/*** Autogenerated by WIDL 1.6 from include/mshtml.idl - Do not edit ***/

#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

#include <rpc.h>
#include <rpcndr.h>

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

#ifndef __mshtml_h__
#define __mshtml_h__

/* Forward declarations */

#ifndef __IHTMLFiltersCollection_FWD_DEFINED__
#define __IHTMLFiltersCollection_FWD_DEFINED__
typedef interface IHTMLFiltersCollection IHTMLFiltersCollection;
#endif

#ifndef __IIE70DispatchEx_FWD_DEFINED__
#define __IIE70DispatchEx_FWD_DEFINED__
typedef interface IIE70DispatchEx IIE70DispatchEx;
#endif

#ifndef __IIE80DispatchEx_FWD_DEFINED__
#define __IIE80DispatchEx_FWD_DEFINED__
typedef interface IIE80DispatchEx IIE80DispatchEx;
#endif

#ifndef __IHTMLDOMConstructor_FWD_DEFINED__
#define __IHTMLDOMConstructor_FWD_DEFINED__
typedef interface IHTMLDOMConstructor IHTMLDOMConstructor;
#endif

#ifndef __IHTMLCSSStyleDeclaration_FWD_DEFINED__
#define __IHTMLCSSStyleDeclaration_FWD_DEFINED__
typedef interface IHTMLCSSStyleDeclaration IHTMLCSSStyleDeclaration;
#endif

#ifndef __IHTMLCSSStyleDeclaration2_FWD_DEFINED__
#define __IHTMLCSSStyleDeclaration2_FWD_DEFINED__
typedef interface IHTMLCSSStyleDeclaration2 IHTMLCSSStyleDeclaration2;
#endif

#ifndef __IHTMLStyleEnabled_FWD_DEFINED__
#define __IHTMLStyleEnabled_FWD_DEFINED__
typedef interface IHTMLStyleEnabled IHTMLStyleEnabled;
#endif

#ifndef __DispHTMLCSSStyleDeclaration_FWD_DEFINED__
#define __DispHTMLCSSStyleDeclaration_FWD_DEFINED__
typedef interface DispHTMLCSSStyleDeclaration DispHTMLCSSStyleDeclaration;
#endif

#ifndef __HTMLCSSStyleDeclaration_FWD_DEFINED__
#define __HTMLCSSStyleDeclaration_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLCSSStyleDeclaration HTMLCSSStyleDeclaration;
#else
typedef struct HTMLCSSStyleDeclaration HTMLCSSStyleDeclaration;
#endif /* defined __cplusplus */
#endif /* defined __HTMLCSSStyleDeclaration_FWD_DEFINED__ */

#ifndef __IHTMLStyle_FWD_DEFINED__
#define __IHTMLStyle_FWD_DEFINED__
typedef interface IHTMLStyle IHTMLStyle;
#endif

#ifndef __IHTMLStyle2_FWD_DEFINED__
#define __IHTMLStyle2_FWD_DEFINED__
typedef interface IHTMLStyle2 IHTMLStyle2;
#endif

#ifndef __IHTMLStyle3_FWD_DEFINED__
#define __IHTMLStyle3_FWD_DEFINED__
typedef interface IHTMLStyle3 IHTMLStyle3;
#endif

#ifndef __IHTMLStyle4_FWD_DEFINED__
#define __IHTMLStyle4_FWD_DEFINED__
typedef interface IHTMLStyle4 IHTMLStyle4;
#endif

#ifndef __IHTMLStyle5_FWD_DEFINED__
#define __IHTMLStyle5_FWD_DEFINED__
typedef interface IHTMLStyle5 IHTMLStyle5;
#endif

#ifndef __IHTMLStyle6_FWD_DEFINED__
#define __IHTMLStyle6_FWD_DEFINED__
typedef interface IHTMLStyle6 IHTMLStyle6;
#endif

#ifndef __IHTMLRuleStyle_FWD_DEFINED__
#define __IHTMLRuleStyle_FWD_DEFINED__
typedef interface IHTMLRuleStyle IHTMLRuleStyle;
#endif

#ifndef __IHTMLRuleStyle2_FWD_DEFINED__
#define __IHTMLRuleStyle2_FWD_DEFINED__
typedef interface IHTMLRuleStyle2 IHTMLRuleStyle2;
#endif

#ifndef __IHTMLRuleStyle3_FWD_DEFINED__
#define __IHTMLRuleStyle3_FWD_DEFINED__
typedef interface IHTMLRuleStyle3 IHTMLRuleStyle3;
#endif

#ifndef __IHTMLRuleStyle4_FWD_DEFINED__
#define __IHTMLRuleStyle4_FWD_DEFINED__
typedef interface IHTMLRuleStyle4 IHTMLRuleStyle4;
#endif

#ifndef __IHTMLRuleStyle5_FWD_DEFINED__
#define __IHTMLRuleStyle5_FWD_DEFINED__
typedef interface IHTMLRuleStyle5 IHTMLRuleStyle5;
#endif

#ifndef __IHTMLRuleStyle6_FWD_DEFINED__
#define __IHTMLRuleStyle6_FWD_DEFINED__
typedef interface IHTMLRuleStyle6 IHTMLRuleStyle6;
#endif

#ifndef __DispHTMLStyle_FWD_DEFINED__
#define __DispHTMLStyle_FWD_DEFINED__
typedef interface DispHTMLStyle DispHTMLStyle;
#endif

#ifndef __HTMLStyle_FWD_DEFINED__
#define __HTMLStyle_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLStyle HTMLStyle;
#else
typedef struct HTMLStyle HTMLStyle;
#endif /* defined __cplusplus */
#endif /* defined __HTMLStyle_FWD_DEFINED__ */

#ifndef __DispHTMLRuleStyle_FWD_DEFINED__
#define __DispHTMLRuleStyle_FWD_DEFINED__
typedef interface DispHTMLRuleStyle DispHTMLRuleStyle;
#endif

#ifndef __HTMLRuleStyle_FWD_DEFINED__
#define __HTMLRuleStyle_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLRuleStyle HTMLRuleStyle;
#else
typedef struct HTMLRuleStyle HTMLRuleStyle;
#endif /* defined __cplusplus */
#endif /* defined __HTMLRuleStyle_FWD_DEFINED__ */

#ifndef __IHTMLCSSRule_FWD_DEFINED__
#define __IHTMLCSSRule_FWD_DEFINED__
typedef interface IHTMLCSSRule IHTMLCSSRule;
#endif

#ifndef __IHTMLCSSImportRule_FWD_DEFINED__
#define __IHTMLCSSImportRule_FWD_DEFINED__
typedef interface IHTMLCSSImportRule IHTMLCSSImportRule;
#endif

#ifndef __IHTMLCSSMediaRule_FWD_DEFINED__
#define __IHTMLCSSMediaRule_FWD_DEFINED__
typedef interface IHTMLCSSMediaRule IHTMLCSSMediaRule;
#endif

#ifndef __IHTMLCSSMediaList_FWD_DEFINED__
#define __IHTMLCSSMediaList_FWD_DEFINED__
typedef interface IHTMLCSSMediaList IHTMLCSSMediaList;
#endif

#ifndef __IHTMLCSSNamespaceRule_FWD_DEFINED__
#define __IHTMLCSSNamespaceRule_FWD_DEFINED__
typedef interface IHTMLCSSNamespaceRule IHTMLCSSNamespaceRule;
#endif

#ifndef __IHTMLMSCSSKeyframeRule_FWD_DEFINED__
#define __IHTMLMSCSSKeyframeRule_FWD_DEFINED__
typedef interface IHTMLMSCSSKeyframeRule IHTMLMSCSSKeyframeRule;
#endif

#ifndef __IHTMLMSCSSKeyframesRule_FWD_DEFINED__
#define __IHTMLMSCSSKeyframesRule_FWD_DEFINED__
typedef interface IHTMLMSCSSKeyframesRule IHTMLMSCSSKeyframesRule;
#endif

#ifndef __DispHTMLCSSRule_FWD_DEFINED__
#define __DispHTMLCSSRule_FWD_DEFINED__
typedef interface DispHTMLCSSRule DispHTMLCSSRule;
#endif

#ifndef __HTMLCSSRule_FWD_DEFINED__
#define __HTMLCSSRule_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLCSSRule HTMLCSSRule;
#else
typedef struct HTMLCSSRule HTMLCSSRule;
#endif /* defined __cplusplus */
#endif /* defined __HTMLCSSRule_FWD_DEFINED__ */

#ifndef __DispHTMLCSSImportRule_FWD_DEFINED__
#define __DispHTMLCSSImportRule_FWD_DEFINED__
typedef interface DispHTMLCSSImportRule DispHTMLCSSImportRule;
#endif

#ifndef __HTMLCSSImportRule_FWD_DEFINED__
#define __HTMLCSSImportRule_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLCSSImportRule HTMLCSSImportRule;
#else
typedef struct HTMLCSSImportRule HTMLCSSImportRule;
#endif /* defined __cplusplus */
#endif /* defined __HTMLCSSImportRule_FWD_DEFINED__ */

#ifndef __DispHTMLCSSMediaRule_FWD_DEFINED__
#define __DispHTMLCSSMediaRule_FWD_DEFINED__
typedef interface DispHTMLCSSMediaRule DispHTMLCSSMediaRule;
#endif

#ifndef __HTMLCSSMediaRule_FWD_DEFINED__
#define __HTMLCSSMediaRule_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLCSSMediaRule HTMLCSSMediaRule;
#else
typedef struct HTMLCSSMediaRule HTMLCSSMediaRule;
#endif /* defined __cplusplus */
#endif /* defined __HTMLCSSMediaRule_FWD_DEFINED__ */

#ifndef __DispHTMLCSSMediaList_FWD_DEFINED__
#define __DispHTMLCSSMediaList_FWD_DEFINED__
typedef interface DispHTMLCSSMediaList DispHTMLCSSMediaList;
#endif

#ifndef __HTMLCSSMediaList_FWD_DEFINED__
#define __HTMLCSSMediaList_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLCSSMediaList HTMLCSSMediaList;
#else
typedef struct HTMLCSSMediaList HTMLCSSMediaList;
#endif /* defined __cplusplus */
#endif /* defined __HTMLCSSMediaList_FWD_DEFINED__ */

#ifndef __DispHTMLCSSNamespaceRule_FWD_DEFINED__
#define __DispHTMLCSSNamespaceRule_FWD_DEFINED__
typedef interface DispHTMLCSSNamespaceRule DispHTMLCSSNamespaceRule;
#endif

#ifndef __HTMLCSSNamespaceRule_FWD_DEFINED__
#define __HTMLCSSNamespaceRule_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLCSSNamespaceRule HTMLCSSNamespaceRule;
#else
typedef struct HTMLCSSNamespaceRule HTMLCSSNamespaceRule;
#endif /* defined __cplusplus */
#endif /* defined __HTMLCSSNamespaceRule_FWD_DEFINED__ */

#ifndef __DispHTMLMSCSSKeyframeRule_FWD_DEFINED__
#define __DispHTMLMSCSSKeyframeRule_FWD_DEFINED__
typedef interface DispHTMLMSCSSKeyframeRule DispHTMLMSCSSKeyframeRule;
#endif

#ifndef __HTMLMSCSSKeyframeRule_FWD_DEFINED__
#define __HTMLMSCSSKeyframeRule_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLMSCSSKeyframeRule HTMLMSCSSKeyframeRule;
#else
typedef struct HTMLMSCSSKeyframeRule HTMLMSCSSKeyframeRule;
#endif /* defined __cplusplus */
#endif /* defined __HTMLMSCSSKeyframeRule_FWD_DEFINED__ */

#ifndef __DispHTMLMSCSSKeyframesRule_FWD_DEFINED__
#define __DispHTMLMSCSSKeyframesRule_FWD_DEFINED__
typedef interface DispHTMLMSCSSKeyframesRule DispHTMLMSCSSKeyframesRule;
#endif

#ifndef __HTMLMSCSSKeyframesRule_FWD_DEFINED__
#define __HTMLMSCSSKeyframesRule_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLMSCSSKeyframesRule HTMLMSCSSKeyframesRule;
#else
typedef struct HTMLMSCSSKeyframesRule HTMLMSCSSKeyframesRule;
#endif /* defined __cplusplus */
#endif /* defined __HTMLMSCSSKeyframesRule_FWD_DEFINED__ */

#ifndef __IHTMLRenderStyle_FWD_DEFINED__
#define __IHTMLRenderStyle_FWD_DEFINED__
typedef interface IHTMLRenderStyle IHTMLRenderStyle;
#endif

#ifndef __DispHTMLRenderStyle_FWD_DEFINED__
#define __DispHTMLRenderStyle_FWD_DEFINED__
typedef interface DispHTMLRenderStyle DispHTMLRenderStyle;
#endif

#ifndef __HTMLRenderStyle_FWD_DEFINED__
#define __HTMLRenderStyle_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLRenderStyle HTMLRenderStyle;
#else
typedef struct HTMLRenderStyle HTMLRenderStyle;
#endif /* defined __cplusplus */
#endif /* defined __HTMLRenderStyle_FWD_DEFINED__ */

#ifndef __IHTMLCurrentStyle_FWD_DEFINED__
#define __IHTMLCurrentStyle_FWD_DEFINED__
typedef interface IHTMLCurrentStyle IHTMLCurrentStyle;
#endif

#ifndef __IHTMLCurrentStyle2_FWD_DEFINED__
#define __IHTMLCurrentStyle2_FWD_DEFINED__
typedef interface IHTMLCurrentStyle2 IHTMLCurrentStyle2;
#endif

#ifndef __IHTMLCurrentStyle3_FWD_DEFINED__
#define __IHTMLCurrentStyle3_FWD_DEFINED__
typedef interface IHTMLCurrentStyle3 IHTMLCurrentStyle3;
#endif

#ifndef __IHTMLCurrentStyle4_FWD_DEFINED__
#define __IHTMLCurrentStyle4_FWD_DEFINED__
typedef interface IHTMLCurrentStyle4 IHTMLCurrentStyle4;
#endif

#ifndef __IHTMLCurrentStyle5_FWD_DEFINED__
#define __IHTMLCurrentStyle5_FWD_DEFINED__
typedef interface IHTMLCurrentStyle5 IHTMLCurrentStyle5;
#endif

#ifndef __DispHTMLCurrentStyle_FWD_DEFINED__
#define __DispHTMLCurrentStyle_FWD_DEFINED__
typedef interface DispHTMLCurrentStyle DispHTMLCurrentStyle;
#endif

#ifndef __HTMLCurrentStyle_FWD_DEFINED__
#define __HTMLCurrentStyle_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLCurrentStyle HTMLCurrentStyle;
#else
typedef struct HTMLCurrentStyle HTMLCurrentStyle;
#endif /* defined __cplusplus */
#endif /* defined __HTMLCurrentStyle_FWD_DEFINED__ */

#ifndef __IHTMLRect_FWD_DEFINED__
#define __IHTMLRect_FWD_DEFINED__
typedef interface IHTMLRect IHTMLRect;
#endif

#ifndef __IHTMLRect2_FWD_DEFINED__
#define __IHTMLRect2_FWD_DEFINED__
typedef interface IHTMLRect2 IHTMLRect2;
#endif

#ifndef __IHTMLRectCollection_FWD_DEFINED__
#define __IHTMLRectCollection_FWD_DEFINED__
typedef interface IHTMLRectCollection IHTMLRectCollection;
#endif

#ifndef __IHTMLDOMNode_FWD_DEFINED__
#define __IHTMLDOMNode_FWD_DEFINED__
typedef interface IHTMLDOMNode IHTMLDOMNode;
#endif

#ifndef __IHTMLDOMNode2_FWD_DEFINED__
#define __IHTMLDOMNode2_FWD_DEFINED__
typedef interface IHTMLDOMNode2 IHTMLDOMNode2;
#endif

#ifndef __IHTMLDOMNode3_FWD_DEFINED__
#define __IHTMLDOMNode3_FWD_DEFINED__
typedef interface IHTMLDOMNode3 IHTMLDOMNode3;
#endif

#ifndef __IHTMLDOMAttribute_FWD_DEFINED__
#define __IHTMLDOMAttribute_FWD_DEFINED__
typedef interface IHTMLDOMAttribute IHTMLDOMAttribute;
#endif

#ifndef __IHTMLDOMAttribute2_FWD_DEFINED__
#define __IHTMLDOMAttribute2_FWD_DEFINED__
typedef interface IHTMLDOMAttribute2 IHTMLDOMAttribute2;
#endif

#ifndef __IHTMLDOMAttribute3_FWD_DEFINED__
#define __IHTMLDOMAttribute3_FWD_DEFINED__
typedef interface IHTMLDOMAttribute3 IHTMLDOMAttribute3;
#endif

#ifndef __IHTMLDOMAttribute4_FWD_DEFINED__
#define __IHTMLDOMAttribute4_FWD_DEFINED__
typedef interface IHTMLDOMAttribute4 IHTMLDOMAttribute4;
#endif

#ifndef __IHTMLDOMTextNode_FWD_DEFINED__
#define __IHTMLDOMTextNode_FWD_DEFINED__
typedef interface IHTMLDOMTextNode IHTMLDOMTextNode;
#endif

#ifndef __IHTMLDOMTextNode2_FWD_DEFINED__
#define __IHTMLDOMTextNode2_FWD_DEFINED__
typedef interface IHTMLDOMTextNode2 IHTMLDOMTextNode2;
#endif

#ifndef __IHTMLDOMTextNode3_FWD_DEFINED__
#define __IHTMLDOMTextNode3_FWD_DEFINED__
typedef interface IHTMLDOMTextNode3 IHTMLDOMTextNode3;
#endif

#ifndef __IHTMLDOMImplementation_FWD_DEFINED__
#define __IHTMLDOMImplementation_FWD_DEFINED__
typedef interface IHTMLDOMImplementation IHTMLDOMImplementation;
#endif

#ifndef __IHTMLDOMImplementation2_FWD_DEFINED__
#define __IHTMLDOMImplementation2_FWD_DEFINED__
typedef interface IHTMLDOMImplementation2 IHTMLDOMImplementation2;
#endif

#ifndef __DispHTMLDOMAttribute_FWD_DEFINED__
#define __DispHTMLDOMAttribute_FWD_DEFINED__
typedef interface DispHTMLDOMAttribute DispHTMLDOMAttribute;
#endif

#ifndef __HTMLDOMAttribute_FWD_DEFINED__
#define __HTMLDOMAttribute_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLDOMAttribute HTMLDOMAttribute;
#else
typedef struct HTMLDOMAttribute HTMLDOMAttribute;
#endif /* defined __cplusplus */
#endif /* defined __HTMLDOMAttribute_FWD_DEFINED__ */

#ifndef __DispHTMLDOMTextNode_FWD_DEFINED__
#define __DispHTMLDOMTextNode_FWD_DEFINED__
typedef interface DispHTMLDOMTextNode DispHTMLDOMTextNode;
#endif

#ifndef __HTMLDOMTextNode_FWD_DEFINED__
#define __HTMLDOMTextNode_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLDOMTextNode HTMLDOMTextNode;
#else
typedef struct HTMLDOMTextNode HTMLDOMTextNode;
#endif /* defined __cplusplus */
#endif /* defined __HTMLDOMTextNode_FWD_DEFINED__ */

#ifndef __DispHTMLDOMImplementation_FWD_DEFINED__
#define __DispHTMLDOMImplementation_FWD_DEFINED__
typedef interface DispHTMLDOMImplementation DispHTMLDOMImplementation;
#endif

#ifndef __HTMLDOMImplementation_FWD_DEFINED__
#define __HTMLDOMImplementation_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLDOMImplementation HTMLDOMImplementation;
#else
typedef struct HTMLDOMImplementation HTMLDOMImplementation;
#endif /* defined __cplusplus */
#endif /* defined __HTMLDOMImplementation_FWD_DEFINED__ */

#ifndef __IHTMLAttributeCollection_FWD_DEFINED__
#define __IHTMLAttributeCollection_FWD_DEFINED__
typedef interface IHTMLAttributeCollection IHTMLAttributeCollection;
#endif

#ifndef __IHTMLAttributeCollection2_FWD_DEFINED__
#define __IHTMLAttributeCollection2_FWD_DEFINED__
typedef interface IHTMLAttributeCollection2 IHTMLAttributeCollection2;
#endif

#ifndef __IHTMLAttributeCollection3_FWD_DEFINED__
#define __IHTMLAttributeCollection3_FWD_DEFINED__
typedef interface IHTMLAttributeCollection3 IHTMLAttributeCollection3;
#endif

#ifndef __IHTMLAttributeCollection4_FWD_DEFINED__
#define __IHTMLAttributeCollection4_FWD_DEFINED__
typedef interface IHTMLAttributeCollection4 IHTMLAttributeCollection4;
#endif

#ifndef __IHTMLDOMChildrenCollection_FWD_DEFINED__
#define __IHTMLDOMChildrenCollection_FWD_DEFINED__
typedef interface IHTMLDOMChildrenCollection IHTMLDOMChildrenCollection;
#endif

#ifndef __IHTMLDOMChildrenCollection2_FWD_DEFINED__
#define __IHTMLDOMChildrenCollection2_FWD_DEFINED__
typedef interface IHTMLDOMChildrenCollection2 IHTMLDOMChildrenCollection2;
#endif

#ifndef __DispHTMLAttributeCollection_FWD_DEFINED__
#define __DispHTMLAttributeCollection_FWD_DEFINED__
typedef interface DispHTMLAttributeCollection DispHTMLAttributeCollection;
#endif

#ifndef __HTMLAttributeCollection_FWD_DEFINED__
#define __HTMLAttributeCollection_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLAttributeCollection HTMLAttributeCollection;
#else
typedef struct HTMLAttributeCollection HTMLAttributeCollection;
#endif /* defined __cplusplus */
#endif /* defined __HTMLAttributeCollection_FWD_DEFINED__ */

#ifndef __DispStaticNodeList_FWD_DEFINED__
#define __DispStaticNodeList_FWD_DEFINED__
typedef interface DispStaticNodeList DispStaticNodeList;
#endif

#ifndef __StaticNodeList_FWD_DEFINED__
#define __StaticNodeList_FWD_DEFINED__
#ifdef __cplusplus
typedef class StaticNodeList StaticNodeList;
#else
typedef struct StaticNodeList StaticNodeList;
#endif /* defined __cplusplus */
#endif /* defined __StaticNodeList_FWD_DEFINED__ */

#ifndef __DispDOMChildrenCollection_FWD_DEFINED__
#define __DispDOMChildrenCollection_FWD_DEFINED__
typedef interface DispDOMChildrenCollection DispDOMChildrenCollection;
#endif

#ifndef __DOMChildrenCollection_FWD_DEFINED__
#define __DOMChildrenCollection_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMChildrenCollection DOMChildrenCollection;
#else
typedef struct DOMChildrenCollection DOMChildrenCollection;
#endif /* defined __cplusplus */
#endif /* defined __DOMChildrenCollection_FWD_DEFINED__ */

#ifndef __HTMLElementEvents4_FWD_DEFINED__
#define __HTMLElementEvents4_FWD_DEFINED__
typedef interface HTMLElementEvents4 HTMLElementEvents4;
#endif

#ifndef __HTMLElementEvents3_FWD_DEFINED__
#define __HTMLElementEvents3_FWD_DEFINED__
typedef interface HTMLElementEvents3 HTMLElementEvents3;
#endif

#ifndef __HTMLElementEvents2_FWD_DEFINED__
#define __HTMLElementEvents2_FWD_DEFINED__
typedef interface HTMLElementEvents2 HTMLElementEvents2;
#endif

#ifndef __HTMLElementEvents_FWD_DEFINED__
#define __HTMLElementEvents_FWD_DEFINED__
typedef interface HTMLElementEvents HTMLElementEvents;
#endif

#ifndef __IHTMLElement_FWD_DEFINED__
#define __IHTMLElement_FWD_DEFINED__
typedef interface IHTMLElement IHTMLElement;
#endif

#ifndef __IHTMLElement2_FWD_DEFINED__
#define __IHTMLElement2_FWD_DEFINED__
typedef interface IHTMLElement2 IHTMLElement2;
#endif

#ifndef __IHTMLElement3_FWD_DEFINED__
#define __IHTMLElement3_FWD_DEFINED__
typedef interface IHTMLElement3 IHTMLElement3;
#endif

#ifndef __IHTMLElement4_FWD_DEFINED__
#define __IHTMLElement4_FWD_DEFINED__
typedef interface IHTMLElement4 IHTMLElement4;
#endif

#ifndef __IElementSelector_FWD_DEFINED__
#define __IElementSelector_FWD_DEFINED__
typedef interface IElementSelector IElementSelector;
#endif

#ifndef __IHTMLElementRender_FWD_DEFINED__
#define __IHTMLElementRender_FWD_DEFINED__
typedef interface IHTMLElementRender IHTMLElementRender;
#endif

#ifndef __IHTMLUniqueName_FWD_DEFINED__
#define __IHTMLUniqueName_FWD_DEFINED__
typedef interface IHTMLUniqueName IHTMLUniqueName;
#endif

#ifndef __IHTMLElement5_FWD_DEFINED__
#define __IHTMLElement5_FWD_DEFINED__
typedef interface IHTMLElement5 IHTMLElement5;
#endif

#ifndef __IHTMLElement6_FWD_DEFINED__
#define __IHTMLElement6_FWD_DEFINED__
typedef interface IHTMLElement6 IHTMLElement6;
#endif

#ifndef __IHTMLElement7_FWD_DEFINED__
#define __IHTMLElement7_FWD_DEFINED__
typedef interface IHTMLElement7 IHTMLElement7;
#endif

#ifndef __IHTMLElementAppliedStyles_FWD_DEFINED__
#define __IHTMLElementAppliedStyles_FWD_DEFINED__
typedef interface IHTMLElementAppliedStyles IHTMLElementAppliedStyles;
#endif

#ifndef __IElementTraversal_FWD_DEFINED__
#define __IElementTraversal_FWD_DEFINED__
typedef interface IElementTraversal IElementTraversal;
#endif

#ifndef __IHTMLDatabinding_FWD_DEFINED__
#define __IHTMLDatabinding_FWD_DEFINED__
typedef interface IHTMLDatabinding IHTMLDatabinding;
#endif

#ifndef __IHTMLElementDefaults_FWD_DEFINED__
#define __IHTMLElementDefaults_FWD_DEFINED__
typedef interface IHTMLElementDefaults IHTMLElementDefaults;
#endif

#ifndef __DispHTMLDefaults_FWD_DEFINED__
#define __DispHTMLDefaults_FWD_DEFINED__
typedef interface DispHTMLDefaults DispHTMLDefaults;
#endif

#ifndef __HTMLDefaults_FWD_DEFINED__
#define __HTMLDefaults_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLDefaults HTMLDefaults;
#else
typedef struct HTMLDefaults HTMLDefaults;
#endif /* defined __cplusplus */
#endif /* defined __HTMLDefaults_FWD_DEFINED__ */

#ifndef __IHTCDefaultDispatch_FWD_DEFINED__
#define __IHTCDefaultDispatch_FWD_DEFINED__
typedef interface IHTCDefaultDispatch IHTCDefaultDispatch;
#endif

#ifndef __IHTCPropertyBehavior_FWD_DEFINED__
#define __IHTCPropertyBehavior_FWD_DEFINED__
typedef interface IHTCPropertyBehavior IHTCPropertyBehavior;
#endif

#ifndef __IHTCMethodBehavior_FWD_DEFINED__
#define __IHTCMethodBehavior_FWD_DEFINED__
typedef interface IHTCMethodBehavior IHTCMethodBehavior;
#endif

#ifndef __IHTCEventBehavior_FWD_DEFINED__
#define __IHTCEventBehavior_FWD_DEFINED__
typedef interface IHTCEventBehavior IHTCEventBehavior;
#endif

#ifndef __IHTCAttachBehavior_FWD_DEFINED__
#define __IHTCAttachBehavior_FWD_DEFINED__
typedef interface IHTCAttachBehavior IHTCAttachBehavior;
#endif

#ifndef __IHTCAttachBehavior2_FWD_DEFINED__
#define __IHTCAttachBehavior2_FWD_DEFINED__
typedef interface IHTCAttachBehavior2 IHTCAttachBehavior2;
#endif

#ifndef __IHTCDescBehavior_FWD_DEFINED__
#define __IHTCDescBehavior_FWD_DEFINED__
typedef interface IHTCDescBehavior IHTCDescBehavior;
#endif

#ifndef __DispHTCDefaultDispatch_FWD_DEFINED__
#define __DispHTCDefaultDispatch_FWD_DEFINED__
typedef interface DispHTCDefaultDispatch DispHTCDefaultDispatch;
#endif

#ifndef __HTCDefaultDispatch_FWD_DEFINED__
#define __HTCDefaultDispatch_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTCDefaultDispatch HTCDefaultDispatch;
#else
typedef struct HTCDefaultDispatch HTCDefaultDispatch;
#endif /* defined __cplusplus */
#endif /* defined __HTCDefaultDispatch_FWD_DEFINED__ */

#ifndef __DispHTCPropertyBehavior_FWD_DEFINED__
#define __DispHTCPropertyBehavior_FWD_DEFINED__
typedef interface DispHTCPropertyBehavior DispHTCPropertyBehavior;
#endif

#ifndef __HTCPropertyBehavior_FWD_DEFINED__
#define __HTCPropertyBehavior_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTCPropertyBehavior HTCPropertyBehavior;
#else
typedef struct HTCPropertyBehavior HTCPropertyBehavior;
#endif /* defined __cplusplus */
#endif /* defined __HTCPropertyBehavior_FWD_DEFINED__ */

#ifndef __DispHTCMethodBehavior_FWD_DEFINED__
#define __DispHTCMethodBehavior_FWD_DEFINED__
typedef interface DispHTCMethodBehavior DispHTCMethodBehavior;
#endif

#ifndef __HTCMethodBehavior_FWD_DEFINED__
#define __HTCMethodBehavior_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTCMethodBehavior HTCMethodBehavior;
#else
typedef struct HTCMethodBehavior HTCMethodBehavior;
#endif /* defined __cplusplus */
#endif /* defined __HTCMethodBehavior_FWD_DEFINED__ */

#ifndef __DispHTCEventBehavior_FWD_DEFINED__
#define __DispHTCEventBehavior_FWD_DEFINED__
typedef interface DispHTCEventBehavior DispHTCEventBehavior;
#endif

#ifndef __HTCEventBehavior_FWD_DEFINED__
#define __HTCEventBehavior_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTCEventBehavior HTCEventBehavior;
#else
typedef struct HTCEventBehavior HTCEventBehavior;
#endif /* defined __cplusplus */
#endif /* defined __HTCEventBehavior_FWD_DEFINED__ */

#ifndef __DispHTCAttachBehavior_FWD_DEFINED__
#define __DispHTCAttachBehavior_FWD_DEFINED__
typedef interface DispHTCAttachBehavior DispHTCAttachBehavior;
#endif

#ifndef __HTCAttachBehavior_FWD_DEFINED__
#define __HTCAttachBehavior_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTCAttachBehavior HTCAttachBehavior;
#else
typedef struct HTCAttachBehavior HTCAttachBehavior;
#endif /* defined __cplusplus */
#endif /* defined __HTCAttachBehavior_FWD_DEFINED__ */

#ifndef __DispHTCDescBehavior_FWD_DEFINED__
#define __DispHTCDescBehavior_FWD_DEFINED__
typedef interface DispHTCDescBehavior DispHTCDescBehavior;
#endif

#ifndef __HTCDescBehavior_FWD_DEFINED__
#define __HTCDescBehavior_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTCDescBehavior HTCDescBehavior;
#else
typedef struct HTCDescBehavior HTCDescBehavior;
#endif /* defined __cplusplus */
#endif /* defined __HTCDescBehavior_FWD_DEFINED__ */

#ifndef __IHTMLUrnCollection_FWD_DEFINED__
#define __IHTMLUrnCollection_FWD_DEFINED__
typedef interface IHTMLUrnCollection IHTMLUrnCollection;
#endif

#ifndef __DispHTMLUrnCollection_FWD_DEFINED__
#define __DispHTMLUrnCollection_FWD_DEFINED__
typedef interface DispHTMLUrnCollection DispHTMLUrnCollection;
#endif

#ifndef __HTMLUrnCollection_FWD_DEFINED__
#define __HTMLUrnCollection_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLUrnCollection HTMLUrnCollection;
#else
typedef struct HTMLUrnCollection HTMLUrnCollection;
#endif /* defined __cplusplus */
#endif /* defined __HTMLUrnCollection_FWD_DEFINED__ */

#ifndef __IHTMLGenericElement_FWD_DEFINED__
#define __IHTMLGenericElement_FWD_DEFINED__
typedef interface IHTMLGenericElement IHTMLGenericElement;
#endif

#ifndef __DispHTMLGenericElement_FWD_DEFINED__
#define __DispHTMLGenericElement_FWD_DEFINED__
typedef interface DispHTMLGenericElement DispHTMLGenericElement;
#endif

#ifndef __HTMLGenericElement_FWD_DEFINED__
#define __HTMLGenericElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLGenericElement HTMLGenericElement;
#else
typedef struct HTMLGenericElement HTMLGenericElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLGenericElement_FWD_DEFINED__ */

#ifndef __IHTMLStyleSheetRule_FWD_DEFINED__
#define __IHTMLStyleSheetRule_FWD_DEFINED__
typedef interface IHTMLStyleSheetRule IHTMLStyleSheetRule;
#endif

#ifndef __IHTMLStyleSheetRuleApplied_FWD_DEFINED__
#define __IHTMLStyleSheetRuleApplied_FWD_DEFINED__
typedef interface IHTMLStyleSheetRuleApplied IHTMLStyleSheetRuleApplied;
#endif

#ifndef __IHTMLStyleSheetRule2_FWD_DEFINED__
#define __IHTMLStyleSheetRule2_FWD_DEFINED__
typedef interface IHTMLStyleSheetRule2 IHTMLStyleSheetRule2;
#endif

#ifndef __IHTMLStyleSheetRulesCollection_FWD_DEFINED__
#define __IHTMLStyleSheetRulesCollection_FWD_DEFINED__
typedef interface IHTMLStyleSheetRulesCollection IHTMLStyleSheetRulesCollection;
#endif

#ifndef __IHTMLStyleSheetRulesCollection2_FWD_DEFINED__
#define __IHTMLStyleSheetRulesCollection2_FWD_DEFINED__
typedef interface IHTMLStyleSheetRulesCollection2 IHTMLStyleSheetRulesCollection2;
#endif

#ifndef __DispHTMLStyleSheetRule_FWD_DEFINED__
#define __DispHTMLStyleSheetRule_FWD_DEFINED__
typedef interface DispHTMLStyleSheetRule DispHTMLStyleSheetRule;
#endif

#ifndef __HTMLStyleSheetRule_FWD_DEFINED__
#define __HTMLStyleSheetRule_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLStyleSheetRule HTMLStyleSheetRule;
#else
typedef struct HTMLStyleSheetRule HTMLStyleSheetRule;
#endif /* defined __cplusplus */
#endif /* defined __HTMLStyleSheetRule_FWD_DEFINED__ */

#ifndef __DispHTMLStyleSheetRulesCollection_FWD_DEFINED__
#define __DispHTMLStyleSheetRulesCollection_FWD_DEFINED__
typedef interface DispHTMLStyleSheetRulesCollection DispHTMLStyleSheetRulesCollection;
#endif

#ifndef __HTMLStyleSheetRulesCollection_FWD_DEFINED__
#define __HTMLStyleSheetRulesCollection_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLStyleSheetRulesCollection HTMLStyleSheetRulesCollection;
#else
typedef struct HTMLStyleSheetRulesCollection HTMLStyleSheetRulesCollection;
#endif /* defined __cplusplus */
#endif /* defined __HTMLStyleSheetRulesCollection_FWD_DEFINED__ */

#ifndef __IHTMLStyleSheetPage_FWD_DEFINED__
#define __IHTMLStyleSheetPage_FWD_DEFINED__
typedef interface IHTMLStyleSheetPage IHTMLStyleSheetPage;
#endif

#ifndef __IHTMLStyleSheetPage2_FWD_DEFINED__
#define __IHTMLStyleSheetPage2_FWD_DEFINED__
typedef interface IHTMLStyleSheetPage2 IHTMLStyleSheetPage2;
#endif

#ifndef __IHTMLStyleSheetPagesCollection_FWD_DEFINED__
#define __IHTMLStyleSheetPagesCollection_FWD_DEFINED__
typedef interface IHTMLStyleSheetPagesCollection IHTMLStyleSheetPagesCollection;
#endif

#ifndef __DispHTMLStyleSheetPage_FWD_DEFINED__
#define __DispHTMLStyleSheetPage_FWD_DEFINED__
typedef interface DispHTMLStyleSheetPage DispHTMLStyleSheetPage;
#endif

#ifndef __HTMLStyleSheetPage_FWD_DEFINED__
#define __HTMLStyleSheetPage_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLStyleSheetPage HTMLStyleSheetPage;
#else
typedef struct HTMLStyleSheetPage HTMLStyleSheetPage;
#endif /* defined __cplusplus */
#endif /* defined __HTMLStyleSheetPage_FWD_DEFINED__ */

#ifndef __DispHTMLStyleSheetPagesCollection_FWD_DEFINED__
#define __DispHTMLStyleSheetPagesCollection_FWD_DEFINED__
typedef interface DispHTMLStyleSheetPagesCollection DispHTMLStyleSheetPagesCollection;
#endif

#ifndef __HTMLStyleSheetPagesCollection_FWD_DEFINED__
#define __HTMLStyleSheetPagesCollection_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLStyleSheetPagesCollection HTMLStyleSheetPagesCollection;
#else
typedef struct HTMLStyleSheetPagesCollection HTMLStyleSheetPagesCollection;
#endif /* defined __cplusplus */
#endif /* defined __HTMLStyleSheetPagesCollection_FWD_DEFINED__ */

#ifndef __IHTMLStyleSheet_FWD_DEFINED__
#define __IHTMLStyleSheet_FWD_DEFINED__
typedef interface IHTMLStyleSheet IHTMLStyleSheet;
#endif

#ifndef __IHTMLStyleSheet2_FWD_DEFINED__
#define __IHTMLStyleSheet2_FWD_DEFINED__
typedef interface IHTMLStyleSheet2 IHTMLStyleSheet2;
#endif

#ifndef __IHTMLStyleSheet3_FWD_DEFINED__
#define __IHTMLStyleSheet3_FWD_DEFINED__
typedef interface IHTMLStyleSheet3 IHTMLStyleSheet3;
#endif

#ifndef __IHTMLStyleSheet4_FWD_DEFINED__
#define __IHTMLStyleSheet4_FWD_DEFINED__
typedef interface IHTMLStyleSheet4 IHTMLStyleSheet4;
#endif

#ifndef __DispHTMLStyleSheet_FWD_DEFINED__
#define __DispHTMLStyleSheet_FWD_DEFINED__
typedef interface DispHTMLStyleSheet DispHTMLStyleSheet;
#endif

#ifndef __HTMLStyleSheet_FWD_DEFINED__
#define __HTMLStyleSheet_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLStyleSheet HTMLStyleSheet;
#else
typedef struct HTMLStyleSheet HTMLStyleSheet;
#endif /* defined __cplusplus */
#endif /* defined __HTMLStyleSheet_FWD_DEFINED__ */

#ifndef __IHTMLStyleSheetsCollection_FWD_DEFINED__
#define __IHTMLStyleSheetsCollection_FWD_DEFINED__
typedef interface IHTMLStyleSheetsCollection IHTMLStyleSheetsCollection;
#endif

#ifndef __IHTMLStyleSheetsCollection2_FWD_DEFINED__
#define __IHTMLStyleSheetsCollection2_FWD_DEFINED__
typedef interface IHTMLStyleSheetsCollection2 IHTMLStyleSheetsCollection2;
#endif

#ifndef __DispHTMLStyleSheetsCollection_FWD_DEFINED__
#define __DispHTMLStyleSheetsCollection_FWD_DEFINED__
typedef interface DispHTMLStyleSheetsCollection DispHTMLStyleSheetsCollection;
#endif

#ifndef __HTMLStyleSheetsCollection_FWD_DEFINED__
#define __HTMLStyleSheetsCollection_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLStyleSheetsCollection HTMLStyleSheetsCollection;
#else
typedef struct HTMLStyleSheetsCollection HTMLStyleSheetsCollection;
#endif /* defined __cplusplus */
#endif /* defined __HTMLStyleSheetsCollection_FWD_DEFINED__ */

#ifndef __HTMLLinkElementEvents2_FWD_DEFINED__
#define __HTMLLinkElementEvents2_FWD_DEFINED__
typedef interface HTMLLinkElementEvents2 HTMLLinkElementEvents2;
#endif

#ifndef __HTMLLinkElementEvents_FWD_DEFINED__
#define __HTMLLinkElementEvents_FWD_DEFINED__
typedef interface HTMLLinkElementEvents HTMLLinkElementEvents;
#endif

#ifndef __IHTMLLinkElement_FWD_DEFINED__
#define __IHTMLLinkElement_FWD_DEFINED__
typedef interface IHTMLLinkElement IHTMLLinkElement;
#endif

#ifndef __IHTMLLinkElement2_FWD_DEFINED__
#define __IHTMLLinkElement2_FWD_DEFINED__
typedef interface IHTMLLinkElement2 IHTMLLinkElement2;
#endif

#ifndef __IHTMLLinkElement3_FWD_DEFINED__
#define __IHTMLLinkElement3_FWD_DEFINED__
typedef interface IHTMLLinkElement3 IHTMLLinkElement3;
#endif

#ifndef __IHTMLLinkElement4_FWD_DEFINED__
#define __IHTMLLinkElement4_FWD_DEFINED__
typedef interface IHTMLLinkElement4 IHTMLLinkElement4;
#endif

#ifndef __IHTMLLinkElement5_FWD_DEFINED__
#define __IHTMLLinkElement5_FWD_DEFINED__
typedef interface IHTMLLinkElement5 IHTMLLinkElement5;
#endif

#ifndef __DispHTMLLinkElement_FWD_DEFINED__
#define __DispHTMLLinkElement_FWD_DEFINED__
typedef interface DispHTMLLinkElement DispHTMLLinkElement;
#endif

#ifndef __HTMLLinkElement_FWD_DEFINED__
#define __HTMLLinkElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLLinkElement HTMLLinkElement;
#else
typedef struct HTMLLinkElement HTMLLinkElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLLinkElement_FWD_DEFINED__ */

#ifndef __IHTMLTxtRange_FWD_DEFINED__
#define __IHTMLTxtRange_FWD_DEFINED__
typedef interface IHTMLTxtRange IHTMLTxtRange;
#endif

#ifndef __IHTMLTextRangeMetrics_FWD_DEFINED__
#define __IHTMLTextRangeMetrics_FWD_DEFINED__
typedef interface IHTMLTextRangeMetrics IHTMLTextRangeMetrics;
#endif

#ifndef __IHTMLTextRangeMetrics2_FWD_DEFINED__
#define __IHTMLTextRangeMetrics2_FWD_DEFINED__
typedef interface IHTMLTextRangeMetrics2 IHTMLTextRangeMetrics2;
#endif

#ifndef __IHTMLTxtRangeCollection_FWD_DEFINED__
#define __IHTMLTxtRangeCollection_FWD_DEFINED__
typedef interface IHTMLTxtRangeCollection IHTMLTxtRangeCollection;
#endif

#ifndef __IHTMLDOMRange_FWD_DEFINED__
#define __IHTMLDOMRange_FWD_DEFINED__
typedef interface IHTMLDOMRange IHTMLDOMRange;
#endif

#ifndef __DispHTMLDOMRange_FWD_DEFINED__
#define __DispHTMLDOMRange_FWD_DEFINED__
typedef interface DispHTMLDOMRange DispHTMLDOMRange;
#endif

#ifndef __HTMLDOMRange_FWD_DEFINED__
#define __HTMLDOMRange_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLDOMRange HTMLDOMRange;
#else
typedef struct HTMLDOMRange HTMLDOMRange;
#endif /* defined __cplusplus */
#endif /* defined __HTMLDOMRange_FWD_DEFINED__ */

#ifndef __HTMLFormElementEvents2_FWD_DEFINED__
#define __HTMLFormElementEvents2_FWD_DEFINED__
typedef interface HTMLFormElementEvents2 HTMLFormElementEvents2;
#endif

#ifndef __HTMLFormElementEvents_FWD_DEFINED__
#define __HTMLFormElementEvents_FWD_DEFINED__
typedef interface HTMLFormElementEvents HTMLFormElementEvents;
#endif

#ifndef __IHTMLFormElement_FWD_DEFINED__
#define __IHTMLFormElement_FWD_DEFINED__
typedef interface IHTMLFormElement IHTMLFormElement;
#endif

#ifndef __IHTMLFormElement2_FWD_DEFINED__
#define __IHTMLFormElement2_FWD_DEFINED__
typedef interface IHTMLFormElement2 IHTMLFormElement2;
#endif

#ifndef __IHTMLFormElement3_FWD_DEFINED__
#define __IHTMLFormElement3_FWD_DEFINED__
typedef interface IHTMLFormElement3 IHTMLFormElement3;
#endif

#ifndef __IHTMLSubmitData_FWD_DEFINED__
#define __IHTMLSubmitData_FWD_DEFINED__
typedef interface IHTMLSubmitData IHTMLSubmitData;
#endif

#ifndef __IHTMLFormElement4_FWD_DEFINED__
#define __IHTMLFormElement4_FWD_DEFINED__
typedef interface IHTMLFormElement4 IHTMLFormElement4;
#endif

#ifndef __DispHTMLFormElement_FWD_DEFINED__
#define __DispHTMLFormElement_FWD_DEFINED__
typedef interface DispHTMLFormElement DispHTMLFormElement;
#endif

#ifndef __HTMLFormElement_FWD_DEFINED__
#define __HTMLFormElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLFormElement HTMLFormElement;
#else
typedef struct HTMLFormElement HTMLFormElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLFormElement_FWD_DEFINED__ */

#ifndef __HTMLControlElementEvents2_FWD_DEFINED__
#define __HTMLControlElementEvents2_FWD_DEFINED__
typedef interface HTMLControlElementEvents2 HTMLControlElementEvents2;
#endif

#ifndef __HTMLControlElementEvents_FWD_DEFINED__
#define __HTMLControlElementEvents_FWD_DEFINED__
typedef interface HTMLControlElementEvents HTMLControlElementEvents;
#endif

#ifndef __IHTMLControlElement_FWD_DEFINED__
#define __IHTMLControlElement_FWD_DEFINED__
typedef interface IHTMLControlElement IHTMLControlElement;
#endif

#ifndef __IHTMLTextElement_FWD_DEFINED__
#define __IHTMLTextElement_FWD_DEFINED__
typedef interface IHTMLTextElement IHTMLTextElement;
#endif

#ifndef __DispHTMLTextElement_FWD_DEFINED__
#define __DispHTMLTextElement_FWD_DEFINED__
typedef interface DispHTMLTextElement DispHTMLTextElement;
#endif

#ifndef __HTMLTextElement_FWD_DEFINED__
#define __HTMLTextElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLTextElement HTMLTextElement;
#else
typedef struct HTMLTextElement HTMLTextElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLTextElement_FWD_DEFINED__ */

#ifndef __HTMLTextContainerEvents2_FWD_DEFINED__
#define __HTMLTextContainerEvents2_FWD_DEFINED__
typedef interface HTMLTextContainerEvents2 HTMLTextContainerEvents2;
#endif

#ifndef __HTMLTextContainerEvents_FWD_DEFINED__
#define __HTMLTextContainerEvents_FWD_DEFINED__
typedef interface HTMLTextContainerEvents HTMLTextContainerEvents;
#endif

#ifndef __IHTMLTextContainer_FWD_DEFINED__
#define __IHTMLTextContainer_FWD_DEFINED__
typedef interface IHTMLTextContainer IHTMLTextContainer;
#endif

#ifndef __IHTMLControlRange_FWD_DEFINED__
#define __IHTMLControlRange_FWD_DEFINED__
typedef interface IHTMLControlRange IHTMLControlRange;
#endif

#ifndef __IHTMLControlRange2_FWD_DEFINED__
#define __IHTMLControlRange2_FWD_DEFINED__
typedef interface IHTMLControlRange2 IHTMLControlRange2;
#endif

#ifndef __HTMLImgEvents2_FWD_DEFINED__
#define __HTMLImgEvents2_FWD_DEFINED__
typedef interface HTMLImgEvents2 HTMLImgEvents2;
#endif

#ifndef __HTMLImgEvents_FWD_DEFINED__
#define __HTMLImgEvents_FWD_DEFINED__
typedef interface HTMLImgEvents HTMLImgEvents;
#endif

#ifndef __IHTMLImgElement_FWD_DEFINED__
#define __IHTMLImgElement_FWD_DEFINED__
typedef interface IHTMLImgElement IHTMLImgElement;
#endif

#ifndef __IHTMLImgElement2_FWD_DEFINED__
#define __IHTMLImgElement2_FWD_DEFINED__
typedef interface IHTMLImgElement2 IHTMLImgElement2;
#endif

#ifndef __IHTMLImgElement3_FWD_DEFINED__
#define __IHTMLImgElement3_FWD_DEFINED__
typedef interface IHTMLImgElement3 IHTMLImgElement3;
#endif

#ifndef __IHTMLImgElement4_FWD_DEFINED__
#define __IHTMLImgElement4_FWD_DEFINED__
typedef interface IHTMLImgElement4 IHTMLImgElement4;
#endif

#ifndef __IHTMLMSImgElement_FWD_DEFINED__
#define __IHTMLMSImgElement_FWD_DEFINED__
typedef interface IHTMLMSImgElement IHTMLMSImgElement;
#endif

#ifndef __IHTMLImageElementFactory_FWD_DEFINED__
#define __IHTMLImageElementFactory_FWD_DEFINED__
typedef interface IHTMLImageElementFactory IHTMLImageElementFactory;
#endif

#ifndef __DispHTMLImg_FWD_DEFINED__
#define __DispHTMLImg_FWD_DEFINED__
typedef interface DispHTMLImg DispHTMLImg;
#endif

#ifndef __HTMLImg_FWD_DEFINED__
#define __HTMLImg_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLImg HTMLImg;
#else
typedef struct HTMLImg HTMLImg;
#endif /* defined __cplusplus */
#endif /* defined __HTMLImg_FWD_DEFINED__ */

#ifndef __HTMLImageElementFactory_FWD_DEFINED__
#define __HTMLImageElementFactory_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLImageElementFactory HTMLImageElementFactory;
#else
typedef struct HTMLImageElementFactory HTMLImageElementFactory;
#endif /* defined __cplusplus */
#endif /* defined __HTMLImageElementFactory_FWD_DEFINED__ */

#ifndef __IHTMLBodyElement_FWD_DEFINED__
#define __IHTMLBodyElement_FWD_DEFINED__
typedef interface IHTMLBodyElement IHTMLBodyElement;
#endif

#ifndef __IHTMLBodyElement2_FWD_DEFINED__
#define __IHTMLBodyElement2_FWD_DEFINED__
typedef interface IHTMLBodyElement2 IHTMLBodyElement2;
#endif

#ifndef __IHTMLBodyElement3_FWD_DEFINED__
#define __IHTMLBodyElement3_FWD_DEFINED__
typedef interface IHTMLBodyElement3 IHTMLBodyElement3;
#endif

#ifndef __IHTMLBodyElement4_FWD_DEFINED__
#define __IHTMLBodyElement4_FWD_DEFINED__
typedef interface IHTMLBodyElement4 IHTMLBodyElement4;
#endif

#ifndef __IHTMLBodyElement5_FWD_DEFINED__
#define __IHTMLBodyElement5_FWD_DEFINED__
typedef interface IHTMLBodyElement5 IHTMLBodyElement5;
#endif

#ifndef __DispHTMLBody_FWD_DEFINED__
#define __DispHTMLBody_FWD_DEFINED__
typedef interface DispHTMLBody DispHTMLBody;
#endif

#ifndef __HTMLBody_FWD_DEFINED__
#define __HTMLBody_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLBody HTMLBody;
#else
typedef struct HTMLBody HTMLBody;
#endif /* defined __cplusplus */
#endif /* defined __HTMLBody_FWD_DEFINED__ */

#ifndef __IHTMLFontElement_FWD_DEFINED__
#define __IHTMLFontElement_FWD_DEFINED__
typedef interface IHTMLFontElement IHTMLFontElement;
#endif

#ifndef __DispHTMLFontElement_FWD_DEFINED__
#define __DispHTMLFontElement_FWD_DEFINED__
typedef interface DispHTMLFontElement DispHTMLFontElement;
#endif

#ifndef __HTMLFontElement_FWD_DEFINED__
#define __HTMLFontElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLFontElement HTMLFontElement;
#else
typedef struct HTMLFontElement HTMLFontElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLFontElement_FWD_DEFINED__ */

#ifndef __HTMLAnchorEvents2_FWD_DEFINED__
#define __HTMLAnchorEvents2_FWD_DEFINED__
typedef interface HTMLAnchorEvents2 HTMLAnchorEvents2;
#endif

#ifndef __HTMLAnchorEvents_FWD_DEFINED__
#define __HTMLAnchorEvents_FWD_DEFINED__
typedef interface HTMLAnchorEvents HTMLAnchorEvents;
#endif

#ifndef __IHTMLAnchorElement_FWD_DEFINED__
#define __IHTMLAnchorElement_FWD_DEFINED__
typedef interface IHTMLAnchorElement IHTMLAnchorElement;
#endif

#ifndef __IHTMLAnchorElement2_FWD_DEFINED__
#define __IHTMLAnchorElement2_FWD_DEFINED__
typedef interface IHTMLAnchorElement2 IHTMLAnchorElement2;
#endif

#ifndef __IHTMLAnchorElement3_FWD_DEFINED__
#define __IHTMLAnchorElement3_FWD_DEFINED__
typedef interface IHTMLAnchorElement3 IHTMLAnchorElement3;
#endif

#ifndef __DispHTMLAnchorElement_FWD_DEFINED__
#define __DispHTMLAnchorElement_FWD_DEFINED__
typedef interface DispHTMLAnchorElement DispHTMLAnchorElement;
#endif

#ifndef __HTMLAnchorElement_FWD_DEFINED__
#define __HTMLAnchorElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLAnchorElement HTMLAnchorElement;
#else
typedef struct HTMLAnchorElement HTMLAnchorElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLAnchorElement_FWD_DEFINED__ */

#ifndef __HTMLLabelEvents2_FWD_DEFINED__
#define __HTMLLabelEvents2_FWD_DEFINED__
typedef interface HTMLLabelEvents2 HTMLLabelEvents2;
#endif

#ifndef __HTMLLabelEvents_FWD_DEFINED__
#define __HTMLLabelEvents_FWD_DEFINED__
typedef interface HTMLLabelEvents HTMLLabelEvents;
#endif

#ifndef __IHTMLLabelElement_FWD_DEFINED__
#define __IHTMLLabelElement_FWD_DEFINED__
typedef interface IHTMLLabelElement IHTMLLabelElement;
#endif

#ifndef __IHTMLLabelElement2_FWD_DEFINED__
#define __IHTMLLabelElement2_FWD_DEFINED__
typedef interface IHTMLLabelElement2 IHTMLLabelElement2;
#endif

#ifndef __DispHTMLLabelElement_FWD_DEFINED__
#define __DispHTMLLabelElement_FWD_DEFINED__
typedef interface DispHTMLLabelElement DispHTMLLabelElement;
#endif

#ifndef __HTMLLabelElement_FWD_DEFINED__
#define __HTMLLabelElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLLabelElement HTMLLabelElement;
#else
typedef struct HTMLLabelElement HTMLLabelElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLLabelElement_FWD_DEFINED__ */

#ifndef __IHTMLListElement_FWD_DEFINED__
#define __IHTMLListElement_FWD_DEFINED__
typedef interface IHTMLListElement IHTMLListElement;
#endif

#ifndef __IHTMLListElement2_FWD_DEFINED__
#define __IHTMLListElement2_FWD_DEFINED__
typedef interface IHTMLListElement2 IHTMLListElement2;
#endif

#ifndef __DispHTMLListElement_FWD_DEFINED__
#define __DispHTMLListElement_FWD_DEFINED__
typedef interface DispHTMLListElement DispHTMLListElement;
#endif

#ifndef __HTMLListElement_FWD_DEFINED__
#define __HTMLListElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLListElement HTMLListElement;
#else
typedef struct HTMLListElement HTMLListElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLListElement_FWD_DEFINED__ */

#ifndef __IHTMLUListElement_FWD_DEFINED__
#define __IHTMLUListElement_FWD_DEFINED__
typedef interface IHTMLUListElement IHTMLUListElement;
#endif

#ifndef __DispHTMLUListElement_FWD_DEFINED__
#define __DispHTMLUListElement_FWD_DEFINED__
typedef interface DispHTMLUListElement DispHTMLUListElement;
#endif

#ifndef __HTMLUListElement_FWD_DEFINED__
#define __HTMLUListElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLUListElement HTMLUListElement;
#else
typedef struct HTMLUListElement HTMLUListElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLUListElement_FWD_DEFINED__ */

#ifndef __IHTMLOListElement_FWD_DEFINED__
#define __IHTMLOListElement_FWD_DEFINED__
typedef interface IHTMLOListElement IHTMLOListElement;
#endif

#ifndef __DispHTMLOListElement_FWD_DEFINED__
#define __DispHTMLOListElement_FWD_DEFINED__
typedef interface DispHTMLOListElement DispHTMLOListElement;
#endif

#ifndef __HTMLOListElement_FWD_DEFINED__
#define __HTMLOListElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLOListElement HTMLOListElement;
#else
typedef struct HTMLOListElement HTMLOListElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLOListElement_FWD_DEFINED__ */

#ifndef __IHTMLLIElement_FWD_DEFINED__
#define __IHTMLLIElement_FWD_DEFINED__
typedef interface IHTMLLIElement IHTMLLIElement;
#endif

#ifndef __DispHTMLLIElement_FWD_DEFINED__
#define __DispHTMLLIElement_FWD_DEFINED__
typedef interface DispHTMLLIElement DispHTMLLIElement;
#endif

#ifndef __HTMLLIElement_FWD_DEFINED__
#define __HTMLLIElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLLIElement HTMLLIElement;
#else
typedef struct HTMLLIElement HTMLLIElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLLIElement_FWD_DEFINED__ */

#ifndef __IHTMLBlockElement_FWD_DEFINED__
#define __IHTMLBlockElement_FWD_DEFINED__
typedef interface IHTMLBlockElement IHTMLBlockElement;
#endif

#ifndef __IHTMLBlockElement2_FWD_DEFINED__
#define __IHTMLBlockElement2_FWD_DEFINED__
typedef interface IHTMLBlockElement2 IHTMLBlockElement2;
#endif

#ifndef __IHTMLBlockElement3_FWD_DEFINED__
#define __IHTMLBlockElement3_FWD_DEFINED__
typedef interface IHTMLBlockElement3 IHTMLBlockElement3;
#endif

#ifndef __DispHTMLBlockElement_FWD_DEFINED__
#define __DispHTMLBlockElement_FWD_DEFINED__
typedef interface DispHTMLBlockElement DispHTMLBlockElement;
#endif

#ifndef __HTMLBlockElement_FWD_DEFINED__
#define __HTMLBlockElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLBlockElement HTMLBlockElement;
#else
typedef struct HTMLBlockElement HTMLBlockElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLBlockElement_FWD_DEFINED__ */

#ifndef __IHTMLDivElement_FWD_DEFINED__
#define __IHTMLDivElement_FWD_DEFINED__
typedef interface IHTMLDivElement IHTMLDivElement;
#endif

#ifndef __DispHTMLDivElement_FWD_DEFINED__
#define __DispHTMLDivElement_FWD_DEFINED__
typedef interface DispHTMLDivElement DispHTMLDivElement;
#endif

#ifndef __HTMLDivElement_FWD_DEFINED__
#define __HTMLDivElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLDivElement HTMLDivElement;
#else
typedef struct HTMLDivElement HTMLDivElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLDivElement_FWD_DEFINED__ */

#ifndef __IHTMLDDElement_FWD_DEFINED__
#define __IHTMLDDElement_FWD_DEFINED__
typedef interface IHTMLDDElement IHTMLDDElement;
#endif

#ifndef __DispHTMLDDElement_FWD_DEFINED__
#define __DispHTMLDDElement_FWD_DEFINED__
typedef interface DispHTMLDDElement DispHTMLDDElement;
#endif

#ifndef __HTMLDDElement_FWD_DEFINED__
#define __HTMLDDElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLDDElement HTMLDDElement;
#else
typedef struct HTMLDDElement HTMLDDElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLDDElement_FWD_DEFINED__ */

#ifndef __IHTMLDTElement_FWD_DEFINED__
#define __IHTMLDTElement_FWD_DEFINED__
typedef interface IHTMLDTElement IHTMLDTElement;
#endif

#ifndef __DispHTMLDTElement_FWD_DEFINED__
#define __DispHTMLDTElement_FWD_DEFINED__
typedef interface DispHTMLDTElement DispHTMLDTElement;
#endif

#ifndef __HTMLDTElement_FWD_DEFINED__
#define __HTMLDTElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLDTElement HTMLDTElement;
#else
typedef struct HTMLDTElement HTMLDTElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLDTElement_FWD_DEFINED__ */

#ifndef __IHTMLBRElement_FWD_DEFINED__
#define __IHTMLBRElement_FWD_DEFINED__
typedef interface IHTMLBRElement IHTMLBRElement;
#endif

#ifndef __DispHTMLBRElement_FWD_DEFINED__
#define __DispHTMLBRElement_FWD_DEFINED__
typedef interface DispHTMLBRElement DispHTMLBRElement;
#endif

#ifndef __HTMLBRElement_FWD_DEFINED__
#define __HTMLBRElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLBRElement HTMLBRElement;
#else
typedef struct HTMLBRElement HTMLBRElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLBRElement_FWD_DEFINED__ */

#ifndef __IHTMLDListElement_FWD_DEFINED__
#define __IHTMLDListElement_FWD_DEFINED__
typedef interface IHTMLDListElement IHTMLDListElement;
#endif

#ifndef __DispHTMLDListElement_FWD_DEFINED__
#define __DispHTMLDListElement_FWD_DEFINED__
typedef interface DispHTMLDListElement DispHTMLDListElement;
#endif

#ifndef __HTMLDListElement_FWD_DEFINED__
#define __HTMLDListElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLDListElement HTMLDListElement;
#else
typedef struct HTMLDListElement HTMLDListElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLDListElement_FWD_DEFINED__ */

#ifndef __IHTMLHRElement_FWD_DEFINED__
#define __IHTMLHRElement_FWD_DEFINED__
typedef interface IHTMLHRElement IHTMLHRElement;
#endif

#ifndef __DispHTMLHRElement_FWD_DEFINED__
#define __DispHTMLHRElement_FWD_DEFINED__
typedef interface DispHTMLHRElement DispHTMLHRElement;
#endif

#ifndef __HTMLHRElement_FWD_DEFINED__
#define __HTMLHRElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLHRElement HTMLHRElement;
#else
typedef struct HTMLHRElement HTMLHRElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLHRElement_FWD_DEFINED__ */

#ifndef __IHTMLParaElement_FWD_DEFINED__
#define __IHTMLParaElement_FWD_DEFINED__
typedef interface IHTMLParaElement IHTMLParaElement;
#endif

#ifndef __DispHTMLParaElement_FWD_DEFINED__
#define __DispHTMLParaElement_FWD_DEFINED__
typedef interface DispHTMLParaElement DispHTMLParaElement;
#endif

#ifndef __HTMLParaElement_FWD_DEFINED__
#define __HTMLParaElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLParaElement HTMLParaElement;
#else
typedef struct HTMLParaElement HTMLParaElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLParaElement_FWD_DEFINED__ */

#ifndef __IHTMLElementCollection_FWD_DEFINED__
#define __IHTMLElementCollection_FWD_DEFINED__
typedef interface IHTMLElementCollection IHTMLElementCollection;
#endif

#ifndef __IHTMLElementCollection2_FWD_DEFINED__
#define __IHTMLElementCollection2_FWD_DEFINED__
typedef interface IHTMLElementCollection2 IHTMLElementCollection2;
#endif

#ifndef __IHTMLElementCollection3_FWD_DEFINED__
#define __IHTMLElementCollection3_FWD_DEFINED__
typedef interface IHTMLElementCollection3 IHTMLElementCollection3;
#endif

#ifndef __IHTMLElementCollection4_FWD_DEFINED__
#define __IHTMLElementCollection4_FWD_DEFINED__
typedef interface IHTMLElementCollection4 IHTMLElementCollection4;
#endif

#ifndef __DispHTMLElementCollection_FWD_DEFINED__
#define __DispHTMLElementCollection_FWD_DEFINED__
typedef interface DispHTMLElementCollection DispHTMLElementCollection;
#endif

#ifndef __HTMLElementCollection_FWD_DEFINED__
#define __HTMLElementCollection_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLElementCollection HTMLElementCollection;
#else
typedef struct HTMLElementCollection HTMLElementCollection;
#endif /* defined __cplusplus */
#endif /* defined __HTMLElementCollection_FWD_DEFINED__ */

#ifndef __IHTMLHeaderElement_FWD_DEFINED__
#define __IHTMLHeaderElement_FWD_DEFINED__
typedef interface IHTMLHeaderElement IHTMLHeaderElement;
#endif

#ifndef __DispHTMLHeaderElement_FWD_DEFINED__
#define __DispHTMLHeaderElement_FWD_DEFINED__
typedef interface DispHTMLHeaderElement DispHTMLHeaderElement;
#endif

#ifndef __HTMLHeaderElement_FWD_DEFINED__
#define __HTMLHeaderElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLHeaderElement HTMLHeaderElement;
#else
typedef struct HTMLHeaderElement HTMLHeaderElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLHeaderElement_FWD_DEFINED__ */

#ifndef __HTMLSelectElementEvents2_FWD_DEFINED__
#define __HTMLSelectElementEvents2_FWD_DEFINED__
typedef interface HTMLSelectElementEvents2 HTMLSelectElementEvents2;
#endif

#ifndef __HTMLSelectElementEvents_FWD_DEFINED__
#define __HTMLSelectElementEvents_FWD_DEFINED__
typedef interface HTMLSelectElementEvents HTMLSelectElementEvents;
#endif

#ifndef __IHTMLSelectElementEx_FWD_DEFINED__
#define __IHTMLSelectElementEx_FWD_DEFINED__
typedef interface IHTMLSelectElementEx IHTMLSelectElementEx;
#endif

#ifndef __IHTMLSelectElement_FWD_DEFINED__
#define __IHTMLSelectElement_FWD_DEFINED__
typedef interface IHTMLSelectElement IHTMLSelectElement;
#endif

#ifndef __IHTMLSelectElement2_FWD_DEFINED__
#define __IHTMLSelectElement2_FWD_DEFINED__
typedef interface IHTMLSelectElement2 IHTMLSelectElement2;
#endif

#ifndef __IHTMLSelectElement4_FWD_DEFINED__
#define __IHTMLSelectElement4_FWD_DEFINED__
typedef interface IHTMLSelectElement4 IHTMLSelectElement4;
#endif

#ifndef __IHTMLSelectElement5_FWD_DEFINED__
#define __IHTMLSelectElement5_FWD_DEFINED__
typedef interface IHTMLSelectElement5 IHTMLSelectElement5;
#endif

#ifndef __IHTMLSelectElement6_FWD_DEFINED__
#define __IHTMLSelectElement6_FWD_DEFINED__
typedef interface IHTMLSelectElement6 IHTMLSelectElement6;
#endif

#ifndef __DispHTMLSelectElement_FWD_DEFINED__
#define __DispHTMLSelectElement_FWD_DEFINED__
typedef interface DispHTMLSelectElement DispHTMLSelectElement;
#endif

#ifndef __HTMLSelectElement_FWD_DEFINED__
#define __HTMLSelectElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLSelectElement HTMLSelectElement;
#else
typedef struct HTMLSelectElement HTMLSelectElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLSelectElement_FWD_DEFINED__ */

#ifndef __DispHTMLWndSelectElement_FWD_DEFINED__
#define __DispHTMLWndSelectElement_FWD_DEFINED__
typedef interface DispHTMLWndSelectElement DispHTMLWndSelectElement;
#endif

#ifndef __HTMLWndSelectElement_FWD_DEFINED__
#define __HTMLWndSelectElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLWndSelectElement HTMLWndSelectElement;
#else
typedef struct HTMLWndSelectElement HTMLWndSelectElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLWndSelectElement_FWD_DEFINED__ */

#ifndef __IHTMLSelectionObject_FWD_DEFINED__
#define __IHTMLSelectionObject_FWD_DEFINED__
typedef interface IHTMLSelectionObject IHTMLSelectionObject;
#endif

#ifndef __IHTMLSelectionObject2_FWD_DEFINED__
#define __IHTMLSelectionObject2_FWD_DEFINED__
typedef interface IHTMLSelectionObject2 IHTMLSelectionObject2;
#endif

#ifndef __IHTMLSelection_FWD_DEFINED__
#define __IHTMLSelection_FWD_DEFINED__
typedef interface IHTMLSelection IHTMLSelection;
#endif

#ifndef __IHTMLOptionElement_FWD_DEFINED__
#define __IHTMLOptionElement_FWD_DEFINED__
typedef interface IHTMLOptionElement IHTMLOptionElement;
#endif

#ifndef __IHTMLOptionElement3_FWD_DEFINED__
#define __IHTMLOptionElement3_FWD_DEFINED__
typedef interface IHTMLOptionElement3 IHTMLOptionElement3;
#endif

#ifndef __IHTMLOptionElement4_FWD_DEFINED__
#define __IHTMLOptionElement4_FWD_DEFINED__
typedef interface IHTMLOptionElement4 IHTMLOptionElement4;
#endif

#ifndef __IHTMLOptionElementFactory_FWD_DEFINED__
#define __IHTMLOptionElementFactory_FWD_DEFINED__
typedef interface IHTMLOptionElementFactory IHTMLOptionElementFactory;
#endif

#ifndef __DispHTMLOptionElement_FWD_DEFINED__
#define __DispHTMLOptionElement_FWD_DEFINED__
typedef interface DispHTMLOptionElement DispHTMLOptionElement;
#endif

#ifndef __HTMLOptionElement_FWD_DEFINED__
#define __HTMLOptionElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLOptionElement HTMLOptionElement;
#else
typedef struct HTMLOptionElement HTMLOptionElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLOptionElement_FWD_DEFINED__ */

#ifndef __HTMLOptionElementFactory_FWD_DEFINED__
#define __HTMLOptionElementFactory_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLOptionElementFactory HTMLOptionElementFactory;
#else
typedef struct HTMLOptionElementFactory HTMLOptionElementFactory;
#endif /* defined __cplusplus */
#endif /* defined __HTMLOptionElementFactory_FWD_DEFINED__ */

#ifndef __DispHTMLWndOptionElement_FWD_DEFINED__
#define __DispHTMLWndOptionElement_FWD_DEFINED__
typedef interface DispHTMLWndOptionElement DispHTMLWndOptionElement;
#endif

#ifndef __HTMLWndOptionElement_FWD_DEFINED__
#define __HTMLWndOptionElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLWndOptionElement HTMLWndOptionElement;
#else
typedef struct HTMLWndOptionElement HTMLWndOptionElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLWndOptionElement_FWD_DEFINED__ */

#ifndef __HTMLButtonElementEvents2_FWD_DEFINED__
#define __HTMLButtonElementEvents2_FWD_DEFINED__
typedef interface HTMLButtonElementEvents2 HTMLButtonElementEvents2;
#endif

#ifndef __HTMLButtonElementEvents_FWD_DEFINED__
#define __HTMLButtonElementEvents_FWD_DEFINED__
typedef interface HTMLButtonElementEvents HTMLButtonElementEvents;
#endif

#ifndef __HTMLInputTextElementEvents2_FWD_DEFINED__
#define __HTMLInputTextElementEvents2_FWD_DEFINED__
typedef interface HTMLInputTextElementEvents2 HTMLInputTextElementEvents2;
#endif

#ifndef __HTMLOptionButtonElementEvents2_FWD_DEFINED__
#define __HTMLOptionButtonElementEvents2_FWD_DEFINED__
typedef interface HTMLOptionButtonElementEvents2 HTMLOptionButtonElementEvents2;
#endif

#ifndef __HTMLInputFileElementEvents2_FWD_DEFINED__
#define __HTMLInputFileElementEvents2_FWD_DEFINED__
typedef interface HTMLInputFileElementEvents2 HTMLInputFileElementEvents2;
#endif

#ifndef __HTMLInputImageEvents2_FWD_DEFINED__
#define __HTMLInputImageEvents2_FWD_DEFINED__
typedef interface HTMLInputImageEvents2 HTMLInputImageEvents2;
#endif

#ifndef __HTMLInputTextElementEvents_FWD_DEFINED__
#define __HTMLInputTextElementEvents_FWD_DEFINED__
typedef interface HTMLInputTextElementEvents HTMLInputTextElementEvents;
#endif

#ifndef __HTMLOptionButtonElementEvents_FWD_DEFINED__
#define __HTMLOptionButtonElementEvents_FWD_DEFINED__
typedef interface HTMLOptionButtonElementEvents HTMLOptionButtonElementEvents;
#endif

#ifndef __HTMLInputFileElementEvents_FWD_DEFINED__
#define __HTMLInputFileElementEvents_FWD_DEFINED__
typedef interface HTMLInputFileElementEvents HTMLInputFileElementEvents;
#endif

#ifndef __HTMLInputImageEvents_FWD_DEFINED__
#define __HTMLInputImageEvents_FWD_DEFINED__
typedef interface HTMLInputImageEvents HTMLInputImageEvents;
#endif

#ifndef __IHTMLInputElement_FWD_DEFINED__
#define __IHTMLInputElement_FWD_DEFINED__
typedef interface IHTMLInputElement IHTMLInputElement;
#endif

#ifndef __IHTMLInputElement2_FWD_DEFINED__
#define __IHTMLInputElement2_FWD_DEFINED__
typedef interface IHTMLInputElement2 IHTMLInputElement2;
#endif

#ifndef __IHTMLInputElement3_FWD_DEFINED__
#define __IHTMLInputElement3_FWD_DEFINED__
typedef interface IHTMLInputElement3 IHTMLInputElement3;
#endif

#ifndef __IHTMLInputButtonElement_FWD_DEFINED__
#define __IHTMLInputButtonElement_FWD_DEFINED__
typedef interface IHTMLInputButtonElement IHTMLInputButtonElement;
#endif

#ifndef __IHTMLInputHiddenElement_FWD_DEFINED__
#define __IHTMLInputHiddenElement_FWD_DEFINED__
typedef interface IHTMLInputHiddenElement IHTMLInputHiddenElement;
#endif

#ifndef __IHTMLInputTextElement_FWD_DEFINED__
#define __IHTMLInputTextElement_FWD_DEFINED__
typedef interface IHTMLInputTextElement IHTMLInputTextElement;
#endif

#ifndef __IHTMLInputTextElement2_FWD_DEFINED__
#define __IHTMLInputTextElement2_FWD_DEFINED__
typedef interface IHTMLInputTextElement2 IHTMLInputTextElement2;
#endif

#ifndef __IHTMLInputFileElement_FWD_DEFINED__
#define __IHTMLInputFileElement_FWD_DEFINED__
typedef interface IHTMLInputFileElement IHTMLInputFileElement;
#endif

#ifndef __IHTMLOptionButtonElement_FWD_DEFINED__
#define __IHTMLOptionButtonElement_FWD_DEFINED__
typedef interface IHTMLOptionButtonElement IHTMLOptionButtonElement;
#endif

#ifndef __IHTMLInputImage_FWD_DEFINED__
#define __IHTMLInputImage_FWD_DEFINED__
typedef interface IHTMLInputImage IHTMLInputImage;
#endif

#ifndef __IHTMLInputRangeElement_FWD_DEFINED__
#define __IHTMLInputRangeElement_FWD_DEFINED__
typedef interface IHTMLInputRangeElement IHTMLInputRangeElement;
#endif

#ifndef __DispHTMLInputElement_FWD_DEFINED__
#define __DispHTMLInputElement_FWD_DEFINED__
typedef interface DispHTMLInputElement DispHTMLInputElement;
#endif

#ifndef __HTMLInputElement_FWD_DEFINED__
#define __HTMLInputElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLInputElement HTMLInputElement;
#else
typedef struct HTMLInputElement HTMLInputElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLInputElement_FWD_DEFINED__ */

#ifndef __IHTMLTextAreaElement_FWD_DEFINED__
#define __IHTMLTextAreaElement_FWD_DEFINED__
typedef interface IHTMLTextAreaElement IHTMLTextAreaElement;
#endif

#ifndef __IHTMLTextAreaElement2_FWD_DEFINED__
#define __IHTMLTextAreaElement2_FWD_DEFINED__
typedef interface IHTMLTextAreaElement2 IHTMLTextAreaElement2;
#endif

#ifndef __DispHTMLTextAreaElement_FWD_DEFINED__
#define __DispHTMLTextAreaElement_FWD_DEFINED__
typedef interface DispHTMLTextAreaElement DispHTMLTextAreaElement;
#endif

#ifndef __HTMLTextAreaElement_FWD_DEFINED__
#define __HTMLTextAreaElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLTextAreaElement HTMLTextAreaElement;
#else
typedef struct HTMLTextAreaElement HTMLTextAreaElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLTextAreaElement_FWD_DEFINED__ */

#ifndef __DispHTMLRichtextElement_FWD_DEFINED__
#define __DispHTMLRichtextElement_FWD_DEFINED__
typedef interface DispHTMLRichtextElement DispHTMLRichtextElement;
#endif

#ifndef __HTMLRichtextElement_FWD_DEFINED__
#define __HTMLRichtextElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLRichtextElement HTMLRichtextElement;
#else
typedef struct HTMLRichtextElement HTMLRichtextElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLRichtextElement_FWD_DEFINED__ */

#ifndef __IHTMLButtonElement_FWD_DEFINED__
#define __IHTMLButtonElement_FWD_DEFINED__
typedef interface IHTMLButtonElement IHTMLButtonElement;
#endif

#ifndef __IHTMLButtonElement2_FWD_DEFINED__
#define __IHTMLButtonElement2_FWD_DEFINED__
typedef interface IHTMLButtonElement2 IHTMLButtonElement2;
#endif

#ifndef __DispHTMLButtonElement_FWD_DEFINED__
#define __DispHTMLButtonElement_FWD_DEFINED__
typedef interface DispHTMLButtonElement DispHTMLButtonElement;
#endif

#ifndef __HTMLButtonElement_FWD_DEFINED__
#define __HTMLButtonElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLButtonElement HTMLButtonElement;
#else
typedef struct HTMLButtonElement HTMLButtonElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLButtonElement_FWD_DEFINED__ */

#ifndef __HTMLMarqueeElementEvents2_FWD_DEFINED__
#define __HTMLMarqueeElementEvents2_FWD_DEFINED__
typedef interface HTMLMarqueeElementEvents2 HTMLMarqueeElementEvents2;
#endif

#ifndef __HTMLMarqueeElementEvents_FWD_DEFINED__
#define __HTMLMarqueeElementEvents_FWD_DEFINED__
typedef interface HTMLMarqueeElementEvents HTMLMarqueeElementEvents;
#endif

#ifndef __IHTMLMarqueeElement_FWD_DEFINED__
#define __IHTMLMarqueeElement_FWD_DEFINED__
typedef interface IHTMLMarqueeElement IHTMLMarqueeElement;
#endif

#ifndef __DispHTMLMarqueeElement_FWD_DEFINED__
#define __DispHTMLMarqueeElement_FWD_DEFINED__
typedef interface DispHTMLMarqueeElement DispHTMLMarqueeElement;
#endif

#ifndef __HTMLMarqueeElement_FWD_DEFINED__
#define __HTMLMarqueeElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLMarqueeElement HTMLMarqueeElement;
#else
typedef struct HTMLMarqueeElement HTMLMarqueeElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLMarqueeElement_FWD_DEFINED__ */

#ifndef __IHTMLHtmlElement_FWD_DEFINED__
#define __IHTMLHtmlElement_FWD_DEFINED__
typedef interface IHTMLHtmlElement IHTMLHtmlElement;
#endif

#ifndef __IHTMLHeadElement_FWD_DEFINED__
#define __IHTMLHeadElement_FWD_DEFINED__
typedef interface IHTMLHeadElement IHTMLHeadElement;
#endif

#ifndef __IHTMLHeadElement2_FWD_DEFINED__
#define __IHTMLHeadElement2_FWD_DEFINED__
typedef interface IHTMLHeadElement2 IHTMLHeadElement2;
#endif

#ifndef __IHTMLTitleElement_FWD_DEFINED__
#define __IHTMLTitleElement_FWD_DEFINED__
typedef interface IHTMLTitleElement IHTMLTitleElement;
#endif

#ifndef __IHTMLMetaElement_FWD_DEFINED__
#define __IHTMLMetaElement_FWD_DEFINED__
typedef interface IHTMLMetaElement IHTMLMetaElement;
#endif

#ifndef __IHTMLMetaElement2_FWD_DEFINED__
#define __IHTMLMetaElement2_FWD_DEFINED__
typedef interface IHTMLMetaElement2 IHTMLMetaElement2;
#endif

#ifndef __IHTMLMetaElement3_FWD_DEFINED__
#define __IHTMLMetaElement3_FWD_DEFINED__
typedef interface IHTMLMetaElement3 IHTMLMetaElement3;
#endif

#ifndef __IHTMLBaseElement_FWD_DEFINED__
#define __IHTMLBaseElement_FWD_DEFINED__
typedef interface IHTMLBaseElement IHTMLBaseElement;
#endif

#ifndef __IHTMLBaseElement2_FWD_DEFINED__
#define __IHTMLBaseElement2_FWD_DEFINED__
typedef interface IHTMLBaseElement2 IHTMLBaseElement2;
#endif

#ifndef __IHTMLIsIndexElement_FWD_DEFINED__
#define __IHTMLIsIndexElement_FWD_DEFINED__
typedef interface IHTMLIsIndexElement IHTMLIsIndexElement;
#endif

#ifndef __IHTMLIsIndexElement2_FWD_DEFINED__
#define __IHTMLIsIndexElement2_FWD_DEFINED__
typedef interface IHTMLIsIndexElement2 IHTMLIsIndexElement2;
#endif

#ifndef __IHTMLNextIdElement_FWD_DEFINED__
#define __IHTMLNextIdElement_FWD_DEFINED__
typedef interface IHTMLNextIdElement IHTMLNextIdElement;
#endif

#ifndef __DispHTMLHtmlElement_FWD_DEFINED__
#define __DispHTMLHtmlElement_FWD_DEFINED__
typedef interface DispHTMLHtmlElement DispHTMLHtmlElement;
#endif

#ifndef __HTMLHtmlElement_FWD_DEFINED__
#define __HTMLHtmlElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLHtmlElement HTMLHtmlElement;
#else
typedef struct HTMLHtmlElement HTMLHtmlElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLHtmlElement_FWD_DEFINED__ */

#ifndef __DispHTMLHeadElement_FWD_DEFINED__
#define __DispHTMLHeadElement_FWD_DEFINED__
typedef interface DispHTMLHeadElement DispHTMLHeadElement;
#endif

#ifndef __HTMLHeadElement_FWD_DEFINED__
#define __HTMLHeadElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLHeadElement HTMLHeadElement;
#else
typedef struct HTMLHeadElement HTMLHeadElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLHeadElement_FWD_DEFINED__ */

#ifndef __DispHTMLTitleElement_FWD_DEFINED__
#define __DispHTMLTitleElement_FWD_DEFINED__
typedef interface DispHTMLTitleElement DispHTMLTitleElement;
#endif

#ifndef __HTMLTitleElement_FWD_DEFINED__
#define __HTMLTitleElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLTitleElement HTMLTitleElement;
#else
typedef struct HTMLTitleElement HTMLTitleElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLTitleElement_FWD_DEFINED__ */

#ifndef __DispHTMLMetaElement_FWD_DEFINED__
#define __DispHTMLMetaElement_FWD_DEFINED__
typedef interface DispHTMLMetaElement DispHTMLMetaElement;
#endif

#ifndef __HTMLMetaElement_FWD_DEFINED__
#define __HTMLMetaElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLMetaElement HTMLMetaElement;
#else
typedef struct HTMLMetaElement HTMLMetaElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLMetaElement_FWD_DEFINED__ */

#ifndef __DispHTMLBaseElement_FWD_DEFINED__
#define __DispHTMLBaseElement_FWD_DEFINED__
typedef interface DispHTMLBaseElement DispHTMLBaseElement;
#endif

#ifndef __HTMLBaseElement_FWD_DEFINED__
#define __HTMLBaseElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLBaseElement HTMLBaseElement;
#else
typedef struct HTMLBaseElement HTMLBaseElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLBaseElement_FWD_DEFINED__ */

#ifndef __DispHTMLIsIndexElement_FWD_DEFINED__
#define __DispHTMLIsIndexElement_FWD_DEFINED__
typedef interface DispHTMLIsIndexElement DispHTMLIsIndexElement;
#endif

#ifndef __HTMLIsIndexElement_FWD_DEFINED__
#define __HTMLIsIndexElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLIsIndexElement HTMLIsIndexElement;
#else
typedef struct HTMLIsIndexElement HTMLIsIndexElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLIsIndexElement_FWD_DEFINED__ */

#ifndef __DispHTMLNextIdElement_FWD_DEFINED__
#define __DispHTMLNextIdElement_FWD_DEFINED__
typedef interface DispHTMLNextIdElement DispHTMLNextIdElement;
#endif

#ifndef __HTMLNextIdElement_FWD_DEFINED__
#define __HTMLNextIdElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLNextIdElement HTMLNextIdElement;
#else
typedef struct HTMLNextIdElement HTMLNextIdElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLNextIdElement_FWD_DEFINED__ */

#ifndef __IHTMLBaseFontElement_FWD_DEFINED__
#define __IHTMLBaseFontElement_FWD_DEFINED__
typedef interface IHTMLBaseFontElement IHTMLBaseFontElement;
#endif

#ifndef __DispHTMLBaseFontElement_FWD_DEFINED__
#define __DispHTMLBaseFontElement_FWD_DEFINED__
typedef interface DispHTMLBaseFontElement DispHTMLBaseFontElement;
#endif

#ifndef __HTMLBaseFontElement_FWD_DEFINED__
#define __HTMLBaseFontElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLBaseFontElement HTMLBaseFontElement;
#else
typedef struct HTMLBaseFontElement HTMLBaseFontElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLBaseFontElement_FWD_DEFINED__ */

#ifndef __IHTMLUnknownElement_FWD_DEFINED__
#define __IHTMLUnknownElement_FWD_DEFINED__
typedef interface IHTMLUnknownElement IHTMLUnknownElement;
#endif

#ifndef __DispHTMLUnknownElement_FWD_DEFINED__
#define __DispHTMLUnknownElement_FWD_DEFINED__
typedef interface DispHTMLUnknownElement DispHTMLUnknownElement;
#endif

#ifndef __HTMLUnknownElement_FWD_DEFINED__
#define __HTMLUnknownElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLUnknownElement HTMLUnknownElement;
#else
typedef struct HTMLUnknownElement HTMLUnknownElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLUnknownElement_FWD_DEFINED__ */

#ifndef __IOmHistory_FWD_DEFINED__
#define __IOmHistory_FWD_DEFINED__
typedef interface IOmHistory IOmHistory;
#endif

#ifndef __IHTMLMimeTypesCollection_FWD_DEFINED__
#define __IHTMLMimeTypesCollection_FWD_DEFINED__
typedef interface IHTMLMimeTypesCollection IHTMLMimeTypesCollection;
#endif

#ifndef __IHTMLPluginsCollection_FWD_DEFINED__
#define __IHTMLPluginsCollection_FWD_DEFINED__
typedef interface IHTMLPluginsCollection IHTMLPluginsCollection;
#endif

#ifndef __IHTMLOpsProfile_FWD_DEFINED__
#define __IHTMLOpsProfile_FWD_DEFINED__
typedef interface IHTMLOpsProfile IHTMLOpsProfile;
#endif

#ifndef __IOmNavigator_FWD_DEFINED__
#define __IOmNavigator_FWD_DEFINED__
typedef interface IOmNavigator IOmNavigator;
#endif

#ifndef __INavigatorGeolocation_FWD_DEFINED__
#define __INavigatorGeolocation_FWD_DEFINED__
typedef interface INavigatorGeolocation INavigatorGeolocation;
#endif

#ifndef __INavigatorDoNotTrack_FWD_DEFINED__
#define __INavigatorDoNotTrack_FWD_DEFINED__
typedef interface INavigatorDoNotTrack INavigatorDoNotTrack;
#endif

#ifndef __IHTMLLocation_FWD_DEFINED__
#define __IHTMLLocation_FWD_DEFINED__
typedef interface IHTMLLocation IHTMLLocation;
#endif

#ifndef __DispHTMLHistory_FWD_DEFINED__
#define __DispHTMLHistory_FWD_DEFINED__
typedef interface DispHTMLHistory DispHTMLHistory;
#endif

#ifndef __HTMLHistory_FWD_DEFINED__
#define __HTMLHistory_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLHistory HTMLHistory;
#else
typedef struct HTMLHistory HTMLHistory;
#endif /* defined __cplusplus */
#endif /* defined __HTMLHistory_FWD_DEFINED__ */

#ifndef __CMimeTypes_FWD_DEFINED__
#define __CMimeTypes_FWD_DEFINED__
#ifdef __cplusplus
typedef class CMimeTypes CMimeTypes;
#else
typedef struct CMimeTypes CMimeTypes;
#endif /* defined __cplusplus */
#endif /* defined __CMimeTypes_FWD_DEFINED__ */

#ifndef __DispCPlugins_FWD_DEFINED__
#define __DispCPlugins_FWD_DEFINED__
typedef interface DispCPlugins DispCPlugins;
#endif

#ifndef __CPlugins_FWD_DEFINED__
#define __CPlugins_FWD_DEFINED__
#ifdef __cplusplus
typedef class CPlugins CPlugins;
#else
typedef struct CPlugins CPlugins;
#endif /* defined __cplusplus */
#endif /* defined __CPlugins_FWD_DEFINED__ */

#ifndef __COpsProfile_FWD_DEFINED__
#define __COpsProfile_FWD_DEFINED__
#ifdef __cplusplus
typedef class COpsProfile COpsProfile;
#else
typedef struct COpsProfile COpsProfile;
#endif /* defined __cplusplus */
#endif /* defined __COpsProfile_FWD_DEFINED__ */

#ifndef __DispHTMLNavigator_FWD_DEFINED__
#define __DispHTMLNavigator_FWD_DEFINED__
typedef interface DispHTMLNavigator DispHTMLNavigator;
#endif

#ifndef __HTMLNavigator_FWD_DEFINED__
#define __HTMLNavigator_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLNavigator HTMLNavigator;
#else
typedef struct HTMLNavigator HTMLNavigator;
#endif /* defined __cplusplus */
#endif /* defined __HTMLNavigator_FWD_DEFINED__ */

#ifndef __DispHTMLLocation_FWD_DEFINED__
#define __DispHTMLLocation_FWD_DEFINED__
typedef interface DispHTMLLocation DispHTMLLocation;
#endif

#ifndef __HTMLLocation_FWD_DEFINED__
#define __HTMLLocation_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLLocation HTMLLocation;
#else
typedef struct HTMLLocation HTMLLocation;
#endif /* defined __cplusplus */
#endif /* defined __HTMLLocation_FWD_DEFINED__ */

#ifndef __IHTMLBookmarkCollection_FWD_DEFINED__
#define __IHTMLBookmarkCollection_FWD_DEFINED__
typedef interface IHTMLBookmarkCollection IHTMLBookmarkCollection;
#endif

#ifndef __IHTMLDataTransfer_FWD_DEFINED__
#define __IHTMLDataTransfer_FWD_DEFINED__
typedef interface IHTMLDataTransfer IHTMLDataTransfer;
#endif

#ifndef __IHTMLEventObj_FWD_DEFINED__
#define __IHTMLEventObj_FWD_DEFINED__
typedef interface IHTMLEventObj IHTMLEventObj;
#endif

#ifndef __IHTMLEventObj2_FWD_DEFINED__
#define __IHTMLEventObj2_FWD_DEFINED__
typedef interface IHTMLEventObj2 IHTMLEventObj2;
#endif

#ifndef __IHTMLEventObj3_FWD_DEFINED__
#define __IHTMLEventObj3_FWD_DEFINED__
typedef interface IHTMLEventObj3 IHTMLEventObj3;
#endif

#ifndef __IHTMLEventObj4_FWD_DEFINED__
#define __IHTMLEventObj4_FWD_DEFINED__
typedef interface IHTMLEventObj4 IHTMLEventObj4;
#endif

#ifndef __IHTMLEventObj5_FWD_DEFINED__
#define __IHTMLEventObj5_FWD_DEFINED__
typedef interface IHTMLEventObj5 IHTMLEventObj5;
#endif

#ifndef __IHTMLEventObj6_FWD_DEFINED__
#define __IHTMLEventObj6_FWD_DEFINED__
typedef interface IHTMLEventObj6 IHTMLEventObj6;
#endif

#ifndef __DispCEventObj_FWD_DEFINED__
#define __DispCEventObj_FWD_DEFINED__
typedef interface DispCEventObj DispCEventObj;
#endif

#ifndef __CEventObj_FWD_DEFINED__
#define __CEventObj_FWD_DEFINED__
#ifdef __cplusplus
typedef class CEventObj CEventObj;
#else
typedef struct CEventObj CEventObj;
#endif /* defined __cplusplus */
#endif /* defined __CEventObj_FWD_DEFINED__ */

#ifndef __IHTMLStyleMedia_FWD_DEFINED__
#define __IHTMLStyleMedia_FWD_DEFINED__
typedef interface IHTMLStyleMedia IHTMLStyleMedia;
#endif

#ifndef __DispHTMLStyleMedia_FWD_DEFINED__
#define __DispHTMLStyleMedia_FWD_DEFINED__
typedef interface DispHTMLStyleMedia DispHTMLStyleMedia;
#endif

#ifndef __HTMLStyleMedia_FWD_DEFINED__
#define __HTMLStyleMedia_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLStyleMedia HTMLStyleMedia;
#else
typedef struct HTMLStyleMedia HTMLStyleMedia;
#endif /* defined __cplusplus */
#endif /* defined __HTMLStyleMedia_FWD_DEFINED__ */

#ifndef __HTMLWindowEvents3_FWD_DEFINED__
#define __HTMLWindowEvents3_FWD_DEFINED__
typedef interface HTMLWindowEvents3 HTMLWindowEvents3;
#endif

#ifndef __HTMLWindowEvents2_FWD_DEFINED__
#define __HTMLWindowEvents2_FWD_DEFINED__
typedef interface HTMLWindowEvents2 HTMLWindowEvents2;
#endif

#ifndef __HTMLWindowEvents_FWD_DEFINED__
#define __HTMLWindowEvents_FWD_DEFINED__
typedef interface HTMLWindowEvents HTMLWindowEvents;
#endif

#ifndef __IHTMLFramesCollection2_FWD_DEFINED__
#define __IHTMLFramesCollection2_FWD_DEFINED__
typedef interface IHTMLFramesCollection2 IHTMLFramesCollection2;
#endif

#ifndef __IHTMLScreen_FWD_DEFINED__
#define __IHTMLScreen_FWD_DEFINED__
typedef interface IHTMLScreen IHTMLScreen;
#endif

#ifndef __IHTMLScreen2_FWD_DEFINED__
#define __IHTMLScreen2_FWD_DEFINED__
typedef interface IHTMLScreen2 IHTMLScreen2;
#endif

#ifndef __IHTMLScreen3_FWD_DEFINED__
#define __IHTMLScreen3_FWD_DEFINED__
typedef interface IHTMLScreen3 IHTMLScreen3;
#endif

#ifndef __IHTMLScreen4_FWD_DEFINED__
#define __IHTMLScreen4_FWD_DEFINED__
typedef interface IHTMLScreen4 IHTMLScreen4;
#endif

#ifndef __IHTMLWindow2_FWD_DEFINED__
#define __IHTMLWindow2_FWD_DEFINED__
typedef interface IHTMLWindow2 IHTMLWindow2;
#endif

#ifndef __IHTMLWindow3_FWD_DEFINED__
#define __IHTMLWindow3_FWD_DEFINED__
typedef interface IHTMLWindow3 IHTMLWindow3;
#endif

#ifndef __IHTMLWindow4_FWD_DEFINED__
#define __IHTMLWindow4_FWD_DEFINED__
typedef interface IHTMLWindow4 IHTMLWindow4;
#endif

#ifndef __IHTMLWindow5_FWD_DEFINED__
#define __IHTMLWindow5_FWD_DEFINED__
typedef interface IHTMLWindow5 IHTMLWindow5;
#endif

#ifndef __IHTMLWindow6_FWD_DEFINED__
#define __IHTMLWindow6_FWD_DEFINED__
typedef interface IHTMLWindow6 IHTMLWindow6;
#endif

#ifndef __IHTMLWindow7_FWD_DEFINED__
#define __IHTMLWindow7_FWD_DEFINED__
typedef interface IHTMLWindow7 IHTMLWindow7;
#endif

#ifndef __IHTMLWindow8_FWD_DEFINED__
#define __IHTMLWindow8_FWD_DEFINED__
typedef interface IHTMLWindow8 IHTMLWindow8;
#endif

#ifndef __FramesCollection_FWD_DEFINED__
#define __FramesCollection_FWD_DEFINED__
#ifdef __cplusplus
typedef class FramesCollection FramesCollection;
#else
typedef struct FramesCollection FramesCollection;
#endif /* defined __cplusplus */
#endif /* defined __FramesCollection_FWD_DEFINED__ */

#ifndef __DispHTMLScreen_FWD_DEFINED__
#define __DispHTMLScreen_FWD_DEFINED__
typedef interface DispHTMLScreen DispHTMLScreen;
#endif

#ifndef __HTMLScreen_FWD_DEFINED__
#define __HTMLScreen_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLScreen HTMLScreen;
#else
typedef struct HTMLScreen HTMLScreen;
#endif /* defined __cplusplus */
#endif /* defined __HTMLScreen_FWD_DEFINED__ */

#ifndef __DispHTMLWindow2_FWD_DEFINED__
#define __DispHTMLWindow2_FWD_DEFINED__
typedef interface DispHTMLWindow2 DispHTMLWindow2;
#endif

#ifndef __HTMLWindow2_FWD_DEFINED__
#define __HTMLWindow2_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLWindow2 HTMLWindow2;
#else
typedef struct HTMLWindow2 HTMLWindow2;
#endif /* defined __cplusplus */
#endif /* defined __HTMLWindow2_FWD_DEFINED__ */

#ifndef __DispHTMLWindowProxy_FWD_DEFINED__
#define __DispHTMLWindowProxy_FWD_DEFINED__
typedef interface DispHTMLWindowProxy DispHTMLWindowProxy;
#endif

#ifndef __HTMLWindowProxy_FWD_DEFINED__
#define __HTMLWindowProxy_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLWindowProxy HTMLWindowProxy;
#else
typedef struct HTMLWindowProxy HTMLWindowProxy;
#endif /* defined __cplusplus */
#endif /* defined __HTMLWindowProxy_FWD_DEFINED__ */

#ifndef __IHTMLDocumentCompatibleInfo_FWD_DEFINED__
#define __IHTMLDocumentCompatibleInfo_FWD_DEFINED__
typedef interface IHTMLDocumentCompatibleInfo IHTMLDocumentCompatibleInfo;
#endif

#ifndef __IHTMLDocumentCompatibleInfoCollection_FWD_DEFINED__
#define __IHTMLDocumentCompatibleInfoCollection_FWD_DEFINED__
typedef interface IHTMLDocumentCompatibleInfoCollection IHTMLDocumentCompatibleInfoCollection;
#endif

#ifndef __DispHTMLDocumentCompatibleInfo_FWD_DEFINED__
#define __DispHTMLDocumentCompatibleInfo_FWD_DEFINED__
typedef interface DispHTMLDocumentCompatibleInfo DispHTMLDocumentCompatibleInfo;
#endif

#ifndef __HTMLDocumentCompatibleInfo_FWD_DEFINED__
#define __HTMLDocumentCompatibleInfo_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLDocumentCompatibleInfo HTMLDocumentCompatibleInfo;
#else
typedef struct HTMLDocumentCompatibleInfo HTMLDocumentCompatibleInfo;
#endif /* defined __cplusplus */
#endif /* defined __HTMLDocumentCompatibleInfo_FWD_DEFINED__ */

#ifndef __DispHTMLDocumentCompatibleInfoCollection_FWD_DEFINED__
#define __DispHTMLDocumentCompatibleInfoCollection_FWD_DEFINED__
typedef interface DispHTMLDocumentCompatibleInfoCollection DispHTMLDocumentCompatibleInfoCollection;
#endif

#ifndef __HTMLDocumentCompatibleInfoCollection_FWD_DEFINED__
#define __HTMLDocumentCompatibleInfoCollection_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLDocumentCompatibleInfoCollection HTMLDocumentCompatibleInfoCollection;
#else
typedef struct HTMLDocumentCompatibleInfoCollection HTMLDocumentCompatibleInfoCollection;
#endif /* defined __cplusplus */
#endif /* defined __HTMLDocumentCompatibleInfoCollection_FWD_DEFINED__ */

#ifndef __HTMLDocumentEvents4_FWD_DEFINED__
#define __HTMLDocumentEvents4_FWD_DEFINED__
typedef interface HTMLDocumentEvents4 HTMLDocumentEvents4;
#endif

#ifndef __HTMLDocumentEvents3_FWD_DEFINED__
#define __HTMLDocumentEvents3_FWD_DEFINED__
typedef interface HTMLDocumentEvents3 HTMLDocumentEvents3;
#endif

#ifndef __HTMLDocumentEvents2_FWD_DEFINED__
#define __HTMLDocumentEvents2_FWD_DEFINED__
typedef interface HTMLDocumentEvents2 HTMLDocumentEvents2;
#endif

#ifndef __HTMLDocumentEvents_FWD_DEFINED__
#define __HTMLDocumentEvents_FWD_DEFINED__
typedef interface HTMLDocumentEvents HTMLDocumentEvents;
#endif

#ifndef __IHTMLDocument_FWD_DEFINED__
#define __IHTMLDocument_FWD_DEFINED__
typedef interface IHTMLDocument IHTMLDocument;
#endif

#ifndef __IHTMLDocument2_FWD_DEFINED__
#define __IHTMLDocument2_FWD_DEFINED__
typedef interface IHTMLDocument2 IHTMLDocument2;
#endif

#ifndef __IHTMLDocument3_FWD_DEFINED__
#define __IHTMLDocument3_FWD_DEFINED__
typedef interface IHTMLDocument3 IHTMLDocument3;
#endif

#ifndef __IHTMLDocument4_FWD_DEFINED__
#define __IHTMLDocument4_FWD_DEFINED__
typedef interface IHTMLDocument4 IHTMLDocument4;
#endif

#ifndef __IHTMLDocument5_FWD_DEFINED__
#define __IHTMLDocument5_FWD_DEFINED__
typedef interface IHTMLDocument5 IHTMLDocument5;
#endif

#ifndef __IHTMLDocument6_FWD_DEFINED__
#define __IHTMLDocument6_FWD_DEFINED__
typedef interface IHTMLDocument6 IHTMLDocument6;
#endif

#ifndef __IHTMLDocument7_FWD_DEFINED__
#define __IHTMLDocument7_FWD_DEFINED__
typedef interface IHTMLDocument7 IHTMLDocument7;
#endif

#ifndef __IHTMLDocument8_FWD_DEFINED__
#define __IHTMLDocument8_FWD_DEFINED__
typedef interface IHTMLDocument8 IHTMLDocument8;
#endif

#ifndef __IDocumentEvent_FWD_DEFINED__
#define __IDocumentEvent_FWD_DEFINED__
typedef interface IDocumentEvent IDocumentEvent;
#endif

#ifndef __IDocumentRange_FWD_DEFINED__
#define __IDocumentRange_FWD_DEFINED__
typedef interface IDocumentRange IDocumentRange;
#endif

#ifndef __IDocumentSelector_FWD_DEFINED__
#define __IDocumentSelector_FWD_DEFINED__
typedef interface IDocumentSelector IDocumentSelector;
#endif

#ifndef __IDocumentTraversal_FWD_DEFINED__
#define __IDocumentTraversal_FWD_DEFINED__
typedef interface IDocumentTraversal IDocumentTraversal;
#endif

#ifndef __DispHTMLDocument_FWD_DEFINED__
#define __DispHTMLDocument_FWD_DEFINED__
typedef interface DispHTMLDocument DispHTMLDocument;
#endif

#ifndef __HTMLDocument_FWD_DEFINED__
#define __HTMLDocument_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLDocument HTMLDocument;
#else
typedef struct HTMLDocument HTMLDocument;
#endif /* defined __cplusplus */
#endif /* defined __HTMLDocument_FWD_DEFINED__ */

#ifndef __DWebBridgeEvents_FWD_DEFINED__
#define __DWebBridgeEvents_FWD_DEFINED__
typedef interface DWebBridgeEvents DWebBridgeEvents;
#endif

#ifndef __IWebBridge_FWD_DEFINED__
#define __IWebBridge_FWD_DEFINED__
typedef interface IWebBridge IWebBridge;
#endif

#ifndef __IWBScriptControl_FWD_DEFINED__
#define __IWBScriptControl_FWD_DEFINED__
typedef interface IWBScriptControl IWBScriptControl;
#endif

#ifndef __Scriptlet_FWD_DEFINED__
#define __Scriptlet_FWD_DEFINED__
#ifdef __cplusplus
typedef class Scriptlet Scriptlet;
#else
typedef struct Scriptlet Scriptlet;
#endif /* defined __cplusplus */
#endif /* defined __Scriptlet_FWD_DEFINED__ */

#ifndef __IHTMLEmbedElement_FWD_DEFINED__
#define __IHTMLEmbedElement_FWD_DEFINED__
typedef interface IHTMLEmbedElement IHTMLEmbedElement;
#endif

#ifndef __IHTMLEmbedElement2_FWD_DEFINED__
#define __IHTMLEmbedElement2_FWD_DEFINED__
typedef interface IHTMLEmbedElement2 IHTMLEmbedElement2;
#endif

#ifndef __DispHTMLEmbed_FWD_DEFINED__
#define __DispHTMLEmbed_FWD_DEFINED__
typedef interface DispHTMLEmbed DispHTMLEmbed;
#endif

#ifndef __HTMLEmbed_FWD_DEFINED__
#define __HTMLEmbed_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLEmbed HTMLEmbed;
#else
typedef struct HTMLEmbed HTMLEmbed;
#endif /* defined __cplusplus */
#endif /* defined __HTMLEmbed_FWD_DEFINED__ */

#ifndef __HTMLMapEvents2_FWD_DEFINED__
#define __HTMLMapEvents2_FWD_DEFINED__
typedef interface HTMLMapEvents2 HTMLMapEvents2;
#endif

#ifndef __HTMLMapEvents_FWD_DEFINED__
#define __HTMLMapEvents_FWD_DEFINED__
typedef interface HTMLMapEvents HTMLMapEvents;
#endif

#ifndef __IHTMLAreasCollection_FWD_DEFINED__
#define __IHTMLAreasCollection_FWD_DEFINED__
typedef interface IHTMLAreasCollection IHTMLAreasCollection;
#endif

#ifndef __IHTMLAreasCollection2_FWD_DEFINED__
#define __IHTMLAreasCollection2_FWD_DEFINED__
typedef interface IHTMLAreasCollection2 IHTMLAreasCollection2;
#endif

#ifndef __IHTMLAreasCollection3_FWD_DEFINED__
#define __IHTMLAreasCollection3_FWD_DEFINED__
typedef interface IHTMLAreasCollection3 IHTMLAreasCollection3;
#endif

#ifndef __IHTMLAreasCollection4_FWD_DEFINED__
#define __IHTMLAreasCollection4_FWD_DEFINED__
typedef interface IHTMLAreasCollection4 IHTMLAreasCollection4;
#endif

#ifndef __IHTMLMapElement_FWD_DEFINED__
#define __IHTMLMapElement_FWD_DEFINED__
typedef interface IHTMLMapElement IHTMLMapElement;
#endif

#ifndef __DispHTMLAreasCollection_FWD_DEFINED__
#define __DispHTMLAreasCollection_FWD_DEFINED__
typedef interface DispHTMLAreasCollection DispHTMLAreasCollection;
#endif

#ifndef __HTMLAreasCollection_FWD_DEFINED__
#define __HTMLAreasCollection_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLAreasCollection HTMLAreasCollection;
#else
typedef struct HTMLAreasCollection HTMLAreasCollection;
#endif /* defined __cplusplus */
#endif /* defined __HTMLAreasCollection_FWD_DEFINED__ */

#ifndef __DispHTMLMapElement_FWD_DEFINED__
#define __DispHTMLMapElement_FWD_DEFINED__
typedef interface DispHTMLMapElement DispHTMLMapElement;
#endif

#ifndef __HTMLMapElement_FWD_DEFINED__
#define __HTMLMapElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLMapElement HTMLMapElement;
#else
typedef struct HTMLMapElement HTMLMapElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLMapElement_FWD_DEFINED__ */

#ifndef __HTMLAreaEvents2_FWD_DEFINED__
#define __HTMLAreaEvents2_FWD_DEFINED__
typedef interface HTMLAreaEvents2 HTMLAreaEvents2;
#endif

#ifndef __HTMLAreaEvents_FWD_DEFINED__
#define __HTMLAreaEvents_FWD_DEFINED__
typedef interface HTMLAreaEvents HTMLAreaEvents;
#endif

#ifndef __IHTMLAreaElement_FWD_DEFINED__
#define __IHTMLAreaElement_FWD_DEFINED__
typedef interface IHTMLAreaElement IHTMLAreaElement;
#endif

#ifndef __IHTMLAreaElement2_FWD_DEFINED__
#define __IHTMLAreaElement2_FWD_DEFINED__
typedef interface IHTMLAreaElement2 IHTMLAreaElement2;
#endif

#ifndef __DispHTMLAreaElement_FWD_DEFINED__
#define __DispHTMLAreaElement_FWD_DEFINED__
typedef interface DispHTMLAreaElement DispHTMLAreaElement;
#endif

#ifndef __HTMLAreaElement_FWD_DEFINED__
#define __HTMLAreaElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLAreaElement HTMLAreaElement;
#else
typedef struct HTMLAreaElement HTMLAreaElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLAreaElement_FWD_DEFINED__ */

#ifndef __IHTMLTableCaption_FWD_DEFINED__
#define __IHTMLTableCaption_FWD_DEFINED__
typedef interface IHTMLTableCaption IHTMLTableCaption;
#endif

#ifndef __DispHTMLTableCaption_FWD_DEFINED__
#define __DispHTMLTableCaption_FWD_DEFINED__
typedef interface DispHTMLTableCaption DispHTMLTableCaption;
#endif

#ifndef __HTMLTableCaption_FWD_DEFINED__
#define __HTMLTableCaption_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLTableCaption HTMLTableCaption;
#else
typedef struct HTMLTableCaption HTMLTableCaption;
#endif /* defined __cplusplus */
#endif /* defined __HTMLTableCaption_FWD_DEFINED__ */

#ifndef __IHTMLCommentElement_FWD_DEFINED__
#define __IHTMLCommentElement_FWD_DEFINED__
typedef interface IHTMLCommentElement IHTMLCommentElement;
#endif

#ifndef __IHTMLCommentElement2_FWD_DEFINED__
#define __IHTMLCommentElement2_FWD_DEFINED__
typedef interface IHTMLCommentElement2 IHTMLCommentElement2;
#endif

#ifndef __IHTMLCommentElement3_FWD_DEFINED__
#define __IHTMLCommentElement3_FWD_DEFINED__
typedef interface IHTMLCommentElement3 IHTMLCommentElement3;
#endif

#ifndef __DispHTMLCommentElement_FWD_DEFINED__
#define __DispHTMLCommentElement_FWD_DEFINED__
typedef interface DispHTMLCommentElement DispHTMLCommentElement;
#endif

#ifndef __HTMLCommentElement_FWD_DEFINED__
#define __HTMLCommentElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLCommentElement HTMLCommentElement;
#else
typedef struct HTMLCommentElement HTMLCommentElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLCommentElement_FWD_DEFINED__ */

#ifndef __IHTMLPhraseElement_FWD_DEFINED__
#define __IHTMLPhraseElement_FWD_DEFINED__
typedef interface IHTMLPhraseElement IHTMLPhraseElement;
#endif

#ifndef __IHTMLPhraseElement2_FWD_DEFINED__
#define __IHTMLPhraseElement2_FWD_DEFINED__
typedef interface IHTMLPhraseElement2 IHTMLPhraseElement2;
#endif

#ifndef __IHTMLPhraseElement3_FWD_DEFINED__
#define __IHTMLPhraseElement3_FWD_DEFINED__
typedef interface IHTMLPhraseElement3 IHTMLPhraseElement3;
#endif

#ifndef __IHTMLSpanElement_FWD_DEFINED__
#define __IHTMLSpanElement_FWD_DEFINED__
typedef interface IHTMLSpanElement IHTMLSpanElement;
#endif

#ifndef __DispHTMLPhraseElement_FWD_DEFINED__
#define __DispHTMLPhraseElement_FWD_DEFINED__
typedef interface DispHTMLPhraseElement DispHTMLPhraseElement;
#endif

#ifndef __HTMLPhraseElement_FWD_DEFINED__
#define __HTMLPhraseElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLPhraseElement HTMLPhraseElement;
#else
typedef struct HTMLPhraseElement HTMLPhraseElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLPhraseElement_FWD_DEFINED__ */

#ifndef __DispHTMLSpanElement_FWD_DEFINED__
#define __DispHTMLSpanElement_FWD_DEFINED__
typedef interface DispHTMLSpanElement DispHTMLSpanElement;
#endif

#ifndef __HTMLSpanElement_FWD_DEFINED__
#define __HTMLSpanElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLSpanElement HTMLSpanElement;
#else
typedef struct HTMLSpanElement HTMLSpanElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLSpanElement_FWD_DEFINED__ */

#ifndef __HTMLTableEvents2_FWD_DEFINED__
#define __HTMLTableEvents2_FWD_DEFINED__
typedef interface HTMLTableEvents2 HTMLTableEvents2;
#endif

#ifndef __HTMLTableEvents_FWD_DEFINED__
#define __HTMLTableEvents_FWD_DEFINED__
typedef interface HTMLTableEvents HTMLTableEvents;
#endif

#ifndef __IHTMLTable_FWD_DEFINED__
#define __IHTMLTable_FWD_DEFINED__
typedef interface IHTMLTable IHTMLTable;
#endif

#ifndef __IHTMLTable2_FWD_DEFINED__
#define __IHTMLTable2_FWD_DEFINED__
typedef interface IHTMLTable2 IHTMLTable2;
#endif

#ifndef __IHTMLTable3_FWD_DEFINED__
#define __IHTMLTable3_FWD_DEFINED__
typedef interface IHTMLTable3 IHTMLTable3;
#endif

#ifndef __IHTMLTable4_FWD_DEFINED__
#define __IHTMLTable4_FWD_DEFINED__
typedef interface IHTMLTable4 IHTMLTable4;
#endif

#ifndef __IHTMLTableCol_FWD_DEFINED__
#define __IHTMLTableCol_FWD_DEFINED__
typedef interface IHTMLTableCol IHTMLTableCol;
#endif

#ifndef __IHTMLTableCol2_FWD_DEFINED__
#define __IHTMLTableCol2_FWD_DEFINED__
typedef interface IHTMLTableCol2 IHTMLTableCol2;
#endif

#ifndef __IHTMLTableCol3_FWD_DEFINED__
#define __IHTMLTableCol3_FWD_DEFINED__
typedef interface IHTMLTableCol3 IHTMLTableCol3;
#endif

#ifndef __IHTMLTableSection_FWD_DEFINED__
#define __IHTMLTableSection_FWD_DEFINED__
typedef interface IHTMLTableSection IHTMLTableSection;
#endif

#ifndef __IHTMLTableSection2_FWD_DEFINED__
#define __IHTMLTableSection2_FWD_DEFINED__
typedef interface IHTMLTableSection2 IHTMLTableSection2;
#endif

#ifndef __IHTMLTableSection3_FWD_DEFINED__
#define __IHTMLTableSection3_FWD_DEFINED__
typedef interface IHTMLTableSection3 IHTMLTableSection3;
#endif

#ifndef __IHTMLTableSection4_FWD_DEFINED__
#define __IHTMLTableSection4_FWD_DEFINED__
typedef interface IHTMLTableSection4 IHTMLTableSection4;
#endif

#ifndef __IHTMLTableRow_FWD_DEFINED__
#define __IHTMLTableRow_FWD_DEFINED__
typedef interface IHTMLTableRow IHTMLTableRow;
#endif

#ifndef __IHTMLTableRow2_FWD_DEFINED__
#define __IHTMLTableRow2_FWD_DEFINED__
typedef interface IHTMLTableRow2 IHTMLTableRow2;
#endif

#ifndef __IHTMLTableRow3_FWD_DEFINED__
#define __IHTMLTableRow3_FWD_DEFINED__
typedef interface IHTMLTableRow3 IHTMLTableRow3;
#endif

#ifndef __IHTMLTableRow4_FWD_DEFINED__
#define __IHTMLTableRow4_FWD_DEFINED__
typedef interface IHTMLTableRow4 IHTMLTableRow4;
#endif

#ifndef __IHTMLTableRowMetrics_FWD_DEFINED__
#define __IHTMLTableRowMetrics_FWD_DEFINED__
typedef interface IHTMLTableRowMetrics IHTMLTableRowMetrics;
#endif

#ifndef __IHTMLTableCell_FWD_DEFINED__
#define __IHTMLTableCell_FWD_DEFINED__
typedef interface IHTMLTableCell IHTMLTableCell;
#endif

#ifndef __IHTMLTableCell2_FWD_DEFINED__
#define __IHTMLTableCell2_FWD_DEFINED__
typedef interface IHTMLTableCell2 IHTMLTableCell2;
#endif

#ifndef __IHTMLTableCell3_FWD_DEFINED__
#define __IHTMLTableCell3_FWD_DEFINED__
typedef interface IHTMLTableCell3 IHTMLTableCell3;
#endif

#ifndef __DispHTMLTable_FWD_DEFINED__
#define __DispHTMLTable_FWD_DEFINED__
typedef interface DispHTMLTable DispHTMLTable;
#endif

#ifndef __HTMLTable_FWD_DEFINED__
#define __HTMLTable_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLTable HTMLTable;
#else
typedef struct HTMLTable HTMLTable;
#endif /* defined __cplusplus */
#endif /* defined __HTMLTable_FWD_DEFINED__ */

#ifndef __DispHTMLTableCol_FWD_DEFINED__
#define __DispHTMLTableCol_FWD_DEFINED__
typedef interface DispHTMLTableCol DispHTMLTableCol;
#endif

#ifndef __HTMLTableCol_FWD_DEFINED__
#define __HTMLTableCol_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLTableCol HTMLTableCol;
#else
typedef struct HTMLTableCol HTMLTableCol;
#endif /* defined __cplusplus */
#endif /* defined __HTMLTableCol_FWD_DEFINED__ */

#ifndef __DispHTMLTableSection_FWD_DEFINED__
#define __DispHTMLTableSection_FWD_DEFINED__
typedef interface DispHTMLTableSection DispHTMLTableSection;
#endif

#ifndef __HTMLTableSection_FWD_DEFINED__
#define __HTMLTableSection_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLTableSection HTMLTableSection;
#else
typedef struct HTMLTableSection HTMLTableSection;
#endif /* defined __cplusplus */
#endif /* defined __HTMLTableSection_FWD_DEFINED__ */

#ifndef __DispHTMLTableRow_FWD_DEFINED__
#define __DispHTMLTableRow_FWD_DEFINED__
typedef interface DispHTMLTableRow DispHTMLTableRow;
#endif

#ifndef __HTMLTableRow_FWD_DEFINED__
#define __HTMLTableRow_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLTableRow HTMLTableRow;
#else
typedef struct HTMLTableRow HTMLTableRow;
#endif /* defined __cplusplus */
#endif /* defined __HTMLTableRow_FWD_DEFINED__ */

#ifndef __DispHTMLTableCell_FWD_DEFINED__
#define __DispHTMLTableCell_FWD_DEFINED__
typedef interface DispHTMLTableCell DispHTMLTableCell;
#endif

#ifndef __HTMLTableCell_FWD_DEFINED__
#define __HTMLTableCell_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLTableCell HTMLTableCell;
#else
typedef struct HTMLTableCell HTMLTableCell;
#endif /* defined __cplusplus */
#endif /* defined __HTMLTableCell_FWD_DEFINED__ */

#ifndef __HTMLScriptEvents2_FWD_DEFINED__
#define __HTMLScriptEvents2_FWD_DEFINED__
typedef interface HTMLScriptEvents2 HTMLScriptEvents2;
#endif

#ifndef __HTMLScriptEvents_FWD_DEFINED__
#define __HTMLScriptEvents_FWD_DEFINED__
typedef interface HTMLScriptEvents HTMLScriptEvents;
#endif

#ifndef __IHTMLScriptElement_FWD_DEFINED__
#define __IHTMLScriptElement_FWD_DEFINED__
typedef interface IHTMLScriptElement IHTMLScriptElement;
#endif

#ifndef __IHTMLScriptElement2_FWD_DEFINED__
#define __IHTMLScriptElement2_FWD_DEFINED__
typedef interface IHTMLScriptElement2 IHTMLScriptElement2;
#endif

#ifndef __IHTMLScriptElement3_FWD_DEFINED__
#define __IHTMLScriptElement3_FWD_DEFINED__
typedef interface IHTMLScriptElement3 IHTMLScriptElement3;
#endif

#ifndef __IHTMLScriptElement4_FWD_DEFINED__
#define __IHTMLScriptElement4_FWD_DEFINED__
typedef interface IHTMLScriptElement4 IHTMLScriptElement4;
#endif

#ifndef __DispHTMLScriptElement_FWD_DEFINED__
#define __DispHTMLScriptElement_FWD_DEFINED__
typedef interface DispHTMLScriptElement DispHTMLScriptElement;
#endif

#ifndef __HTMLScriptElement_FWD_DEFINED__
#define __HTMLScriptElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLScriptElement HTMLScriptElement;
#else
typedef struct HTMLScriptElement HTMLScriptElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLScriptElement_FWD_DEFINED__ */

#ifndef __IHTMLNoShowElement_FWD_DEFINED__
#define __IHTMLNoShowElement_FWD_DEFINED__
typedef interface IHTMLNoShowElement IHTMLNoShowElement;
#endif

#ifndef __DispHTMLNoShowElement_FWD_DEFINED__
#define __DispHTMLNoShowElement_FWD_DEFINED__
typedef interface DispHTMLNoShowElement DispHTMLNoShowElement;
#endif

#ifndef __HTMLNoShowElement_FWD_DEFINED__
#define __HTMLNoShowElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLNoShowElement HTMLNoShowElement;
#else
typedef struct HTMLNoShowElement HTMLNoShowElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLNoShowElement_FWD_DEFINED__ */

#ifndef __HTMLObjectElementEvents2_FWD_DEFINED__
#define __HTMLObjectElementEvents2_FWD_DEFINED__
typedef interface HTMLObjectElementEvents2 HTMLObjectElementEvents2;
#endif

#ifndef __HTMLObjectElementEvents_FWD_DEFINED__
#define __HTMLObjectElementEvents_FWD_DEFINED__
typedef interface HTMLObjectElementEvents HTMLObjectElementEvents;
#endif

#ifndef __IHTMLObjectElement_FWD_DEFINED__
#define __IHTMLObjectElement_FWD_DEFINED__
typedef interface IHTMLObjectElement IHTMLObjectElement;
#endif

#ifndef __IHTMLObjectElement2_FWD_DEFINED__
#define __IHTMLObjectElement2_FWD_DEFINED__
typedef interface IHTMLObjectElement2 IHTMLObjectElement2;
#endif

#ifndef __IHTMLObjectElement3_FWD_DEFINED__
#define __IHTMLObjectElement3_FWD_DEFINED__
typedef interface IHTMLObjectElement3 IHTMLObjectElement3;
#endif

#ifndef __IHTMLObjectElement4_FWD_DEFINED__
#define __IHTMLObjectElement4_FWD_DEFINED__
typedef interface IHTMLObjectElement4 IHTMLObjectElement4;
#endif

#ifndef __IHTMLObjectElement5_FWD_DEFINED__
#define __IHTMLObjectElement5_FWD_DEFINED__
typedef interface IHTMLObjectElement5 IHTMLObjectElement5;
#endif

#ifndef __IHTMLParamElement_FWD_DEFINED__
#define __IHTMLParamElement_FWD_DEFINED__
typedef interface IHTMLParamElement IHTMLParamElement;
#endif

#ifndef __IHTMLParamElement2_FWD_DEFINED__
#define __IHTMLParamElement2_FWD_DEFINED__
typedef interface IHTMLParamElement2 IHTMLParamElement2;
#endif

#ifndef __DispHTMLObjectElement_FWD_DEFINED__
#define __DispHTMLObjectElement_FWD_DEFINED__
typedef interface DispHTMLObjectElement DispHTMLObjectElement;
#endif

#ifndef __HTMLObjectElement_FWD_DEFINED__
#define __HTMLObjectElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLObjectElement HTMLObjectElement;
#else
typedef struct HTMLObjectElement HTMLObjectElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLObjectElement_FWD_DEFINED__ */

#ifndef __DispHTMLParamElement_FWD_DEFINED__
#define __DispHTMLParamElement_FWD_DEFINED__
typedef interface DispHTMLParamElement DispHTMLParamElement;
#endif

#ifndef __HTMLParamElement_FWD_DEFINED__
#define __HTMLParamElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLParamElement HTMLParamElement;
#else
typedef struct HTMLParamElement HTMLParamElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLParamElement_FWD_DEFINED__ */

#ifndef __HTMLFrameSiteEvents2_FWD_DEFINED__
#define __HTMLFrameSiteEvents2_FWD_DEFINED__
typedef interface HTMLFrameSiteEvents2 HTMLFrameSiteEvents2;
#endif

#ifndef __HTMLFrameSiteEvents_FWD_DEFINED__
#define __HTMLFrameSiteEvents_FWD_DEFINED__
typedef interface HTMLFrameSiteEvents HTMLFrameSiteEvents;
#endif

#ifndef __IHTMLFrameBase_FWD_DEFINED__
#define __IHTMLFrameBase_FWD_DEFINED__
typedef interface IHTMLFrameBase IHTMLFrameBase;
#endif

#ifndef __IHTMLFrameBase2_FWD_DEFINED__
#define __IHTMLFrameBase2_FWD_DEFINED__
typedef interface IHTMLFrameBase2 IHTMLFrameBase2;
#endif

#ifndef __IHTMLFrameBase3_FWD_DEFINED__
#define __IHTMLFrameBase3_FWD_DEFINED__
typedef interface IHTMLFrameBase3 IHTMLFrameBase3;
#endif

#ifndef __DispHTMLFrameBase_FWD_DEFINED__
#define __DispHTMLFrameBase_FWD_DEFINED__
typedef interface DispHTMLFrameBase DispHTMLFrameBase;
#endif

#ifndef __HTMLFrameBase_FWD_DEFINED__
#define __HTMLFrameBase_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLFrameBase HTMLFrameBase;
#else
typedef struct HTMLFrameBase HTMLFrameBase;
#endif /* defined __cplusplus */
#endif /* defined __HTMLFrameBase_FWD_DEFINED__ */

#ifndef __IHTMLFrameElement_FWD_DEFINED__
#define __IHTMLFrameElement_FWD_DEFINED__
typedef interface IHTMLFrameElement IHTMLFrameElement;
#endif

#ifndef __IHTMLFrameElement2_FWD_DEFINED__
#define __IHTMLFrameElement2_FWD_DEFINED__
typedef interface IHTMLFrameElement2 IHTMLFrameElement2;
#endif

#ifndef __IHTMLFrameElement3_FWD_DEFINED__
#define __IHTMLFrameElement3_FWD_DEFINED__
typedef interface IHTMLFrameElement3 IHTMLFrameElement3;
#endif

#ifndef __DispHTMLFrameElement_FWD_DEFINED__
#define __DispHTMLFrameElement_FWD_DEFINED__
typedef interface DispHTMLFrameElement DispHTMLFrameElement;
#endif

#ifndef __HTMLFrameElement_FWD_DEFINED__
#define __HTMLFrameElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLFrameElement HTMLFrameElement;
#else
typedef struct HTMLFrameElement HTMLFrameElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLFrameElement_FWD_DEFINED__ */

#ifndef __IHTMLIFrameElement_FWD_DEFINED__
#define __IHTMLIFrameElement_FWD_DEFINED__
typedef interface IHTMLIFrameElement IHTMLIFrameElement;
#endif

#ifndef __IHTMLIFrameElement2_FWD_DEFINED__
#define __IHTMLIFrameElement2_FWD_DEFINED__
typedef interface IHTMLIFrameElement2 IHTMLIFrameElement2;
#endif

#ifndef __IHTMLIFrameElement3_FWD_DEFINED__
#define __IHTMLIFrameElement3_FWD_DEFINED__
typedef interface IHTMLIFrameElement3 IHTMLIFrameElement3;
#endif

#ifndef __DispHTMLIFrame_FWD_DEFINED__
#define __DispHTMLIFrame_FWD_DEFINED__
typedef interface DispHTMLIFrame DispHTMLIFrame;
#endif

#ifndef __HTMLIFrame_FWD_DEFINED__
#define __HTMLIFrame_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLIFrame HTMLIFrame;
#else
typedef struct HTMLIFrame HTMLIFrame;
#endif /* defined __cplusplus */
#endif /* defined __HTMLIFrame_FWD_DEFINED__ */

#ifndef __IHTMLDivPosition_FWD_DEFINED__
#define __IHTMLDivPosition_FWD_DEFINED__
typedef interface IHTMLDivPosition IHTMLDivPosition;
#endif

#ifndef __IHTMLFieldSetElement_FWD_DEFINED__
#define __IHTMLFieldSetElement_FWD_DEFINED__
typedef interface IHTMLFieldSetElement IHTMLFieldSetElement;
#endif

#ifndef __IHTMLFieldSetElement2_FWD_DEFINED__
#define __IHTMLFieldSetElement2_FWD_DEFINED__
typedef interface IHTMLFieldSetElement2 IHTMLFieldSetElement2;
#endif

#ifndef __IHTMLLegendElement_FWD_DEFINED__
#define __IHTMLLegendElement_FWD_DEFINED__
typedef interface IHTMLLegendElement IHTMLLegendElement;
#endif

#ifndef __IHTMLLegendElement2_FWD_DEFINED__
#define __IHTMLLegendElement2_FWD_DEFINED__
typedef interface IHTMLLegendElement2 IHTMLLegendElement2;
#endif

#ifndef __DispHTMLDivPosition_FWD_DEFINED__
#define __DispHTMLDivPosition_FWD_DEFINED__
typedef interface DispHTMLDivPosition DispHTMLDivPosition;
#endif

#ifndef __HTMLDivPosition_FWD_DEFINED__
#define __HTMLDivPosition_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLDivPosition HTMLDivPosition;
#else
typedef struct HTMLDivPosition HTMLDivPosition;
#endif /* defined __cplusplus */
#endif /* defined __HTMLDivPosition_FWD_DEFINED__ */

#ifndef __DispHTMLFieldSetElement_FWD_DEFINED__
#define __DispHTMLFieldSetElement_FWD_DEFINED__
typedef interface DispHTMLFieldSetElement DispHTMLFieldSetElement;
#endif

#ifndef __HTMLFieldSetElement_FWD_DEFINED__
#define __HTMLFieldSetElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLFieldSetElement HTMLFieldSetElement;
#else
typedef struct HTMLFieldSetElement HTMLFieldSetElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLFieldSetElement_FWD_DEFINED__ */

#ifndef __DispHTMLLegendElement_FWD_DEFINED__
#define __DispHTMLLegendElement_FWD_DEFINED__
typedef interface DispHTMLLegendElement DispHTMLLegendElement;
#endif

#ifndef __HTMLLegendElement_FWD_DEFINED__
#define __HTMLLegendElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLLegendElement HTMLLegendElement;
#else
typedef struct HTMLLegendElement HTMLLegendElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLLegendElement_FWD_DEFINED__ */

#ifndef __IHTMLSpanFlow_FWD_DEFINED__
#define __IHTMLSpanFlow_FWD_DEFINED__
typedef interface IHTMLSpanFlow IHTMLSpanFlow;
#endif

#ifndef __DispHTMLSpanFlow_FWD_DEFINED__
#define __DispHTMLSpanFlow_FWD_DEFINED__
typedef interface DispHTMLSpanFlow DispHTMLSpanFlow;
#endif

#ifndef __HTMLSpanFlow_FWD_DEFINED__
#define __HTMLSpanFlow_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLSpanFlow HTMLSpanFlow;
#else
typedef struct HTMLSpanFlow HTMLSpanFlow;
#endif /* defined __cplusplus */
#endif /* defined __HTMLSpanFlow_FWD_DEFINED__ */

#ifndef __IHTMLFrameSetElement_FWD_DEFINED__
#define __IHTMLFrameSetElement_FWD_DEFINED__
typedef interface IHTMLFrameSetElement IHTMLFrameSetElement;
#endif

#ifndef __IHTMLFrameSetElement2_FWD_DEFINED__
#define __IHTMLFrameSetElement2_FWD_DEFINED__
typedef interface IHTMLFrameSetElement2 IHTMLFrameSetElement2;
#endif

#ifndef __IHTMLFrameSetElement3_FWD_DEFINED__
#define __IHTMLFrameSetElement3_FWD_DEFINED__
typedef interface IHTMLFrameSetElement3 IHTMLFrameSetElement3;
#endif

#ifndef __DispHTMLFrameSetSite_FWD_DEFINED__
#define __DispHTMLFrameSetSite_FWD_DEFINED__
typedef interface DispHTMLFrameSetSite DispHTMLFrameSetSite;
#endif

#ifndef __HTMLFrameSetSite_FWD_DEFINED__
#define __HTMLFrameSetSite_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLFrameSetSite HTMLFrameSetSite;
#else
typedef struct HTMLFrameSetSite HTMLFrameSetSite;
#endif /* defined __cplusplus */
#endif /* defined __HTMLFrameSetSite_FWD_DEFINED__ */

#ifndef __IHTMLBGsound_FWD_DEFINED__
#define __IHTMLBGsound_FWD_DEFINED__
typedef interface IHTMLBGsound IHTMLBGsound;
#endif

#ifndef __DispHTMLBGsound_FWD_DEFINED__
#define __DispHTMLBGsound_FWD_DEFINED__
typedef interface DispHTMLBGsound DispHTMLBGsound;
#endif

#ifndef __HTMLBGsound_FWD_DEFINED__
#define __HTMLBGsound_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLBGsound HTMLBGsound;
#else
typedef struct HTMLBGsound HTMLBGsound;
#endif /* defined __cplusplus */
#endif /* defined __HTMLBGsound_FWD_DEFINED__ */

#ifndef __IHTMLFontNamesCollection_FWD_DEFINED__
#define __IHTMLFontNamesCollection_FWD_DEFINED__
typedef interface IHTMLFontNamesCollection IHTMLFontNamesCollection;
#endif

#ifndef __IHTMLFontSizesCollection_FWD_DEFINED__
#define __IHTMLFontSizesCollection_FWD_DEFINED__
typedef interface IHTMLFontSizesCollection IHTMLFontSizesCollection;
#endif

#ifndef __IHTMLOptionsHolder_FWD_DEFINED__
#define __IHTMLOptionsHolder_FWD_DEFINED__
typedef interface IHTMLOptionsHolder IHTMLOptionsHolder;
#endif

#ifndef __HTMLStyleElementEvents2_FWD_DEFINED__
#define __HTMLStyleElementEvents2_FWD_DEFINED__
typedef interface HTMLStyleElementEvents2 HTMLStyleElementEvents2;
#endif

#ifndef __HTMLStyleElementEvents_FWD_DEFINED__
#define __HTMLStyleElementEvents_FWD_DEFINED__
typedef interface HTMLStyleElementEvents HTMLStyleElementEvents;
#endif

#ifndef __IHTMLStyleElement_FWD_DEFINED__
#define __IHTMLStyleElement_FWD_DEFINED__
typedef interface IHTMLStyleElement IHTMLStyleElement;
#endif

#ifndef __IHTMLStyleElement2_FWD_DEFINED__
#define __IHTMLStyleElement2_FWD_DEFINED__
typedef interface IHTMLStyleElement2 IHTMLStyleElement2;
#endif

#ifndef __DispHTMLStyleElement_FWD_DEFINED__
#define __DispHTMLStyleElement_FWD_DEFINED__
typedef interface DispHTMLStyleElement DispHTMLStyleElement;
#endif

#ifndef __HTMLStyleElement_FWD_DEFINED__
#define __HTMLStyleElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLStyleElement HTMLStyleElement;
#else
typedef struct HTMLStyleElement HTMLStyleElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLStyleElement_FWD_DEFINED__ */

#ifndef __IHTMLStyleFontFace_FWD_DEFINED__
#define __IHTMLStyleFontFace_FWD_DEFINED__
typedef interface IHTMLStyleFontFace IHTMLStyleFontFace;
#endif

#ifndef __IHTMLStyleFontFace2_FWD_DEFINED__
#define __IHTMLStyleFontFace2_FWD_DEFINED__
typedef interface IHTMLStyleFontFace2 IHTMLStyleFontFace2;
#endif

#ifndef __DispHTMLStyleFontFace_FWD_DEFINED__
#define __DispHTMLStyleFontFace_FWD_DEFINED__
typedef interface DispHTMLStyleFontFace DispHTMLStyleFontFace;
#endif

#ifndef __HTMLStyleFontFace_FWD_DEFINED__
#define __HTMLStyleFontFace_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLStyleFontFace HTMLStyleFontFace;
#else
typedef struct HTMLStyleFontFace HTMLStyleFontFace;
#endif /* defined __cplusplus */
#endif /* defined __HTMLStyleFontFace_FWD_DEFINED__ */

#ifndef __IHTMLXDomainRequest_FWD_DEFINED__
#define __IHTMLXDomainRequest_FWD_DEFINED__
typedef interface IHTMLXDomainRequest IHTMLXDomainRequest;
#endif

#ifndef __IHTMLXDomainRequestFactory_FWD_DEFINED__
#define __IHTMLXDomainRequestFactory_FWD_DEFINED__
typedef interface IHTMLXDomainRequestFactory IHTMLXDomainRequestFactory;
#endif

#ifndef __DispXDomainRequest_FWD_DEFINED__
#define __DispXDomainRequest_FWD_DEFINED__
typedef interface DispXDomainRequest DispXDomainRequest;
#endif

#ifndef __XDomainRequest_FWD_DEFINED__
#define __XDomainRequest_FWD_DEFINED__
#ifdef __cplusplus
typedef class XDomainRequest XDomainRequest;
#else
typedef struct XDomainRequest XDomainRequest;
#endif /* defined __cplusplus */
#endif /* defined __XDomainRequest_FWD_DEFINED__ */

#ifndef __XDomainRequestFactory_FWD_DEFINED__
#define __XDomainRequestFactory_FWD_DEFINED__
#ifdef __cplusplus
typedef class XDomainRequestFactory XDomainRequestFactory;
#else
typedef struct XDomainRequestFactory XDomainRequestFactory;
#endif /* defined __cplusplus */
#endif /* defined __XDomainRequestFactory_FWD_DEFINED__ */

#ifndef __IHTMLStorage_FWD_DEFINED__
#define __IHTMLStorage_FWD_DEFINED__
typedef interface IHTMLStorage IHTMLStorage;
#endif

#ifndef __IHTMLStorage2_FWD_DEFINED__
#define __IHTMLStorage2_FWD_DEFINED__
typedef interface IHTMLStorage2 IHTMLStorage2;
#endif

#ifndef __DispHTMLStorage_FWD_DEFINED__
#define __DispHTMLStorage_FWD_DEFINED__
typedef interface DispHTMLStorage DispHTMLStorage;
#endif

#ifndef __HTMLStorage_FWD_DEFINED__
#define __HTMLStorage_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLStorage HTMLStorage;
#else
typedef struct HTMLStorage HTMLStorage;
#endif /* defined __cplusplus */
#endif /* defined __HTMLStorage_FWD_DEFINED__ */

#ifndef __IEventTarget_FWD_DEFINED__
#define __IEventTarget_FWD_DEFINED__
typedef interface IEventTarget IEventTarget;
#endif

#ifndef __IDOMEvent_FWD_DEFINED__
#define __IDOMEvent_FWD_DEFINED__
typedef interface IDOMEvent IDOMEvent;
#endif

#ifndef __DispDOMEvent_FWD_DEFINED__
#define __DispDOMEvent_FWD_DEFINED__
typedef interface DispDOMEvent DispDOMEvent;
#endif

#ifndef __DOMEvent_FWD_DEFINED__
#define __DOMEvent_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMEvent DOMEvent;
#else
typedef struct DOMEvent DOMEvent;
#endif /* defined __cplusplus */
#endif /* defined __DOMEvent_FWD_DEFINED__ */

#ifndef __IDOMUIEvent_FWD_DEFINED__
#define __IDOMUIEvent_FWD_DEFINED__
typedef interface IDOMUIEvent IDOMUIEvent;
#endif

#ifndef __DispDOMUIEvent_FWD_DEFINED__
#define __DispDOMUIEvent_FWD_DEFINED__
typedef interface DispDOMUIEvent DispDOMUIEvent;
#endif

#ifndef __DOMUIEvent_FWD_DEFINED__
#define __DOMUIEvent_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMUIEvent DOMUIEvent;
#else
typedef struct DOMUIEvent DOMUIEvent;
#endif /* defined __cplusplus */
#endif /* defined __DOMUIEvent_FWD_DEFINED__ */

#ifndef __IDOMMouseEvent_FWD_DEFINED__
#define __IDOMMouseEvent_FWD_DEFINED__
typedef interface IDOMMouseEvent IDOMMouseEvent;
#endif

#ifndef __DispDOMMouseEvent_FWD_DEFINED__
#define __DispDOMMouseEvent_FWD_DEFINED__
typedef interface DispDOMMouseEvent DispDOMMouseEvent;
#endif

#ifndef __DOMMouseEvent_FWD_DEFINED__
#define __DOMMouseEvent_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMMouseEvent DOMMouseEvent;
#else
typedef struct DOMMouseEvent DOMMouseEvent;
#endif /* defined __cplusplus */
#endif /* defined __DOMMouseEvent_FWD_DEFINED__ */

#ifndef __IDOMDragEvent_FWD_DEFINED__
#define __IDOMDragEvent_FWD_DEFINED__
typedef interface IDOMDragEvent IDOMDragEvent;
#endif

#ifndef __DispDOMDragEvent_FWD_DEFINED__
#define __DispDOMDragEvent_FWD_DEFINED__
typedef interface DispDOMDragEvent DispDOMDragEvent;
#endif

#ifndef __DOMDragEvent_FWD_DEFINED__
#define __DOMDragEvent_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMDragEvent DOMDragEvent;
#else
typedef struct DOMDragEvent DOMDragEvent;
#endif /* defined __cplusplus */
#endif /* defined __DOMDragEvent_FWD_DEFINED__ */

#ifndef __IDOMMouseWheelEvent_FWD_DEFINED__
#define __IDOMMouseWheelEvent_FWD_DEFINED__
typedef interface IDOMMouseWheelEvent IDOMMouseWheelEvent;
#endif

#ifndef __DispDOMMouseWheelEvent_FWD_DEFINED__
#define __DispDOMMouseWheelEvent_FWD_DEFINED__
typedef interface DispDOMMouseWheelEvent DispDOMMouseWheelEvent;
#endif

#ifndef __DOMMouseWheelEvent_FWD_DEFINED__
#define __DOMMouseWheelEvent_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMMouseWheelEvent DOMMouseWheelEvent;
#else
typedef struct DOMMouseWheelEvent DOMMouseWheelEvent;
#endif /* defined __cplusplus */
#endif /* defined __DOMMouseWheelEvent_FWD_DEFINED__ */

#ifndef __IDOMWheelEvent_FWD_DEFINED__
#define __IDOMWheelEvent_FWD_DEFINED__
typedef interface IDOMWheelEvent IDOMWheelEvent;
#endif

#ifndef __DispDOMWheelEvent_FWD_DEFINED__
#define __DispDOMWheelEvent_FWD_DEFINED__
typedef interface DispDOMWheelEvent DispDOMWheelEvent;
#endif

#ifndef __DOMWheelEvent_FWD_DEFINED__
#define __DOMWheelEvent_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMWheelEvent DOMWheelEvent;
#else
typedef struct DOMWheelEvent DOMWheelEvent;
#endif /* defined __cplusplus */
#endif /* defined __DOMWheelEvent_FWD_DEFINED__ */

#ifndef __IDOMTextEvent_FWD_DEFINED__
#define __IDOMTextEvent_FWD_DEFINED__
typedef interface IDOMTextEvent IDOMTextEvent;
#endif

#ifndef __DispDOMTextEvent_FWD_DEFINED__
#define __DispDOMTextEvent_FWD_DEFINED__
typedef interface DispDOMTextEvent DispDOMTextEvent;
#endif

#ifndef __DOMTextEvent_FWD_DEFINED__
#define __DOMTextEvent_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMTextEvent DOMTextEvent;
#else
typedef struct DOMTextEvent DOMTextEvent;
#endif /* defined __cplusplus */
#endif /* defined __DOMTextEvent_FWD_DEFINED__ */

#ifndef __IDOMKeyboardEvent_FWD_DEFINED__
#define __IDOMKeyboardEvent_FWD_DEFINED__
typedef interface IDOMKeyboardEvent IDOMKeyboardEvent;
#endif

#ifndef __DispDOMKeyboardEvent_FWD_DEFINED__
#define __DispDOMKeyboardEvent_FWD_DEFINED__
typedef interface DispDOMKeyboardEvent DispDOMKeyboardEvent;
#endif

#ifndef __DOMKeyboardEvent_FWD_DEFINED__
#define __DOMKeyboardEvent_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMKeyboardEvent DOMKeyboardEvent;
#else
typedef struct DOMKeyboardEvent DOMKeyboardEvent;
#endif /* defined __cplusplus */
#endif /* defined __DOMKeyboardEvent_FWD_DEFINED__ */

#ifndef __IDOMCompositionEvent_FWD_DEFINED__
#define __IDOMCompositionEvent_FWD_DEFINED__
typedef interface IDOMCompositionEvent IDOMCompositionEvent;
#endif

#ifndef __DispDOMCompositionEvent_FWD_DEFINED__
#define __DispDOMCompositionEvent_FWD_DEFINED__
typedef interface DispDOMCompositionEvent DispDOMCompositionEvent;
#endif

#ifndef __DOMCompositionEvent_FWD_DEFINED__
#define __DOMCompositionEvent_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMCompositionEvent DOMCompositionEvent;
#else
typedef struct DOMCompositionEvent DOMCompositionEvent;
#endif /* defined __cplusplus */
#endif /* defined __DOMCompositionEvent_FWD_DEFINED__ */

#ifndef __IDOMMutationEvent_FWD_DEFINED__
#define __IDOMMutationEvent_FWD_DEFINED__
typedef interface IDOMMutationEvent IDOMMutationEvent;
#endif

#ifndef __DispDOMMutationEvent_FWD_DEFINED__
#define __DispDOMMutationEvent_FWD_DEFINED__
typedef interface DispDOMMutationEvent DispDOMMutationEvent;
#endif

#ifndef __DOMMutationEvent_FWD_DEFINED__
#define __DOMMutationEvent_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMMutationEvent DOMMutationEvent;
#else
typedef struct DOMMutationEvent DOMMutationEvent;
#endif /* defined __cplusplus */
#endif /* defined __DOMMutationEvent_FWD_DEFINED__ */

#ifndef __IDOMBeforeUnloadEvent_FWD_DEFINED__
#define __IDOMBeforeUnloadEvent_FWD_DEFINED__
typedef interface IDOMBeforeUnloadEvent IDOMBeforeUnloadEvent;
#endif

#ifndef __DispDOMBeforeUnloadEvent_FWD_DEFINED__
#define __DispDOMBeforeUnloadEvent_FWD_DEFINED__
typedef interface DispDOMBeforeUnloadEvent DispDOMBeforeUnloadEvent;
#endif

#ifndef __DOMBeforeUnloadEvent_FWD_DEFINED__
#define __DOMBeforeUnloadEvent_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMBeforeUnloadEvent DOMBeforeUnloadEvent;
#else
typedef struct DOMBeforeUnloadEvent DOMBeforeUnloadEvent;
#endif /* defined __cplusplus */
#endif /* defined __DOMBeforeUnloadEvent_FWD_DEFINED__ */

#ifndef __IDOMFocusEvent_FWD_DEFINED__
#define __IDOMFocusEvent_FWD_DEFINED__
typedef interface IDOMFocusEvent IDOMFocusEvent;
#endif

#ifndef __DispDOMFocusEvent_FWD_DEFINED__
#define __DispDOMFocusEvent_FWD_DEFINED__
typedef interface DispDOMFocusEvent DispDOMFocusEvent;
#endif

#ifndef __DOMFocusEvent_FWD_DEFINED__
#define __DOMFocusEvent_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMFocusEvent DOMFocusEvent;
#else
typedef struct DOMFocusEvent DOMFocusEvent;
#endif /* defined __cplusplus */
#endif /* defined __DOMFocusEvent_FWD_DEFINED__ */

#ifndef __IDOMCustomEvent_FWD_DEFINED__
#define __IDOMCustomEvent_FWD_DEFINED__
typedef interface IDOMCustomEvent IDOMCustomEvent;
#endif

#ifndef __DispDOMCustomEvent_FWD_DEFINED__
#define __DispDOMCustomEvent_FWD_DEFINED__
typedef interface DispDOMCustomEvent DispDOMCustomEvent;
#endif

#ifndef __DOMCustomEvent_FWD_DEFINED__
#define __DOMCustomEvent_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMCustomEvent DOMCustomEvent;
#else
typedef struct DOMCustomEvent DOMCustomEvent;
#endif /* defined __cplusplus */
#endif /* defined __DOMCustomEvent_FWD_DEFINED__ */

#ifndef __ICanvasGradient_FWD_DEFINED__
#define __ICanvasGradient_FWD_DEFINED__
typedef interface ICanvasGradient ICanvasGradient;
#endif

#ifndef __ICanvasPattern_FWD_DEFINED__
#define __ICanvasPattern_FWD_DEFINED__
typedef interface ICanvasPattern ICanvasPattern;
#endif

#ifndef __ICanvasTextMetrics_FWD_DEFINED__
#define __ICanvasTextMetrics_FWD_DEFINED__
typedef interface ICanvasTextMetrics ICanvasTextMetrics;
#endif

#ifndef __ICanvasImageData_FWD_DEFINED__
#define __ICanvasImageData_FWD_DEFINED__
typedef interface ICanvasImageData ICanvasImageData;
#endif

#ifndef __ICanvasPixelArray_FWD_DEFINED__
#define __ICanvasPixelArray_FWD_DEFINED__
typedef interface ICanvasPixelArray ICanvasPixelArray;
#endif

#ifndef __ICanvasRenderingContext2D_FWD_DEFINED__
#define __ICanvasRenderingContext2D_FWD_DEFINED__
typedef interface ICanvasRenderingContext2D ICanvasRenderingContext2D;
#endif

#ifndef __IHTMLCanvasElement_FWD_DEFINED__
#define __IHTMLCanvasElement_FWD_DEFINED__
typedef interface IHTMLCanvasElement IHTMLCanvasElement;
#endif

#ifndef __DispCanvasGradient_FWD_DEFINED__
#define __DispCanvasGradient_FWD_DEFINED__
typedef interface DispCanvasGradient DispCanvasGradient;
#endif

#ifndef __CanvasGradient_FWD_DEFINED__
#define __CanvasGradient_FWD_DEFINED__
#ifdef __cplusplus
typedef class CanvasGradient CanvasGradient;
#else
typedef struct CanvasGradient CanvasGradient;
#endif /* defined __cplusplus */
#endif /* defined __CanvasGradient_FWD_DEFINED__ */

#ifndef __DispCanvasPattern_FWD_DEFINED__
#define __DispCanvasPattern_FWD_DEFINED__
typedef interface DispCanvasPattern DispCanvasPattern;
#endif

#ifndef __CanvasPattern_FWD_DEFINED__
#define __CanvasPattern_FWD_DEFINED__
#ifdef __cplusplus
typedef class CanvasPattern CanvasPattern;
#else
typedef struct CanvasPattern CanvasPattern;
#endif /* defined __cplusplus */
#endif /* defined __CanvasPattern_FWD_DEFINED__ */

#ifndef __DispCanvasTextMetrics_FWD_DEFINED__
#define __DispCanvasTextMetrics_FWD_DEFINED__
typedef interface DispCanvasTextMetrics DispCanvasTextMetrics;
#endif

#ifndef __CanvasTextMetrics_FWD_DEFINED__
#define __CanvasTextMetrics_FWD_DEFINED__
#ifdef __cplusplus
typedef class CanvasTextMetrics CanvasTextMetrics;
#else
typedef struct CanvasTextMetrics CanvasTextMetrics;
#endif /* defined __cplusplus */
#endif /* defined __CanvasTextMetrics_FWD_DEFINED__ */

#ifndef __DispCanvasImageData_FWD_DEFINED__
#define __DispCanvasImageData_FWD_DEFINED__
typedef interface DispCanvasImageData DispCanvasImageData;
#endif

#ifndef __CanvasImageData_FWD_DEFINED__
#define __CanvasImageData_FWD_DEFINED__
#ifdef __cplusplus
typedef class CanvasImageData CanvasImageData;
#else
typedef struct CanvasImageData CanvasImageData;
#endif /* defined __cplusplus */
#endif /* defined __CanvasImageData_FWD_DEFINED__ */

#ifndef __DispCanvasRenderingContext2D_FWD_DEFINED__
#define __DispCanvasRenderingContext2D_FWD_DEFINED__
typedef interface DispCanvasRenderingContext2D DispCanvasRenderingContext2D;
#endif

#ifndef __CanvasRenderingContext2D_FWD_DEFINED__
#define __CanvasRenderingContext2D_FWD_DEFINED__
#ifdef __cplusplus
typedef class CanvasRenderingContext2D CanvasRenderingContext2D;
#else
typedef struct CanvasRenderingContext2D CanvasRenderingContext2D;
#endif /* defined __cplusplus */
#endif /* defined __CanvasRenderingContext2D_FWD_DEFINED__ */

#ifndef __DispHTMLCanvasElement_FWD_DEFINED__
#define __DispHTMLCanvasElement_FWD_DEFINED__
typedef interface DispHTMLCanvasElement DispHTMLCanvasElement;
#endif

#ifndef __HTMLCanvasElement_FWD_DEFINED__
#define __HTMLCanvasElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLCanvasElement HTMLCanvasElement;
#else
typedef struct HTMLCanvasElement HTMLCanvasElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLCanvasElement_FWD_DEFINED__ */

#ifndef __IDOMProgressEvent_FWD_DEFINED__
#define __IDOMProgressEvent_FWD_DEFINED__
typedef interface IDOMProgressEvent IDOMProgressEvent;
#endif

#ifndef __DispDOMProgressEvent_FWD_DEFINED__
#define __DispDOMProgressEvent_FWD_DEFINED__
typedef interface DispDOMProgressEvent DispDOMProgressEvent;
#endif

#ifndef __DOMProgressEvent_FWD_DEFINED__
#define __DOMProgressEvent_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMProgressEvent DOMProgressEvent;
#else
typedef struct DOMProgressEvent DOMProgressEvent;
#endif /* defined __cplusplus */
#endif /* defined __DOMProgressEvent_FWD_DEFINED__ */

#ifndef __IDOMMessageEvent_FWD_DEFINED__
#define __IDOMMessageEvent_FWD_DEFINED__
typedef interface IDOMMessageEvent IDOMMessageEvent;
#endif

#ifndef __DispDOMMessageEvent_FWD_DEFINED__
#define __DispDOMMessageEvent_FWD_DEFINED__
typedef interface DispDOMMessageEvent DispDOMMessageEvent;
#endif

#ifndef __DOMMessageEvent_FWD_DEFINED__
#define __DOMMessageEvent_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMMessageEvent DOMMessageEvent;
#else
typedef struct DOMMessageEvent DOMMessageEvent;
#endif /* defined __cplusplus */
#endif /* defined __DOMMessageEvent_FWD_DEFINED__ */

#ifndef __IDOMSiteModeEvent_FWD_DEFINED__
#define __IDOMSiteModeEvent_FWD_DEFINED__
typedef interface IDOMSiteModeEvent IDOMSiteModeEvent;
#endif

#ifndef __DispDOMSiteModeEvent_FWD_DEFINED__
#define __DispDOMSiteModeEvent_FWD_DEFINED__
typedef interface DispDOMSiteModeEvent DispDOMSiteModeEvent;
#endif

#ifndef __DOMSiteModeEvent_FWD_DEFINED__
#define __DOMSiteModeEvent_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMSiteModeEvent DOMSiteModeEvent;
#else
typedef struct DOMSiteModeEvent DOMSiteModeEvent;
#endif /* defined __cplusplus */
#endif /* defined __DOMSiteModeEvent_FWD_DEFINED__ */

#ifndef __IDOMStorageEvent_FWD_DEFINED__
#define __IDOMStorageEvent_FWD_DEFINED__
typedef interface IDOMStorageEvent IDOMStorageEvent;
#endif

#ifndef __DispDOMStorageEvent_FWD_DEFINED__
#define __DispDOMStorageEvent_FWD_DEFINED__
typedef interface DispDOMStorageEvent DispDOMStorageEvent;
#endif

#ifndef __DOMStorageEvent_FWD_DEFINED__
#define __DOMStorageEvent_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMStorageEvent DOMStorageEvent;
#else
typedef struct DOMStorageEvent DOMStorageEvent;
#endif /* defined __cplusplus */
#endif /* defined __DOMStorageEvent_FWD_DEFINED__ */

#ifndef __IXMLHttpRequestEventTarget_FWD_DEFINED__
#define __IXMLHttpRequestEventTarget_FWD_DEFINED__
typedef interface IXMLHttpRequestEventTarget IXMLHttpRequestEventTarget;
#endif

#ifndef __DispXMLHttpRequestEventTarget_FWD_DEFINED__
#define __DispXMLHttpRequestEventTarget_FWD_DEFINED__
typedef interface DispXMLHttpRequestEventTarget DispXMLHttpRequestEventTarget;
#endif

#ifndef __XMLHttpRequestEventTarget_FWD_DEFINED__
#define __XMLHttpRequestEventTarget_FWD_DEFINED__
#ifdef __cplusplus
typedef class XMLHttpRequestEventTarget XMLHttpRequestEventTarget;
#else
typedef struct XMLHttpRequestEventTarget XMLHttpRequestEventTarget;
#endif /* defined __cplusplus */
#endif /* defined __XMLHttpRequestEventTarget_FWD_DEFINED__ */

#ifndef __HTMLXMLHttpRequestEvents_FWD_DEFINED__
#define __HTMLXMLHttpRequestEvents_FWD_DEFINED__
typedef interface HTMLXMLHttpRequestEvents HTMLXMLHttpRequestEvents;
#endif

#ifndef __IHTMLXMLHttpRequest_FWD_DEFINED__
#define __IHTMLXMLHttpRequest_FWD_DEFINED__
typedef interface IHTMLXMLHttpRequest IHTMLXMLHttpRequest;
#endif

#ifndef __IHTMLXMLHttpRequest2_FWD_DEFINED__
#define __IHTMLXMLHttpRequest2_FWD_DEFINED__
typedef interface IHTMLXMLHttpRequest2 IHTMLXMLHttpRequest2;
#endif

#ifndef __IHTMLXMLHttpRequestFactory_FWD_DEFINED__
#define __IHTMLXMLHttpRequestFactory_FWD_DEFINED__
typedef interface IHTMLXMLHttpRequestFactory IHTMLXMLHttpRequestFactory;
#endif

#ifndef __DispHTMLXMLHttpRequest_FWD_DEFINED__
#define __DispHTMLXMLHttpRequest_FWD_DEFINED__
typedef interface DispHTMLXMLHttpRequest DispHTMLXMLHttpRequest;
#endif

#ifndef __HTMLXMLHttpRequest_FWD_DEFINED__
#define __HTMLXMLHttpRequest_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLXMLHttpRequest HTMLXMLHttpRequest;
#else
typedef struct HTMLXMLHttpRequest HTMLXMLHttpRequest;
#endif /* defined __cplusplus */
#endif /* defined __HTMLXMLHttpRequest_FWD_DEFINED__ */

#ifndef __HTMLXMLHttpRequestFactory_FWD_DEFINED__
#define __HTMLXMLHttpRequestFactory_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLXMLHttpRequestFactory HTMLXMLHttpRequestFactory;
#else
typedef struct HTMLXMLHttpRequestFactory HTMLXMLHttpRequestFactory;
#endif /* defined __cplusplus */
#endif /* defined __HTMLXMLHttpRequestFactory_FWD_DEFINED__ */

#ifndef __ISVGAngle_FWD_DEFINED__
#define __ISVGAngle_FWD_DEFINED__
typedef interface ISVGAngle ISVGAngle;
#endif

#ifndef __SVGAngle_FWD_DEFINED__
#define __SVGAngle_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGAngle SVGAngle;
#else
typedef struct SVGAngle SVGAngle;
#endif /* defined __cplusplus */
#endif /* defined __SVGAngle_FWD_DEFINED__ */

#ifndef __ISVGStylable_FWD_DEFINED__
#define __ISVGStylable_FWD_DEFINED__
typedef interface ISVGStylable ISVGStylable;
#endif

#ifndef __ISVGLocatable_FWD_DEFINED__
#define __ISVGLocatable_FWD_DEFINED__
typedef interface ISVGLocatable ISVGLocatable;
#endif

#ifndef __ISVGTransformable_FWD_DEFINED__
#define __ISVGTransformable_FWD_DEFINED__
typedef interface ISVGTransformable ISVGTransformable;
#endif

#ifndef __ISVGTests_FWD_DEFINED__
#define __ISVGTests_FWD_DEFINED__
typedef interface ISVGTests ISVGTests;
#endif

#ifndef __ISVGLangSpace_FWD_DEFINED__
#define __ISVGLangSpace_FWD_DEFINED__
typedef interface ISVGLangSpace ISVGLangSpace;
#endif

#ifndef __ISVGExternalResourcesRequired_FWD_DEFINED__
#define __ISVGExternalResourcesRequired_FWD_DEFINED__
typedef interface ISVGExternalResourcesRequired ISVGExternalResourcesRequired;
#endif

#ifndef __ISVGFitToViewBox_FWD_DEFINED__
#define __ISVGFitToViewBox_FWD_DEFINED__
typedef interface ISVGFitToViewBox ISVGFitToViewBox;
#endif

#ifndef __ISVGZoomAndPan_FWD_DEFINED__
#define __ISVGZoomAndPan_FWD_DEFINED__
typedef interface ISVGZoomAndPan ISVGZoomAndPan;
#endif

#ifndef __ISVGURIReference_FWD_DEFINED__
#define __ISVGURIReference_FWD_DEFINED__
typedef interface ISVGURIReference ISVGURIReference;
#endif

#ifndef __ISVGAnimatedAngle_FWD_DEFINED__
#define __ISVGAnimatedAngle_FWD_DEFINED__
typedef interface ISVGAnimatedAngle ISVGAnimatedAngle;
#endif

#ifndef __SVGAnimatedAngle_FWD_DEFINED__
#define __SVGAnimatedAngle_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGAnimatedAngle SVGAnimatedAngle;
#else
typedef struct SVGAnimatedAngle SVGAnimatedAngle;
#endif /* defined __cplusplus */
#endif /* defined __SVGAnimatedAngle_FWD_DEFINED__ */

#ifndef __ISVGAnimatedTransformList_FWD_DEFINED__
#define __ISVGAnimatedTransformList_FWD_DEFINED__
typedef interface ISVGAnimatedTransformList ISVGAnimatedTransformList;
#endif

#ifndef __SVGAnimatedTransformList_FWD_DEFINED__
#define __SVGAnimatedTransformList_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGAnimatedTransformList SVGAnimatedTransformList;
#else
typedef struct SVGAnimatedTransformList SVGAnimatedTransformList;
#endif /* defined __cplusplus */
#endif /* defined __SVGAnimatedTransformList_FWD_DEFINED__ */

#ifndef __ISVGAnimatedBoolean_FWD_DEFINED__
#define __ISVGAnimatedBoolean_FWD_DEFINED__
typedef interface ISVGAnimatedBoolean ISVGAnimatedBoolean;
#endif

#ifndef __SVGAnimatedBoolean_FWD_DEFINED__
#define __SVGAnimatedBoolean_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGAnimatedBoolean SVGAnimatedBoolean;
#else
typedef struct SVGAnimatedBoolean SVGAnimatedBoolean;
#endif /* defined __cplusplus */
#endif /* defined __SVGAnimatedBoolean_FWD_DEFINED__ */

#ifndef __ISVGAnimatedEnumeration_FWD_DEFINED__
#define __ISVGAnimatedEnumeration_FWD_DEFINED__
typedef interface ISVGAnimatedEnumeration ISVGAnimatedEnumeration;
#endif

#ifndef __SVGAnimatedEnumeration_FWD_DEFINED__
#define __SVGAnimatedEnumeration_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGAnimatedEnumeration SVGAnimatedEnumeration;
#else
typedef struct SVGAnimatedEnumeration SVGAnimatedEnumeration;
#endif /* defined __cplusplus */
#endif /* defined __SVGAnimatedEnumeration_FWD_DEFINED__ */

#ifndef __ISVGAnimatedInteger_FWD_DEFINED__
#define __ISVGAnimatedInteger_FWD_DEFINED__
typedef interface ISVGAnimatedInteger ISVGAnimatedInteger;
#endif

#ifndef __SVGAnimatedInteger_FWD_DEFINED__
#define __SVGAnimatedInteger_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGAnimatedInteger SVGAnimatedInteger;
#else
typedef struct SVGAnimatedInteger SVGAnimatedInteger;
#endif /* defined __cplusplus */
#endif /* defined __SVGAnimatedInteger_FWD_DEFINED__ */

#ifndef __ISVGAnimatedLength_FWD_DEFINED__
#define __ISVGAnimatedLength_FWD_DEFINED__
typedef interface ISVGAnimatedLength ISVGAnimatedLength;
#endif

#ifndef __SVGAnimatedLength_FWD_DEFINED__
#define __SVGAnimatedLength_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGAnimatedLength SVGAnimatedLength;
#else
typedef struct SVGAnimatedLength SVGAnimatedLength;
#endif /* defined __cplusplus */
#endif /* defined __SVGAnimatedLength_FWD_DEFINED__ */

#ifndef __ISVGAnimatedLengthList_FWD_DEFINED__
#define __ISVGAnimatedLengthList_FWD_DEFINED__
typedef interface ISVGAnimatedLengthList ISVGAnimatedLengthList;
#endif

#ifndef __SVGAnimatedLengthList_FWD_DEFINED__
#define __SVGAnimatedLengthList_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGAnimatedLengthList SVGAnimatedLengthList;
#else
typedef struct SVGAnimatedLengthList SVGAnimatedLengthList;
#endif /* defined __cplusplus */
#endif /* defined __SVGAnimatedLengthList_FWD_DEFINED__ */

#ifndef __ISVGAnimatedNumber_FWD_DEFINED__
#define __ISVGAnimatedNumber_FWD_DEFINED__
typedef interface ISVGAnimatedNumber ISVGAnimatedNumber;
#endif

#ifndef __SVGAnimatedNumber_FWD_DEFINED__
#define __SVGAnimatedNumber_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGAnimatedNumber SVGAnimatedNumber;
#else
typedef struct SVGAnimatedNumber SVGAnimatedNumber;
#endif /* defined __cplusplus */
#endif /* defined __SVGAnimatedNumber_FWD_DEFINED__ */

#ifndef __ISVGAnimatedNumberList_FWD_DEFINED__
#define __ISVGAnimatedNumberList_FWD_DEFINED__
typedef interface ISVGAnimatedNumberList ISVGAnimatedNumberList;
#endif

#ifndef __SVGAnimatedNumberList_FWD_DEFINED__
#define __SVGAnimatedNumberList_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGAnimatedNumberList SVGAnimatedNumberList;
#else
typedef struct SVGAnimatedNumberList SVGAnimatedNumberList;
#endif /* defined __cplusplus */
#endif /* defined __SVGAnimatedNumberList_FWD_DEFINED__ */

#ifndef __ISVGAnimatedRect_FWD_DEFINED__
#define __ISVGAnimatedRect_FWD_DEFINED__
typedef interface ISVGAnimatedRect ISVGAnimatedRect;
#endif

#ifndef __SVGAnimatedRect_FWD_DEFINED__
#define __SVGAnimatedRect_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGAnimatedRect SVGAnimatedRect;
#else
typedef struct SVGAnimatedRect SVGAnimatedRect;
#endif /* defined __cplusplus */
#endif /* defined __SVGAnimatedRect_FWD_DEFINED__ */

#ifndef __ISVGAnimatedString_FWD_DEFINED__
#define __ISVGAnimatedString_FWD_DEFINED__
typedef interface ISVGAnimatedString ISVGAnimatedString;
#endif

#ifndef __SVGAnimatedString_FWD_DEFINED__
#define __SVGAnimatedString_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGAnimatedString SVGAnimatedString;
#else
typedef struct SVGAnimatedString SVGAnimatedString;
#endif /* defined __cplusplus */
#endif /* defined __SVGAnimatedString_FWD_DEFINED__ */

#ifndef __ISVGClipPathElement_FWD_DEFINED__
#define __ISVGClipPathElement_FWD_DEFINED__
typedef interface ISVGClipPathElement ISVGClipPathElement;
#endif

#ifndef __DispSVGClipPathElement_FWD_DEFINED__
#define __DispSVGClipPathElement_FWD_DEFINED__
typedef interface DispSVGClipPathElement DispSVGClipPathElement;
#endif

#ifndef __SVGClipPathElement_FWD_DEFINED__
#define __SVGClipPathElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGClipPathElement SVGClipPathElement;
#else
typedef struct SVGClipPathElement SVGClipPathElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGClipPathElement_FWD_DEFINED__ */

#ifndef __ISVGDocument_FWD_DEFINED__
#define __ISVGDocument_FWD_DEFINED__
typedef interface ISVGDocument ISVGDocument;
#endif

#ifndef __IGetSVGDocument_FWD_DEFINED__
#define __IGetSVGDocument_FWD_DEFINED__
typedef interface IGetSVGDocument IGetSVGDocument;
#endif

#ifndef __ISVGElement_FWD_DEFINED__
#define __ISVGElement_FWD_DEFINED__
typedef interface ISVGElement ISVGElement;
#endif

#ifndef __DispSVGElement_FWD_DEFINED__
#define __DispSVGElement_FWD_DEFINED__
typedef interface DispSVGElement DispSVGElement;
#endif

#ifndef __SVGElement_FWD_DEFINED__
#define __SVGElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGElement SVGElement;
#else
typedef struct SVGElement SVGElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGElement_FWD_DEFINED__ */

#ifndef __IICCSVGColor_FWD_DEFINED__
#define __IICCSVGColor_FWD_DEFINED__
typedef interface IICCSVGColor IICCSVGColor;
#endif

#ifndef __ISVGLength_FWD_DEFINED__
#define __ISVGLength_FWD_DEFINED__
typedef interface ISVGLength ISVGLength;
#endif

#ifndef __SVGLength_FWD_DEFINED__
#define __SVGLength_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGLength SVGLength;
#else
typedef struct SVGLength SVGLength;
#endif /* defined __cplusplus */
#endif /* defined __SVGLength_FWD_DEFINED__ */

#ifndef __ISVGLengthList_FWD_DEFINED__
#define __ISVGLengthList_FWD_DEFINED__
typedef interface ISVGLengthList ISVGLengthList;
#endif

#ifndef __SVGLengthList_FWD_DEFINED__
#define __SVGLengthList_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGLengthList SVGLengthList;
#else
typedef struct SVGLengthList SVGLengthList;
#endif /* defined __cplusplus */
#endif /* defined __SVGLengthList_FWD_DEFINED__ */

#ifndef __ISVGMatrix_FWD_DEFINED__
#define __ISVGMatrix_FWD_DEFINED__
typedef interface ISVGMatrix ISVGMatrix;
#endif

#ifndef __SVGMatrix_FWD_DEFINED__
#define __SVGMatrix_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGMatrix SVGMatrix;
#else
typedef struct SVGMatrix SVGMatrix;
#endif /* defined __cplusplus */
#endif /* defined __SVGMatrix_FWD_DEFINED__ */

#ifndef __ISVGNumber_FWD_DEFINED__
#define __ISVGNumber_FWD_DEFINED__
typedef interface ISVGNumber ISVGNumber;
#endif

#ifndef __SVGNumber_FWD_DEFINED__
#define __SVGNumber_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGNumber SVGNumber;
#else
typedef struct SVGNumber SVGNumber;
#endif /* defined __cplusplus */
#endif /* defined __SVGNumber_FWD_DEFINED__ */

#ifndef __ISVGNumberList_FWD_DEFINED__
#define __ISVGNumberList_FWD_DEFINED__
typedef interface ISVGNumberList ISVGNumberList;
#endif

#ifndef __SVGNumberList_FWD_DEFINED__
#define __SVGNumberList_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGNumberList SVGNumberList;
#else
typedef struct SVGNumberList SVGNumberList;
#endif /* defined __cplusplus */
#endif /* defined __SVGNumberList_FWD_DEFINED__ */

#ifndef __ISVGPaint_FWD_DEFINED__
#define __ISVGPaint_FWD_DEFINED__
typedef interface ISVGPaint ISVGPaint;
#endif

#ifndef __ISVGPatternElement_FWD_DEFINED__
#define __ISVGPatternElement_FWD_DEFINED__
typedef interface ISVGPatternElement ISVGPatternElement;
#endif

#ifndef __DispSVGPatternElement_FWD_DEFINED__
#define __DispSVGPatternElement_FWD_DEFINED__
typedef interface DispSVGPatternElement DispSVGPatternElement;
#endif

#ifndef __SVGPatternElement_FWD_DEFINED__
#define __SVGPatternElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGPatternElement SVGPatternElement;
#else
typedef struct SVGPatternElement SVGPatternElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGPatternElement_FWD_DEFINED__ */

#ifndef __ISVGPathSeg_FWD_DEFINED__
#define __ISVGPathSeg_FWD_DEFINED__
typedef interface ISVGPathSeg ISVGPathSeg;
#endif

#ifndef __ISVGPathSegArcAbs_FWD_DEFINED__
#define __ISVGPathSegArcAbs_FWD_DEFINED__
typedef interface ISVGPathSegArcAbs ISVGPathSegArcAbs;
#endif

#ifndef __ISVGPathSegArcRel_FWD_DEFINED__
#define __ISVGPathSegArcRel_FWD_DEFINED__
typedef interface ISVGPathSegArcRel ISVGPathSegArcRel;
#endif

#ifndef __ISVGPathSegClosePath_FWD_DEFINED__
#define __ISVGPathSegClosePath_FWD_DEFINED__
typedef interface ISVGPathSegClosePath ISVGPathSegClosePath;
#endif

#ifndef __ISVGPathSegMovetoAbs_FWD_DEFINED__
#define __ISVGPathSegMovetoAbs_FWD_DEFINED__
typedef interface ISVGPathSegMovetoAbs ISVGPathSegMovetoAbs;
#endif

#ifndef __ISVGPathSegMovetoRel_FWD_DEFINED__
#define __ISVGPathSegMovetoRel_FWD_DEFINED__
typedef interface ISVGPathSegMovetoRel ISVGPathSegMovetoRel;
#endif

#ifndef __ISVGPathSegLinetoAbs_FWD_DEFINED__
#define __ISVGPathSegLinetoAbs_FWD_DEFINED__
typedef interface ISVGPathSegLinetoAbs ISVGPathSegLinetoAbs;
#endif

#ifndef __ISVGPathSegLinetoRel_FWD_DEFINED__
#define __ISVGPathSegLinetoRel_FWD_DEFINED__
typedef interface ISVGPathSegLinetoRel ISVGPathSegLinetoRel;
#endif

#ifndef __ISVGPathSegCurvetoCubicAbs_FWD_DEFINED__
#define __ISVGPathSegCurvetoCubicAbs_FWD_DEFINED__
typedef interface ISVGPathSegCurvetoCubicAbs ISVGPathSegCurvetoCubicAbs;
#endif

#ifndef __ISVGPathSegCurvetoCubicRel_FWD_DEFINED__
#define __ISVGPathSegCurvetoCubicRel_FWD_DEFINED__
typedef interface ISVGPathSegCurvetoCubicRel ISVGPathSegCurvetoCubicRel;
#endif

#ifndef __ISVGPathSegCurvetoCubicSmoothAbs_FWD_DEFINED__
#define __ISVGPathSegCurvetoCubicSmoothAbs_FWD_DEFINED__
typedef interface ISVGPathSegCurvetoCubicSmoothAbs ISVGPathSegCurvetoCubicSmoothAbs;
#endif

#ifndef __ISVGPathSegCurvetoCubicSmoothRel_FWD_DEFINED__
#define __ISVGPathSegCurvetoCubicSmoothRel_FWD_DEFINED__
typedef interface ISVGPathSegCurvetoCubicSmoothRel ISVGPathSegCurvetoCubicSmoothRel;
#endif

#ifndef __ISVGPathSegCurvetoQuadraticAbs_FWD_DEFINED__
#define __ISVGPathSegCurvetoQuadraticAbs_FWD_DEFINED__
typedef interface ISVGPathSegCurvetoQuadraticAbs ISVGPathSegCurvetoQuadraticAbs;
#endif

#ifndef __ISVGPathSegCurvetoQuadraticRel_FWD_DEFINED__
#define __ISVGPathSegCurvetoQuadraticRel_FWD_DEFINED__
typedef interface ISVGPathSegCurvetoQuadraticRel ISVGPathSegCurvetoQuadraticRel;
#endif

#ifndef __ISVGPathSegCurvetoQuadraticSmoothAbs_FWD_DEFINED__
#define __ISVGPathSegCurvetoQuadraticSmoothAbs_FWD_DEFINED__
typedef interface ISVGPathSegCurvetoQuadraticSmoothAbs ISVGPathSegCurvetoQuadraticSmoothAbs;
#endif

#ifndef __ISVGPathSegCurvetoQuadraticSmoothRel_FWD_DEFINED__
#define __ISVGPathSegCurvetoQuadraticSmoothRel_FWD_DEFINED__
typedef interface ISVGPathSegCurvetoQuadraticSmoothRel ISVGPathSegCurvetoQuadraticSmoothRel;
#endif

#ifndef __ISVGPathSegLinetoHorizontalAbs_FWD_DEFINED__
#define __ISVGPathSegLinetoHorizontalAbs_FWD_DEFINED__
typedef interface ISVGPathSegLinetoHorizontalAbs ISVGPathSegLinetoHorizontalAbs;
#endif

#ifndef __ISVGPathSegLinetoHorizontalRel_FWD_DEFINED__
#define __ISVGPathSegLinetoHorizontalRel_FWD_DEFINED__
typedef interface ISVGPathSegLinetoHorizontalRel ISVGPathSegLinetoHorizontalRel;
#endif

#ifndef __ISVGPathSegLinetoVerticalAbs_FWD_DEFINED__
#define __ISVGPathSegLinetoVerticalAbs_FWD_DEFINED__
typedef interface ISVGPathSegLinetoVerticalAbs ISVGPathSegLinetoVerticalAbs;
#endif

#ifndef __ISVGPathSegLinetoVerticalRel_FWD_DEFINED__
#define __ISVGPathSegLinetoVerticalRel_FWD_DEFINED__
typedef interface ISVGPathSegLinetoVerticalRel ISVGPathSegLinetoVerticalRel;
#endif

#ifndef __SVGPathSeg_FWD_DEFINED__
#define __SVGPathSeg_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGPathSeg SVGPathSeg;
#else
typedef struct SVGPathSeg SVGPathSeg;
#endif /* defined __cplusplus */
#endif /* defined __SVGPathSeg_FWD_DEFINED__ */

#ifndef __DispSVGPathSegArcAbs_FWD_DEFINED__
#define __DispSVGPathSegArcAbs_FWD_DEFINED__
typedef interface DispSVGPathSegArcAbs DispSVGPathSegArcAbs;
#endif

#ifndef __SVGPathSegArcAbs_FWD_DEFINED__
#define __SVGPathSegArcAbs_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGPathSegArcAbs SVGPathSegArcAbs;
#else
typedef struct SVGPathSegArcAbs SVGPathSegArcAbs;
#endif /* defined __cplusplus */
#endif /* defined __SVGPathSegArcAbs_FWD_DEFINED__ */

#ifndef __DispSVGPathSegArcRel_FWD_DEFINED__
#define __DispSVGPathSegArcRel_FWD_DEFINED__
typedef interface DispSVGPathSegArcRel DispSVGPathSegArcRel;
#endif

#ifndef __SVGPathSegArcRel_FWD_DEFINED__
#define __SVGPathSegArcRel_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGPathSegArcRel SVGPathSegArcRel;
#else
typedef struct SVGPathSegArcRel SVGPathSegArcRel;
#endif /* defined __cplusplus */
#endif /* defined __SVGPathSegArcRel_FWD_DEFINED__ */

#ifndef __DispSVGPathSegClosePath_FWD_DEFINED__
#define __DispSVGPathSegClosePath_FWD_DEFINED__
typedef interface DispSVGPathSegClosePath DispSVGPathSegClosePath;
#endif

#ifndef __SVGPathSegClosePath_FWD_DEFINED__
#define __SVGPathSegClosePath_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGPathSegClosePath SVGPathSegClosePath;
#else
typedef struct SVGPathSegClosePath SVGPathSegClosePath;
#endif /* defined __cplusplus */
#endif /* defined __SVGPathSegClosePath_FWD_DEFINED__ */

#ifndef __DispSVGPathSegMovetoAbs_FWD_DEFINED__
#define __DispSVGPathSegMovetoAbs_FWD_DEFINED__
typedef interface DispSVGPathSegMovetoAbs DispSVGPathSegMovetoAbs;
#endif

#ifndef __SVGPathSegMovetoAbs_FWD_DEFINED__
#define __SVGPathSegMovetoAbs_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGPathSegMovetoAbs SVGPathSegMovetoAbs;
#else
typedef struct SVGPathSegMovetoAbs SVGPathSegMovetoAbs;
#endif /* defined __cplusplus */
#endif /* defined __SVGPathSegMovetoAbs_FWD_DEFINED__ */

#ifndef __DispSVGPathSegMovetoRel_FWD_DEFINED__
#define __DispSVGPathSegMovetoRel_FWD_DEFINED__
typedef interface DispSVGPathSegMovetoRel DispSVGPathSegMovetoRel;
#endif

#ifndef __SVGPathSegMovetoRel_FWD_DEFINED__
#define __SVGPathSegMovetoRel_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGPathSegMovetoRel SVGPathSegMovetoRel;
#else
typedef struct SVGPathSegMovetoRel SVGPathSegMovetoRel;
#endif /* defined __cplusplus */
#endif /* defined __SVGPathSegMovetoRel_FWD_DEFINED__ */

#ifndef __DispSVGPathSegLinetoAbs_FWD_DEFINED__
#define __DispSVGPathSegLinetoAbs_FWD_DEFINED__
typedef interface DispSVGPathSegLinetoAbs DispSVGPathSegLinetoAbs;
#endif

#ifndef __SVGPathSegLinetoAbs_FWD_DEFINED__
#define __SVGPathSegLinetoAbs_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGPathSegLinetoAbs SVGPathSegLinetoAbs;
#else
typedef struct SVGPathSegLinetoAbs SVGPathSegLinetoAbs;
#endif /* defined __cplusplus */
#endif /* defined __SVGPathSegLinetoAbs_FWD_DEFINED__ */

#ifndef __DispSVGPathSegLinetoRel_FWD_DEFINED__
#define __DispSVGPathSegLinetoRel_FWD_DEFINED__
typedef interface DispSVGPathSegLinetoRel DispSVGPathSegLinetoRel;
#endif

#ifndef __SVGPathSegLinetoRel_FWD_DEFINED__
#define __SVGPathSegLinetoRel_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGPathSegLinetoRel SVGPathSegLinetoRel;
#else
typedef struct SVGPathSegLinetoRel SVGPathSegLinetoRel;
#endif /* defined __cplusplus */
#endif /* defined __SVGPathSegLinetoRel_FWD_DEFINED__ */

#ifndef __DispSVGPathSegCurvetoCubicAbs_FWD_DEFINED__
#define __DispSVGPathSegCurvetoCubicAbs_FWD_DEFINED__
typedef interface DispSVGPathSegCurvetoCubicAbs DispSVGPathSegCurvetoCubicAbs;
#endif

#ifndef __SVGPathSegCurvetoCubicAbs_FWD_DEFINED__
#define __SVGPathSegCurvetoCubicAbs_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGPathSegCurvetoCubicAbs SVGPathSegCurvetoCubicAbs;
#else
typedef struct SVGPathSegCurvetoCubicAbs SVGPathSegCurvetoCubicAbs;
#endif /* defined __cplusplus */
#endif /* defined __SVGPathSegCurvetoCubicAbs_FWD_DEFINED__ */

#ifndef __DispSVGPathSegCurvetoCubicRel_FWD_DEFINED__
#define __DispSVGPathSegCurvetoCubicRel_FWD_DEFINED__
typedef interface DispSVGPathSegCurvetoCubicRel DispSVGPathSegCurvetoCubicRel;
#endif

#ifndef __SVGPathSegCurvetoCubicRel_FWD_DEFINED__
#define __SVGPathSegCurvetoCubicRel_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGPathSegCurvetoCubicRel SVGPathSegCurvetoCubicRel;
#else
typedef struct SVGPathSegCurvetoCubicRel SVGPathSegCurvetoCubicRel;
#endif /* defined __cplusplus */
#endif /* defined __SVGPathSegCurvetoCubicRel_FWD_DEFINED__ */

#ifndef __DispSVGPathSegCurvetoCubicSmoothAbs_FWD_DEFINED__
#define __DispSVGPathSegCurvetoCubicSmoothAbs_FWD_DEFINED__
typedef interface DispSVGPathSegCurvetoCubicSmoothAbs DispSVGPathSegCurvetoCubicSmoothAbs;
#endif

#ifndef __SVGPathSegCurvetoCubicSmoothAbs_FWD_DEFINED__
#define __SVGPathSegCurvetoCubicSmoothAbs_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGPathSegCurvetoCubicSmoothAbs SVGPathSegCurvetoCubicSmoothAbs;
#else
typedef struct SVGPathSegCurvetoCubicSmoothAbs SVGPathSegCurvetoCubicSmoothAbs;
#endif /* defined __cplusplus */
#endif /* defined __SVGPathSegCurvetoCubicSmoothAbs_FWD_DEFINED__ */

#ifndef __DispSVGPathSegCurvetoCubicSmoothRel_FWD_DEFINED__
#define __DispSVGPathSegCurvetoCubicSmoothRel_FWD_DEFINED__
typedef interface DispSVGPathSegCurvetoCubicSmoothRel DispSVGPathSegCurvetoCubicSmoothRel;
#endif

#ifndef __SVGPathSegCurvetoCubicSmoothRel_FWD_DEFINED__
#define __SVGPathSegCurvetoCubicSmoothRel_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGPathSegCurvetoCubicSmoothRel SVGPathSegCurvetoCubicSmoothRel;
#else
typedef struct SVGPathSegCurvetoCubicSmoothRel SVGPathSegCurvetoCubicSmoothRel;
#endif /* defined __cplusplus */
#endif /* defined __SVGPathSegCurvetoCubicSmoothRel_FWD_DEFINED__ */

#ifndef __DispSVGPathSegCurvetoQuadraticAbs_FWD_DEFINED__
#define __DispSVGPathSegCurvetoQuadraticAbs_FWD_DEFINED__
typedef interface DispSVGPathSegCurvetoQuadraticAbs DispSVGPathSegCurvetoQuadraticAbs;
#endif

#ifndef __SVGPathSegCurvetoQuadraticAbs_FWD_DEFINED__
#define __SVGPathSegCurvetoQuadraticAbs_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGPathSegCurvetoQuadraticAbs SVGPathSegCurvetoQuadraticAbs;
#else
typedef struct SVGPathSegCurvetoQuadraticAbs SVGPathSegCurvetoQuadraticAbs;
#endif /* defined __cplusplus */
#endif /* defined __SVGPathSegCurvetoQuadraticAbs_FWD_DEFINED__ */

#ifndef __DispSVGPathSegCurvetoQuadraticRel_FWD_DEFINED__
#define __DispSVGPathSegCurvetoQuadraticRel_FWD_DEFINED__
typedef interface DispSVGPathSegCurvetoQuadraticRel DispSVGPathSegCurvetoQuadraticRel;
#endif

#ifndef __SVGPathSegCurvetoQuadraticRel_FWD_DEFINED__
#define __SVGPathSegCurvetoQuadraticRel_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGPathSegCurvetoQuadraticRel SVGPathSegCurvetoQuadraticRel;
#else
typedef struct SVGPathSegCurvetoQuadraticRel SVGPathSegCurvetoQuadraticRel;
#endif /* defined __cplusplus */
#endif /* defined __SVGPathSegCurvetoQuadraticRel_FWD_DEFINED__ */

#ifndef __DispSVGPathSegCurvetoQuadraticSmoothAbs_FWD_DEFINED__
#define __DispSVGPathSegCurvetoQuadraticSmoothAbs_FWD_DEFINED__
typedef interface DispSVGPathSegCurvetoQuadraticSmoothAbs DispSVGPathSegCurvetoQuadraticSmoothAbs;
#endif

#ifndef __SVGPathSegCurvetoQuadraticSmoothAbs_FWD_DEFINED__
#define __SVGPathSegCurvetoQuadraticSmoothAbs_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGPathSegCurvetoQuadraticSmoothAbs SVGPathSegCurvetoQuadraticSmoothAbs;
#else
typedef struct SVGPathSegCurvetoQuadraticSmoothAbs SVGPathSegCurvetoQuadraticSmoothAbs;
#endif /* defined __cplusplus */
#endif /* defined __SVGPathSegCurvetoQuadraticSmoothAbs_FWD_DEFINED__ */

#ifndef __DispSVGPathSegCurvetoQuadraticSmoothRel_FWD_DEFINED__
#define __DispSVGPathSegCurvetoQuadraticSmoothRel_FWD_DEFINED__
typedef interface DispSVGPathSegCurvetoQuadraticSmoothRel DispSVGPathSegCurvetoQuadraticSmoothRel;
#endif

#ifndef __SVGPathSegCurvetoQuadraticSmoothRel_FWD_DEFINED__
#define __SVGPathSegCurvetoQuadraticSmoothRel_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGPathSegCurvetoQuadraticSmoothRel SVGPathSegCurvetoQuadraticSmoothRel;
#else
typedef struct SVGPathSegCurvetoQuadraticSmoothRel SVGPathSegCurvetoQuadraticSmoothRel;
#endif /* defined __cplusplus */
#endif /* defined __SVGPathSegCurvetoQuadraticSmoothRel_FWD_DEFINED__ */

#ifndef __DispSVGPathSegLinetoHorizontalAbs_FWD_DEFINED__
#define __DispSVGPathSegLinetoHorizontalAbs_FWD_DEFINED__
typedef interface DispSVGPathSegLinetoHorizontalAbs DispSVGPathSegLinetoHorizontalAbs;
#endif

#ifndef __SVGPathSegLinetoHorizontalAbs_FWD_DEFINED__
#define __SVGPathSegLinetoHorizontalAbs_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGPathSegLinetoHorizontalAbs SVGPathSegLinetoHorizontalAbs;
#else
typedef struct SVGPathSegLinetoHorizontalAbs SVGPathSegLinetoHorizontalAbs;
#endif /* defined __cplusplus */
#endif /* defined __SVGPathSegLinetoHorizontalAbs_FWD_DEFINED__ */

#ifndef __DispSVGPathSegLinetoHorizontalRel_FWD_DEFINED__
#define __DispSVGPathSegLinetoHorizontalRel_FWD_DEFINED__
typedef interface DispSVGPathSegLinetoHorizontalRel DispSVGPathSegLinetoHorizontalRel;
#endif

#ifndef __SVGPathSegLinetoHorizontalRel_FWD_DEFINED__
#define __SVGPathSegLinetoHorizontalRel_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGPathSegLinetoHorizontalRel SVGPathSegLinetoHorizontalRel;
#else
typedef struct SVGPathSegLinetoHorizontalRel SVGPathSegLinetoHorizontalRel;
#endif /* defined __cplusplus */
#endif /* defined __SVGPathSegLinetoHorizontalRel_FWD_DEFINED__ */

#ifndef __DispSVGPathSegLinetoVerticalAbs_FWD_DEFINED__
#define __DispSVGPathSegLinetoVerticalAbs_FWD_DEFINED__
typedef interface DispSVGPathSegLinetoVerticalAbs DispSVGPathSegLinetoVerticalAbs;
#endif

#ifndef __SVGPathSegLinetoVerticalAbs_FWD_DEFINED__
#define __SVGPathSegLinetoVerticalAbs_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGPathSegLinetoVerticalAbs SVGPathSegLinetoVerticalAbs;
#else
typedef struct SVGPathSegLinetoVerticalAbs SVGPathSegLinetoVerticalAbs;
#endif /* defined __cplusplus */
#endif /* defined __SVGPathSegLinetoVerticalAbs_FWD_DEFINED__ */

#ifndef __DispSVGPathSegLinetoVerticalRel_FWD_DEFINED__
#define __DispSVGPathSegLinetoVerticalRel_FWD_DEFINED__
typedef interface DispSVGPathSegLinetoVerticalRel DispSVGPathSegLinetoVerticalRel;
#endif

#ifndef __SVGPathSegLinetoVerticalRel_FWD_DEFINED__
#define __SVGPathSegLinetoVerticalRel_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGPathSegLinetoVerticalRel SVGPathSegLinetoVerticalRel;
#else
typedef struct SVGPathSegLinetoVerticalRel SVGPathSegLinetoVerticalRel;
#endif /* defined __cplusplus */
#endif /* defined __SVGPathSegLinetoVerticalRel_FWD_DEFINED__ */

#ifndef __ISVGPathSegList_FWD_DEFINED__
#define __ISVGPathSegList_FWD_DEFINED__
typedef interface ISVGPathSegList ISVGPathSegList;
#endif

#ifndef __SVGPathSegList_FWD_DEFINED__
#define __SVGPathSegList_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGPathSegList SVGPathSegList;
#else
typedef struct SVGPathSegList SVGPathSegList;
#endif /* defined __cplusplus */
#endif /* defined __SVGPathSegList_FWD_DEFINED__ */

#ifndef __ISVGPoint_FWD_DEFINED__
#define __ISVGPoint_FWD_DEFINED__
typedef interface ISVGPoint ISVGPoint;
#endif

#ifndef __SVGPoint_FWD_DEFINED__
#define __SVGPoint_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGPoint SVGPoint;
#else
typedef struct SVGPoint SVGPoint;
#endif /* defined __cplusplus */
#endif /* defined __SVGPoint_FWD_DEFINED__ */

#ifndef __ISVGPointList_FWD_DEFINED__
#define __ISVGPointList_FWD_DEFINED__
typedef interface ISVGPointList ISVGPointList;
#endif

#ifndef __SVGPointList_FWD_DEFINED__
#define __SVGPointList_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGPointList SVGPointList;
#else
typedef struct SVGPointList SVGPointList;
#endif /* defined __cplusplus */
#endif /* defined __SVGPointList_FWD_DEFINED__ */

#ifndef __ISVGRect_FWD_DEFINED__
#define __ISVGRect_FWD_DEFINED__
typedef interface ISVGRect ISVGRect;
#endif

#ifndef __SVGRect_FWD_DEFINED__
#define __SVGRect_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGRect SVGRect;
#else
typedef struct SVGRect SVGRect;
#endif /* defined __cplusplus */
#endif /* defined __SVGRect_FWD_DEFINED__ */

#ifndef __ISVGStringList_FWD_DEFINED__
#define __ISVGStringList_FWD_DEFINED__
typedef interface ISVGStringList ISVGStringList;
#endif

#ifndef __SVGStringList_FWD_DEFINED__
#define __SVGStringList_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGStringList SVGStringList;
#else
typedef struct SVGStringList SVGStringList;
#endif /* defined __cplusplus */
#endif /* defined __SVGStringList_FWD_DEFINED__ */

#ifndef __ISVGViewSpec_FWD_DEFINED__
#define __ISVGViewSpec_FWD_DEFINED__
typedef interface ISVGViewSpec ISVGViewSpec;
#endif

#ifndef __ISVGTransform_FWD_DEFINED__
#define __ISVGTransform_FWD_DEFINED__
typedef interface ISVGTransform ISVGTransform;
#endif

#ifndef __SVGTransform_FWD_DEFINED__
#define __SVGTransform_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGTransform SVGTransform;
#else
typedef struct SVGTransform SVGTransform;
#endif /* defined __cplusplus */
#endif /* defined __SVGTransform_FWD_DEFINED__ */

#ifndef __ISVGSVGElement_FWD_DEFINED__
#define __ISVGSVGElement_FWD_DEFINED__
typedef interface ISVGSVGElement ISVGSVGElement;
#endif

#ifndef __DispSVGSVGElement_FWD_DEFINED__
#define __DispSVGSVGElement_FWD_DEFINED__
typedef interface DispSVGSVGElement DispSVGSVGElement;
#endif

#ifndef __SVGSVGElement_FWD_DEFINED__
#define __SVGSVGElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGSVGElement SVGSVGElement;
#else
typedef struct SVGSVGElement SVGSVGElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGSVGElement_FWD_DEFINED__ */

#ifndef __ISVGUseElement_FWD_DEFINED__
#define __ISVGUseElement_FWD_DEFINED__
typedef interface ISVGUseElement ISVGUseElement;
#endif

#ifndef __DispSVGUseElement_FWD_DEFINED__
#define __DispSVGUseElement_FWD_DEFINED__
typedef interface DispSVGUseElement DispSVGUseElement;
#endif

#ifndef __SVGUseElement_FWD_DEFINED__
#define __SVGUseElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGUseElement SVGUseElement;
#else
typedef struct SVGUseElement SVGUseElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGUseElement_FWD_DEFINED__ */

#ifndef __IHTMLStyleSheetRulesAppliedCollection_FWD_DEFINED__
#define __IHTMLStyleSheetRulesAppliedCollection_FWD_DEFINED__
typedef interface IHTMLStyleSheetRulesAppliedCollection IHTMLStyleSheetRulesAppliedCollection;
#endif

#ifndef __IRulesApplied_FWD_DEFINED__
#define __IRulesApplied_FWD_DEFINED__
typedef interface IRulesApplied IRulesApplied;
#endif

#ifndef __IRulesAppliedCollection_FWD_DEFINED__
#define __IRulesAppliedCollection_FWD_DEFINED__
typedef interface IRulesAppliedCollection IRulesAppliedCollection;
#endif

#ifndef __DispHTMLStyleSheetRulesAppliedCollection_FWD_DEFINED__
#define __DispHTMLStyleSheetRulesAppliedCollection_FWD_DEFINED__
typedef interface DispHTMLStyleSheetRulesAppliedCollection DispHTMLStyleSheetRulesAppliedCollection;
#endif

#ifndef __HTMLStyleSheetRulesAppliedCollection_FWD_DEFINED__
#define __HTMLStyleSheetRulesAppliedCollection_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLStyleSheetRulesAppliedCollection HTMLStyleSheetRulesAppliedCollection;
#else
typedef struct HTMLStyleSheetRulesAppliedCollection HTMLStyleSheetRulesAppliedCollection;
#endif /* defined __cplusplus */
#endif /* defined __HTMLStyleSheetRulesAppliedCollection_FWD_DEFINED__ */

#ifndef __DispRulesApplied_FWD_DEFINED__
#define __DispRulesApplied_FWD_DEFINED__
typedef interface DispRulesApplied DispRulesApplied;
#endif

#ifndef __RulesApplied_FWD_DEFINED__
#define __RulesApplied_FWD_DEFINED__
#ifdef __cplusplus
typedef class RulesApplied RulesApplied;
#else
typedef struct RulesApplied RulesApplied;
#endif /* defined __cplusplus */
#endif /* defined __RulesApplied_FWD_DEFINED__ */

#ifndef __DispRulesAppliedCollection_FWD_DEFINED__
#define __DispRulesAppliedCollection_FWD_DEFINED__
typedef interface DispRulesAppliedCollection DispRulesAppliedCollection;
#endif

#ifndef __RulesAppliedCollection_FWD_DEFINED__
#define __RulesAppliedCollection_FWD_DEFINED__
#ifdef __cplusplus
typedef class RulesAppliedCollection RulesAppliedCollection;
#else
typedef struct RulesAppliedCollection RulesAppliedCollection;
#endif /* defined __cplusplus */
#endif /* defined __RulesAppliedCollection_FWD_DEFINED__ */

#ifndef __DispHTMLW3CComputedStyle_FWD_DEFINED__
#define __DispHTMLW3CComputedStyle_FWD_DEFINED__
typedef interface DispHTMLW3CComputedStyle DispHTMLW3CComputedStyle;
#endif

#ifndef __HTMLW3CComputedStyle_FWD_DEFINED__
#define __HTMLW3CComputedStyle_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLW3CComputedStyle HTMLW3CComputedStyle;
#else
typedef struct HTMLW3CComputedStyle HTMLW3CComputedStyle;
#endif /* defined __cplusplus */
#endif /* defined __HTMLW3CComputedStyle_FWD_DEFINED__ */

#ifndef __ISVGTransformList_FWD_DEFINED__
#define __ISVGTransformList_FWD_DEFINED__
typedef interface ISVGTransformList ISVGTransformList;
#endif

#ifndef __SVGTransformList_FWD_DEFINED__
#define __SVGTransformList_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGTransformList SVGTransformList;
#else
typedef struct SVGTransformList SVGTransformList;
#endif /* defined __cplusplus */
#endif /* defined __SVGTransformList_FWD_DEFINED__ */

#ifndef __ISVGAnimatedPoints_FWD_DEFINED__
#define __ISVGAnimatedPoints_FWD_DEFINED__
typedef interface ISVGAnimatedPoints ISVGAnimatedPoints;
#endif

#ifndef __ISVGCircleElement_FWD_DEFINED__
#define __ISVGCircleElement_FWD_DEFINED__
typedef interface ISVGCircleElement ISVGCircleElement;
#endif

#ifndef __ISVGEllipseElement_FWD_DEFINED__
#define __ISVGEllipseElement_FWD_DEFINED__
typedef interface ISVGEllipseElement ISVGEllipseElement;
#endif

#ifndef __ISVGLineElement_FWD_DEFINED__
#define __ISVGLineElement_FWD_DEFINED__
typedef interface ISVGLineElement ISVGLineElement;
#endif

#ifndef __ISVGRectElement_FWD_DEFINED__
#define __ISVGRectElement_FWD_DEFINED__
typedef interface ISVGRectElement ISVGRectElement;
#endif

#ifndef __ISVGPolygonElement_FWD_DEFINED__
#define __ISVGPolygonElement_FWD_DEFINED__
typedef interface ISVGPolygonElement ISVGPolygonElement;
#endif

#ifndef __ISVGPolylineElement_FWD_DEFINED__
#define __ISVGPolylineElement_FWD_DEFINED__
typedef interface ISVGPolylineElement ISVGPolylineElement;
#endif

#ifndef __DispSVGCircleElement_FWD_DEFINED__
#define __DispSVGCircleElement_FWD_DEFINED__
typedef interface DispSVGCircleElement DispSVGCircleElement;
#endif

#ifndef __SVGCircleElement_FWD_DEFINED__
#define __SVGCircleElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGCircleElement SVGCircleElement;
#else
typedef struct SVGCircleElement SVGCircleElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGCircleElement_FWD_DEFINED__ */

#ifndef __DispSVGEllipseElement_FWD_DEFINED__
#define __DispSVGEllipseElement_FWD_DEFINED__
typedef interface DispSVGEllipseElement DispSVGEllipseElement;
#endif

#ifndef __SVGEllipseElement_FWD_DEFINED__
#define __SVGEllipseElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGEllipseElement SVGEllipseElement;
#else
typedef struct SVGEllipseElement SVGEllipseElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGEllipseElement_FWD_DEFINED__ */

#ifndef __DispSVGLineElement_FWD_DEFINED__
#define __DispSVGLineElement_FWD_DEFINED__
typedef interface DispSVGLineElement DispSVGLineElement;
#endif

#ifndef __SVGLineElement_FWD_DEFINED__
#define __SVGLineElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGLineElement SVGLineElement;
#else
typedef struct SVGLineElement SVGLineElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGLineElement_FWD_DEFINED__ */

#ifndef __DispSVGRectElement_FWD_DEFINED__
#define __DispSVGRectElement_FWD_DEFINED__
typedef interface DispSVGRectElement DispSVGRectElement;
#endif

#ifndef __SVGRectElement_FWD_DEFINED__
#define __SVGRectElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGRectElement SVGRectElement;
#else
typedef struct SVGRectElement SVGRectElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGRectElement_FWD_DEFINED__ */

#ifndef __DispSVGPolygonElement_FWD_DEFINED__
#define __DispSVGPolygonElement_FWD_DEFINED__
typedef interface DispSVGPolygonElement DispSVGPolygonElement;
#endif

#ifndef __SVGPolygonElement_FWD_DEFINED__
#define __SVGPolygonElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGPolygonElement SVGPolygonElement;
#else
typedef struct SVGPolygonElement SVGPolygonElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGPolygonElement_FWD_DEFINED__ */

#ifndef __DispSVGPolylineElement_FWD_DEFINED__
#define __DispSVGPolylineElement_FWD_DEFINED__
typedef interface DispSVGPolylineElement DispSVGPolylineElement;
#endif

#ifndef __SVGPolylineElement_FWD_DEFINED__
#define __SVGPolylineElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGPolylineElement SVGPolylineElement;
#else
typedef struct SVGPolylineElement SVGPolylineElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGPolylineElement_FWD_DEFINED__ */

#ifndef __ISVGGElement_FWD_DEFINED__
#define __ISVGGElement_FWD_DEFINED__
typedef interface ISVGGElement ISVGGElement;
#endif

#ifndef __DispSVGGElement_FWD_DEFINED__
#define __DispSVGGElement_FWD_DEFINED__
typedef interface DispSVGGElement DispSVGGElement;
#endif

#ifndef __SVGGElement_FWD_DEFINED__
#define __SVGGElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGGElement SVGGElement;
#else
typedef struct SVGGElement SVGGElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGGElement_FWD_DEFINED__ */

#ifndef __ISVGSymbolElement_FWD_DEFINED__
#define __ISVGSymbolElement_FWD_DEFINED__
typedef interface ISVGSymbolElement ISVGSymbolElement;
#endif

#ifndef __DispSVGSymbolElement_FWD_DEFINED__
#define __DispSVGSymbolElement_FWD_DEFINED__
typedef interface DispSVGSymbolElement DispSVGSymbolElement;
#endif

#ifndef __SVGSymbolElement_FWD_DEFINED__
#define __SVGSymbolElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGSymbolElement SVGSymbolElement;
#else
typedef struct SVGSymbolElement SVGSymbolElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGSymbolElement_FWD_DEFINED__ */

#ifndef __ISVGDefsElement_FWD_DEFINED__
#define __ISVGDefsElement_FWD_DEFINED__
typedef interface ISVGDefsElement ISVGDefsElement;
#endif

#ifndef __DispSVGDefsElement_FWD_DEFINED__
#define __DispSVGDefsElement_FWD_DEFINED__
typedef interface DispSVGDefsElement DispSVGDefsElement;
#endif

#ifndef __SVGDefsElement_FWD_DEFINED__
#define __SVGDefsElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGDefsElement SVGDefsElement;
#else
typedef struct SVGDefsElement SVGDefsElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGDefsElement_FWD_DEFINED__ */

#ifndef __ISVGAnimatedPathData_FWD_DEFINED__
#define __ISVGAnimatedPathData_FWD_DEFINED__
typedef interface ISVGAnimatedPathData ISVGAnimatedPathData;
#endif

#ifndef __ISVGPathElement_FWD_DEFINED__
#define __ISVGPathElement_FWD_DEFINED__
typedef interface ISVGPathElement ISVGPathElement;
#endif

#ifndef __DispSVGPathElement_FWD_DEFINED__
#define __DispSVGPathElement_FWD_DEFINED__
typedef interface DispSVGPathElement DispSVGPathElement;
#endif

#ifndef __SVGPathElement_FWD_DEFINED__
#define __SVGPathElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGPathElement SVGPathElement;
#else
typedef struct SVGPathElement SVGPathElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGPathElement_FWD_DEFINED__ */

#ifndef __ISVGPreserveAspectRatio_FWD_DEFINED__
#define __ISVGPreserveAspectRatio_FWD_DEFINED__
typedef interface ISVGPreserveAspectRatio ISVGPreserveAspectRatio;
#endif

#ifndef __SVGPreserveAspectRatio_FWD_DEFINED__
#define __SVGPreserveAspectRatio_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGPreserveAspectRatio SVGPreserveAspectRatio;
#else
typedef struct SVGPreserveAspectRatio SVGPreserveAspectRatio;
#endif /* defined __cplusplus */
#endif /* defined __SVGPreserveAspectRatio_FWD_DEFINED__ */

#ifndef __ISVGTextElement_FWD_DEFINED__
#define __ISVGTextElement_FWD_DEFINED__
typedef interface ISVGTextElement ISVGTextElement;
#endif

#ifndef __DispSVGTextElement_FWD_DEFINED__
#define __DispSVGTextElement_FWD_DEFINED__
typedef interface DispSVGTextElement DispSVGTextElement;
#endif

#ifndef __SVGTextElement_FWD_DEFINED__
#define __SVGTextElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGTextElement SVGTextElement;
#else
typedef struct SVGTextElement SVGTextElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGTextElement_FWD_DEFINED__ */

#ifndef __ISVGAnimatedPreserveAspectRatio_FWD_DEFINED__
#define __ISVGAnimatedPreserveAspectRatio_FWD_DEFINED__
typedef interface ISVGAnimatedPreserveAspectRatio ISVGAnimatedPreserveAspectRatio;
#endif

#ifndef __SVGAnimatedPreserveAspectRatio_FWD_DEFINED__
#define __SVGAnimatedPreserveAspectRatio_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGAnimatedPreserveAspectRatio SVGAnimatedPreserveAspectRatio;
#else
typedef struct SVGAnimatedPreserveAspectRatio SVGAnimatedPreserveAspectRatio;
#endif /* defined __cplusplus */
#endif /* defined __SVGAnimatedPreserveAspectRatio_FWD_DEFINED__ */

#ifndef __ISVGImageElement_FWD_DEFINED__
#define __ISVGImageElement_FWD_DEFINED__
typedef interface ISVGImageElement ISVGImageElement;
#endif

#ifndef __DispSVGImageElement_FWD_DEFINED__
#define __DispSVGImageElement_FWD_DEFINED__
typedef interface DispSVGImageElement DispSVGImageElement;
#endif

#ifndef __SVGImageElement_FWD_DEFINED__
#define __SVGImageElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGImageElement SVGImageElement;
#else
typedef struct SVGImageElement SVGImageElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGImageElement_FWD_DEFINED__ */

#ifndef __ISVGStopElement_FWD_DEFINED__
#define __ISVGStopElement_FWD_DEFINED__
typedef interface ISVGStopElement ISVGStopElement;
#endif

#ifndef __DispSVGStopElement_FWD_DEFINED__
#define __DispSVGStopElement_FWD_DEFINED__
typedef interface DispSVGStopElement DispSVGStopElement;
#endif

#ifndef __SVGStopElement_FWD_DEFINED__
#define __SVGStopElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGStopElement SVGStopElement;
#else
typedef struct SVGStopElement SVGStopElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGStopElement_FWD_DEFINED__ */

#ifndef __ISVGGradientElement_FWD_DEFINED__
#define __ISVGGradientElement_FWD_DEFINED__
typedef interface ISVGGradientElement ISVGGradientElement;
#endif

#ifndef __DispSVGGradientElement_FWD_DEFINED__
#define __DispSVGGradientElement_FWD_DEFINED__
typedef interface DispSVGGradientElement DispSVGGradientElement;
#endif

#ifndef __SVGGradientElement_FWD_DEFINED__
#define __SVGGradientElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGGradientElement SVGGradientElement;
#else
typedef struct SVGGradientElement SVGGradientElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGGradientElement_FWD_DEFINED__ */

#ifndef __ISVGLinearGradientElement_FWD_DEFINED__
#define __ISVGLinearGradientElement_FWD_DEFINED__
typedef interface ISVGLinearGradientElement ISVGLinearGradientElement;
#endif

#ifndef __DispSVGLinearGradientElement_FWD_DEFINED__
#define __DispSVGLinearGradientElement_FWD_DEFINED__
typedef interface DispSVGLinearGradientElement DispSVGLinearGradientElement;
#endif

#ifndef __SVGLinearGradientElement_FWD_DEFINED__
#define __SVGLinearGradientElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGLinearGradientElement SVGLinearGradientElement;
#else
typedef struct SVGLinearGradientElement SVGLinearGradientElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGLinearGradientElement_FWD_DEFINED__ */

#ifndef __ISVGRadialGradientElement_FWD_DEFINED__
#define __ISVGRadialGradientElement_FWD_DEFINED__
typedef interface ISVGRadialGradientElement ISVGRadialGradientElement;
#endif

#ifndef __DispSVGRadialGradientElement_FWD_DEFINED__
#define __DispSVGRadialGradientElement_FWD_DEFINED__
typedef interface DispSVGRadialGradientElement DispSVGRadialGradientElement;
#endif

#ifndef __SVGRadialGradientElement_FWD_DEFINED__
#define __SVGRadialGradientElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGRadialGradientElement SVGRadialGradientElement;
#else
typedef struct SVGRadialGradientElement SVGRadialGradientElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGRadialGradientElement_FWD_DEFINED__ */

#ifndef __ISVGMaskElement_FWD_DEFINED__
#define __ISVGMaskElement_FWD_DEFINED__
typedef interface ISVGMaskElement ISVGMaskElement;
#endif

#ifndef __DispSVGMaskElement_FWD_DEFINED__
#define __DispSVGMaskElement_FWD_DEFINED__
typedef interface DispSVGMaskElement DispSVGMaskElement;
#endif

#ifndef __SVGMaskElement_FWD_DEFINED__
#define __SVGMaskElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGMaskElement SVGMaskElement;
#else
typedef struct SVGMaskElement SVGMaskElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGMaskElement_FWD_DEFINED__ */

#ifndef __ISVGMarkerElement_FWD_DEFINED__
#define __ISVGMarkerElement_FWD_DEFINED__
typedef interface ISVGMarkerElement ISVGMarkerElement;
#endif

#ifndef __DispSVGMarkerElement_FWD_DEFINED__
#define __DispSVGMarkerElement_FWD_DEFINED__
typedef interface DispSVGMarkerElement DispSVGMarkerElement;
#endif

#ifndef __SVGMarkerElement_FWD_DEFINED__
#define __SVGMarkerElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGMarkerElement SVGMarkerElement;
#else
typedef struct SVGMarkerElement SVGMarkerElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGMarkerElement_FWD_DEFINED__ */

#ifndef __ISVGZoomEvent_FWD_DEFINED__
#define __ISVGZoomEvent_FWD_DEFINED__
typedef interface ISVGZoomEvent ISVGZoomEvent;
#endif

#ifndef __DispSVGZoomEvent_FWD_DEFINED__
#define __DispSVGZoomEvent_FWD_DEFINED__
typedef interface DispSVGZoomEvent DispSVGZoomEvent;
#endif

#ifndef __SVGZoomEvent_FWD_DEFINED__
#define __SVGZoomEvent_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGZoomEvent SVGZoomEvent;
#else
typedef struct SVGZoomEvent SVGZoomEvent;
#endif /* defined __cplusplus */
#endif /* defined __SVGZoomEvent_FWD_DEFINED__ */

#ifndef __ISVGAElement_FWD_DEFINED__
#define __ISVGAElement_FWD_DEFINED__
typedef interface ISVGAElement ISVGAElement;
#endif

#ifndef __DispSVGAElement_FWD_DEFINED__
#define __DispSVGAElement_FWD_DEFINED__
typedef interface DispSVGAElement DispSVGAElement;
#endif

#ifndef __SVGAElement_FWD_DEFINED__
#define __SVGAElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGAElement SVGAElement;
#else
typedef struct SVGAElement SVGAElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGAElement_FWD_DEFINED__ */

#ifndef __ISVGViewElement_FWD_DEFINED__
#define __ISVGViewElement_FWD_DEFINED__
typedef interface ISVGViewElement ISVGViewElement;
#endif

#ifndef __DispSVGViewElement_FWD_DEFINED__
#define __DispSVGViewElement_FWD_DEFINED__
typedef interface DispSVGViewElement DispSVGViewElement;
#endif

#ifndef __SVGViewElement_FWD_DEFINED__
#define __SVGViewElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGViewElement SVGViewElement;
#else
typedef struct SVGViewElement SVGViewElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGViewElement_FWD_DEFINED__ */

#ifndef __IHTMLMediaError_FWD_DEFINED__
#define __IHTMLMediaError_FWD_DEFINED__
typedef interface IHTMLMediaError IHTMLMediaError;
#endif

#ifndef __IHTMLTimeRanges_FWD_DEFINED__
#define __IHTMLTimeRanges_FWD_DEFINED__
typedef interface IHTMLTimeRanges IHTMLTimeRanges;
#endif

#ifndef __IHTMLTimeRanges2_FWD_DEFINED__
#define __IHTMLTimeRanges2_FWD_DEFINED__
typedef interface IHTMLTimeRanges2 IHTMLTimeRanges2;
#endif

#ifndef __IHTMLMediaElement_FWD_DEFINED__
#define __IHTMLMediaElement_FWD_DEFINED__
typedef interface IHTMLMediaElement IHTMLMediaElement;
#endif

#ifndef __IHTMLMediaElement2_FWD_DEFINED__
#define __IHTMLMediaElement2_FWD_DEFINED__
typedef interface IHTMLMediaElement2 IHTMLMediaElement2;
#endif

#ifndef __IHTMLMSMediaElement_FWD_DEFINED__
#define __IHTMLMSMediaElement_FWD_DEFINED__
typedef interface IHTMLMSMediaElement IHTMLMSMediaElement;
#endif

#ifndef __IHTMLSourceElement_FWD_DEFINED__
#define __IHTMLSourceElement_FWD_DEFINED__
typedef interface IHTMLSourceElement IHTMLSourceElement;
#endif

#ifndef __IHTMLAudioElement_FWD_DEFINED__
#define __IHTMLAudioElement_FWD_DEFINED__
typedef interface IHTMLAudioElement IHTMLAudioElement;
#endif

#ifndef __IHTMLVideoElement_FWD_DEFINED__
#define __IHTMLVideoElement_FWD_DEFINED__
typedef interface IHTMLVideoElement IHTMLVideoElement;
#endif

#ifndef __IHTMLAudioElementFactory_FWD_DEFINED__
#define __IHTMLAudioElementFactory_FWD_DEFINED__
typedef interface IHTMLAudioElementFactory IHTMLAudioElementFactory;
#endif

#ifndef __DispHTMLMediaError_FWD_DEFINED__
#define __DispHTMLMediaError_FWD_DEFINED__
typedef interface DispHTMLMediaError DispHTMLMediaError;
#endif

#ifndef __HTMLMediaError_FWD_DEFINED__
#define __HTMLMediaError_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLMediaError HTMLMediaError;
#else
typedef struct HTMLMediaError HTMLMediaError;
#endif /* defined __cplusplus */
#endif /* defined __HTMLMediaError_FWD_DEFINED__ */

#ifndef __DispHTMLTimeRanges_FWD_DEFINED__
#define __DispHTMLTimeRanges_FWD_DEFINED__
typedef interface DispHTMLTimeRanges DispHTMLTimeRanges;
#endif

#ifndef __HTMLTimeRanges_FWD_DEFINED__
#define __HTMLTimeRanges_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLTimeRanges HTMLTimeRanges;
#else
typedef struct HTMLTimeRanges HTMLTimeRanges;
#endif /* defined __cplusplus */
#endif /* defined __HTMLTimeRanges_FWD_DEFINED__ */

#ifndef __DispHTMLMediaElement_FWD_DEFINED__
#define __DispHTMLMediaElement_FWD_DEFINED__
typedef interface DispHTMLMediaElement DispHTMLMediaElement;
#endif

#ifndef __HTMLMediaElement_FWD_DEFINED__
#define __HTMLMediaElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLMediaElement HTMLMediaElement;
#else
typedef struct HTMLMediaElement HTMLMediaElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLMediaElement_FWD_DEFINED__ */

#ifndef __DispHTMLSourceElement_FWD_DEFINED__
#define __DispHTMLSourceElement_FWD_DEFINED__
typedef interface DispHTMLSourceElement DispHTMLSourceElement;
#endif

#ifndef __HTMLSourceElement_FWD_DEFINED__
#define __HTMLSourceElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLSourceElement HTMLSourceElement;
#else
typedef struct HTMLSourceElement HTMLSourceElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLSourceElement_FWD_DEFINED__ */

#ifndef __DispHTMLAudioElement_FWD_DEFINED__
#define __DispHTMLAudioElement_FWD_DEFINED__
typedef interface DispHTMLAudioElement DispHTMLAudioElement;
#endif

#ifndef __HTMLAudioElement_FWD_DEFINED__
#define __HTMLAudioElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLAudioElement HTMLAudioElement;
#else
typedef struct HTMLAudioElement HTMLAudioElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLAudioElement_FWD_DEFINED__ */

#ifndef __HTMLAudioElementFactory_FWD_DEFINED__
#define __HTMLAudioElementFactory_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLAudioElementFactory HTMLAudioElementFactory;
#else
typedef struct HTMLAudioElementFactory HTMLAudioElementFactory;
#endif /* defined __cplusplus */
#endif /* defined __HTMLAudioElementFactory_FWD_DEFINED__ */

#ifndef __DispHTMLVideoElement_FWD_DEFINED__
#define __DispHTMLVideoElement_FWD_DEFINED__
typedef interface DispHTMLVideoElement DispHTMLVideoElement;
#endif

#ifndef __HTMLVideoElement_FWD_DEFINED__
#define __HTMLVideoElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLVideoElement HTMLVideoElement;
#else
typedef struct HTMLVideoElement HTMLVideoElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLVideoElement_FWD_DEFINED__ */

#ifndef __ISVGSwitchElement_FWD_DEFINED__
#define __ISVGSwitchElement_FWD_DEFINED__
typedef interface ISVGSwitchElement ISVGSwitchElement;
#endif

#ifndef __DispSVGSwitchElement_FWD_DEFINED__
#define __DispSVGSwitchElement_FWD_DEFINED__
typedef interface DispSVGSwitchElement DispSVGSwitchElement;
#endif

#ifndef __SVGSwitchElement_FWD_DEFINED__
#define __SVGSwitchElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGSwitchElement SVGSwitchElement;
#else
typedef struct SVGSwitchElement SVGSwitchElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGSwitchElement_FWD_DEFINED__ */

#ifndef __ISVGDescElement_FWD_DEFINED__
#define __ISVGDescElement_FWD_DEFINED__
typedef interface ISVGDescElement ISVGDescElement;
#endif

#ifndef __DispSVGDescElement_FWD_DEFINED__
#define __DispSVGDescElement_FWD_DEFINED__
typedef interface DispSVGDescElement DispSVGDescElement;
#endif

#ifndef __SVGDescElement_FWD_DEFINED__
#define __SVGDescElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGDescElement SVGDescElement;
#else
typedef struct SVGDescElement SVGDescElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGDescElement_FWD_DEFINED__ */

#ifndef __ISVGTitleElement_FWD_DEFINED__
#define __ISVGTitleElement_FWD_DEFINED__
typedef interface ISVGTitleElement ISVGTitleElement;
#endif

#ifndef __DispSVGTitleElement_FWD_DEFINED__
#define __DispSVGTitleElement_FWD_DEFINED__
typedef interface DispSVGTitleElement DispSVGTitleElement;
#endif

#ifndef __SVGTitleElement_FWD_DEFINED__
#define __SVGTitleElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGTitleElement SVGTitleElement;
#else
typedef struct SVGTitleElement SVGTitleElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGTitleElement_FWD_DEFINED__ */

#ifndef __ISVGMetadataElement_FWD_DEFINED__
#define __ISVGMetadataElement_FWD_DEFINED__
typedef interface ISVGMetadataElement ISVGMetadataElement;
#endif

#ifndef __DispSVGMetadataElement_FWD_DEFINED__
#define __DispSVGMetadataElement_FWD_DEFINED__
typedef interface DispSVGMetadataElement DispSVGMetadataElement;
#endif

#ifndef __SVGMetadataElement_FWD_DEFINED__
#define __SVGMetadataElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGMetadataElement SVGMetadataElement;
#else
typedef struct SVGMetadataElement SVGMetadataElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGMetadataElement_FWD_DEFINED__ */

#ifndef __ISVGElementInstance_FWD_DEFINED__
#define __ISVGElementInstance_FWD_DEFINED__
typedef interface ISVGElementInstance ISVGElementInstance;
#endif

#ifndef __DispSVGElementInstance_FWD_DEFINED__
#define __DispSVGElementInstance_FWD_DEFINED__
typedef interface DispSVGElementInstance DispSVGElementInstance;
#endif

#ifndef __SVGElementInstance_FWD_DEFINED__
#define __SVGElementInstance_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGElementInstance SVGElementInstance;
#else
typedef struct SVGElementInstance SVGElementInstance;
#endif /* defined __cplusplus */
#endif /* defined __SVGElementInstance_FWD_DEFINED__ */

#ifndef __ISVGElementInstanceList_FWD_DEFINED__
#define __ISVGElementInstanceList_FWD_DEFINED__
typedef interface ISVGElementInstanceList ISVGElementInstanceList;
#endif

#ifndef __DispSVGElementInstanceList_FWD_DEFINED__
#define __DispSVGElementInstanceList_FWD_DEFINED__
typedef interface DispSVGElementInstanceList DispSVGElementInstanceList;
#endif

#ifndef __SVGElementInstanceList_FWD_DEFINED__
#define __SVGElementInstanceList_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGElementInstanceList SVGElementInstanceList;
#else
typedef struct SVGElementInstanceList SVGElementInstanceList;
#endif /* defined __cplusplus */
#endif /* defined __SVGElementInstanceList_FWD_DEFINED__ */

#ifndef __IDOMException_FWD_DEFINED__
#define __IDOMException_FWD_DEFINED__
typedef interface IDOMException IDOMException;
#endif

#ifndef __IRangeException_FWD_DEFINED__
#define __IRangeException_FWD_DEFINED__
typedef interface IRangeException IRangeException;
#endif

#ifndef __ISVGException_FWD_DEFINED__
#define __ISVGException_FWD_DEFINED__
typedef interface ISVGException ISVGException;
#endif

#ifndef __IEventException_FWD_DEFINED__
#define __IEventException_FWD_DEFINED__
typedef interface IEventException IEventException;
#endif

#ifndef __DispDOMException_FWD_DEFINED__
#define __DispDOMException_FWD_DEFINED__
typedef interface DispDOMException DispDOMException;
#endif

#ifndef __DOMException_FWD_DEFINED__
#define __DOMException_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMException DOMException;
#else
typedef struct DOMException DOMException;
#endif /* defined __cplusplus */
#endif /* defined __DOMException_FWD_DEFINED__ */

#ifndef __DispRangeException_FWD_DEFINED__
#define __DispRangeException_FWD_DEFINED__
typedef interface DispRangeException DispRangeException;
#endif

#ifndef __RangeException_FWD_DEFINED__
#define __RangeException_FWD_DEFINED__
#ifdef __cplusplus
typedef class RangeException RangeException;
#else
typedef struct RangeException RangeException;
#endif /* defined __cplusplus */
#endif /* defined __RangeException_FWD_DEFINED__ */

#ifndef __DispSVGException_FWD_DEFINED__
#define __DispSVGException_FWD_DEFINED__
typedef interface DispSVGException DispSVGException;
#endif

#ifndef __SVGException_FWD_DEFINED__
#define __SVGException_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGException SVGException;
#else
typedef struct SVGException SVGException;
#endif /* defined __cplusplus */
#endif /* defined __SVGException_FWD_DEFINED__ */

#ifndef __DispEventException_FWD_DEFINED__
#define __DispEventException_FWD_DEFINED__
typedef interface DispEventException DispEventException;
#endif

#ifndef __EventException_FWD_DEFINED__
#define __EventException_FWD_DEFINED__
#ifdef __cplusplus
typedef class EventException EventException;
#else
typedef struct EventException EventException;
#endif /* defined __cplusplus */
#endif /* defined __EventException_FWD_DEFINED__ */

#ifndef __ISVGScriptElement_FWD_DEFINED__
#define __ISVGScriptElement_FWD_DEFINED__
typedef interface ISVGScriptElement ISVGScriptElement;
#endif

#ifndef __DispSVGScriptElement_FWD_DEFINED__
#define __DispSVGScriptElement_FWD_DEFINED__
typedef interface DispSVGScriptElement DispSVGScriptElement;
#endif

#ifndef __SVGScriptElement_FWD_DEFINED__
#define __SVGScriptElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGScriptElement SVGScriptElement;
#else
typedef struct SVGScriptElement SVGScriptElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGScriptElement_FWD_DEFINED__ */

#ifndef __ISVGStyleElement_FWD_DEFINED__
#define __ISVGStyleElement_FWD_DEFINED__
typedef interface ISVGStyleElement ISVGStyleElement;
#endif

#ifndef __DispSVGStyleElement_FWD_DEFINED__
#define __DispSVGStyleElement_FWD_DEFINED__
typedef interface DispSVGStyleElement DispSVGStyleElement;
#endif

#ifndef __SVGStyleElement_FWD_DEFINED__
#define __SVGStyleElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGStyleElement SVGStyleElement;
#else
typedef struct SVGStyleElement SVGStyleElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGStyleElement_FWD_DEFINED__ */

#ifndef __ISVGTextContentElement_FWD_DEFINED__
#define __ISVGTextContentElement_FWD_DEFINED__
typedef interface ISVGTextContentElement ISVGTextContentElement;
#endif

#ifndef __DispSVGTextContentElement_FWD_DEFINED__
#define __DispSVGTextContentElement_FWD_DEFINED__
typedef interface DispSVGTextContentElement DispSVGTextContentElement;
#endif

#ifndef __SVGTextContentElement_FWD_DEFINED__
#define __SVGTextContentElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGTextContentElement SVGTextContentElement;
#else
typedef struct SVGTextContentElement SVGTextContentElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGTextContentElement_FWD_DEFINED__ */

#ifndef __ISVGTextPositioningElement_FWD_DEFINED__
#define __ISVGTextPositioningElement_FWD_DEFINED__
typedef interface ISVGTextPositioningElement ISVGTextPositioningElement;
#endif

#ifndef __DispSVGTextPositioningElement_FWD_DEFINED__
#define __DispSVGTextPositioningElement_FWD_DEFINED__
typedef interface DispSVGTextPositioningElement DispSVGTextPositioningElement;
#endif

#ifndef __SVGTextPositioningElement_FWD_DEFINED__
#define __SVGTextPositioningElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGTextPositioningElement SVGTextPositioningElement;
#else
typedef struct SVGTextPositioningElement SVGTextPositioningElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGTextPositioningElement_FWD_DEFINED__ */

#ifndef __IDOMDocumentType_FWD_DEFINED__
#define __IDOMDocumentType_FWD_DEFINED__
typedef interface IDOMDocumentType IDOMDocumentType;
#endif

#ifndef __DispDOMDocumentType_FWD_DEFINED__
#define __DispDOMDocumentType_FWD_DEFINED__
typedef interface DispDOMDocumentType DispDOMDocumentType;
#endif

#ifndef __DOMDocumentType_FWD_DEFINED__
#define __DOMDocumentType_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMDocumentType DOMDocumentType;
#else
typedef struct DOMDocumentType DOMDocumentType;
#endif /* defined __cplusplus */
#endif /* defined __DOMDocumentType_FWD_DEFINED__ */

#ifndef __IDOMNodeIterator_FWD_DEFINED__
#define __IDOMNodeIterator_FWD_DEFINED__
typedef interface IDOMNodeIterator IDOMNodeIterator;
#endif

#ifndef __IDOMTreeWalker_FWD_DEFINED__
#define __IDOMTreeWalker_FWD_DEFINED__
typedef interface IDOMTreeWalker IDOMTreeWalker;
#endif

#ifndef __DispNodeIterator_FWD_DEFINED__
#define __DispNodeIterator_FWD_DEFINED__
typedef interface DispNodeIterator DispNodeIterator;
#endif

#ifndef __NodeIterator_FWD_DEFINED__
#define __NodeIterator_FWD_DEFINED__
#ifdef __cplusplus
typedef class NodeIterator NodeIterator;
#else
typedef struct NodeIterator NodeIterator;
#endif /* defined __cplusplus */
#endif /* defined __NodeIterator_FWD_DEFINED__ */

#ifndef __DispTreeWalker_FWD_DEFINED__
#define __DispTreeWalker_FWD_DEFINED__
typedef interface DispTreeWalker DispTreeWalker;
#endif

#ifndef __TreeWalker_FWD_DEFINED__
#define __TreeWalker_FWD_DEFINED__
#ifdef __cplusplus
typedef class TreeWalker TreeWalker;
#else
typedef struct TreeWalker TreeWalker;
#endif /* defined __cplusplus */
#endif /* defined __TreeWalker_FWD_DEFINED__ */

#ifndef __IDOMProcessingInstruction_FWD_DEFINED__
#define __IDOMProcessingInstruction_FWD_DEFINED__
typedef interface IDOMProcessingInstruction IDOMProcessingInstruction;
#endif

#ifndef __DispDOMProcessingInstruction_FWD_DEFINED__
#define __DispDOMProcessingInstruction_FWD_DEFINED__
typedef interface DispDOMProcessingInstruction DispDOMProcessingInstruction;
#endif

#ifndef __DOMProcessingInstruction_FWD_DEFINED__
#define __DOMProcessingInstruction_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMProcessingInstruction DOMProcessingInstruction;
#else
typedef struct DOMProcessingInstruction DOMProcessingInstruction;
#endif /* defined __cplusplus */
#endif /* defined __DOMProcessingInstruction_FWD_DEFINED__ */

#ifndef __IHTMLPerformance_FWD_DEFINED__
#define __IHTMLPerformance_FWD_DEFINED__
typedef interface IHTMLPerformance IHTMLPerformance;
#endif

#ifndef __IHTMLPerformanceNavigation_FWD_DEFINED__
#define __IHTMLPerformanceNavigation_FWD_DEFINED__
typedef interface IHTMLPerformanceNavigation IHTMLPerformanceNavigation;
#endif

#ifndef __IHTMLPerformanceTiming_FWD_DEFINED__
#define __IHTMLPerformanceTiming_FWD_DEFINED__
typedef interface IHTMLPerformanceTiming IHTMLPerformanceTiming;
#endif

#ifndef __DispHTMLPerformance_FWD_DEFINED__
#define __DispHTMLPerformance_FWD_DEFINED__
typedef interface DispHTMLPerformance DispHTMLPerformance;
#endif

#ifndef __HTMLPerformance_FWD_DEFINED__
#define __HTMLPerformance_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLPerformance HTMLPerformance;
#else
typedef struct HTMLPerformance HTMLPerformance;
#endif /* defined __cplusplus */
#endif /* defined __HTMLPerformance_FWD_DEFINED__ */

#ifndef __DispHTMLPerformanceNavigation_FWD_DEFINED__
#define __DispHTMLPerformanceNavigation_FWD_DEFINED__
typedef interface DispHTMLPerformanceNavigation DispHTMLPerformanceNavigation;
#endif

#ifndef __HTMLPerformanceNavigation_FWD_DEFINED__
#define __HTMLPerformanceNavigation_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLPerformanceNavigation HTMLPerformanceNavigation;
#else
typedef struct HTMLPerformanceNavigation HTMLPerformanceNavigation;
#endif /* defined __cplusplus */
#endif /* defined __HTMLPerformanceNavigation_FWD_DEFINED__ */

#ifndef __DispHTMLPerformanceTiming_FWD_DEFINED__
#define __DispHTMLPerformanceTiming_FWD_DEFINED__
typedef interface DispHTMLPerformanceTiming DispHTMLPerformanceTiming;
#endif

#ifndef __HTMLPerformanceTiming_FWD_DEFINED__
#define __HTMLPerformanceTiming_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLPerformanceTiming HTMLPerformanceTiming;
#else
typedef struct HTMLPerformanceTiming HTMLPerformanceTiming;
#endif /* defined __cplusplus */
#endif /* defined __HTMLPerformanceTiming_FWD_DEFINED__ */

#ifndef __ISVGTSpanElement_FWD_DEFINED__
#define __ISVGTSpanElement_FWD_DEFINED__
typedef interface ISVGTSpanElement ISVGTSpanElement;
#endif

#ifndef __DispSVGTSpanElement_FWD_DEFINED__
#define __DispSVGTSpanElement_FWD_DEFINED__
typedef interface DispSVGTSpanElement DispSVGTSpanElement;
#endif

#ifndef __SVGTSpanElement_FWD_DEFINED__
#define __SVGTSpanElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGTSpanElement SVGTSpanElement;
#else
typedef struct SVGTSpanElement SVGTSpanElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGTSpanElement_FWD_DEFINED__ */

#ifndef __ITemplatePrinter_FWD_DEFINED__
#define __ITemplatePrinter_FWD_DEFINED__
typedef interface ITemplatePrinter ITemplatePrinter;
#endif

#ifndef __ITemplatePrinter2_FWD_DEFINED__
#define __ITemplatePrinter2_FWD_DEFINED__
typedef interface ITemplatePrinter2 ITemplatePrinter2;
#endif

#ifndef __ITemplatePrinter3_FWD_DEFINED__
#define __ITemplatePrinter3_FWD_DEFINED__
typedef interface ITemplatePrinter3 ITemplatePrinter3;
#endif

#ifndef __IPrintManagerTemplatePrinter_FWD_DEFINED__
#define __IPrintManagerTemplatePrinter_FWD_DEFINED__
typedef interface IPrintManagerTemplatePrinter IPrintManagerTemplatePrinter;
#endif

#ifndef __CTemplatePrinter_FWD_DEFINED__
#define __CTemplatePrinter_FWD_DEFINED__
#ifdef __cplusplus
typedef class CTemplatePrinter CTemplatePrinter;
#else
typedef struct CTemplatePrinter CTemplatePrinter;
#endif /* defined __cplusplus */
#endif /* defined __CTemplatePrinter_FWD_DEFINED__ */

#ifndef __DispCPrintManagerTemplatePrinter_FWD_DEFINED__
#define __DispCPrintManagerTemplatePrinter_FWD_DEFINED__
typedef interface DispCPrintManagerTemplatePrinter DispCPrintManagerTemplatePrinter;
#endif

#ifndef __CPrintManagerTemplatePrinter_FWD_DEFINED__
#define __CPrintManagerTemplatePrinter_FWD_DEFINED__
#ifdef __cplusplus
typedef class CPrintManagerTemplatePrinter CPrintManagerTemplatePrinter;
#else
typedef struct CPrintManagerTemplatePrinter CPrintManagerTemplatePrinter;
#endif /* defined __cplusplus */
#endif /* defined __CPrintManagerTemplatePrinter_FWD_DEFINED__ */

#ifndef __ISVGTextPathElement_FWD_DEFINED__
#define __ISVGTextPathElement_FWD_DEFINED__
typedef interface ISVGTextPathElement ISVGTextPathElement;
#endif

#ifndef __DispSVGTextPathElement_FWD_DEFINED__
#define __DispSVGTextPathElement_FWD_DEFINED__
typedef interface DispSVGTextPathElement DispSVGTextPathElement;
#endif

#ifndef __SVGTextPathElement_FWD_DEFINED__
#define __SVGTextPathElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class SVGTextPathElement SVGTextPathElement;
#else
typedef struct SVGTextPathElement SVGTextPathElement;
#endif /* defined __cplusplus */
#endif /* defined __SVGTextPathElement_FWD_DEFINED__ */

#ifndef __IDOMXmlSerializer_FWD_DEFINED__
#define __IDOMXmlSerializer_FWD_DEFINED__
typedef interface IDOMXmlSerializer IDOMXmlSerializer;
#endif

#ifndef __IDOMXmlSerializerFactory_FWD_DEFINED__
#define __IDOMXmlSerializerFactory_FWD_DEFINED__
typedef interface IDOMXmlSerializerFactory IDOMXmlSerializerFactory;
#endif

#ifndef __IDOMParser_FWD_DEFINED__
#define __IDOMParser_FWD_DEFINED__
typedef interface IDOMParser IDOMParser;
#endif

#ifndef __IDOMParserFactory_FWD_DEFINED__
#define __IDOMParserFactory_FWD_DEFINED__
typedef interface IDOMParserFactory IDOMParserFactory;
#endif

#ifndef __DispXMLSerializer_FWD_DEFINED__
#define __DispXMLSerializer_FWD_DEFINED__
typedef interface DispXMLSerializer DispXMLSerializer;
#endif

#ifndef __XMLSerializer_FWD_DEFINED__
#define __XMLSerializer_FWD_DEFINED__
#ifdef __cplusplus
typedef class XMLSerializer XMLSerializer;
#else
typedef struct XMLSerializer XMLSerializer;
#endif /* defined __cplusplus */
#endif /* defined __XMLSerializer_FWD_DEFINED__ */

#ifndef __HTMLDOMXmlSerializerFactory_FWD_DEFINED__
#define __HTMLDOMXmlSerializerFactory_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLDOMXmlSerializerFactory HTMLDOMXmlSerializerFactory;
#else
typedef struct HTMLDOMXmlSerializerFactory HTMLDOMXmlSerializerFactory;
#endif /* defined __cplusplus */
#endif /* defined __HTMLDOMXmlSerializerFactory_FWD_DEFINED__ */

#ifndef __DispDOMParser_FWD_DEFINED__
#define __DispDOMParser_FWD_DEFINED__
typedef interface DispDOMParser DispDOMParser;
#endif

#ifndef __DOMParser_FWD_DEFINED__
#define __DOMParser_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMParser DOMParser;
#else
typedef struct DOMParser DOMParser;
#endif /* defined __cplusplus */
#endif /* defined __DOMParser_FWD_DEFINED__ */

#ifndef __DOMParserFactory_FWD_DEFINED__
#define __DOMParserFactory_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMParserFactory DOMParserFactory;
#else
typedef struct DOMParserFactory DOMParserFactory;
#endif /* defined __cplusplus */
#endif /* defined __DOMParserFactory_FWD_DEFINED__ */

#ifndef __DispHTMLSemanticElement_FWD_DEFINED__
#define __DispHTMLSemanticElement_FWD_DEFINED__
typedef interface DispHTMLSemanticElement DispHTMLSemanticElement;
#endif

#ifndef __HTMLSemanticElement_FWD_DEFINED__
#define __HTMLSemanticElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLSemanticElement HTMLSemanticElement;
#else
typedef struct HTMLSemanticElement HTMLSemanticElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLSemanticElement_FWD_DEFINED__ */

#ifndef __IHTMLProgressElement_FWD_DEFINED__
#define __IHTMLProgressElement_FWD_DEFINED__
typedef interface IHTMLProgressElement IHTMLProgressElement;
#endif

#ifndef __DispHTMLProgressElement_FWD_DEFINED__
#define __DispHTMLProgressElement_FWD_DEFINED__
typedef interface DispHTMLProgressElement DispHTMLProgressElement;
#endif

#ifndef __HTMLProgressElement_FWD_DEFINED__
#define __HTMLProgressElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLProgressElement HTMLProgressElement;
#else
typedef struct HTMLProgressElement HTMLProgressElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLProgressElement_FWD_DEFINED__ */

#ifndef __IDOMMSTransitionEvent_FWD_DEFINED__
#define __IDOMMSTransitionEvent_FWD_DEFINED__
typedef interface IDOMMSTransitionEvent IDOMMSTransitionEvent;
#endif

#ifndef __DispDOMMSTransitionEvent_FWD_DEFINED__
#define __DispDOMMSTransitionEvent_FWD_DEFINED__
typedef interface DispDOMMSTransitionEvent DispDOMMSTransitionEvent;
#endif

#ifndef __DOMMSTransitionEvent_FWD_DEFINED__
#define __DOMMSTransitionEvent_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMMSTransitionEvent DOMMSTransitionEvent;
#else
typedef struct DOMMSTransitionEvent DOMMSTransitionEvent;
#endif /* defined __cplusplus */
#endif /* defined __DOMMSTransitionEvent_FWD_DEFINED__ */

#ifndef __IDOMMSAnimationEvent_FWD_DEFINED__
#define __IDOMMSAnimationEvent_FWD_DEFINED__
typedef interface IDOMMSAnimationEvent IDOMMSAnimationEvent;
#endif

#ifndef __DispDOMMSAnimationEvent_FWD_DEFINED__
#define __DispDOMMSAnimationEvent_FWD_DEFINED__
typedef interface DispDOMMSAnimationEvent DispDOMMSAnimationEvent;
#endif

#ifndef __DOMMSAnimationEvent_FWD_DEFINED__
#define __DOMMSAnimationEvent_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMMSAnimationEvent DOMMSAnimationEvent;
#else
typedef struct DOMMSAnimationEvent DOMMSAnimationEvent;
#endif /* defined __cplusplus */
#endif /* defined __DOMMSAnimationEvent_FWD_DEFINED__ */

#ifndef __IWebGeolocation_FWD_DEFINED__
#define __IWebGeolocation_FWD_DEFINED__
typedef interface IWebGeolocation IWebGeolocation;
#endif

#ifndef __IWebGeocoordinates_FWD_DEFINED__
#define __IWebGeocoordinates_FWD_DEFINED__
typedef interface IWebGeocoordinates IWebGeocoordinates;
#endif

#ifndef __IWebGeopositionError_FWD_DEFINED__
#define __IWebGeopositionError_FWD_DEFINED__
typedef interface IWebGeopositionError IWebGeopositionError;
#endif

#ifndef __IWebGeoposition_FWD_DEFINED__
#define __IWebGeoposition_FWD_DEFINED__
typedef interface IWebGeoposition IWebGeoposition;
#endif

#ifndef __DispWebGeolocation_FWD_DEFINED__
#define __DispWebGeolocation_FWD_DEFINED__
typedef interface DispWebGeolocation DispWebGeolocation;
#endif

#ifndef __WebGeolocation_FWD_DEFINED__
#define __WebGeolocation_FWD_DEFINED__
#ifdef __cplusplus
typedef class WebGeolocation WebGeolocation;
#else
typedef struct WebGeolocation WebGeolocation;
#endif /* defined __cplusplus */
#endif /* defined __WebGeolocation_FWD_DEFINED__ */

#ifndef __DispWebGeocoordinates_FWD_DEFINED__
#define __DispWebGeocoordinates_FWD_DEFINED__
typedef interface DispWebGeocoordinates DispWebGeocoordinates;
#endif

#ifndef __WebGeocoordinates_FWD_DEFINED__
#define __WebGeocoordinates_FWD_DEFINED__
#ifdef __cplusplus
typedef class WebGeocoordinates WebGeocoordinates;
#else
typedef struct WebGeocoordinates WebGeocoordinates;
#endif /* defined __cplusplus */
#endif /* defined __WebGeocoordinates_FWD_DEFINED__ */

#ifndef __DispWebGeopositionError_FWD_DEFINED__
#define __DispWebGeopositionError_FWD_DEFINED__
typedef interface DispWebGeopositionError DispWebGeopositionError;
#endif

#ifndef __WebGeopositionError_FWD_DEFINED__
#define __WebGeopositionError_FWD_DEFINED__
#ifdef __cplusplus
typedef class WebGeopositionError WebGeopositionError;
#else
typedef struct WebGeopositionError WebGeopositionError;
#endif /* defined __cplusplus */
#endif /* defined __WebGeopositionError_FWD_DEFINED__ */

#ifndef __DispWebGeoposition_FWD_DEFINED__
#define __DispWebGeoposition_FWD_DEFINED__
typedef interface DispWebGeoposition DispWebGeoposition;
#endif

#ifndef __WebGeoposition_FWD_DEFINED__
#define __WebGeoposition_FWD_DEFINED__
#ifdef __cplusplus
typedef class WebGeoposition WebGeoposition;
#else
typedef struct WebGeoposition WebGeoposition;
#endif /* defined __cplusplus */
#endif /* defined __WebGeoposition_FWD_DEFINED__ */

#ifndef __IClientCaps_FWD_DEFINED__
#define __IClientCaps_FWD_DEFINED__
typedef interface IClientCaps IClientCaps;
#endif

#ifndef __CClientCaps_FWD_DEFINED__
#define __CClientCaps_FWD_DEFINED__
#ifdef __cplusplus
typedef class CClientCaps CClientCaps;
#else
typedef struct CClientCaps CClientCaps;
#endif /* defined __cplusplus */
#endif /* defined __CClientCaps_FWD_DEFINED__ */

#ifndef __IDOMMSManipulationEvent_FWD_DEFINED__
#define __IDOMMSManipulationEvent_FWD_DEFINED__
typedef interface IDOMMSManipulationEvent IDOMMSManipulationEvent;
#endif

#ifndef __DispDOMMSManipulationEvent_FWD_DEFINED__
#define __DispDOMMSManipulationEvent_FWD_DEFINED__
typedef interface DispDOMMSManipulationEvent DispDOMMSManipulationEvent;
#endif

#ifndef __DOMMSManipulationEvent_FWD_DEFINED__
#define __DOMMSManipulationEvent_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMMSManipulationEvent DOMMSManipulationEvent;
#else
typedef struct DOMMSManipulationEvent DOMMSManipulationEvent;
#endif /* defined __cplusplus */
#endif /* defined __DOMMSManipulationEvent_FWD_DEFINED__ */

#ifndef __IDOMCloseEvent_FWD_DEFINED__
#define __IDOMCloseEvent_FWD_DEFINED__
typedef interface IDOMCloseEvent IDOMCloseEvent;
#endif

#ifndef __DispDOMCloseEvent_FWD_DEFINED__
#define __DispDOMCloseEvent_FWD_DEFINED__
typedef interface DispDOMCloseEvent DispDOMCloseEvent;
#endif

#ifndef __DOMCloseEvent_FWD_DEFINED__
#define __DOMCloseEvent_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMCloseEvent DOMCloseEvent;
#else
typedef struct DOMCloseEvent DOMCloseEvent;
#endif /* defined __cplusplus */
#endif /* defined __DOMCloseEvent_FWD_DEFINED__ */

#ifndef __IHTMLApplicationCache_FWD_DEFINED__
#define __IHTMLApplicationCache_FWD_DEFINED__
typedef interface IHTMLApplicationCache IHTMLApplicationCache;
#endif

#ifndef __DispApplicationCache_FWD_DEFINED__
#define __DispApplicationCache_FWD_DEFINED__
typedef interface DispApplicationCache DispApplicationCache;
#endif

#ifndef __ApplicationCache_FWD_DEFINED__
#define __ApplicationCache_FWD_DEFINED__
#ifdef __cplusplus
typedef class ApplicationCache ApplicationCache;
#else
typedef struct ApplicationCache ApplicationCache;
#endif /* defined __cplusplus */
#endif /* defined __ApplicationCache_FWD_DEFINED__ */

#ifndef __ICSSFilterSite_FWD_DEFINED__
#define __ICSSFilterSite_FWD_DEFINED__
typedef interface ICSSFilterSite ICSSFilterSite;
#endif

#ifndef __ICSSFilter_FWD_DEFINED__
#define __ICSSFilter_FWD_DEFINED__
typedef interface ICSSFilter ICSSFilter;
#endif

#ifndef __ISecureUrlHost_FWD_DEFINED__
#define __ISecureUrlHost_FWD_DEFINED__
typedef interface ISecureUrlHost ISecureUrlHost;
#endif

#ifndef __IMarkupServices_FWD_DEFINED__
#define __IMarkupServices_FWD_DEFINED__
typedef interface IMarkupServices IMarkupServices;
#endif

#ifndef __IMarkupServices2_FWD_DEFINED__
#define __IMarkupServices2_FWD_DEFINED__
typedef interface IMarkupServices2 IMarkupServices2;
#endif

#ifndef __IMarkupContainer_FWD_DEFINED__
#define __IMarkupContainer_FWD_DEFINED__
typedef interface IMarkupContainer IMarkupContainer;
#endif

#ifndef __IMarkupContainer2_FWD_DEFINED__
#define __IMarkupContainer2_FWD_DEFINED__
typedef interface IMarkupContainer2 IMarkupContainer2;
#endif

#ifndef __IHTMLChangePlayback_FWD_DEFINED__
#define __IHTMLChangePlayback_FWD_DEFINED__
typedef interface IHTMLChangePlayback IHTMLChangePlayback;
#endif

#ifndef __IMarkupPointer_FWD_DEFINED__
#define __IMarkupPointer_FWD_DEFINED__
typedef interface IMarkupPointer IMarkupPointer;
#endif

#ifndef __IMarkupPointer2_FWD_DEFINED__
#define __IMarkupPointer2_FWD_DEFINED__
typedef interface IMarkupPointer2 IMarkupPointer2;
#endif

#ifndef __IMarkupTextFrags_FWD_DEFINED__
#define __IMarkupTextFrags_FWD_DEFINED__
typedef interface IMarkupTextFrags IMarkupTextFrags;
#endif

#ifndef __IHTMLChangeLog_FWD_DEFINED__
#define __IHTMLChangeLog_FWD_DEFINED__
typedef interface IHTMLChangeLog IHTMLChangeLog;
#endif

#ifndef __IHTMLChangeSink_FWD_DEFINED__
#define __IHTMLChangeSink_FWD_DEFINED__
typedef interface IHTMLChangeSink IHTMLChangeSink;
#endif

#ifndef __IXMLGenericParse_FWD_DEFINED__
#define __IXMLGenericParse_FWD_DEFINED__
typedef interface IXMLGenericParse IXMLGenericParse;
#endif

#ifndef __IHTMLEditHost_FWD_DEFINED__
#define __IHTMLEditHost_FWD_DEFINED__
typedef interface IHTMLEditHost IHTMLEditHost;
#endif

#ifndef __IHTMLEditHost2_FWD_DEFINED__
#define __IHTMLEditHost2_FWD_DEFINED__
typedef interface IHTMLEditHost2 IHTMLEditHost2;
#endif

#ifndef __ISegment_FWD_DEFINED__
#define __ISegment_FWD_DEFINED__
typedef interface ISegment ISegment;
#endif

#ifndef __ISegmentListIterator_FWD_DEFINED__
#define __ISegmentListIterator_FWD_DEFINED__
typedef interface ISegmentListIterator ISegmentListIterator;
#endif

#ifndef __ISegmentList_FWD_DEFINED__
#define __ISegmentList_FWD_DEFINED__
typedef interface ISegmentList ISegmentList;
#endif

#ifndef __ISequenceNumber_FWD_DEFINED__
#define __ISequenceNumber_FWD_DEFINED__
typedef interface ISequenceNumber ISequenceNumber;
#endif

#ifndef __IIMEServices_FWD_DEFINED__
#define __IIMEServices_FWD_DEFINED__
typedef interface IIMEServices IIMEServices;
#endif

#ifndef __IHTMLCaret_FWD_DEFINED__
#define __IHTMLCaret_FWD_DEFINED__
typedef interface IHTMLCaret IHTMLCaret;
#endif

#ifndef __IHighlightRenderingServices_FWD_DEFINED__
#define __IHighlightRenderingServices_FWD_DEFINED__
typedef interface IHighlightRenderingServices IHighlightRenderingServices;
#endif

#ifndef __ISelectionServicesListener_FWD_DEFINED__
#define __ISelectionServicesListener_FWD_DEFINED__
typedef interface ISelectionServicesListener ISelectionServicesListener;
#endif

#ifndef __ISelectionServices_FWD_DEFINED__
#define __ISelectionServices_FWD_DEFINED__
typedef interface ISelectionServices ISelectionServices;
#endif

#ifndef __IElementSegment_FWD_DEFINED__
#define __IElementSegment_FWD_DEFINED__
typedef interface IElementSegment IElementSegment;
#endif

#ifndef __IHighlightSegment_FWD_DEFINED__
#define __IHighlightSegment_FWD_DEFINED__
typedef interface IHighlightSegment IHighlightSegment;
#endif

#ifndef __IHTMLEditDesigner_FWD_DEFINED__
#define __IHTMLEditDesigner_FWD_DEFINED__
typedef interface IHTMLEditDesigner IHTMLEditDesigner;
#endif

#ifndef __IHTMLEditServices_FWD_DEFINED__
#define __IHTMLEditServices_FWD_DEFINED__
typedef interface IHTMLEditServices IHTMLEditServices;
#endif

#ifndef __IHTMLEditServices2_FWD_DEFINED__
#define __IHTMLEditServices2_FWD_DEFINED__
typedef interface IHTMLEditServices2 IHTMLEditServices2;
#endif

#ifndef __ILineInfo_FWD_DEFINED__
#define __ILineInfo_FWD_DEFINED__
typedef interface ILineInfo ILineInfo;
#endif

#ifndef __IHTMLComputedStyle_FWD_DEFINED__
#define __IHTMLComputedStyle_FWD_DEFINED__
typedef interface IHTMLComputedStyle IHTMLComputedStyle;
#endif

#ifndef __IDisplayPointer_FWD_DEFINED__
#define __IDisplayPointer_FWD_DEFINED__
typedef interface IDisplayPointer IDisplayPointer;
#endif

#ifndef __IDisplayServices_FWD_DEFINED__
#define __IDisplayServices_FWD_DEFINED__
typedef interface IDisplayServices IDisplayServices;
#endif

#ifndef __IHtmlDlgSafeHelper_FWD_DEFINED__
#define __IHtmlDlgSafeHelper_FWD_DEFINED__
typedef interface IHtmlDlgSafeHelper IHtmlDlgSafeHelper;
#endif

#ifndef __IBlockFormats_FWD_DEFINED__
#define __IBlockFormats_FWD_DEFINED__
typedef interface IBlockFormats IBlockFormats;
#endif

#ifndef __IFontNames_FWD_DEFINED__
#define __IFontNames_FWD_DEFINED__
typedef interface IFontNames IFontNames;
#endif

#ifndef __HtmlDlgSafeHelper_FWD_DEFINED__
#define __HtmlDlgSafeHelper_FWD_DEFINED__
#ifdef __cplusplus
typedef class HtmlDlgSafeHelper HtmlDlgSafeHelper;
#else
typedef struct HtmlDlgSafeHelper HtmlDlgSafeHelper;
#endif /* defined __cplusplus */
#endif /* defined __HtmlDlgSafeHelper_FWD_DEFINED__ */

#ifndef __BlockFormats_FWD_DEFINED__
#define __BlockFormats_FWD_DEFINED__
#ifdef __cplusplus
typedef class BlockFormats BlockFormats;
#else
typedef struct BlockFormats BlockFormats;
#endif /* defined __cplusplus */
#endif /* defined __BlockFormats_FWD_DEFINED__ */

#ifndef __FontNames_FWD_DEFINED__
#define __FontNames_FWD_DEFINED__
#ifdef __cplusplus
typedef class FontNames FontNames;
#else
typedef struct FontNames FontNames;
#endif /* defined __cplusplus */
#endif /* defined __FontNames_FWD_DEFINED__ */

#ifndef __IDeveloperConsoleMessageReceiver_FWD_DEFINED__
#define __IDeveloperConsoleMessageReceiver_FWD_DEFINED__
typedef interface IDeveloperConsoleMessageReceiver IDeveloperConsoleMessageReceiver;
#endif

#ifndef __IDebugCallbackNotificationHandler_FWD_DEFINED__
#define __IDebugCallbackNotificationHandler_FWD_DEFINED__
typedef interface IDebugCallbackNotificationHandler IDebugCallbackNotificationHandler;
#endif

#ifndef __IScriptEventHandler_FWD_DEFINED__
#define __IScriptEventHandler_FWD_DEFINED__
typedef interface IScriptEventHandler IScriptEventHandler;
#endif

#ifndef __IScriptEventHandlerSourceInfo_FWD_DEFINED__
#define __IScriptEventHandlerSourceInfo_FWD_DEFINED__
typedef interface IScriptEventHandlerSourceInfo IScriptEventHandlerSourceInfo;
#endif

#ifndef __IDOMEventRegistrationCallback_FWD_DEFINED__
#define __IDOMEventRegistrationCallback_FWD_DEFINED__
typedef interface IDOMEventRegistrationCallback IDOMEventRegistrationCallback;
#endif

#ifndef __IEventTarget2_FWD_DEFINED__
#define __IEventTarget2_FWD_DEFINED__
typedef interface IEventTarget2 IEventTarget2;
#endif

#ifndef __HTMLNamespaceEvents_FWD_DEFINED__
#define __HTMLNamespaceEvents_FWD_DEFINED__
typedef interface HTMLNamespaceEvents HTMLNamespaceEvents;
#endif

#ifndef __IHTMLNamespace_FWD_DEFINED__
#define __IHTMLNamespace_FWD_DEFINED__
typedef interface IHTMLNamespace IHTMLNamespace;
#endif

#ifndef __IHTMLNamespaceCollection_FWD_DEFINED__
#define __IHTMLNamespaceCollection_FWD_DEFINED__
typedef interface IHTMLNamespaceCollection IHTMLNamespaceCollection;
#endif

#ifndef __DispHTMLNamespace_FWD_DEFINED__
#define __DispHTMLNamespace_FWD_DEFINED__
typedef interface DispHTMLNamespace DispHTMLNamespace;
#endif

#ifndef __HTMLNamespace_FWD_DEFINED__
#define __HTMLNamespace_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLNamespace HTMLNamespace;
#else
typedef struct HTMLNamespace HTMLNamespace;
#endif /* defined __cplusplus */
#endif /* defined __HTMLNamespace_FWD_DEFINED__ */

#ifndef __DispHTMLNamespaceCollection_FWD_DEFINED__
#define __DispHTMLNamespaceCollection_FWD_DEFINED__
typedef interface DispHTMLNamespaceCollection DispHTMLNamespaceCollection;
#endif

#ifndef __HTMLNamespaceCollection_FWD_DEFINED__
#define __HTMLNamespaceCollection_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLNamespaceCollection HTMLNamespaceCollection;
#else
typedef struct HTMLNamespaceCollection HTMLNamespaceCollection;
#endif /* defined __cplusplus */
#endif /* defined __HTMLNamespaceCollection_FWD_DEFINED__ */

#ifndef __IHTMLPainter_FWD_DEFINED__
#define __IHTMLPainter_FWD_DEFINED__
typedef interface IHTMLPainter IHTMLPainter;
#endif

#ifndef __IHTMLPainterEventInfo_FWD_DEFINED__
#define __IHTMLPainterEventInfo_FWD_DEFINED__
typedef interface IHTMLPainterEventInfo IHTMLPainterEventInfo;
#endif

#ifndef __IHTMLPainterOverlay_FWD_DEFINED__
#define __IHTMLPainterOverlay_FWD_DEFINED__
typedef interface IHTMLPainterOverlay IHTMLPainterOverlay;
#endif

#ifndef __IHTMLPaintSite_FWD_DEFINED__
#define __IHTMLPaintSite_FWD_DEFINED__
typedef interface IHTMLPaintSite IHTMLPaintSite;
#endif

#ifndef __IHTMLIPrintCollection_FWD_DEFINED__
#define __IHTMLIPrintCollection_FWD_DEFINED__
typedef interface IHTMLIPrintCollection IHTMLIPrintCollection;
#endif

#ifndef __IEnumPrivacyRecords_FWD_DEFINED__
#define __IEnumPrivacyRecords_FWD_DEFINED__
typedef interface IEnumPrivacyRecords IEnumPrivacyRecords;
#endif

#ifndef __IWPCBlockedUrls_FWD_DEFINED__
#define __IWPCBlockedUrls_FWD_DEFINED__
typedef interface IWPCBlockedUrls IWPCBlockedUrls;
#endif

#ifndef __IHTMLDOMConstructorCollection_FWD_DEFINED__
#define __IHTMLDOMConstructorCollection_FWD_DEFINED__
typedef interface IHTMLDOMConstructorCollection IHTMLDOMConstructorCollection;
#endif

#ifndef __IHTMLDialog_FWD_DEFINED__
#define __IHTMLDialog_FWD_DEFINED__
typedef interface IHTMLDialog IHTMLDialog;
#endif

#ifndef __IHTMLDialog2_FWD_DEFINED__
#define __IHTMLDialog2_FWD_DEFINED__
typedef interface IHTMLDialog2 IHTMLDialog2;
#endif

#ifndef __IHTMLDialog3_FWD_DEFINED__
#define __IHTMLDialog3_FWD_DEFINED__
typedef interface IHTMLDialog3 IHTMLDialog3;
#endif

#ifndef __IHTMLModelessInit_FWD_DEFINED__
#define __IHTMLModelessInit_FWD_DEFINED__
typedef interface IHTMLModelessInit IHTMLModelessInit;
#endif

#ifndef __ThreadDialogProcParam_FWD_DEFINED__
#define __ThreadDialogProcParam_FWD_DEFINED__
#ifdef __cplusplus
typedef class ThreadDialogProcParam ThreadDialogProcParam;
#else
typedef struct ThreadDialogProcParam ThreadDialogProcParam;
#endif /* defined __cplusplus */
#endif /* defined __ThreadDialogProcParam_FWD_DEFINED__ */

#ifndef __HTMLDialog_FWD_DEFINED__
#define __HTMLDialog_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLDialog HTMLDialog;
#else
typedef struct HTMLDialog HTMLDialog;
#endif /* defined __cplusplus */
#endif /* defined __HTMLDialog_FWD_DEFINED__ */

#ifndef __IHTMLPopup_FWD_DEFINED__
#define __IHTMLPopup_FWD_DEFINED__
typedef interface IHTMLPopup IHTMLPopup;
#endif

#ifndef __DispHTMLPopup_FWD_DEFINED__
#define __DispHTMLPopup_FWD_DEFINED__
typedef interface DispHTMLPopup DispHTMLPopup;
#endif

#ifndef __HTMLPopup_FWD_DEFINED__
#define __HTMLPopup_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLPopup HTMLPopup;
#else
typedef struct HTMLPopup HTMLPopup;
#endif /* defined __cplusplus */
#endif /* defined __HTMLPopup_FWD_DEFINED__ */

#ifndef __IHTMLAppBehavior_FWD_DEFINED__
#define __IHTMLAppBehavior_FWD_DEFINED__
typedef interface IHTMLAppBehavior IHTMLAppBehavior;
#endif

#ifndef __IHTMLAppBehavior2_FWD_DEFINED__
#define __IHTMLAppBehavior2_FWD_DEFINED__
typedef interface IHTMLAppBehavior2 IHTMLAppBehavior2;
#endif

#ifndef __IHTMLAppBehavior3_FWD_DEFINED__
#define __IHTMLAppBehavior3_FWD_DEFINED__
typedef interface IHTMLAppBehavior3 IHTMLAppBehavior3;
#endif

#ifndef __DispHTMLAppBehavior_FWD_DEFINED__
#define __DispHTMLAppBehavior_FWD_DEFINED__
typedef interface DispHTMLAppBehavior DispHTMLAppBehavior;
#endif

#ifndef __HTMLAppBehavior_FWD_DEFINED__
#define __HTMLAppBehavior_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLAppBehavior HTMLAppBehavior;
#else
typedef struct HTMLAppBehavior HTMLAppBehavior;
#endif /* defined __cplusplus */
#endif /* defined __HTMLAppBehavior_FWD_DEFINED__ */

#ifndef __OldHTMLDocument_FWD_DEFINED__
#define __OldHTMLDocument_FWD_DEFINED__
#ifdef __cplusplus
typedef class OldHTMLDocument OldHTMLDocument;
#else
typedef struct OldHTMLDocument OldHTMLDocument;
#endif /* defined __cplusplus */
#endif /* defined __OldHTMLDocument_FWD_DEFINED__ */

#ifndef __OldHTMLFormElement_FWD_DEFINED__
#define __OldHTMLFormElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class OldHTMLFormElement OldHTMLFormElement;
#else
typedef struct OldHTMLFormElement OldHTMLFormElement;
#endif /* defined __cplusplus */
#endif /* defined __OldHTMLFormElement_FWD_DEFINED__ */

#ifndef __DispIHTMLInputButtonElement_FWD_DEFINED__
#define __DispIHTMLInputButtonElement_FWD_DEFINED__
typedef interface DispIHTMLInputButtonElement DispIHTMLInputButtonElement;
#endif

#ifndef __HTMLInputButtonElement_FWD_DEFINED__
#define __HTMLInputButtonElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLInputButtonElement HTMLInputButtonElement;
#else
typedef struct HTMLInputButtonElement HTMLInputButtonElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLInputButtonElement_FWD_DEFINED__ */

#ifndef __DispIHTMLInputTextElement_FWD_DEFINED__
#define __DispIHTMLInputTextElement_FWD_DEFINED__
typedef interface DispIHTMLInputTextElement DispIHTMLInputTextElement;
#endif

#ifndef __HTMLInputTextElement_FWD_DEFINED__
#define __HTMLInputTextElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLInputTextElement HTMLInputTextElement;
#else
typedef struct HTMLInputTextElement HTMLInputTextElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLInputTextElement_FWD_DEFINED__ */

#ifndef __DispIHTMLInputFileElement_FWD_DEFINED__
#define __DispIHTMLInputFileElement_FWD_DEFINED__
typedef interface DispIHTMLInputFileElement DispIHTMLInputFileElement;
#endif

#ifndef __HTMLInputFileElement_FWD_DEFINED__
#define __HTMLInputFileElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLInputFileElement HTMLInputFileElement;
#else
typedef struct HTMLInputFileElement HTMLInputFileElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLInputFileElement_FWD_DEFINED__ */

#ifndef __DispIHTMLOptionButtonElement_FWD_DEFINED__
#define __DispIHTMLOptionButtonElement_FWD_DEFINED__
typedef interface DispIHTMLOptionButtonElement DispIHTMLOptionButtonElement;
#endif

#ifndef __HTMLOptionButtonElement_FWD_DEFINED__
#define __HTMLOptionButtonElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLOptionButtonElement HTMLOptionButtonElement;
#else
typedef struct HTMLOptionButtonElement HTMLOptionButtonElement;
#endif /* defined __cplusplus */
#endif /* defined __HTMLOptionButtonElement_FWD_DEFINED__ */

#ifndef __DispIHTMLInputImage_FWD_DEFINED__
#define __DispIHTMLInputImage_FWD_DEFINED__
typedef interface DispIHTMLInputImage DispIHTMLInputImage;
#endif

#ifndef __HTMLInputImage_FWD_DEFINED__
#define __HTMLInputImage_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLInputImage HTMLInputImage;
#else
typedef struct HTMLInputImage HTMLInputImage;
#endif /* defined __cplusplus */
#endif /* defined __HTMLInputImage_FWD_DEFINED__ */

#ifndef __IElementBehaviorFactory_FWD_DEFINED__
#define __IElementBehaviorFactory_FWD_DEFINED__
typedef interface IElementBehaviorFactory IElementBehaviorFactory;
#endif

#ifndef __IElementNamespace_FWD_DEFINED__
#define __IElementNamespace_FWD_DEFINED__
typedef interface IElementNamespace IElementNamespace;
#endif

#ifndef __IElementNamespaceTable_FWD_DEFINED__
#define __IElementNamespaceTable_FWD_DEFINED__
typedef interface IElementNamespaceTable IElementNamespaceTable;
#endif

#ifndef __IElementNamespaceFactory_FWD_DEFINED__
#define __IElementNamespaceFactory_FWD_DEFINED__
typedef interface IElementNamespaceFactory IElementNamespaceFactory;
#endif

#ifndef __IElementNamespaceFactory2_FWD_DEFINED__
#define __IElementNamespaceFactory2_FWD_DEFINED__
typedef interface IElementNamespaceFactory2 IElementNamespaceFactory2;
#endif

#ifndef __IElementNamespaceFactoryCallback_FWD_DEFINED__
#define __IElementNamespaceFactoryCallback_FWD_DEFINED__
typedef interface IElementNamespaceFactoryCallback IElementNamespaceFactoryCallback;
#endif

#ifndef __IElementBehavior_FWD_DEFINED__
#define __IElementBehavior_FWD_DEFINED__
typedef interface IElementBehavior IElementBehavior;
#endif

#ifndef __IElementBehaviorSite_FWD_DEFINED__
#define __IElementBehaviorSite_FWD_DEFINED__
typedef interface IElementBehaviorSite IElementBehaviorSite;
#endif

#ifndef __IElementBehaviorSiteOM_FWD_DEFINED__
#define __IElementBehaviorSiteOM_FWD_DEFINED__
typedef interface IElementBehaviorSiteOM IElementBehaviorSiteOM;
#endif

#ifndef __IElementBehaviorSiteOM2_FWD_DEFINED__
#define __IElementBehaviorSiteOM2_FWD_DEFINED__
typedef interface IElementBehaviorSiteOM2 IElementBehaviorSiteOM2;
#endif

#ifndef __IElementBehaviorRender_FWD_DEFINED__
#define __IElementBehaviorRender_FWD_DEFINED__
typedef interface IElementBehaviorRender IElementBehaviorRender;
#endif

#ifndef __IElementBehaviorSiteRender_FWD_DEFINED__
#define __IElementBehaviorSiteRender_FWD_DEFINED__
typedef interface IElementBehaviorSiteRender IElementBehaviorSiteRender;
#endif

#ifndef __IElementBehaviorCategory_FWD_DEFINED__
#define __IElementBehaviorCategory_FWD_DEFINED__
typedef interface IElementBehaviorCategory IElementBehaviorCategory;
#endif

#ifndef __IElementBehaviorSiteCategory_FWD_DEFINED__
#define __IElementBehaviorSiteCategory_FWD_DEFINED__
typedef interface IElementBehaviorSiteCategory IElementBehaviorSiteCategory;
#endif

#ifndef __IElementBehaviorSubmit_FWD_DEFINED__
#define __IElementBehaviorSubmit_FWD_DEFINED__
typedef interface IElementBehaviorSubmit IElementBehaviorSubmit;
#endif

#ifndef __IElementBehaviorFocus_FWD_DEFINED__
#define __IElementBehaviorFocus_FWD_DEFINED__
typedef interface IElementBehaviorFocus IElementBehaviorFocus;
#endif

#ifndef __IElementBehaviorLayout_FWD_DEFINED__
#define __IElementBehaviorLayout_FWD_DEFINED__
typedef interface IElementBehaviorLayout IElementBehaviorLayout;
#endif

#ifndef __IElementBehaviorLayout2_FWD_DEFINED__
#define __IElementBehaviorLayout2_FWD_DEFINED__
typedef interface IElementBehaviorLayout2 IElementBehaviorLayout2;
#endif

#ifndef __IElementBehaviorSiteLayout_FWD_DEFINED__
#define __IElementBehaviorSiteLayout_FWD_DEFINED__
typedef interface IElementBehaviorSiteLayout IElementBehaviorSiteLayout;
#endif

#ifndef __IElementBehaviorSiteLayout2_FWD_DEFINED__
#define __IElementBehaviorSiteLayout2_FWD_DEFINED__
typedef interface IElementBehaviorSiteLayout2 IElementBehaviorSiteLayout2;
#endif

#ifndef __IHostBehaviorInit_FWD_DEFINED__
#define __IHostBehaviorInit_FWD_DEFINED__
typedef interface IHostBehaviorInit IHostBehaviorInit;
#endif

#ifndef __IViewObjectPresentSite_FWD_DEFINED__
#define __IViewObjectPresentSite_FWD_DEFINED__
typedef interface IViewObjectPresentSite IViewObjectPresentSite;
#endif

#ifndef __ISurfacePresenter_FWD_DEFINED__
#define __ISurfacePresenter_FWD_DEFINED__
typedef interface ISurfacePresenter ISurfacePresenter;
#endif

#ifndef __ICanvasPixelArrayData_FWD_DEFINED__
#define __ICanvasPixelArrayData_FWD_DEFINED__
typedef interface ICanvasPixelArrayData ICanvasPixelArrayData;
#endif

#ifndef __IViewObjectPrint_FWD_DEFINED__
#define __IViewObjectPrint_FWD_DEFINED__
typedef interface IViewObjectPrint IViewObjectPrint;
#endif

#ifndef __IViewObjectPresentNotifySite_FWD_DEFINED__
#define __IViewObjectPresentNotifySite_FWD_DEFINED__
typedef interface IViewObjectPresentNotifySite IViewObjectPresentNotifySite;
#endif

#ifndef __IViewObjectPresentNotify_FWD_DEFINED__
#define __IViewObjectPresentNotify_FWD_DEFINED__
typedef interface IViewObjectPresentNotify IViewObjectPresentNotify;
#endif

#ifndef __ITrackingProtection_FWD_DEFINED__
#define __ITrackingProtection_FWD_DEFINED__
typedef interface ITrackingProtection ITrackingProtection;
#endif

/* Headers for imported files */

#include <ocidl.h>
#include <dimm.h>
#include <shtypes.h>
#include <dispex.h>
#include <ocidl.h>
#include <dxgitype.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * This file is part of the mingw-w64 runtime package.
 * No warranty is given; refer to the file DISCLAIMER within this package.
 */

#include <winapifamily.h>

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
#include <dxgitype.h>
#include <olectl.h>

EXTERN_C const GUID CMDSETID_Forms3;
EXTERN_C const GUID CLSID_MHTMLDocument;
EXTERN_C const GUID CLSID_IEXMLDocument;
EXTERN_C const GUID CLSID_SVGDocument;
EXTERN_C const GUID CLSID_XHTMLDocument;
EXTERN_C const GUID CLSID_HTADocument;
EXTERN_C const GUID CLSID_HTMLApplication;
EXTERN_C const GUID CLSID_HTMLPluginDocument;
EXTERN_C const GUID CLSID_CStyle;

DEFINE_GUID(SID_SEditCommandTarget,0x3050f4b5,0x98b5,0x11cf,0xbb,0x82,0x0,0xaa,0x0,0xbd,0xce,0x0b);
DEFINE_GUID(CGID_EditStateCommands,0x3050f4b6,0x98b5,0x11cf,0xbb,0x82,0x0,0xaa,0x0,0xbd,0xce,0x0b);
DEFINE_GUID(SID_SHTMLEditHost,0x3050f6a0,0x98b5,0x11cf,0xbb,0x82,0x0,0xaa,0x0,0xbd,0xce,0x0b);
DEFINE_GUID(SID_SHTMLEditServices,0x3050f7f9,0x98b5,0x11cf,0xbb,0x82,0x0,0xaa,0x0,0xbd,0xce,0x0b);

#define SID_SHTMLWindow IID_IHTMLWindow2
#define SID_SElementBehaviorFactory IID_IElementBehaviorFactory
#define SID_STrackingProtection IID_ITrackingProtection

#define COOKIEACTION_NONE 0x0
#define COOKIEACTION_ACCEPT 0x1
#define COOKIEACTION_REJECT 0x2
#define COOKIEACTION_DOWNGRADE 0x4
#define COOKIEACTION_LEASH 0x8
#define COOKIEACTION_SUPPRESS 0x10
#define COOKIEACTION_READ 0x20

#define PRIVACY_URLISTOPLEVEL 0x10000
#define PRIVACY_URLHASCOMPACTPOLICY 0x20000
#define PRIVACY_URLHASPOSTDATA 0x80000
#define PRIVACY_URLHASPOLICYREFLINK 0x100000
#define PRIVACY_URLHASPOLICYREFHEADER 0x200000
#define PRIVACY_URLHASP3PHEADER 0x400000

#define DEBUGCALLBACKNOTIFICATION_TIMEOUT 0x1
#define DEBUGCALLBACKNOTIFICATION_INTERVAL 0x2
#define DEBUGCALLBACKNOTIFICATION_IMMEDIATE 0x4
#define DEBUGCALLBACKNOTIFICATION_ANIMATIONFRAME 0x8
#define DEBUGCALLBACKNOTIFICATION_DOMEVENT 0x10

#define DEBUGDOMEVENTPROPAGATIONSTATUS_DEFAULTCANCELED 0x1
#define DEBUGDOMEVENTPROPAGATIONSTATUS_STOPIMMEDIATEPROPAGATION 0x2
#define DEBUGDOMEVENTPROPAGATIONSTATUS_STOPPROPAGATION 0x4

/*****************************************************************************
 * IHTMLFiltersCollection interface
 */
#ifndef __IHTMLFiltersCollection_INTERFACE_DEFINED__
#define __IHTMLFiltersCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLFiltersCollection, 0x3050f3ee, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f3ee-98b5-11cf-bb82-00aa00bdce0b")
IHTMLFiltersCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__newEnum(
        IUnknown **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE item(
        VARIANT *pvarIndex,
        VARIANT *pvarResult) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLFiltersCollection, 0x3050f3ee, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLFiltersCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLFiltersCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLFiltersCollection* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get__newEnum)(
        IHTMLFiltersCollection* This,
        IUnknown **p);

    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLFiltersCollection* This,
        VARIANT *pvarIndex,
        VARIANT *pvarResult);

    END_INTERFACE
} IHTMLFiltersCollectionVtbl;
interface IHTMLFiltersCollection {
    CONST_VTBL IHTMLFiltersCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLFiltersCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLFiltersCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLFiltersCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLFiltersCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLFiltersCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLFiltersCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLFiltersCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLFiltersCollection methods ***/
#define IHTMLFiltersCollection_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLFiltersCollection_get__newEnum(This,p) (This)->lpVtbl->get__newEnum(This,p)
#define IHTMLFiltersCollection_item(This,pvarIndex,pvarResult) (This)->lpVtbl->item(This,pvarIndex,pvarResult)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLFiltersCollection_QueryInterface(IHTMLFiltersCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLFiltersCollection_AddRef(IHTMLFiltersCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLFiltersCollection_Release(IHTMLFiltersCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLFiltersCollection_GetTypeInfoCount(IHTMLFiltersCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLFiltersCollection_GetTypeInfo(IHTMLFiltersCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLFiltersCollection_GetIDsOfNames(IHTMLFiltersCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLFiltersCollection_Invoke(IHTMLFiltersCollection* 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);
}
/*** IHTMLFiltersCollection methods ***/
static FORCEINLINE HRESULT IHTMLFiltersCollection_get_length(IHTMLFiltersCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IHTMLFiltersCollection_get__newEnum(IHTMLFiltersCollection* This,IUnknown **p) {
    return This->lpVtbl->get__newEnum(This,p);
}
static FORCEINLINE HRESULT IHTMLFiltersCollection_item(IHTMLFiltersCollection* This,VARIANT *pvarIndex,VARIANT *pvarResult) {
    return This->lpVtbl->item(This,pvarIndex,pvarResult);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLFiltersCollection_get_length_Proxy(
    IHTMLFiltersCollection* This,
    LONG *p);
void __RPC_STUB IHTMLFiltersCollection_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFiltersCollection_get__newEnum_Proxy(
    IHTMLFiltersCollection* This,
    IUnknown **p);
void __RPC_STUB IHTMLFiltersCollection_get__newEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFiltersCollection_item_Proxy(
    IHTMLFiltersCollection* This,
    VARIANT *pvarIndex,
    VARIANT *pvarResult);
void __RPC_STUB IHTMLFiltersCollection_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLFiltersCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIE70DispatchEx interface
 */
#ifndef __IIE70DispatchEx_INTERFACE_DEFINED__
#define __IIE70DispatchEx_INTERFACE_DEFINED__

DEFINE_GUID(IID_IIE70DispatchEx, 0x3051046b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051046b-98b5-11cf-bb82-00aa00bdce0b")
IIE70DispatchEx : public IDispatchEx
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IIE70DispatchEx, 0x3051046b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IIE70DispatchExVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IDispatchEx methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDispID)(
        IIE70DispatchEx* This,
        BSTR bstrName,
        DWORD grfdex,
        DISPID *pid);

    HRESULT (STDMETHODCALLTYPE *InvokeEx)(
        IIE70DispatchEx* This,
        DISPID id,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pdp,
        VARIANT *pvarRes,
        EXCEPINFO *pei,
        IServiceProvider *pspCaller);

    HRESULT (STDMETHODCALLTYPE *DeleteMemberByName)(
        IIE70DispatchEx* This,
        BSTR bstrName,
        DWORD grfdex);

    HRESULT (STDMETHODCALLTYPE *DeleteMemberByDispID)(
        IIE70DispatchEx* This,
        DISPID id);

    HRESULT (STDMETHODCALLTYPE *GetMemberProperties)(
        IIE70DispatchEx* This,
        DISPID id,
        DWORD grfdexFetch,
        DWORD *pgrfdex);

    HRESULT (STDMETHODCALLTYPE *GetMemberName)(
        IIE70DispatchEx* This,
        DISPID id,
        BSTR *pbstrName);

    HRESULT (STDMETHODCALLTYPE *GetNextDispID)(
        IIE70DispatchEx* This,
        DWORD grfdex,
        DISPID id,
        DISPID *pid);

    HRESULT (STDMETHODCALLTYPE *GetNameSpaceParent)(
        IIE70DispatchEx* This,
        IUnknown **ppunk);

    END_INTERFACE
} IIE70DispatchExVtbl;
interface IIE70DispatchEx {
    CONST_VTBL IIE70DispatchExVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IIE70DispatchEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IIE70DispatchEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IIE70DispatchEx_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IIE70DispatchEx_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IIE70DispatchEx_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IIE70DispatchEx_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IIE70DispatchEx_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDispatchEx methods ***/
#define IIE70DispatchEx_GetDispID(This,bstrName,grfdex,pid) (This)->lpVtbl->GetDispID(This,bstrName,grfdex,pid)
#define IIE70DispatchEx_InvokeEx(This,id,lcid,wFlags,pdp,pvarRes,pei,pspCaller) (This)->lpVtbl->InvokeEx(This,id,lcid,wFlags,pdp,pvarRes,pei,pspCaller)
#define IIE70DispatchEx_DeleteMemberByName(This,bstrName,grfdex) (This)->lpVtbl->DeleteMemberByName(This,bstrName,grfdex)
#define IIE70DispatchEx_DeleteMemberByDispID(This,id) (This)->lpVtbl->DeleteMemberByDispID(This,id)
#define IIE70DispatchEx_GetMemberProperties(This,id,grfdexFetch,pgrfdex) (This)->lpVtbl->GetMemberProperties(This,id,grfdexFetch,pgrfdex)
#define IIE70DispatchEx_GetMemberName(This,id,pbstrName) (This)->lpVtbl->GetMemberName(This,id,pbstrName)
#define IIE70DispatchEx_GetNextDispID(This,grfdex,id,pid) (This)->lpVtbl->GetNextDispID(This,grfdex,id,pid)
#define IIE70DispatchEx_GetNameSpaceParent(This,ppunk) (This)->lpVtbl->GetNameSpaceParent(This,ppunk)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IIE70DispatchEx_QueryInterface(IIE70DispatchEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IIE70DispatchEx_AddRef(IIE70DispatchEx* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IIE70DispatchEx_Release(IIE70DispatchEx* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IIE70DispatchEx_GetTypeInfoCount(IIE70DispatchEx* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IIE70DispatchEx_GetTypeInfo(IIE70DispatchEx* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IIE70DispatchEx_GetIDsOfNames(IIE70DispatchEx* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IIE70DispatchEx_Invoke(IIE70DispatchEx* 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);
}
/*** IDispatchEx methods ***/
static FORCEINLINE HRESULT IIE70DispatchEx_GetDispID(IIE70DispatchEx* This,BSTR bstrName,DWORD grfdex,DISPID *pid) {
    return This->lpVtbl->GetDispID(This,bstrName,grfdex,pid);
}
static FORCEINLINE HRESULT IIE70DispatchEx_InvokeEx(IIE70DispatchEx* This,DISPID id,LCID lcid,WORD wFlags,DISPPARAMS *pdp,VARIANT *pvarRes,EXCEPINFO *pei,IServiceProvider *pspCaller) {
    return This->lpVtbl->InvokeEx(This,id,lcid,wFlags,pdp,pvarRes,pei,pspCaller);
}
static FORCEINLINE HRESULT IIE70DispatchEx_DeleteMemberByName(IIE70DispatchEx* This,BSTR bstrName,DWORD grfdex) {
    return This->lpVtbl->DeleteMemberByName(This,bstrName,grfdex);
}
static FORCEINLINE HRESULT IIE70DispatchEx_DeleteMemberByDispID(IIE70DispatchEx* This,DISPID id) {
    return This->lpVtbl->DeleteMemberByDispID(This,id);
}
static FORCEINLINE HRESULT IIE70DispatchEx_GetMemberProperties(IIE70DispatchEx* This,DISPID id,DWORD grfdexFetch,DWORD *pgrfdex) {
    return This->lpVtbl->GetMemberProperties(This,id,grfdexFetch,pgrfdex);
}
static FORCEINLINE HRESULT IIE70DispatchEx_GetMemberName(IIE70DispatchEx* This,DISPID id,BSTR *pbstrName) {
    return This->lpVtbl->GetMemberName(This,id,pbstrName);
}
static FORCEINLINE HRESULT IIE70DispatchEx_GetNextDispID(IIE70DispatchEx* This,DWORD grfdex,DISPID id,DISPID *pid) {
    return This->lpVtbl->GetNextDispID(This,grfdex,id,pid);
}
static FORCEINLINE HRESULT IIE70DispatchEx_GetNameSpaceParent(IIE70DispatchEx* This,IUnknown **ppunk) {
    return This->lpVtbl->GetNameSpaceParent(This,ppunk);
}
#endif
#endif

#endif


#endif  /* __IIE70DispatchEx_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIE80DispatchEx interface
 */
#ifndef __IIE80DispatchEx_INTERFACE_DEFINED__
#define __IIE80DispatchEx_INTERFACE_DEFINED__

DEFINE_GUID(IID_IIE80DispatchEx, 0x3051046c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051046c-98b5-11cf-bb82-00aa00bdce0b")
IIE80DispatchEx : public IDispatchEx
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IIE80DispatchEx, 0x3051046c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IIE80DispatchExVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IDispatchEx methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDispID)(
        IIE80DispatchEx* This,
        BSTR bstrName,
        DWORD grfdex,
        DISPID *pid);

    HRESULT (STDMETHODCALLTYPE *InvokeEx)(
        IIE80DispatchEx* This,
        DISPID id,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pdp,
        VARIANT *pvarRes,
        EXCEPINFO *pei,
        IServiceProvider *pspCaller);

    HRESULT (STDMETHODCALLTYPE *DeleteMemberByName)(
        IIE80DispatchEx* This,
        BSTR bstrName,
        DWORD grfdex);

    HRESULT (STDMETHODCALLTYPE *DeleteMemberByDispID)(
        IIE80DispatchEx* This,
        DISPID id);

    HRESULT (STDMETHODCALLTYPE *GetMemberProperties)(
        IIE80DispatchEx* This,
        DISPID id,
        DWORD grfdexFetch,
        DWORD *pgrfdex);

    HRESULT (STDMETHODCALLTYPE *GetMemberName)(
        IIE80DispatchEx* This,
        DISPID id,
        BSTR *pbstrName);

    HRESULT (STDMETHODCALLTYPE *GetNextDispID)(
        IIE80DispatchEx* This,
        DWORD grfdex,
        DISPID id,
        DISPID *pid);

    HRESULT (STDMETHODCALLTYPE *GetNameSpaceParent)(
        IIE80DispatchEx* This,
        IUnknown **ppunk);

    END_INTERFACE
} IIE80DispatchExVtbl;
interface IIE80DispatchEx {
    CONST_VTBL IIE80DispatchExVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IIE80DispatchEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IIE80DispatchEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IIE80DispatchEx_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IIE80DispatchEx_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IIE80DispatchEx_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IIE80DispatchEx_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IIE80DispatchEx_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDispatchEx methods ***/
#define IIE80DispatchEx_GetDispID(This,bstrName,grfdex,pid) (This)->lpVtbl->GetDispID(This,bstrName,grfdex,pid)
#define IIE80DispatchEx_InvokeEx(This,id,lcid,wFlags,pdp,pvarRes,pei,pspCaller) (This)->lpVtbl->InvokeEx(This,id,lcid,wFlags,pdp,pvarRes,pei,pspCaller)
#define IIE80DispatchEx_DeleteMemberByName(This,bstrName,grfdex) (This)->lpVtbl->DeleteMemberByName(This,bstrName,grfdex)
#define IIE80DispatchEx_DeleteMemberByDispID(This,id) (This)->lpVtbl->DeleteMemberByDispID(This,id)
#define IIE80DispatchEx_GetMemberProperties(This,id,grfdexFetch,pgrfdex) (This)->lpVtbl->GetMemberProperties(This,id,grfdexFetch,pgrfdex)
#define IIE80DispatchEx_GetMemberName(This,id,pbstrName) (This)->lpVtbl->GetMemberName(This,id,pbstrName)
#define IIE80DispatchEx_GetNextDispID(This,grfdex,id,pid) (This)->lpVtbl->GetNextDispID(This,grfdex,id,pid)
#define IIE80DispatchEx_GetNameSpaceParent(This,ppunk) (This)->lpVtbl->GetNameSpaceParent(This,ppunk)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IIE80DispatchEx_QueryInterface(IIE80DispatchEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IIE80DispatchEx_AddRef(IIE80DispatchEx* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IIE80DispatchEx_Release(IIE80DispatchEx* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IIE80DispatchEx_GetTypeInfoCount(IIE80DispatchEx* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IIE80DispatchEx_GetTypeInfo(IIE80DispatchEx* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IIE80DispatchEx_GetIDsOfNames(IIE80DispatchEx* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IIE80DispatchEx_Invoke(IIE80DispatchEx* 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);
}
/*** IDispatchEx methods ***/
static FORCEINLINE HRESULT IIE80DispatchEx_GetDispID(IIE80DispatchEx* This,BSTR bstrName,DWORD grfdex,DISPID *pid) {
    return This->lpVtbl->GetDispID(This,bstrName,grfdex,pid);
}
static FORCEINLINE HRESULT IIE80DispatchEx_InvokeEx(IIE80DispatchEx* This,DISPID id,LCID lcid,WORD wFlags,DISPPARAMS *pdp,VARIANT *pvarRes,EXCEPINFO *pei,IServiceProvider *pspCaller) {
    return This->lpVtbl->InvokeEx(This,id,lcid,wFlags,pdp,pvarRes,pei,pspCaller);
}
static FORCEINLINE HRESULT IIE80DispatchEx_DeleteMemberByName(IIE80DispatchEx* This,BSTR bstrName,DWORD grfdex) {
    return This->lpVtbl->DeleteMemberByName(This,bstrName,grfdex);
}
static FORCEINLINE HRESULT IIE80DispatchEx_DeleteMemberByDispID(IIE80DispatchEx* This,DISPID id) {
    return This->lpVtbl->DeleteMemberByDispID(This,id);
}
static FORCEINLINE HRESULT IIE80DispatchEx_GetMemberProperties(IIE80DispatchEx* This,DISPID id,DWORD grfdexFetch,DWORD *pgrfdex) {
    return This->lpVtbl->GetMemberProperties(This,id,grfdexFetch,pgrfdex);
}
static FORCEINLINE HRESULT IIE80DispatchEx_GetMemberName(IIE80DispatchEx* This,DISPID id,BSTR *pbstrName) {
    return This->lpVtbl->GetMemberName(This,id,pbstrName);
}
static FORCEINLINE HRESULT IIE80DispatchEx_GetNextDispID(IIE80DispatchEx* This,DWORD grfdex,DISPID id,DISPID *pid) {
    return This->lpVtbl->GetNextDispID(This,grfdex,id,pid);
}
static FORCEINLINE HRESULT IIE80DispatchEx_GetNameSpaceParent(IIE80DispatchEx* This,IUnknown **ppunk) {
    return This->lpVtbl->GetNameSpaceParent(This,ppunk);
}
#endif
#endif

#endif


#endif  /* __IIE80DispatchEx_INTERFACE_DEFINED__ */


DEFINE_GUID(LIBID_MSHTML, 0x3050f1c5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifndef __IDOMEvent_FWD_DEFINED__
#define __IDOMEvent_FWD_DEFINED__
typedef interface IDOMEvent IDOMEvent;
#endif

#ifndef __IElementBehavior_FWD_DEFINED__
#define __IElementBehavior_FWD_DEFINED__
typedef interface IElementBehavior IElementBehavior;
#endif

#ifndef __IElementBehaviorFactory_FWD_DEFINED__
#define __IElementBehaviorFactory_FWD_DEFINED__
typedef interface IElementBehaviorFactory IElementBehaviorFactory;
#endif

#ifndef __IElementBehaviorRender_FWD_DEFINED__
#define __IElementBehaviorRender_FWD_DEFINED__
typedef interface IElementBehaviorRender IElementBehaviorRender;
#endif

#ifndef __IElementBehaviorSite_FWD_DEFINED__
#define __IElementBehaviorSite_FWD_DEFINED__
typedef interface IElementBehaviorSite IElementBehaviorSite;
#endif

#ifndef __IElementBehaviorSiteOM_FWD_DEFINED__
#define __IElementBehaviorSiteOM_FWD_DEFINED__
typedef interface IElementBehaviorSiteOM IElementBehaviorSiteOM;
#endif

#ifndef __IElementBehaviorSiteRender_FWD_DEFINED__
#define __IElementBehaviorSiteRender_FWD_DEFINED__
typedef interface IElementBehaviorSiteRender IElementBehaviorSiteRender;
#endif

#ifndef __IHTMLEventObj_FWD_DEFINED__
#define __IHTMLEventObj_FWD_DEFINED__
typedef interface IHTMLEventObj IHTMLEventObj;
#endif

#ifndef __IHTMLStyleSheetRule_FWD_DEFINED__
#define __IHTMLStyleSheetRule_FWD_DEFINED__
typedef interface IHTMLStyleSheetRule IHTMLStyleSheetRule;
#endif

typedef enum _htmlBlockAlign {
    htmlBlockAlignNotSet = 0,
    htmlBlockAlignLeft = 1,
    htmlBlockAlignCenter = 2,
    htmlBlockAlignRight = 3,
    htmlBlockAlignJustify = 4,
    htmlBlockAlign_Max = 0x7fffffff
} htmlBlockAlign;
typedef enum _htmlClear {
    htmlClearNotSet = 0,
    htmlClearAll = 1,
    htmlClearLeft = 2,
    htmlClearRight = 3,
    htmlClearBoth = 4,
    htmlClearNone = 5,
    htmlClear_Max = 0x7fffffff
} htmlClear;
typedef enum _htmlControlAlign {
    htmlControlAlignNotSet = 0,
    htmlControlAlignLeft = 1,
    htmlControlAlignCenter = 2,
    htmlControlAlignRight = 3,
    htmlControlAlignTextTop = 4,
    htmlControlAlignAbsMiddle = 5,
    htmlControlAlignBaseline = 6,
    htmlControlAlignAbsBottom = 7,
    htmlControlAlignBottom = 8,
    htmlControlAlignMiddle = 9,
    htmlControlAlignTop = 10,
    htmlControlAlign_Max = 0x7fffffff
} htmlControlAlign;
typedef enum _htmlDesignMode {
    htmlDesignModeInherit = -2,
    htmlDesignModeOn = -1,
    htmlDesignModeOff = 0,
    htmlDesignMode_Max = 0x7fffffff
} htmlDesignMode;
typedef enum _htmlReadyState {
    htmlReadyStateuninitialized = 0,
    htmlReadyStateloading = 1,
    htmlReadyStateloaded = 2,
    htmlReadyStateinteractive = 3,
    htmlReadyStatecomplete = 4,
    htmlReadyState_Max = 0x7fffffff
} htmlReadyState;
typedef enum _htmlZOrder {
    htmlZOrderFront = 0,
    htmlZOrderBack = 1,
    htmlZOrder_Max = 0x7fffffff
} htmlZOrder;
typedef enum _htmlLoop {
    htmlLoopLoopInfinite = -1,
    htmlLoop_Max = 0x7fffffff
} htmlLoop;
typedef enum _mediaType {
    mediaTypeNotSet = 0,
    mediaTypeAll = 511,
    mediaTypeAural = 1,
    mediaTypeBraille = 2,
    mediaTypeEmbossed = 4,
    mediaTypeHandheld = 8,
    mediaTypePrint = 16,
    mediaTypeProjection = 32,
    mediaTypeScreen = 64,
    mediaTypeTty = 128,
    mediaTypeTv = 256,
    mediaType_Max = 0x7fffffff
} mediaType;
typedef enum _DomConstructor {
    DomConstructorObject = 0,
    DomConstructorAttr = 1,
    DomConstructorBehaviorUrnsCollection = 2,
    DomConstructorBookmarkCollection = 3,
    DomConstructorCompatibleInfo = 4,
    DomConstructorCompatibleInfoCollection = 5,
    DomConstructorControlRangeCollection = 6,
    DomConstructorCSSCurrentStyleDeclaration = 7,
    DomConstructorCSSRuleList = 8,
    DomConstructorCSSRuleStyleDeclaration = 9,
    DomConstructorCSSStyleDeclaration = 10,
    DomConstructorCSSStyleRule = 11,
    DomConstructorCSSStyleSheet = 12,
    DomConstructorDataTransfer = 13,
    DomConstructorDOMImplementation = 14,
    DomConstructorElement = 15,
    DomConstructorEvent = 16,
    DomConstructorHistory = 17,
    DomConstructorHTCElementBehaviorDefaults = 18,
    DomConstructorHTMLAnchorElement = 19,
    DomConstructorHTMLAreaElement = 20,
    DomConstructorHTMLAreasCollection = 21,
    DomConstructorHTMLBaseElement = 22,
    DomConstructorHTMLBaseFontElement = 23,
    DomConstructorHTMLBGSoundElement = 24,
    DomConstructorHTMLBlockElement = 25,
    DomConstructorHTMLBodyElement = 26,
    DomConstructorHTMLBRElement = 27,
    DomConstructorHTMLButtonElement = 28,
    DomConstructorHTMLCollection = 29,
    DomConstructorHTMLCommentElement = 30,
    DomConstructorHTMLDDElement = 31,
    DomConstructorHTMLDivElement = 32,
    DomConstructorHTMLDocument = 33,
    DomConstructorHTMLDListElement = 34,
    DomConstructorHTMLDTElement = 35,
    DomConstructorHTMLEmbedElement = 36,
    DomConstructorHTMLFieldSetElement = 37,
    DomConstructorHTMLFontElement = 38,
    DomConstructorHTMLFormElement = 39,
    DomConstructorHTMLFrameElement = 40,
    DomConstructorHTMLFrameSetElement = 41,
    DomConstructorHTMLGenericElement = 42,
    DomConstructorHTMLHeadElement = 43,
    DomConstructorHTMLHeadingElement = 44,
    DomConstructorHTMLHRElement = 45,
    DomConstructorHTMLHtmlElement = 46,
    DomConstructorHTMLIFrameElement = 47,
    DomConstructorHTMLImageElement = 48,
    DomConstructorHTMLInputElement = 49,
    DomConstructorHTMLIsIndexElement = 50,
    DomConstructorHTMLLabelElement = 51,
    DomConstructorHTMLLegendElement = 52,
    DomConstructorHTMLLIElement = 53,
    DomConstructorHTMLLinkElement = 54,
    DomConstructorHTMLMapElement = 55,
    DomConstructorHTMLMarqueeElement = 56,
    DomConstructorHTMLMetaElement = 57,
    DomConstructorHTMLModelessDialog = 58,
    DomConstructorHTMLNamespaceInfo = 59,
    DomConstructorHTMLNamespaceInfoCollection = 60,
    DomConstructorHTMLNextIdElement = 61,
    DomConstructorHTMLNoShowElement = 62,
    DomConstructorHTMLObjectElement = 63,
    DomConstructorHTMLOListElement = 64,
    DomConstructorHTMLOptionElement = 65,
    DomConstructorHTMLParagraphElement = 66,
    DomConstructorHTMLParamElement = 67,
    DomConstructorHTMLPhraseElement = 68,
    DomConstructorHTMLPluginsCollection = 69,
    DomConstructorHTMLPopup = 70,
    DomConstructorHTMLScriptElement = 71,
    DomConstructorHTMLSelectElement = 72,
    DomConstructorHTMLSpanElement = 73,
    DomConstructorHTMLStyleElement = 74,
    DomConstructorHTMLTableCaptionElement = 75,
    DomConstructorHTMLTableCellElement = 76,
    DomConstructorHTMLTableColElement = 77,
    DomConstructorHTMLTableElement = 78,
    DomConstructorHTMLTableRowElement = 79,
    DomConstructorHTMLTableSectionElement = 80,
    DomConstructorHTMLTextAreaElement = 81,
    DomConstructorHTMLTextElement = 82,
    DomConstructorHTMLTitleElement = 83,
    DomConstructorHTMLUListElement = 84,
    DomConstructorHTMLUnknownElement = 85,
    DomConstructorImage = 86,
    DomConstructorLocation = 87,
    DomConstructorNamedNodeMap = 88,
    DomConstructorNavigator = 89,
    DomConstructorNodeList = 90,
    DomConstructorOption = 91,
    DomConstructorScreen = 92,
    DomConstructorSelection = 93,
    DomConstructorStaticNodeList = 94,
    DomConstructorStorage = 95,
    DomConstructorStyleSheetList = 96,
    DomConstructorStyleSheetPage = 97,
    DomConstructorStyleSheetPageList = 98,
    DomConstructorText = 99,
    DomConstructorTextRange = 100,
    DomConstructorTextRangeCollection = 101,
    DomConstructorTextRectangle = 102,
    DomConstructorTextRectangleList = 103,
    DomConstructorWindow = 104,
    DomConstructorXDomainRequest = 105,
    DomConstructorXMLHttpRequest = 106,
    DomConstructorMax = 107,
    DomConstructor_Max = 0x7fffffff
} DomConstructor;
typedef enum _styleBackgroundAttachment {
    styleBackgroundAttachmentFixed = 0,
    styleBackgroundAttachmentScroll = 1,
    styleBackgroundAttachmentNotSet = 2,
    styleBackgroundAttachment_Max = 0x7fffffff
} styleBackgroundAttachment;
typedef enum _styleBackgroundAttachment3 {
    styleBackgroundAttachment3Fixed = 0,
    styleBackgroundAttachment3Scroll = 1,
    styleBackgroundAttachment3Local = 2,
    styleBackgroundAttachment3NotSet = 3,
    styleBackgroundAttachment3_Max = 0x7fffffff
} styleBackgroundAttachment3;
typedef enum _styleBackgroundClip {
    styleBackgroundClipBorderBox = 0,
    styleBackgroundClipPaddingBox = 1,
    styleBackgroundClipContentBox = 2,
    styleBackgroundClipNotSet = 3,
    styleBackgroundClip_Max = 0x7fffffff
} styleBackgroundClip;
typedef enum _styleBackgroundOrigin {
    styleBackgroundOriginBorderBox = 0,
    styleBackgroundOriginPaddingBox = 1,
    styleBackgroundOriginContentBox = 2,
    styleBackgroundOriginNotSet = 3,
    styleBackgroundOrigin_Max = 0x7fffffff
} styleBackgroundOrigin;
typedef enum _styleBackgroundRepeat {
    styleBackgroundRepeatRepeat = 0,
    styleBackgroundRepeatRepeatX = 1,
    styleBackgroundRepeatRepeatY = 2,
    styleBackgroundRepeatNoRepeat = 3,
    styleBackgroundRepeatNotSet = 4,
    styleBackgroundRepeat_Max = 0x7fffffff
} styleBackgroundRepeat;
typedef enum _styleBorderCollapse {
    styleBorderCollapseNotSet = 0,
    styleBorderCollapseSeparate = 1,
    styleBorderCollapseCollapse = 2,
    styleBorderCollapse_Max = 0x7fffffff
} styleBorderCollapse;
typedef enum _styleCaptionSide {
    styleCaptionSideNotSet = 0,
    styleCaptionSideTop = 1,
    styleCaptionSideBottom = 2,
    styleCaptionSideLeft = 3,
    styleCaptionSideRight = 4,
    styleCaptionSide_Max = 0x7fffffff
} styleCaptionSide;
typedef enum _styleDataRepeat {
    styleDataRepeatNone = 0,
    styleDataRepeatInner = 1,
    styleDataRepeat_Max = 0x7fffffff
} styleDataRepeat;
typedef enum _styleEmptyCells {
    styleEmptyCellsNotSet = 0,
    styleEmptyCellsShow = 1,
    styleEmptyCellsHide = 2,
    styleEmptyCells_Max = 0x7fffffff
} styleEmptyCells;
typedef enum _styleFontStyle {
    styleFontStyleNotSet = 0,
    styleFontStyleItalic = 1,
    styleFontStyleOblique = 2,
    styleFontStyleNormal = 3,
    styleFontStyle_Max = 0x7fffffff
} styleFontStyle;
typedef enum _styleFontVariant {
    styleFontVariantNotSet = 0,
    styleFontVariantSmallCaps = 1,
    styleFontVariantNormal = 2,
    styleFontVariant_Max = 0x7fffffff
} styleFontVariant;
typedef enum _styleFontSize {
    styleFontSizeXXSmall = 0,
    styleFontSizeXSmall = 1,
    styleFontSizeSmall = 2,
    styleFontSizeMedium = 3,
    styleFontSizeLarge = 4,
    styleFontSizeXLarge = 5,
    styleFontSizeXXLarge = 6,
    styleFontSizeSmaller = 7,
    styleFontSizeLarger = 8,
    styleFontSize_Max = 0x7fffffff
} styleFontSize;
typedef enum _styleFontWeight {
    styleFontWeightNotSet = 0,
    styleFontWeight100 = 1,
    styleFontWeight200 = 2,
    styleFontWeight300 = 3,
    styleFontWeight400 = 4,
    styleFontWeight500 = 5,
    styleFontWeight600 = 6,
    styleFontWeight700 = 7,
    styleFontWeight800 = 8,
    styleFontWeight900 = 9,
    styleFontWeightNormal = 10,
    styleFontWeightBold = 11,
    styleFontWeightBolder = 12,
    styleFontWeightLighter = 13,
    styleFontWeight_Max = 0x7fffffff
} styleFontWeight;
typedef enum _styleMsOverflowStyle {
    styleMsOverflowStyleNotSet = 0,
    styleMsOverflowStyleAuto = 1,
    styleMsOverflowStyleNone = 2,
    styleMsOverflowStyleScrollbar = 3,
    styleMsOverflowStyleMsAutoHidingScrollbar = 4,
    styleMsOverflowStyle_Max = 0x7fffffff
} styleMsOverflowStyle;
typedef enum _styleOverflow {
    styleOverflowNotSet = 0,
    styleOverflowAuto = 1,
    styleOverflowHidden = 2,
    styleOverflowVisible = 3,
    styleOverflowScroll = 4,
    styleOverflow_Max = 0x7fffffff
} styleOverflow;
typedef enum _styleTableLayout {
    styleTableLayoutNotSet = 0,
    styleTableLayoutAuto = 1,
    styleTableLayoutFixed = 2,
    styleTableLayout_Max = 0x7fffffff
} styleTableLayout;
typedef enum _styleTextTransform {
    styleTextTransformNotSet = 0,
    styleTextTransformCapitalize = 1,
    styleTextTransformLowercase = 2,
    styleTextTransformUppercase = 3,
    styleTextTransformNone = 4,
    styleTextTransform_Max = 0x7fffffff
} styleTextTransform;
typedef enum _styleVerticalAlign {
    styleVerticalAlignAuto = 0,
    styleVerticalAlignBaseline = 1,
    styleVerticalAlignSub = 2,
    styleVerticalAlignSuper = 3,
    styleVerticalAlignTop = 4,
    styleVerticalAlignTextTop = 5,
    styleVerticalAlignMiddle = 6,
    styleVerticalAlignBottom = 7,
    styleVerticalAlignTextBottom = 8,
    styleVerticalAlignInherit = 9,
    styleVerticalAlignNotSet = 10,
    styleVerticalAlign_Max = 0x7fffffff
} styleVerticalAlign;
typedef enum _styleWidowsOrphans {
    styleWidowsOrphansNotSet = -2147483647,
    styleWidowsOrphans_Max = 0x7fffffff
} styleWidowsOrphans;
typedef enum _styleZIndex {
    styleZIndexAuto = -2147483647,
    styleZIndex_Max = 0x7fffffff
} styleZIndex;
typedef enum _styleAuto {
    styleAutoAuto = 0,
    styleAuto_Max = 0x7fffffff
} styleAuto;
typedef enum _styleNone {
    styleNoneNone = 0,
    styleNone_Max = 0x7fffffff
} styleNone;
typedef enum _styleNormal {
    styleNormalNormal = 0,
    styleNormal_Max = 0x7fffffff
} styleNormal;
typedef enum _styleBorderWidth {
    styleBorderWidthThin = 0,
    styleBorderWidthMedium = 1,
    styleBorderWidthThick = 2,
    styleBorderWidth_Max = 0x7fffffff
} styleBorderWidth;
typedef enum _stylePosition {
    stylePositionNotSet = 0,
    stylePositionstatic = 1,
    stylePositionrelative = 2,
    stylePositionabsolute = 3,
    stylePositionfixed = 4,
    stylePositionMsPage = 5,
    stylePosition_Max = 0x7fffffff
} stylePosition;
typedef enum _styleBorderStyle {
    styleBorderStyleNotSet = 0,
    styleBorderStyleDotted = 1,
    styleBorderStyleDashed = 2,
    styleBorderStyleSolid = 3,
    styleBorderStyleDouble = 4,
    styleBorderStyleGroove = 5,
    styleBorderStyleRidge = 6,
    styleBorderStyleInset = 7,
    styleBorderStyleOutset = 8,
    styleBorderStyleWindowInset = 9,
    styleBorderStyleNone = 10,
    styleBorderStyleHidden = 11,
    styleBorderStyle_Max = 0x7fffffff
} styleBorderStyle;
typedef enum _styleOutlineStyle {
    styleOutlineStyleNotSet = 0,
    styleOutlineStyleDotted = 1,
    styleOutlineStyleDashed = 2,
    styleOutlineStyleSolid = 3,
    styleOutlineStyleDouble = 4,
    styleOutlineStyleGroove = 5,
    styleOutlineStyleRidge = 6,
    styleOutlineStyleInset = 7,
    styleOutlineStyleOutset = 8,
    styleOutlineStyleWindowInset = 9,
    styleOutlineStyleNone = 10,
    styleOutlineStyle_Max = 0x7fffffff
} styleOutlineStyle;
typedef enum _styleStyleFloat {
    styleStyleFloatNotSet = 0,
    styleStyleFloatLeft = 1,
    styleStyleFloatRight = 2,
    styleStyleFloatNone = 3,
    styleStyleFloat_Max = 0x7fffffff
} styleStyleFloat;
typedef enum _styleDisplay {
    styleDisplayNotSet = 0,
    styleDisplayBlock = 1,
    styleDisplayInline = 2,
    styleDisplayListItem = 3,
    styleDisplayNone = 4,
    styleDisplayTableHeaderGroup = 5,
    styleDisplayTableFooterGroup = 6,
    styleDisplayInlineBlock = 7,
    styleDisplayTable = 8,
    styleDisplayInlineTable = 9,
    styleDisplayTableRow = 10,
    styleDisplayTableRowGroup = 11,
    styleDisplayTableColumn = 12,
    styleDisplayTableColumnGroup = 13,
    styleDisplayTableCell = 14,
    styleDisplayTableCaption = 15,
    styleDisplayRunIn = 16,
    styleDisplayRuby = 17,
    styleDisplayRubyBase = 18,
    styleDisplayRubyText = 19,
    styleDisplayRubyBaseContainer = 20,
    styleDisplayRubyTextContainer = 21,
    styleDisplayMsFlexbox = 22,
    styleDisplayMsInlineFlexbox = 23,
    styleDisplayMsGrid = 24,
    styleDisplayMsInlineGrid = 25,
    styleDisplay_Max = 0x7fffffff
} styleDisplay;
typedef enum _styleVisibility {
    styleVisibilityNotSet = 0,
    styleVisibilityInherit = 1,
    styleVisibilityVisible = 2,
    styleVisibilityHidden = 3,
    styleVisibilityCollapse = 4,
    styleVisibility_Max = 0x7fffffff
} styleVisibility;
typedef enum _styleListStyleType {
    styleListStyleTypeNotSet = 0,
    styleListStyleTypeDisc = 1,
    styleListStyleTypeCircle = 2,
    styleListStyleTypeSquare = 3,
    styleListStyleTypeDecimal = 4,
    styleListStyleTypeLowerRoman = 5,
    styleListStyleTypeUpperRoman = 6,
    styleListStyleTypeLowerAlpha = 7,
    styleListStyleTypeUpperAlpha = 8,
    styleListStyleTypeNone = 9,
    styleListStyleTypeDecimalLeadingZero = 10,
    styleListStyleTypeGeorgian = 11,
    styleListStyleTypeArmenian = 12,
    styleListStyleTypeUpperLatin = 13,
    styleListStyleTypeLowerLatin = 14,
    styleListStyleTypeUpperGreek = 15,
    styleListStyleTypeLowerGreek = 16,
    styleListStyleType_Max = 0x7fffffff
} styleListStyleType;
typedef enum _styleListStylePosition {
    styleListStylePositionNotSet = 0,
    styleListStylePositionInside = 1,
    styleListStylePositionOutSide = 2,
    styleListStylePosition_Max = 0x7fffffff
} styleListStylePosition;
typedef enum _styleWhiteSpace {
    styleWhiteSpaceNotSet = 0,
    styleWhiteSpaceNormal = 1,
    styleWhiteSpacePre = 2,
    styleWhiteSpaceNowrap = 3,
    styleWhiteSpacePreline = 4,
    styleWhiteSpacePrewrap = 5,
    styleWhiteSpace_Max = 0x7fffffff
} styleWhiteSpace;
typedef enum _stylePageBreak {
    stylePageBreakNotSet = 0,
    stylePageBreakAuto = 1,
    stylePageBreakAlways = 2,
    stylePageBreakLeft = 3,
    stylePageBreakRight = 4,
    stylePageBreakAvoid = 5,
    stylePageBreak_Max = 0x7fffffff
} stylePageBreak;
typedef enum _stylePageBreakInside {
    stylePageBreakInsideNotSet = 0,
    stylePageBreakInsideAuto = 1,
    stylePageBreakInsideAvoid = 2,
    stylePageBreakInside_Max = 0x7fffffff
} stylePageBreakInside;
typedef enum _styleCursor {
    styleCursorAuto = 0,
    styleCursorCrosshair = 1,
    styleCursorDefault = 2,
    styleCursorHand = 3,
    styleCursorMove = 4,
    styleCursorE_resize = 5,
    styleCursorNe_resize = 6,
    styleCursorNw_resize = 7,
    styleCursorN_resize = 8,
    styleCursorSe_resize = 9,
    styleCursorSw_resize = 10,
    styleCursorS_resize = 11,
    styleCursorW_resize = 12,
    styleCursorText = 13,
    styleCursorWait = 14,
    styleCursorHelp = 15,
    styleCursorPointer = 16,
    styleCursorProgress = 17,
    styleCursorNot_allowed = 18,
    styleCursorNo_drop = 19,
    styleCursorVertical_text = 20,
    styleCursorall_scroll = 21,
    styleCursorcol_resize = 22,
    styleCursorrow_resize = 23,
    styleCursorNone = 24,
    styleCursorContext_menu = 25,
    styleCursorEw_resize = 26,
    styleCursorNs_resize = 27,
    styleCursorNesw_resize = 28,
    styleCursorNwse_resize = 29,
    styleCursorCell = 30,
    styleCursorCopy = 31,
    styleCursorAlias = 32,
    styleCursorcustom = 33,
    styleCursorNotSet = 34,
    styleCursor_Max = 0x7fffffff
} styleCursor;
typedef enum _styleDir {
    styleDirNotSet = 0,
    styleDirLeftToRight = 1,
    styleDirRightToLeft = 2,
    styleDirInherit = 3,
    styleDir_Max = 0x7fffffff
} styleDir;
typedef enum _styleBidi {
    styleBidiNotSet = 0,
    styleBidiNormal = 1,
    styleBidiEmbed = 2,
    styleBidiOverride = 3,
    styleBidiInherit = 4,
    styleBidi_Max = 0x7fffffff
} styleBidi;
typedef enum _styleImeMode {
    styleImeModeAuto = 0,
    styleImeModeActive = 1,
    styleImeModeInactive = 2,
    styleImeModeDisabled = 3,
    styleImeModeNotSet = 4,
    styleImeMode_Max = 0x7fffffff
} styleImeMode;
typedef enum _styleRubyAlign {
    styleRubyAlignNotSet = 0,
    styleRubyAlignAuto = 1,
    styleRubyAlignLeft = 2,
    styleRubyAlignCenter = 3,
    styleRubyAlignRight = 4,
    styleRubyAlignDistributeLetter = 5,
    styleRubyAlignDistributeSpace = 6,
    styleRubyAlignLineEdge = 7,
    styleRubyAlign_Max = 0x7fffffff
} styleRubyAlign;
typedef enum _styleRubyPosition {
    styleRubyPositionNotSet = 0,
    styleRubyPositionAbove = 1,
    styleRubyPositionInline = 2,
    styleRubyPosition_Max = 0x7fffffff
} styleRubyPosition;
typedef enum _styleRubyOverhang {
    styleRubyOverhangNotSet = 0,
    styleRubyOverhangAuto = 1,
    styleRubyOverhangWhitespace = 2,
    styleRubyOverhangNone = 3,
    styleRubyOverhang_Max = 0x7fffffff
} styleRubyOverhang;
typedef enum _styleLayoutGridChar {
    styleLayoutGridCharNotSet = 0,
    styleLayoutGridCharAuto = 1,
    styleLayoutGridCharNone = 2,
    styleLayoutGridChar_Max = 0x7fffffff
} styleLayoutGridChar;
typedef enum _styleLayoutGridLine {
    styleLayoutGridLineNotSet = 0,
    styleLayoutGridLineAuto = 1,
    styleLayoutGridLineNone = 2,
    styleLayoutGridLine_Max = 0x7fffffff
} styleLayoutGridLine;
typedef enum _styleLayoutGridMode {
    styleLayoutGridModeNotSet = 0,
    styleLayoutGridModeChar = 1,
    styleLayoutGridModeLine = 2,
    styleLayoutGridModeBoth = 3,
    styleLayoutGridModeNone = 4,
    styleLayoutGridMode_Max = 0x7fffffff
} styleLayoutGridMode;
typedef enum _styleLayoutGridType {
    styleLayoutGridTypeNotSet = 0,
    styleLayoutGridTypeLoose = 1,
    styleLayoutGridTypeStrict = 2,
    styleLayoutGridTypeFixed = 3,
    styleLayoutGridType_Max = 0x7fffffff
} styleLayoutGridType;
typedef enum _styleLineBreak {
    styleLineBreakNotSet = 0,
    styleLineBreakNormal = 1,
    styleLineBreakStrict = 2,
    styleLineBreak_Max = 0x7fffffff
} styleLineBreak;
typedef enum _styleWordBreak {
    styleWordBreakNotSet = 0,
    styleWordBreakNormal = 1,
    styleWordBreakBreakAll = 2,
    styleWordBreakKeepAll = 3,
    styleWordBreak_Max = 0x7fffffff
} styleWordBreak;
typedef enum _styleWordWrap {
    styleWordWrapNotSet = 0,
    styleWordWrapOff = 1,
    styleWordWrapOn = 2,
    styleWordWrap_Max = 0x7fffffff
} styleWordWrap;
typedef enum _styleTextJustify {
    styleTextJustifyNotSet = 0,
    styleTextJustifyInterWord = 1,
    styleTextJustifyNewspaper = 2,
    styleTextJustifyDistribute = 3,
    styleTextJustifyDistributeAllLines = 4,
    styleTextJustifyInterIdeograph = 5,
    styleTextJustifyInterCluster = 6,
    styleTextJustifyKashida = 7,
    styleTextJustifyAuto = 8,
    styleTextJustify_Max = 0x7fffffff
} styleTextJustify;
typedef enum _styleTextAlignLast {
    styleTextAlignLastNotSet = 0,
    styleTextAlignLastLeft = 1,
    styleTextAlignLastCenter = 2,
    styleTextAlignLastRight = 3,
    styleTextAlignLastJustify = 4,
    styleTextAlignLastAuto = 5,
    styleTextAlignLast_Max = 0x7fffffff
} styleTextAlignLast;
typedef enum _styleTextJustifyTrim {
    styleTextJustifyTrimNotSet = 0,
    styleTextJustifyTrimNone = 1,
    styleTextJustifyTrimPunctuation = 2,
    styleTextJustifyTrimPunctAndKana = 3,
    styleTextJustifyTrim_Max = 0x7fffffff
} styleTextJustifyTrim;
typedef enum _styleAccelerator {
    styleAcceleratorFalse = 0,
    styleAcceleratorTrue = 1,
    styleAccelerator_Max = 0x7fffffff
} styleAccelerator;
typedef enum _styleLayoutFlow {
    styleLayoutFlowHorizontal = 0,
    styleLayoutFlowVerticalIdeographic = 1,
    styleLayoutFlowNotSet = 2,
    styleLayoutFlow_Max = 0x7fffffff
} styleLayoutFlow;
typedef enum _styleBlockProgression {
    styleBlockProgressionTb = 0,
    styleBlockProgressionRl = 1,
    styleBlockProgressionBt = 2,
    styleBlockProgressionLr = 3,
    styleBlockProgressionNotSet = 4,
    styleBlockProgression_Max = 0x7fffffff
} styleBlockProgression;
typedef enum _styleWritingMode {
    styleWritingModeLrtb = 0,
    styleWritingModeTbrl = 1,
    styleWritingModeRltb = 2,
    styleWritingModeBtrl = 3,
    styleWritingModeNotSet = 4,
    styleWritingModeTblr = 5,
    styleWritingModeBtlr = 6,
    styleWritingModeLrbt = 7,
    styleWritingModeRlbt = 8,
    styleWritingModeLr = 9,
    styleWritingModeRl = 10,
    styleWritingModeTb = 11,
    styleWritingMode_Max = 0x7fffffff
} styleWritingMode;
typedef enum _styleBool {
    styleBoolFalse = 0,
    styleBoolTrue = 1,
    styleBool_Max = 0x7fffffff
} styleBool;
typedef enum _styleTextUnderlinePosition {
    styleTextUnderlinePositionBelow = 0,
    styleTextUnderlinePositionAbove = 1,
    styleTextUnderlinePositionAuto = 2,
    styleTextUnderlinePositionNotSet = 3,
    styleTextUnderlinePosition_Max = 0x7fffffff
} styleTextUnderlinePosition;
typedef enum _styleTextOverflow {
    styleTextOverflowClip = 0,
    styleTextOverflowEllipsis = 1,
    styleTextOverflowNotSet = 2,
    styleTextOverflow_Max = 0x7fffffff
} styleTextOverflow;
typedef enum _styleInterpolation {
    styleInterpolationNotSet = 0,
    styleInterpolationNN = 1,
    styleInterpolationBCH = 2,
    styleInterpolation_Max = 0x7fffffff
} styleInterpolation;
typedef enum _styleBoxSizing {
    styleBoxSizingNotSet = 0,
    styleBoxSizingContentBox = 1,
    styleBoxSizingBorderBox = 2,
    styleBoxSizing_Max = 0x7fffffff
} styleBoxSizing;
typedef enum _styleMsFlex {
    styleMsFlexNone = 0,
    styleMsFlexNotSet = 1,
    styleMsFlex_Max = 0x7fffffff
} styleMsFlex;
typedef enum _styleMsFlexPreferredSize {
    styleMsFlexPreferredSizeAuto = 0,
    styleMsFlexPreferredSizeNotSet = 1,
    styleMsFlexPreferredSize_Max = 0x7fffffff
} styleMsFlexPreferredSize;
typedef enum _styleMsFlexDirection {
    styleMsFlexDirectionRow = 0,
    styleMsFlexDirectionRowReverse = 1,
    styleMsFlexDirectionColumn = 2,
    styleMsFlexDirectionColumnReverse = 3,
    styleMsFlexDirectionNotSet = 4,
    styleMsFlexDirection_Max = 0x7fffffff
} styleMsFlexDirection;
typedef enum _styleMsFlexWrap {
    styleMsFlexWrapNowrap = 0,
    styleMsFlexWrapWrap = 1,
    styleMsFlexWrapWrapReverse = 2,
    styleMsFlexWrapNotSet = 3,
    styleMsFlexWrap_Max = 0x7fffffff
} styleMsFlexWrap;
typedef enum _styleMsFlexAlign {
    styleMsFlexAlignStart = 0,
    styleMsFlexAlignEnd = 1,
    styleMsFlexAlignCenter = 2,
    styleMsFlexAlignBaseline = 3,
    styleMsFlexAlignStretch = 4,
    styleMsFlexAlignNotSet = 5,
    styleMsFlexAlign_Max = 0x7fffffff
} styleMsFlexAlign;
typedef enum _styleMsFlexItemAlign {
    styleMsFlexItemAlignStart = 0,
    styleMsFlexItemAlignEnd = 1,
    styleMsFlexItemAlignCenter = 2,
    styleMsFlexItemAlignBaseline = 3,
    styleMsFlexItemAlignStretch = 4,
    styleMsFlexItemAlignAuto = 5,
    styleMsFlexItemAlignNotSet = 6,
    styleMsFlexItemAlign_Max = 0x7fffffff
} styleMsFlexItemAlign;
typedef enum _styleMsFlexPack {
    styleMsFlexPackStart = 0,
    styleMsFlexPackEnd = 1,
    styleMsFlexPackCenter = 2,
    styleMsFlexPackJustify = 3,
    styleMsFlexPackDistribute = 4,
    styleMsFlexPackNotSet = 5,
    styleMsFlexPack_Max = 0x7fffffff
} styleMsFlexPack;
typedef enum _styleMsFlexLinePack {
    styleMsFlexLinePackStart = 0,
    styleMsFlexLinePackEnd = 1,
    styleMsFlexLinePackCenter = 2,
    styleMsFlexLinePackJustify = 3,
    styleMsFlexLinePackDistribute = 4,
    styleMsFlexLinePackStretch = 5,
    styleMsFlexLinePackNotSet = 6,
    styleMsFlexLinePack_Max = 0x7fffffff
} styleMsFlexLinePack;
typedef enum _styleColumnFill {
    styleColumnFillAuto = 0,
    styleColumnFillBalance = 1,
    styleColumnFillNotSet = 2,
    styleColumnFill_Max = 0x7fffffff
} styleColumnFill;
typedef enum _styleColumnSpan {
    styleColumnSpanOne = 0,
    styleColumnSpanAll = 1,
    styleColumnSpanNotSet = 2,
    styleColumnSpan_Max = 0x7fffffff
} styleColumnSpan;
typedef enum _styleBreak {
    styleBreakNotSet = 0,
    styleBreakAuto = 1,
    styleBreakAlways = 2,
    styleBreakAvoid = 3,
    styleBreakLeft = 4,
    styleBreakRight = 5,
    styleBreakPage = 6,
    styleBreakColumn = 7,
    styleBreakAvoidPage = 8,
    styleBreakAvoidColumn = 9,
    styleBreak_Max = 0x7fffffff
} styleBreak;
typedef enum _styleBreakInside {
    styleBreakInsideNotSet = 0,
    styleBreakInsideAuto = 1,
    styleBreakInsideAvoid = 2,
    styleBreakInsideAvoidPage = 3,
    styleBreakInsideAvoidColumn = 4,
    styleBreakInside_Max = 0x7fffffff
} styleBreakInside;
typedef enum _styleMsScrollChaining {
    styleMsScrollChainingNotSet = 0,
    styleMsScrollChainingNone = 1,
    styleMsScrollChainingChained = 2,
    styleMsScrollChaining_Max = 0x7fffffff
} styleMsScrollChaining;
typedef enum _styleMsContentZooming {
    styleMsContentZoomingNotSet = 0,
    styleMsContentZoomingNone = 1,
    styleMsContentZoomingZoom = 2,
    styleMsContentZooming_Max = 0x7fffffff
} styleMsContentZooming;
typedef enum _styleMsContentZoomSnapType {
    styleMsContentZoomSnapTypeNotSet = 0,
    styleMsContentZoomSnapTypeNone = 1,
    styleMsContentZoomSnapTypeMandatory = 2,
    styleMsContentZoomSnapTypeProximity = 3,
    styleMsContentZoomSnapType_Max = 0x7fffffff
} styleMsContentZoomSnapType;
typedef enum _styleMsScrollRails {
    styleMsScrollRailsNotSet = 0,
    styleMsScrollRailsNone = 1,
    styleMsScrollRailsRailed = 2,
    styleMsScrollRails_Max = 0x7fffffff
} styleMsScrollRails;
typedef enum _styleMsContentZoomChaining {
    styleMsContentZoomChainingNotSet = 0,
    styleMsContentZoomChainingNone = 1,
    styleMsContentZoomChainingChained = 2,
    styleMsContentZoomChaining_Max = 0x7fffffff
} styleMsContentZoomChaining;
typedef enum _styleMsScrollSnapType {
    styleMsScrollSnapTypeNotSet = 0,
    styleMsScrollSnapTypeNone = 1,
    styleMsScrollSnapTypeMandatory = 2,
    styleMsScrollSnapTypeProximity = 3,
    styleMsScrollSnapType_Max = 0x7fffffff
} styleMsScrollSnapType;
typedef enum _styleGridColumn {
    styleGridColumnNotSet = 0,
    styleGridColumn_Max = 0x7fffffff
} styleGridColumn;
typedef enum _styleGridColumnAlign {
    styleGridColumnAlignCenter = 0,
    styleGridColumnAlignEnd = 1,
    styleGridColumnAlignStart = 2,
    styleGridColumnAlignStretch = 3,
    styleGridColumnAlignNotSet = 4,
    styleGridColumnAlign_Max = 0x7fffffff
} styleGridColumnAlign;
typedef enum _styleGridColumnSpan {
    styleGridColumnSpanNotSet = 0,
    styleGridColumnSpan_Max = 0x7fffffff
} styleGridColumnSpan;
typedef enum _styleGridRow {
    styleGridRowNotSet = 0,
    styleGridRow_Max = 0x7fffffff
} styleGridRow;
typedef enum _styleGridRowAlign {
    styleGridRowAlignCenter = 0,
    styleGridRowAlignEnd = 1,
    styleGridRowAlignStart = 2,
    styleGridRowAlignStretch = 3,
    styleGridRowAlignNotSet = 4,
    styleGridRowAlign_Max = 0x7fffffff
} styleGridRowAlign;
typedef enum _styleGridRowSpan {
    styleGridRowSpanNotSet = 0,
    styleGridRowSpan_Max = 0x7fffffff
} styleGridRowSpan;
typedef enum _styleWrapThrough {
    styleWrapThroughNotSet = 0,
    styleWrapThroughWrap = 1,
    styleWrapThroughNone = 2,
    styleWrapThrough_Max = 0x7fffffff
} styleWrapThrough;
typedef enum _styleWrapFlow {
    styleWrapFlowNotSet = 0,
    styleWrapFlowAuto = 1,
    styleWrapFlowBoth = 2,
    styleWrapFlowStart = 3,
    styleWrapFlowEnd = 4,
    styleWrapFlowClear = 5,
    styleWrapFlowMinimum = 6,
    styleWrapFlowMaximum = 7,
    styleWrapFlow_Max = 0x7fffffff
} styleWrapFlow;
typedef enum _styleAlignmentBaseline {
    styleAlignmentBaselineNotSet = 0,
    styleAlignmentBaselineAfterEdge = 1,
    styleAlignmentBaselineAlphabetic = 2,
    styleAlignmentBaselineAuto = 3,
    styleAlignmentBaselineBaseline = 4,
    styleAlignmentBaselineBeforeEdge = 5,
    styleAlignmentBaselineCentral = 6,
    styleAlignmentBaselineHanging = 7,
    styleAlignmentBaselineMathematical = 8,
    styleAlignmentBaselineMiddle = 9,
    styleAlignmentBaselineTextAfterEdge = 10,
    styleAlignmentBaselineTextBeforeEdge = 11,
    styleAlignmentBaselineIdeographic = 12,
    styleAlignmentBaseline_Max = 0x7fffffff
} styleAlignmentBaseline;
typedef enum _styleBaselineShift {
    styleBaselineShiftBaseline = 0,
    styleBaselineShiftSub = 1,
    styleBaselineShiftSuper = 2,
    styleBaselineShift_Max = 0x7fffffff
} styleBaselineShift;
typedef enum _styleClipRule {
    styleClipRuleNotSet = 0,
    styleClipRuleNonZero = 1,
    styleClipRuleEvenOdd = 2,
    styleClipRule_Max = 0x7fffffff
} styleClipRule;
typedef enum _styleDominantBaseline {
    styleDominantBaselineNotSet = 0,
    styleDominantBaselineAlphabetic = 1,
    styleDominantBaselineAuto = 2,
    styleDominantBaselineCentral = 3,
    styleDominantBaselineHanging = 4,
    styleDominantBaselineIdeographic = 5,
    styleDominantBaselineMathematical = 6,
    styleDominantBaselineMiddle = 7,
    styleDominantBaselineNoChange = 8,
    styleDominantBaselineResetSize = 9,
    styleDominantBaselineTextAfterEdge = 10,
    styleDominantBaselineTextBeforeEdge = 11,
    styleDominantBaselineUseScript = 12,
    styleDominantBaseline_Max = 0x7fffffff
} styleDominantBaseline;
typedef enum _styleFillRule {
    styleFillRuleNotSet = 0,
    styleFillRuleNonZero = 1,
    styleFillRuleEvenOdd = 2,
    styleFillRule_Max = 0x7fffffff
} styleFillRule;
typedef enum _styleFontStretch {
    styleFontStretchNotSet = 0,
    styleFontStretchWider = 1,
    styleFontStretchNarrower = 2,
    styleFontStretchUltraCondensed = 3,
    styleFontStretchExtraCondensed = 4,
    styleFontStretchCondensed = 5,
    styleFontStretchSemiCondensed = 6,
    styleFontStretchNormal = 7,
    styleFontStretchSemiExpanded = 8,
    styleFontStretchExpanded = 9,
    styleFontStretchExtraExpanded = 10,
    styleFontStretchUltraExpanded = 11,
    styleFontStretch_Max = 0x7fffffff
} styleFontStretch;
typedef enum _stylePointerEvents {
    stylePointerEventsNotSet = 0,
    stylePointerEventsVisiblePainted = 1,
    stylePointerEventsVisibleFill = 2,
    stylePointerEventsVisibleStroke = 3,
    stylePointerEventsVisible = 4,
    stylePointerEventsPainted = 5,
    stylePointerEventsFill = 6,
    stylePointerEventsStroke = 7,
    stylePointerEventsAll = 8,
    stylePointerEventsNone = 9,
    stylePointerEvents_Max = 0x7fffffff
} stylePointerEvents;
typedef enum _styleEnableBackground {
    styleEnableBackgroundNotSet = 0,
    styleEnableBackgroundAccumulate = 1,
    styleEnableBackgroundNew = 2,
    styleEnableBackgroundInherit = 3,
    styleEnableBackground_Max = 0x7fffffff
} styleEnableBackground;
typedef enum _styleStrokeLinecap {
    styleStrokeLinecapNotSet = 0,
    styleStrokeLinecapButt = 1,
    styleStrokeLinecapRound = 2,
    styleStrokeLinecapSquare = 3,
    styleStrokeLinecap_Max = 0x7fffffff
} styleStrokeLinecap;
typedef enum _styleStrokeLinejoin {
    styleStrokeLinejoinNotSet = 0,
    styleStrokeLinejoinMiter = 1,
    styleStrokeLinejoinRound = 2,
    styleStrokeLinejoinBevel = 3,
    styleStrokeLinejoin_Max = 0x7fffffff
} styleStrokeLinejoin;
typedef enum _styleTextAnchor {
    styleTextAnchorNotSet = 0,
    styleTextAnchorStart = 1,
    styleTextAnchorMiddle = 2,
    styleTextAnchorEnd = 3,
    styleTextAnchor_Max = 0x7fffffff
} styleTextAnchor;
typedef enum _styleAttrType {
    styleAttrTypeString = 0,
    styleAttrTypeColor = 1,
    styleAttrTypeUrl = 2,
    styleAttrTypeInteger = 3,
    styleAttrTypeNumber = 4,
    styleAttrTypeLength = 5,
    styleAttrTypePx = 6,
    styleAttrTypeEm = 7,
    styleAttrTypeEx = 8,
    styleAttrTypeIn = 9,
    styleAttrTypeCm = 10,
    styleAttrTypeMm = 11,
    styleAttrTypePt = 12,
    styleAttrTypePc = 13,
    styleAttrTypeRem = 14,
    styleAttrTypeCh = 15,
    styleAttrTypeVh = 16,
    styleAttrTypeVw = 17,
    styleAttrTypeVmin = 18,
    styleAttrTypePercentage = 19,
    styleAttrTypeAngle = 20,
    styleAttrTypeDeg = 21,
    styleAttrTypeRad = 22,
    styleAttrTypeGrad = 23,
    styleAttrTypeTime = 24,
    styleAttrTypeS = 25,
    styleAttrTypeMs = 26,
    styleAttrType_Max = 0x7fffffff
} styleAttrType;
typedef enum _styleInitialColor {
    styleInitialColorNoInitial = 0,
    styleInitialColorColorProperty = 1,
    styleInitialColorTransparent = 2,
    styleInitialColorInvert = 3,
    styleInitialColor_Max = 0x7fffffff
} styleInitialColor;
typedef enum _styleInitialString {
    styleInitialStringNoInitial = 0,
    styleInitialStringNone = 1,
    styleInitialStringAuto = 2,
    styleInitialStringNormal = 3,
    styleInitialString_Max = 0x7fffffff
} styleInitialString;
typedef enum _styleTransformOriginX {
    styleTransformOriginXNotSet = 0,
    styleTransformOriginXLeft = 1,
    styleTransformOriginXCenter = 2,
    styleTransformOriginXRight = 3,
    styleTransformOriginX_Max = 0x7fffffff
} styleTransformOriginX;
typedef enum _styleTransformOriginY {
    styleTransformOriginYNotSet = 0,
    styleTransformOriginYTop = 1,
    styleTransformOriginYCenter = 2,
    styleTransformOriginYBottom = 3,
    styleTransformOriginY_Max = 0x7fffffff
} styleTransformOriginY;
typedef enum _stylePerspectiveOriginX {
    stylePerspectiveOriginXNotSet = 0,
    stylePerspectiveOriginXLeft = 1,
    stylePerspectiveOriginXCenter = 2,
    stylePerspectiveOriginXRight = 3,
    stylePerspectiveOriginX_Max = 0x7fffffff
} stylePerspectiveOriginX;
typedef enum _stylePerspectiveOriginY {
    stylePerspectiveOriginYNotSet = 0,
    stylePerspectiveOriginYTop = 1,
    stylePerspectiveOriginYCenter = 2,
    stylePerspectiveOriginYBottom = 3,
    stylePerspectiveOriginY_Max = 0x7fffffff
} stylePerspectiveOriginY;
typedef enum _styleTransformStyle {
    styleTransformStyleFlat = 0,
    styleTransformStyleNotSet = 1,
    styleTransformStyle_Max = 0x7fffffff
} styleTransformStyle;
typedef enum _styleBackfaceVisibility {
    styleBackfaceVisibilityVisible = 0,
    styleBackfaceVisibilityHidden = 1,
    styleBackfaceVisibilityNotSet = 2,
    styleBackfaceVisibility_Max = 0x7fffffff
} styleBackfaceVisibility;
typedef enum _styleTextSizeAdjust {
    styleTextSizeAdjustNone = 0,
    styleTextSizeAdjustAuto = 1,
    styleTextSizeAdjust_Max = 0x7fffffff
} styleTextSizeAdjust;
typedef enum _styleColorInterpolationFilters {
    styleColorInterpolationFiltersAuto = 0,
    styleColorInterpolationFiltersSRgb = 1,
    styleColorInterpolationFiltersLinearRgb = 2,
    styleColorInterpolationFiltersNotSet = 3,
    styleColorInterpolationFilters_Max = 0x7fffffff
} styleColorInterpolationFilters;
typedef enum _styleHyphens {
    styleHyphensNone = 0,
    styleHyphensManual = 1,
    styleHyphensAuto = 2,
    styleHyphensNotSet = 3,
    styleHyphens_Max = 0x7fffffff
} styleHyphens;
typedef enum _styleHyphenateLimitLines {
    styleHyphenateLimitLinesNoLimit = 0,
    styleHyphenateLimitLines_Max = 0x7fffffff
} styleHyphenateLimitLines;
typedef enum _styleMsAnimationPlayState {
    styleMsAnimationPlayStateRunning = 0,
    styleMsAnimationPlayStatePaused = 1,
    styleMsAnimationPlayStateNotSet = 2,
    styleMsAnimationPlayState_Max = 0x7fffffff
} styleMsAnimationPlayState;
typedef enum _styleMsAnimationDirection {
    styleMsAnimationDirectionNormal = 0,
    styleMsAnimationDirectionAlternate = 1,
    styleMsAnimationDirectionReverse = 2,
    styleMsAnimationDirectionAlternateReverse = 3,
    styleMsAnimationDirectionNotSet = 4,
    styleMsAnimationDirection_Max = 0x7fffffff
} styleMsAnimationDirection;
typedef enum _styleMsAnimationFillMode {
    styleMsAnimationFillModeNone = 0,
    styleMsAnimationFillModeForwards = 1,
    styleMsAnimationFillModeBackwards = 2,
    styleMsAnimationFillModeBoth = 3,
    styleMsAnimationFillModeNotSet = 4,
    styleMsAnimationFillMode_Max = 0x7fffffff
} styleMsAnimationFillMode;
typedef enum _styleMsHighContrastAdjust {
    styleMsHighContrastAdjustNotSet = 0,
    styleMsHighContrastAdjustAuto = 1,
    styleMsHighContrastAdjustNone = 2,
    styleMsHighContrastAdjust_Max = 0x7fffffff
} styleMsHighContrastAdjust;
typedef enum _styleMsUserSelect {
    styleMsUserSelectAuto = 0,
    styleMsUserSelectText = 1,
    styleMsUserSelectElement = 2,
    styleMsUserSelectNone = 3,
    styleMsUserSelectNotSet = 4,
    styleMsUserSelect_Max = 0x7fffffff
} styleMsUserSelect;
typedef enum _styleMsTouchAction {
    styleMsTouchActionNotSet = -1,
    styleMsTouchActionNone = 0,
    styleMsTouchActionAuto = 1,
    styleMsTouchActionManipulation = 2,
    styleMsTouchActionDoubleTapZoom = 4,
    styleMsTouchActionPanX = 8,
    styleMsTouchActionPanY = 16,
    styleMsTouchActionPinchZoom = 32,
    styleMsTouchAction_Max = 0x7fffffff
} styleMsTouchAction;
typedef enum _styleMsTouchSelect {
    styleMsTouchSelectGrippers = 0,
    styleMsTouchSelectNone = 1,
    styleMsTouchSelectNotSet = 2,
    styleMsTouchSelect_Max = 0x7fffffff
} styleMsTouchSelect;
typedef enum _styleMsScrollTranslation {
    styleMsScrollTranslationNotSet = 0,
    styleMsScrollTranslationNone = 1,
    styleMsScrollTranslationVtoH = 2,
    styleMsScrollTranslation_Max = 0x7fffffff
} styleMsScrollTranslation;
/*****************************************************************************
 * IHTMLDOMConstructor interface
 */
#ifndef __IHTMLDOMConstructor_INTERFACE_DEFINED__
#define __IHTMLDOMConstructor_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDOMConstructor, 0x3051049b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051049b-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDOMConstructor : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_constructor(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE LookupGetter(
        BSTR propname,
        VARIANT *ppDispHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE LookupSetter(
        BSTR propname,
        VARIANT *ppDispHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE DefineGetter(
        BSTR propname,
        VARIANT *pdispHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE DefineSetter(
        BSTR propname,
        VARIANT *pdispHandler) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDOMConstructor, 0x3051049b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDOMConstructorVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLDOMConstructor methods ***/
    HRESULT (STDMETHODCALLTYPE *get_constructor)(
        IHTMLDOMConstructor* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *LookupGetter)(
        IHTMLDOMConstructor* This,
        BSTR propname,
        VARIANT *ppDispHandler);

    HRESULT (STDMETHODCALLTYPE *LookupSetter)(
        IHTMLDOMConstructor* This,
        BSTR propname,
        VARIANT *ppDispHandler);

    HRESULT (STDMETHODCALLTYPE *DefineGetter)(
        IHTMLDOMConstructor* This,
        BSTR propname,
        VARIANT *pdispHandler);

    HRESULT (STDMETHODCALLTYPE *DefineSetter)(
        IHTMLDOMConstructor* This,
        BSTR propname,
        VARIANT *pdispHandler);

    END_INTERFACE
} IHTMLDOMConstructorVtbl;
interface IHTMLDOMConstructor {
    CONST_VTBL IHTMLDOMConstructorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDOMConstructor_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDOMConstructor_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDOMConstructor_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDOMConstructor_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDOMConstructor_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDOMConstructor_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDOMConstructor_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDOMConstructor methods ***/
#define IHTMLDOMConstructor_get_constructor(This,p) (This)->lpVtbl->get_constructor(This,p)
#define IHTMLDOMConstructor_LookupGetter(This,propname,ppDispHandler) (This)->lpVtbl->LookupGetter(This,propname,ppDispHandler)
#define IHTMLDOMConstructor_LookupSetter(This,propname,ppDispHandler) (This)->lpVtbl->LookupSetter(This,propname,ppDispHandler)
#define IHTMLDOMConstructor_DefineGetter(This,propname,pdispHandler) (This)->lpVtbl->DefineGetter(This,propname,pdispHandler)
#define IHTMLDOMConstructor_DefineSetter(This,propname,pdispHandler) (This)->lpVtbl->DefineSetter(This,propname,pdispHandler)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDOMConstructor_QueryInterface(IHTMLDOMConstructor* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDOMConstructor_AddRef(IHTMLDOMConstructor* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDOMConstructor_Release(IHTMLDOMConstructor* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDOMConstructor_GetTypeInfoCount(IHTMLDOMConstructor* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDOMConstructor_GetTypeInfo(IHTMLDOMConstructor* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDOMConstructor_GetIDsOfNames(IHTMLDOMConstructor* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDOMConstructor_Invoke(IHTMLDOMConstructor* 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);
}
/*** IHTMLDOMConstructor methods ***/
static FORCEINLINE HRESULT IHTMLDOMConstructor_get_constructor(IHTMLDOMConstructor* This,IDispatch **p) {
    return This->lpVtbl->get_constructor(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructor_LookupGetter(IHTMLDOMConstructor* This,BSTR propname,VARIANT *ppDispHandler) {
    return This->lpVtbl->LookupGetter(This,propname,ppDispHandler);
}
static FORCEINLINE HRESULT IHTMLDOMConstructor_LookupSetter(IHTMLDOMConstructor* This,BSTR propname,VARIANT *ppDispHandler) {
    return This->lpVtbl->LookupSetter(This,propname,ppDispHandler);
}
static FORCEINLINE HRESULT IHTMLDOMConstructor_DefineGetter(IHTMLDOMConstructor* This,BSTR propname,VARIANT *pdispHandler) {
    return This->lpVtbl->DefineGetter(This,propname,pdispHandler);
}
static FORCEINLINE HRESULT IHTMLDOMConstructor_DefineSetter(IHTMLDOMConstructor* This,BSTR propname,VARIANT *pdispHandler) {
    return This->lpVtbl->DefineSetter(This,propname,pdispHandler);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDOMConstructor_get_constructor_Proxy(
    IHTMLDOMConstructor* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructor_get_constructor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructor_LookupGetter_Proxy(
    IHTMLDOMConstructor* This,
    BSTR propname,
    VARIANT *ppDispHandler);
void __RPC_STUB IHTMLDOMConstructor_LookupGetter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructor_LookupSetter_Proxy(
    IHTMLDOMConstructor* This,
    BSTR propname,
    VARIANT *ppDispHandler);
void __RPC_STUB IHTMLDOMConstructor_LookupSetter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructor_DefineGetter_Proxy(
    IHTMLDOMConstructor* This,
    BSTR propname,
    VARIANT *pdispHandler);
void __RPC_STUB IHTMLDOMConstructor_DefineGetter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructor_DefineSetter_Proxy(
    IHTMLDOMConstructor* This,
    BSTR propname,
    VARIANT *pdispHandler);
void __RPC_STUB IHTMLDOMConstructor_DefineSetter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDOMConstructor_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLCSSStyleDeclaration interface
 */
#ifndef __IHTMLCSSStyleDeclaration_INTERFACE_DEFINED__
#define __IHTMLCSSStyleDeclaration_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLCSSStyleDeclaration, 0x30510740, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510740-98b5-11cf-bb82-00aa00bdce0b")
IHTMLCSSStyleDeclaration : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_parentRule(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE getPropertyValue(
        BSTR bstrPropertyName,
        BSTR *pbstrPropertyValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE getPropertyPriority(
        BSTR bstrPropertyName,
        BSTR *pbstrPropertyPriority) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeProperty(
        BSTR bstrPropertyName,
        BSTR *pbstrPropertyValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE setProperty(
        BSTR bstrPropertyName,
        VARIANT *pvarPropertyValue,
        VARIANT *pvarPropertyPriority = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE item(
        LONG index,
        BSTR *pbstrPropertyName) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_fontFamily(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fontFamily(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_fontStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fontStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_fontVariant(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fontVariant(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_fontWeight(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fontWeight(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_fontSize(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fontSize(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_font(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_font(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_color(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_color(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_background(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_background(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_backgroundColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_backgroundImage(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundImage(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_backgroundRepeat(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundRepeat(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_backgroundAttachment(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundAttachment(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_backgroundPosition(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundPosition(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_backgroundPositionX(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundPositionX(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_backgroundPositionY(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundPositionY(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_wordSpacing(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_wordSpacing(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_letterSpacing(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_letterSpacing(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textDecoration(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textDecoration(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_verticalAlign(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_verticalAlign(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textTransform(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textTransform(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textAlign(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textAlign(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textIndent(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textIndent(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_lineHeight(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_lineHeight(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_marginTop(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_marginTop(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_marginRight(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_marginRight(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_marginBottom(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_marginBottom(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_marginLeft(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_marginLeft(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_margin(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_margin(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_paddingTop(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_paddingTop(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_paddingRight(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_paddingRight(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_paddingBottom(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_paddingBottom(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_paddingLeft(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_paddingLeft(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_padding(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_padding(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_border(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_border(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderTop(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderTop(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderRight(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderRight(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderBottom(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderBottom(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderLeft(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderLeft(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderColor(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderColor(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderTopColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderTopColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderRightColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderRightColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderBottomColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderBottomColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderLeftColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderLeftColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderWidth(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderWidth(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderTopWidth(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderTopWidth(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderRightWidth(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderRightWidth(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderBottomWidth(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderBottomWidth(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderLeftWidth(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderLeftWidth(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderTopStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderTopStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderRightStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderRightStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderBottomStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderBottomStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderLeftStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderLeftStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_width(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_width(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_height(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_height(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_styleFloat(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_styleFloat(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_clear(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clear(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_display(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_display(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_visibility(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_visibility(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_listStyleType(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_listStyleType(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_listStylePosition(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_listStylePosition(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_listStyleImage(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_listStyleImage(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_listStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_listStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_whiteSpace(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_whiteSpace(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_top(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_top(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_left(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_left(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_zIndex(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_zIndex(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_overflow(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_overflow(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_pageBreakBefore(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pageBreakBefore(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_pageBreakAfter(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pageBreakAfter(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_cssText(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cssText(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_cursor(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cursor(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_clip(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clip(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_filter(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_filter(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_tableLayout(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_tableLayout(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderCollapse(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderCollapse(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_direction(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_direction(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_behavior(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_behavior(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_position(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_position(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_unicodeBidi(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_unicodeBidi(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_bottom(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_bottom(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_right(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_right(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_imeMode(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_imeMode(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_rubyAlign(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_rubyAlign(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_rubyPosition(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_rubyPosition(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_rubyOverhang(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_rubyOverhang(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_layoutGridChar(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_layoutGridChar(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_layoutGridLine(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_layoutGridLine(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_layoutGridMode(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_layoutGridMode(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_layoutGridType(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_layoutGridType(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_layoutGrid(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_layoutGrid(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textAutospace(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textAutospace(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_wordBreak(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_wordBreak(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_lineBreak(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_lineBreak(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textJustify(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textJustify(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textJustifyTrim(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textJustifyTrim(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textKashida(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textKashida(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_overflowX(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_overflowX(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_overflowY(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_overflowY(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_accelerator(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_accelerator(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_layoutFlow(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_layoutFlow(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_zoom(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_zoom(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_wordWrap(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_wordWrap(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textUnderlinePosition(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textUnderlinePosition(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollbarBaseColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbarBaseColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollbarFaceColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbarFaceColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollbar3dLightColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbar3dLightColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollbarShadowColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbarShadowColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollbarHighlightColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbarHighlightColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollbarDarkShadowColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbarDarkShadowColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollbarArrowColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbarArrowColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollbarTrackColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbarTrackColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_writingMode(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_writingMode(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textAlignLast(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textAlignLast(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textKashidaSpace(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textKashidaSpace(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textOverflow(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textOverflow(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_minHeight(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_minHeight(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msInterpolationMode(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msInterpolationMode(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_maxHeight(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_maxHeight(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_minWidth(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_minWidth(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_maxWidth(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_maxWidth(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_content(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_content(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_captionSide(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_captionSide(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_counterIncrement(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_counterIncrement(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_counterReset(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_counterReset(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_outline(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_outline(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_outlineWidth(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_outlineWidth(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_outlineStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_outlineStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_outlineColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_outlineColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_boxSizing(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_boxSizing(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderSpacing(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderSpacing(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_orphans(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_orphans(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_widows(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_widows(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_pageBreakInside(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pageBreakInside(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_emptyCells(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_emptyCells(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msBlockProgression(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msBlockProgression(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_quotes(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_quotes(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_alignmentBaseline(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_alignmentBaseline(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_baselineShift(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_baselineShift(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_dominantBaseline(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_dominantBaseline(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_fontSizeAdjust(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fontSizeAdjust(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_fontStretch(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fontStretch(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_opacity(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_opacity(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_clipPath(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clipPath(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_clipRule(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clipRule(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_fill(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fill(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_fillOpacity(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fillOpacity(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_fillRule(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fillRule(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_kerning(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_kerning(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_marker(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_marker(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_markerEnd(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_markerEnd(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_markerMid(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_markerMid(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_markerStart(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_markerStart(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_mask(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_mask(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_pointerEvents(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pointerEvents(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_stopColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_stopColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_stopOpacity(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_stopOpacity(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_stroke(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_stroke(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_strokeDasharray(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_strokeDasharray(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_strokeDashoffset(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_strokeDashoffset(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_strokeLinecap(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_strokeLinecap(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_strokeLinejoin(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_strokeLinejoin(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_strokeMiterlimit(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_strokeMiterlimit(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_strokeOpacity(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_strokeOpacity(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_strokeWidth(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_strokeWidth(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textAnchor(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textAnchor(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_glyphOrientationHorizontal(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_glyphOrientationHorizontal(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_glyphOrientationVertical(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_glyphOrientationVertical(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderRadius(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderRadius(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderTopLeftRadius(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderTopLeftRadius(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderTopRightRadius(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderTopRightRadius(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderBottomRightRadius(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderBottomRightRadius(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderBottomLeftRadius(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderBottomLeftRadius(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_clipTop(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clipTop(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_clipRight(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clipRight(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clipBottom(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_clipLeft(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clipLeft(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_cssFloat(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cssFloat(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_backgroundClip(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundClip(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_backgroundOrigin(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundOrigin(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_backgroundSize(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundSize(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_boxShadow(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_boxShadow(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msTransform(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msTransform(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msTransformOrigin(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msTransformOrigin(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLCSSStyleDeclaration, 0x30510740, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLCSSStyleDeclarationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLCSSStyleDeclaration methods ***/
    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLCSSStyleDeclaration* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_parentRule)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *getPropertyValue)(
        IHTMLCSSStyleDeclaration* This,
        BSTR bstrPropertyName,
        BSTR *pbstrPropertyValue);

    HRESULT (STDMETHODCALLTYPE *getPropertyPriority)(
        IHTMLCSSStyleDeclaration* This,
        BSTR bstrPropertyName,
        BSTR *pbstrPropertyPriority);

    HRESULT (STDMETHODCALLTYPE *removeProperty)(
        IHTMLCSSStyleDeclaration* This,
        BSTR bstrPropertyName,
        BSTR *pbstrPropertyValue);

    HRESULT (STDMETHODCALLTYPE *setProperty)(
        IHTMLCSSStyleDeclaration* This,
        BSTR bstrPropertyName,
        VARIANT *pvarPropertyValue,
        VARIANT *pvarPropertyPriority);

    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLCSSStyleDeclaration* This,
        LONG index,
        BSTR *pbstrPropertyName);

    HRESULT (STDMETHODCALLTYPE *put_fontFamily)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_fontFamily)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_fontStyle)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_fontStyle)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_fontVariant)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_fontVariant)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_fontWeight)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_fontWeight)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_fontSize)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_fontSize)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_font)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_font)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_color)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_color)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_background)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_background)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_backgroundColor)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_backgroundColor)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_backgroundImage)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_backgroundImage)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_backgroundRepeat)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_backgroundRepeat)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_backgroundAttachment)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_backgroundAttachment)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_backgroundPosition)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_backgroundPosition)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_backgroundPositionX)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_backgroundPositionX)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_backgroundPositionY)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_backgroundPositionY)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_wordSpacing)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_wordSpacing)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_letterSpacing)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_letterSpacing)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_textDecoration)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textDecoration)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_verticalAlign)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_verticalAlign)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_textTransform)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textTransform)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textAlign)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textAlign)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textIndent)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_textIndent)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_lineHeight)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_lineHeight)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_marginTop)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_marginTop)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_marginRight)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_marginRight)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_marginBottom)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_marginBottom)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_marginLeft)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_marginLeft)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_margin)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_margin)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_paddingTop)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_paddingTop)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_paddingRight)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_paddingRight)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_paddingBottom)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_paddingBottom)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_paddingLeft)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_paddingLeft)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_padding)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_padding)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_border)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_border)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderTop)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderTop)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderRight)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderRight)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderBottom)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderBottom)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderLeft)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderLeft)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderColor)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderColor)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderTopColor)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderTopColor)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderRightColor)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderRightColor)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderBottomColor)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderBottomColor)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderLeftColor)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderLeftColor)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderWidth)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderWidth)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderTopWidth)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderTopWidth)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderRightWidth)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderRightWidth)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderBottomWidth)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderBottomWidth)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderLeftWidth)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderLeftWidth)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderStyle)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderStyle)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderTopStyle)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderTopStyle)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderRightStyle)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderRightStyle)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderBottomStyle)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderBottomStyle)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderLeftStyle)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderLeftStyle)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_width)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_width)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_height)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_height)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_styleFloat)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_styleFloat)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_clear)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_clear)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_display)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_display)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_visibility)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_visibility)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_listStyleType)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_listStyleType)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_listStylePosition)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_listStylePosition)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_listStyleImage)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_listStyleImage)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_listStyle)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_listStyle)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_whiteSpace)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_whiteSpace)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_top)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_top)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_left)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_left)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_zIndex)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_zIndex)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_overflow)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_overflow)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_pageBreakBefore)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_pageBreakBefore)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_pageBreakAfter)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_pageBreakAfter)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_cssText)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_cssText)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_cursor)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_cursor)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_clip)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_clip)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_filter)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_filter)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_tableLayout)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_tableLayout)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderCollapse)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderCollapse)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_direction)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_direction)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_behavior)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_behavior)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_position)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_position)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_unicodeBidi)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_unicodeBidi)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_bottom)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_bottom)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_right)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_right)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_imeMode)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_imeMode)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_rubyAlign)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_rubyAlign)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_rubyPosition)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_rubyPosition)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_rubyOverhang)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_rubyOverhang)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_layoutGridChar)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_layoutGridChar)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_layoutGridLine)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_layoutGridLine)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_layoutGridMode)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_layoutGridMode)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_layoutGridType)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_layoutGridType)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_layoutGrid)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_layoutGrid)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textAutospace)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textAutospace)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_wordBreak)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_wordBreak)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_lineBreak)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_lineBreak)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textJustify)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textJustify)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textJustifyTrim)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textJustifyTrim)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textKashida)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_textKashida)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_overflowX)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_overflowX)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_overflowY)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_overflowY)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_accelerator)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_accelerator)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_layoutFlow)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_layoutFlow)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_zoom)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_zoom)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_wordWrap)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_wordWrap)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textUnderlinePosition)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textUnderlinePosition)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollbarBaseColor)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_scrollbarBaseColor)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollbarFaceColor)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_scrollbarFaceColor)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollbar3dLightColor)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_scrollbar3dLightColor)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollbarShadowColor)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_scrollbarShadowColor)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollbarHighlightColor)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_scrollbarHighlightColor)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollbarDarkShadowColor)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_scrollbarDarkShadowColor)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollbarArrowColor)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_scrollbarArrowColor)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollbarTrackColor)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_scrollbarTrackColor)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_writingMode)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_writingMode)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textAlignLast)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textAlignLast)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textKashidaSpace)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_textKashidaSpace)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_textOverflow)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textOverflow)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_minHeight)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_minHeight)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_msInterpolationMode)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msInterpolationMode)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_maxHeight)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_maxHeight)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_minWidth)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_minWidth)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_maxWidth)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_maxWidth)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_content)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_content)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_captionSide)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_captionSide)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_counterIncrement)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_counterIncrement)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_counterReset)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_counterReset)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_outline)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_outline)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_outlineWidth)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_outlineWidth)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_outlineStyle)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_outlineStyle)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_outlineColor)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_outlineColor)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_boxSizing)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_boxSizing)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderSpacing)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderSpacing)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_orphans)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_orphans)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_widows)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_widows)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_pageBreakInside)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_pageBreakInside)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_emptyCells)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_emptyCells)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msBlockProgression)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msBlockProgression)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_quotes)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_quotes)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_alignmentBaseline)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_alignmentBaseline)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_baselineShift)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_baselineShift)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_dominantBaseline)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_dominantBaseline)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_fontSizeAdjust)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_fontSizeAdjust)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_fontStretch)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_fontStretch)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_opacity)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_opacity)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_clipPath)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_clipPath)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_clipRule)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_clipRule)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_fill)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_fill)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_fillOpacity)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_fillOpacity)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_fillRule)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_fillRule)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_kerning)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_kerning)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_marker)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_marker)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_markerEnd)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_markerEnd)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_markerMid)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_markerMid)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_markerStart)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_markerStart)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_mask)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_mask)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_pointerEvents)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_pointerEvents)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_stopColor)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_stopColor)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_stopOpacity)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_stopOpacity)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_stroke)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_stroke)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_strokeDasharray)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_strokeDasharray)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_strokeDashoffset)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_strokeDashoffset)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_strokeLinecap)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_strokeLinecap)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_strokeLinejoin)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_strokeLinejoin)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_strokeMiterlimit)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_strokeMiterlimit)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_strokeOpacity)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_strokeOpacity)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_strokeWidth)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_strokeWidth)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_textAnchor)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textAnchor)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_glyphOrientationHorizontal)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_glyphOrientationHorizontal)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_glyphOrientationVertical)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_glyphOrientationVertical)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderRadius)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderRadius)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderTopLeftRadius)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderTopLeftRadius)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderTopRightRadius)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderTopRightRadius)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderBottomRightRadius)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderBottomRightRadius)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderBottomLeftRadius)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderBottomLeftRadius)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_clipTop)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_clipTop)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_clipRight)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_clipRight)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_clipBottom)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_clipLeft)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_clipLeft)(
        IHTMLCSSStyleDeclaration* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_cssFloat)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_cssFloat)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_backgroundClip)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_backgroundClip)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_backgroundOrigin)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_backgroundOrigin)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_backgroundSize)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_backgroundSize)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_boxShadow)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_boxShadow)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msTransform)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msTransform)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msTransformOrigin)(
        IHTMLCSSStyleDeclaration* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msTransformOrigin)(
        IHTMLCSSStyleDeclaration* This,
        BSTR *p);

    END_INTERFACE
} IHTMLCSSStyleDeclarationVtbl;
interface IHTMLCSSStyleDeclaration {
    CONST_VTBL IHTMLCSSStyleDeclarationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLCSSStyleDeclaration_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLCSSStyleDeclaration_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLCSSStyleDeclaration_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLCSSStyleDeclaration_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLCSSStyleDeclaration_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLCSSStyleDeclaration_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLCSSStyleDeclaration_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLCSSStyleDeclaration methods ***/
#define IHTMLCSSStyleDeclaration_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLCSSStyleDeclaration_get_parentRule(This,p) (This)->lpVtbl->get_parentRule(This,p)
#define IHTMLCSSStyleDeclaration_getPropertyValue(This,bstrPropertyName,pbstrPropertyValue) (This)->lpVtbl->getPropertyValue(This,bstrPropertyName,pbstrPropertyValue)
#define IHTMLCSSStyleDeclaration_getPropertyPriority(This,bstrPropertyName,pbstrPropertyPriority) (This)->lpVtbl->getPropertyPriority(This,bstrPropertyName,pbstrPropertyPriority)
#define IHTMLCSSStyleDeclaration_removeProperty(This,bstrPropertyName,pbstrPropertyValue) (This)->lpVtbl->removeProperty(This,bstrPropertyName,pbstrPropertyValue)
#define IHTMLCSSStyleDeclaration_setProperty(This,bstrPropertyName,pvarPropertyValue,pvarPropertyPriority) (This)->lpVtbl->setProperty(This,bstrPropertyName,pvarPropertyValue,pvarPropertyPriority)
#define IHTMLCSSStyleDeclaration_item(This,index,pbstrPropertyName) (This)->lpVtbl->item(This,index,pbstrPropertyName)
#define IHTMLCSSStyleDeclaration_put_fontFamily(This,v) (This)->lpVtbl->put_fontFamily(This,v)
#define IHTMLCSSStyleDeclaration_get_fontFamily(This,p) (This)->lpVtbl->get_fontFamily(This,p)
#define IHTMLCSSStyleDeclaration_put_fontStyle(This,v) (This)->lpVtbl->put_fontStyle(This,v)
#define IHTMLCSSStyleDeclaration_get_fontStyle(This,p) (This)->lpVtbl->get_fontStyle(This,p)
#define IHTMLCSSStyleDeclaration_put_fontVariant(This,v) (This)->lpVtbl->put_fontVariant(This,v)
#define IHTMLCSSStyleDeclaration_get_fontVariant(This,p) (This)->lpVtbl->get_fontVariant(This,p)
#define IHTMLCSSStyleDeclaration_put_fontWeight(This,v) (This)->lpVtbl->put_fontWeight(This,v)
#define IHTMLCSSStyleDeclaration_get_fontWeight(This,p) (This)->lpVtbl->get_fontWeight(This,p)
#define IHTMLCSSStyleDeclaration_put_fontSize(This,v) (This)->lpVtbl->put_fontSize(This,v)
#define IHTMLCSSStyleDeclaration_get_fontSize(This,p) (This)->lpVtbl->get_fontSize(This,p)
#define IHTMLCSSStyleDeclaration_put_font(This,v) (This)->lpVtbl->put_font(This,v)
#define IHTMLCSSStyleDeclaration_get_font(This,p) (This)->lpVtbl->get_font(This,p)
#define IHTMLCSSStyleDeclaration_put_color(This,v) (This)->lpVtbl->put_color(This,v)
#define IHTMLCSSStyleDeclaration_get_color(This,p) (This)->lpVtbl->get_color(This,p)
#define IHTMLCSSStyleDeclaration_put_background(This,v) (This)->lpVtbl->put_background(This,v)
#define IHTMLCSSStyleDeclaration_get_background(This,p) (This)->lpVtbl->get_background(This,p)
#define IHTMLCSSStyleDeclaration_put_backgroundColor(This,v) (This)->lpVtbl->put_backgroundColor(This,v)
#define IHTMLCSSStyleDeclaration_get_backgroundColor(This,p) (This)->lpVtbl->get_backgroundColor(This,p)
#define IHTMLCSSStyleDeclaration_put_backgroundImage(This,v) (This)->lpVtbl->put_backgroundImage(This,v)
#define IHTMLCSSStyleDeclaration_get_backgroundImage(This,p) (This)->lpVtbl->get_backgroundImage(This,p)
#define IHTMLCSSStyleDeclaration_put_backgroundRepeat(This,v) (This)->lpVtbl->put_backgroundRepeat(This,v)
#define IHTMLCSSStyleDeclaration_get_backgroundRepeat(This,p) (This)->lpVtbl->get_backgroundRepeat(This,p)
#define IHTMLCSSStyleDeclaration_put_backgroundAttachment(This,v) (This)->lpVtbl->put_backgroundAttachment(This,v)
#define IHTMLCSSStyleDeclaration_get_backgroundAttachment(This,p) (This)->lpVtbl->get_backgroundAttachment(This,p)
#define IHTMLCSSStyleDeclaration_put_backgroundPosition(This,v) (This)->lpVtbl->put_backgroundPosition(This,v)
#define IHTMLCSSStyleDeclaration_get_backgroundPosition(This,p) (This)->lpVtbl->get_backgroundPosition(This,p)
#define IHTMLCSSStyleDeclaration_put_backgroundPositionX(This,v) (This)->lpVtbl->put_backgroundPositionX(This,v)
#define IHTMLCSSStyleDeclaration_get_backgroundPositionX(This,p) (This)->lpVtbl->get_backgroundPositionX(This,p)
#define IHTMLCSSStyleDeclaration_put_backgroundPositionY(This,v) (This)->lpVtbl->put_backgroundPositionY(This,v)
#define IHTMLCSSStyleDeclaration_get_backgroundPositionY(This,p) (This)->lpVtbl->get_backgroundPositionY(This,p)
#define IHTMLCSSStyleDeclaration_put_wordSpacing(This,v) (This)->lpVtbl->put_wordSpacing(This,v)
#define IHTMLCSSStyleDeclaration_get_wordSpacing(This,p) (This)->lpVtbl->get_wordSpacing(This,p)
#define IHTMLCSSStyleDeclaration_put_letterSpacing(This,v) (This)->lpVtbl->put_letterSpacing(This,v)
#define IHTMLCSSStyleDeclaration_get_letterSpacing(This,p) (This)->lpVtbl->get_letterSpacing(This,p)
#define IHTMLCSSStyleDeclaration_put_textDecoration(This,v) (This)->lpVtbl->put_textDecoration(This,v)
#define IHTMLCSSStyleDeclaration_get_textDecoration(This,p) (This)->lpVtbl->get_textDecoration(This,p)
#define IHTMLCSSStyleDeclaration_put_verticalAlign(This,v) (This)->lpVtbl->put_verticalAlign(This,v)
#define IHTMLCSSStyleDeclaration_get_verticalAlign(This,p) (This)->lpVtbl->get_verticalAlign(This,p)
#define IHTMLCSSStyleDeclaration_put_textTransform(This,v) (This)->lpVtbl->put_textTransform(This,v)
#define IHTMLCSSStyleDeclaration_get_textTransform(This,p) (This)->lpVtbl->get_textTransform(This,p)
#define IHTMLCSSStyleDeclaration_put_textAlign(This,v) (This)->lpVtbl->put_textAlign(This,v)
#define IHTMLCSSStyleDeclaration_get_textAlign(This,p) (This)->lpVtbl->get_textAlign(This,p)
#define IHTMLCSSStyleDeclaration_put_textIndent(This,v) (This)->lpVtbl->put_textIndent(This,v)
#define IHTMLCSSStyleDeclaration_get_textIndent(This,p) (This)->lpVtbl->get_textIndent(This,p)
#define IHTMLCSSStyleDeclaration_put_lineHeight(This,v) (This)->lpVtbl->put_lineHeight(This,v)
#define IHTMLCSSStyleDeclaration_get_lineHeight(This,p) (This)->lpVtbl->get_lineHeight(This,p)
#define IHTMLCSSStyleDeclaration_put_marginTop(This,v) (This)->lpVtbl->put_marginTop(This,v)
#define IHTMLCSSStyleDeclaration_get_marginTop(This,p) (This)->lpVtbl->get_marginTop(This,p)
#define IHTMLCSSStyleDeclaration_put_marginRight(This,v) (This)->lpVtbl->put_marginRight(This,v)
#define IHTMLCSSStyleDeclaration_get_marginRight(This,p) (This)->lpVtbl->get_marginRight(This,p)
#define IHTMLCSSStyleDeclaration_put_marginBottom(This,v) (This)->lpVtbl->put_marginBottom(This,v)
#define IHTMLCSSStyleDeclaration_get_marginBottom(This,p) (This)->lpVtbl->get_marginBottom(This,p)
#define IHTMLCSSStyleDeclaration_put_marginLeft(This,v) (This)->lpVtbl->put_marginLeft(This,v)
#define IHTMLCSSStyleDeclaration_get_marginLeft(This,p) (This)->lpVtbl->get_marginLeft(This,p)
#define IHTMLCSSStyleDeclaration_put_margin(This,v) (This)->lpVtbl->put_margin(This,v)
#define IHTMLCSSStyleDeclaration_get_margin(This,p) (This)->lpVtbl->get_margin(This,p)
#define IHTMLCSSStyleDeclaration_put_paddingTop(This,v) (This)->lpVtbl->put_paddingTop(This,v)
#define IHTMLCSSStyleDeclaration_get_paddingTop(This,p) (This)->lpVtbl->get_paddingTop(This,p)
#define IHTMLCSSStyleDeclaration_put_paddingRight(This,v) (This)->lpVtbl->put_paddingRight(This,v)
#define IHTMLCSSStyleDeclaration_get_paddingRight(This,p) (This)->lpVtbl->get_paddingRight(This,p)
#define IHTMLCSSStyleDeclaration_put_paddingBottom(This,v) (This)->lpVtbl->put_paddingBottom(This,v)
#define IHTMLCSSStyleDeclaration_get_paddingBottom(This,p) (This)->lpVtbl->get_paddingBottom(This,p)
#define IHTMLCSSStyleDeclaration_put_paddingLeft(This,v) (This)->lpVtbl->put_paddingLeft(This,v)
#define IHTMLCSSStyleDeclaration_get_paddingLeft(This,p) (This)->lpVtbl->get_paddingLeft(This,p)
#define IHTMLCSSStyleDeclaration_put_padding(This,v) (This)->lpVtbl->put_padding(This,v)
#define IHTMLCSSStyleDeclaration_get_padding(This,p) (This)->lpVtbl->get_padding(This,p)
#define IHTMLCSSStyleDeclaration_put_border(This,v) (This)->lpVtbl->put_border(This,v)
#define IHTMLCSSStyleDeclaration_get_border(This,p) (This)->lpVtbl->get_border(This,p)
#define IHTMLCSSStyleDeclaration_put_borderTop(This,v) (This)->lpVtbl->put_borderTop(This,v)
#define IHTMLCSSStyleDeclaration_get_borderTop(This,p) (This)->lpVtbl->get_borderTop(This,p)
#define IHTMLCSSStyleDeclaration_put_borderRight(This,v) (This)->lpVtbl->put_borderRight(This,v)
#define IHTMLCSSStyleDeclaration_get_borderRight(This,p) (This)->lpVtbl->get_borderRight(This,p)
#define IHTMLCSSStyleDeclaration_put_borderBottom(This,v) (This)->lpVtbl->put_borderBottom(This,v)
#define IHTMLCSSStyleDeclaration_get_borderBottom(This,p) (This)->lpVtbl->get_borderBottom(This,p)
#define IHTMLCSSStyleDeclaration_put_borderLeft(This,v) (This)->lpVtbl->put_borderLeft(This,v)
#define IHTMLCSSStyleDeclaration_get_borderLeft(This,p) (This)->lpVtbl->get_borderLeft(This,p)
#define IHTMLCSSStyleDeclaration_put_borderColor(This,v) (This)->lpVtbl->put_borderColor(This,v)
#define IHTMLCSSStyleDeclaration_get_borderColor(This,p) (This)->lpVtbl->get_borderColor(This,p)
#define IHTMLCSSStyleDeclaration_put_borderTopColor(This,v) (This)->lpVtbl->put_borderTopColor(This,v)
#define IHTMLCSSStyleDeclaration_get_borderTopColor(This,p) (This)->lpVtbl->get_borderTopColor(This,p)
#define IHTMLCSSStyleDeclaration_put_borderRightColor(This,v) (This)->lpVtbl->put_borderRightColor(This,v)
#define IHTMLCSSStyleDeclaration_get_borderRightColor(This,p) (This)->lpVtbl->get_borderRightColor(This,p)
#define IHTMLCSSStyleDeclaration_put_borderBottomColor(This,v) (This)->lpVtbl->put_borderBottomColor(This,v)
#define IHTMLCSSStyleDeclaration_get_borderBottomColor(This,p) (This)->lpVtbl->get_borderBottomColor(This,p)
#define IHTMLCSSStyleDeclaration_put_borderLeftColor(This,v) (This)->lpVtbl->put_borderLeftColor(This,v)
#define IHTMLCSSStyleDeclaration_get_borderLeftColor(This,p) (This)->lpVtbl->get_borderLeftColor(This,p)
#define IHTMLCSSStyleDeclaration_put_borderWidth(This,v) (This)->lpVtbl->put_borderWidth(This,v)
#define IHTMLCSSStyleDeclaration_get_borderWidth(This,p) (This)->lpVtbl->get_borderWidth(This,p)
#define IHTMLCSSStyleDeclaration_put_borderTopWidth(This,v) (This)->lpVtbl->put_borderTopWidth(This,v)
#define IHTMLCSSStyleDeclaration_get_borderTopWidth(This,p) (This)->lpVtbl->get_borderTopWidth(This,p)
#define IHTMLCSSStyleDeclaration_put_borderRightWidth(This,v) (This)->lpVtbl->put_borderRightWidth(This,v)
#define IHTMLCSSStyleDeclaration_get_borderRightWidth(This,p) (This)->lpVtbl->get_borderRightWidth(This,p)
#define IHTMLCSSStyleDeclaration_put_borderBottomWidth(This,v) (This)->lpVtbl->put_borderBottomWidth(This,v)
#define IHTMLCSSStyleDeclaration_get_borderBottomWidth(This,p) (This)->lpVtbl->get_borderBottomWidth(This,p)
#define IHTMLCSSStyleDeclaration_put_borderLeftWidth(This,v) (This)->lpVtbl->put_borderLeftWidth(This,v)
#define IHTMLCSSStyleDeclaration_get_borderLeftWidth(This,p) (This)->lpVtbl->get_borderLeftWidth(This,p)
#define IHTMLCSSStyleDeclaration_put_borderStyle(This,v) (This)->lpVtbl->put_borderStyle(This,v)
#define IHTMLCSSStyleDeclaration_get_borderStyle(This,p) (This)->lpVtbl->get_borderStyle(This,p)
#define IHTMLCSSStyleDeclaration_put_borderTopStyle(This,v) (This)->lpVtbl->put_borderTopStyle(This,v)
#define IHTMLCSSStyleDeclaration_get_borderTopStyle(This,p) (This)->lpVtbl->get_borderTopStyle(This,p)
#define IHTMLCSSStyleDeclaration_put_borderRightStyle(This,v) (This)->lpVtbl->put_borderRightStyle(This,v)
#define IHTMLCSSStyleDeclaration_get_borderRightStyle(This,p) (This)->lpVtbl->get_borderRightStyle(This,p)
#define IHTMLCSSStyleDeclaration_put_borderBottomStyle(This,v) (This)->lpVtbl->put_borderBottomStyle(This,v)
#define IHTMLCSSStyleDeclaration_get_borderBottomStyle(This,p) (This)->lpVtbl->get_borderBottomStyle(This,p)
#define IHTMLCSSStyleDeclaration_put_borderLeftStyle(This,v) (This)->lpVtbl->put_borderLeftStyle(This,v)
#define IHTMLCSSStyleDeclaration_get_borderLeftStyle(This,p) (This)->lpVtbl->get_borderLeftStyle(This,p)
#define IHTMLCSSStyleDeclaration_put_width(This,v) (This)->lpVtbl->put_width(This,v)
#define IHTMLCSSStyleDeclaration_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#define IHTMLCSSStyleDeclaration_put_height(This,v) (This)->lpVtbl->put_height(This,v)
#define IHTMLCSSStyleDeclaration_get_height(This,p) (This)->lpVtbl->get_height(This,p)
#define IHTMLCSSStyleDeclaration_put_styleFloat(This,v) (This)->lpVtbl->put_styleFloat(This,v)
#define IHTMLCSSStyleDeclaration_get_styleFloat(This,p) (This)->lpVtbl->get_styleFloat(This,p)
#define IHTMLCSSStyleDeclaration_put_clear(This,v) (This)->lpVtbl->put_clear(This,v)
#define IHTMLCSSStyleDeclaration_get_clear(This,p) (This)->lpVtbl->get_clear(This,p)
#define IHTMLCSSStyleDeclaration_put_display(This,v) (This)->lpVtbl->put_display(This,v)
#define IHTMLCSSStyleDeclaration_get_display(This,p) (This)->lpVtbl->get_display(This,p)
#define IHTMLCSSStyleDeclaration_put_visibility(This,v) (This)->lpVtbl->put_visibility(This,v)
#define IHTMLCSSStyleDeclaration_get_visibility(This,p) (This)->lpVtbl->get_visibility(This,p)
#define IHTMLCSSStyleDeclaration_put_listStyleType(This,v) (This)->lpVtbl->put_listStyleType(This,v)
#define IHTMLCSSStyleDeclaration_get_listStyleType(This,p) (This)->lpVtbl->get_listStyleType(This,p)
#define IHTMLCSSStyleDeclaration_put_listStylePosition(This,v) (This)->lpVtbl->put_listStylePosition(This,v)
#define IHTMLCSSStyleDeclaration_get_listStylePosition(This,p) (This)->lpVtbl->get_listStylePosition(This,p)
#define IHTMLCSSStyleDeclaration_put_listStyleImage(This,v) (This)->lpVtbl->put_listStyleImage(This,v)
#define IHTMLCSSStyleDeclaration_get_listStyleImage(This,p) (This)->lpVtbl->get_listStyleImage(This,p)
#define IHTMLCSSStyleDeclaration_put_listStyle(This,v) (This)->lpVtbl->put_listStyle(This,v)
#define IHTMLCSSStyleDeclaration_get_listStyle(This,p) (This)->lpVtbl->get_listStyle(This,p)
#define IHTMLCSSStyleDeclaration_put_whiteSpace(This,v) (This)->lpVtbl->put_whiteSpace(This,v)
#define IHTMLCSSStyleDeclaration_get_whiteSpace(This,p) (This)->lpVtbl->get_whiteSpace(This,p)
#define IHTMLCSSStyleDeclaration_put_top(This,v) (This)->lpVtbl->put_top(This,v)
#define IHTMLCSSStyleDeclaration_get_top(This,p) (This)->lpVtbl->get_top(This,p)
#define IHTMLCSSStyleDeclaration_put_left(This,v) (This)->lpVtbl->put_left(This,v)
#define IHTMLCSSStyleDeclaration_get_left(This,p) (This)->lpVtbl->get_left(This,p)
#define IHTMLCSSStyleDeclaration_put_zIndex(This,v) (This)->lpVtbl->put_zIndex(This,v)
#define IHTMLCSSStyleDeclaration_get_zIndex(This,p) (This)->lpVtbl->get_zIndex(This,p)
#define IHTMLCSSStyleDeclaration_put_overflow(This,v) (This)->lpVtbl->put_overflow(This,v)
#define IHTMLCSSStyleDeclaration_get_overflow(This,p) (This)->lpVtbl->get_overflow(This,p)
#define IHTMLCSSStyleDeclaration_put_pageBreakBefore(This,v) (This)->lpVtbl->put_pageBreakBefore(This,v)
#define IHTMLCSSStyleDeclaration_get_pageBreakBefore(This,p) (This)->lpVtbl->get_pageBreakBefore(This,p)
#define IHTMLCSSStyleDeclaration_put_pageBreakAfter(This,v) (This)->lpVtbl->put_pageBreakAfter(This,v)
#define IHTMLCSSStyleDeclaration_get_pageBreakAfter(This,p) (This)->lpVtbl->get_pageBreakAfter(This,p)
#define IHTMLCSSStyleDeclaration_put_cssText(This,v) (This)->lpVtbl->put_cssText(This,v)
#define IHTMLCSSStyleDeclaration_get_cssText(This,p) (This)->lpVtbl->get_cssText(This,p)
#define IHTMLCSSStyleDeclaration_put_cursor(This,v) (This)->lpVtbl->put_cursor(This,v)
#define IHTMLCSSStyleDeclaration_get_cursor(This,p) (This)->lpVtbl->get_cursor(This,p)
#define IHTMLCSSStyleDeclaration_put_clip(This,v) (This)->lpVtbl->put_clip(This,v)
#define IHTMLCSSStyleDeclaration_get_clip(This,p) (This)->lpVtbl->get_clip(This,p)
#define IHTMLCSSStyleDeclaration_put_filter(This,v) (This)->lpVtbl->put_filter(This,v)
#define IHTMLCSSStyleDeclaration_get_filter(This,p) (This)->lpVtbl->get_filter(This,p)
#define IHTMLCSSStyleDeclaration_put_tableLayout(This,v) (This)->lpVtbl->put_tableLayout(This,v)
#define IHTMLCSSStyleDeclaration_get_tableLayout(This,p) (This)->lpVtbl->get_tableLayout(This,p)
#define IHTMLCSSStyleDeclaration_put_borderCollapse(This,v) (This)->lpVtbl->put_borderCollapse(This,v)
#define IHTMLCSSStyleDeclaration_get_borderCollapse(This,p) (This)->lpVtbl->get_borderCollapse(This,p)
#define IHTMLCSSStyleDeclaration_put_direction(This,v) (This)->lpVtbl->put_direction(This,v)
#define IHTMLCSSStyleDeclaration_get_direction(This,p) (This)->lpVtbl->get_direction(This,p)
#define IHTMLCSSStyleDeclaration_put_behavior(This,v) (This)->lpVtbl->put_behavior(This,v)
#define IHTMLCSSStyleDeclaration_get_behavior(This,p) (This)->lpVtbl->get_behavior(This,p)
#define IHTMLCSSStyleDeclaration_put_position(This,v) (This)->lpVtbl->put_position(This,v)
#define IHTMLCSSStyleDeclaration_get_position(This,p) (This)->lpVtbl->get_position(This,p)
#define IHTMLCSSStyleDeclaration_put_unicodeBidi(This,v) (This)->lpVtbl->put_unicodeBidi(This,v)
#define IHTMLCSSStyleDeclaration_get_unicodeBidi(This,p) (This)->lpVtbl->get_unicodeBidi(This,p)
#define IHTMLCSSStyleDeclaration_put_bottom(This,v) (This)->lpVtbl->put_bottom(This,v)
#define IHTMLCSSStyleDeclaration_get_bottom(This,p) (This)->lpVtbl->get_bottom(This,p)
#define IHTMLCSSStyleDeclaration_put_right(This,v) (This)->lpVtbl->put_right(This,v)
#define IHTMLCSSStyleDeclaration_get_right(This,p) (This)->lpVtbl->get_right(This,p)
#define IHTMLCSSStyleDeclaration_put_imeMode(This,v) (This)->lpVtbl->put_imeMode(This,v)
#define IHTMLCSSStyleDeclaration_get_imeMode(This,p) (This)->lpVtbl->get_imeMode(This,p)
#define IHTMLCSSStyleDeclaration_put_rubyAlign(This,v) (This)->lpVtbl->put_rubyAlign(This,v)
#define IHTMLCSSStyleDeclaration_get_rubyAlign(This,p) (This)->lpVtbl->get_rubyAlign(This,p)
#define IHTMLCSSStyleDeclaration_put_rubyPosition(This,v) (This)->lpVtbl->put_rubyPosition(This,v)
#define IHTMLCSSStyleDeclaration_get_rubyPosition(This,p) (This)->lpVtbl->get_rubyPosition(This,p)
#define IHTMLCSSStyleDeclaration_put_rubyOverhang(This,v) (This)->lpVtbl->put_rubyOverhang(This,v)
#define IHTMLCSSStyleDeclaration_get_rubyOverhang(This,p) (This)->lpVtbl->get_rubyOverhang(This,p)
#define IHTMLCSSStyleDeclaration_put_layoutGridChar(This,v) (This)->lpVtbl->put_layoutGridChar(This,v)
#define IHTMLCSSStyleDeclaration_get_layoutGridChar(This,p) (This)->lpVtbl->get_layoutGridChar(This,p)
#define IHTMLCSSStyleDeclaration_put_layoutGridLine(This,v) (This)->lpVtbl->put_layoutGridLine(This,v)
#define IHTMLCSSStyleDeclaration_get_layoutGridLine(This,p) (This)->lpVtbl->get_layoutGridLine(This,p)
#define IHTMLCSSStyleDeclaration_put_layoutGridMode(This,v) (This)->lpVtbl->put_layoutGridMode(This,v)
#define IHTMLCSSStyleDeclaration_get_layoutGridMode(This,p) (This)->lpVtbl->get_layoutGridMode(This,p)
#define IHTMLCSSStyleDeclaration_put_layoutGridType(This,v) (This)->lpVtbl->put_layoutGridType(This,v)
#define IHTMLCSSStyleDeclaration_get_layoutGridType(This,p) (This)->lpVtbl->get_layoutGridType(This,p)
#define IHTMLCSSStyleDeclaration_put_layoutGrid(This,v) (This)->lpVtbl->put_layoutGrid(This,v)
#define IHTMLCSSStyleDeclaration_get_layoutGrid(This,p) (This)->lpVtbl->get_layoutGrid(This,p)
#define IHTMLCSSStyleDeclaration_put_textAutospace(This,v) (This)->lpVtbl->put_textAutospace(This,v)
#define IHTMLCSSStyleDeclaration_get_textAutospace(This,p) (This)->lpVtbl->get_textAutospace(This,p)
#define IHTMLCSSStyleDeclaration_put_wordBreak(This,v) (This)->lpVtbl->put_wordBreak(This,v)
#define IHTMLCSSStyleDeclaration_get_wordBreak(This,p) (This)->lpVtbl->get_wordBreak(This,p)
#define IHTMLCSSStyleDeclaration_put_lineBreak(This,v) (This)->lpVtbl->put_lineBreak(This,v)
#define IHTMLCSSStyleDeclaration_get_lineBreak(This,p) (This)->lpVtbl->get_lineBreak(This,p)
#define IHTMLCSSStyleDeclaration_put_textJustify(This,v) (This)->lpVtbl->put_textJustify(This,v)
#define IHTMLCSSStyleDeclaration_get_textJustify(This,p) (This)->lpVtbl->get_textJustify(This,p)
#define IHTMLCSSStyleDeclaration_put_textJustifyTrim(This,v) (This)->lpVtbl->put_textJustifyTrim(This,v)
#define IHTMLCSSStyleDeclaration_get_textJustifyTrim(This,p) (This)->lpVtbl->get_textJustifyTrim(This,p)
#define IHTMLCSSStyleDeclaration_put_textKashida(This,v) (This)->lpVtbl->put_textKashida(This,v)
#define IHTMLCSSStyleDeclaration_get_textKashida(This,p) (This)->lpVtbl->get_textKashida(This,p)
#define IHTMLCSSStyleDeclaration_put_overflowX(This,v) (This)->lpVtbl->put_overflowX(This,v)
#define IHTMLCSSStyleDeclaration_get_overflowX(This,p) (This)->lpVtbl->get_overflowX(This,p)
#define IHTMLCSSStyleDeclaration_put_overflowY(This,v) (This)->lpVtbl->put_overflowY(This,v)
#define IHTMLCSSStyleDeclaration_get_overflowY(This,p) (This)->lpVtbl->get_overflowY(This,p)
#define IHTMLCSSStyleDeclaration_put_accelerator(This,v) (This)->lpVtbl->put_accelerator(This,v)
#define IHTMLCSSStyleDeclaration_get_accelerator(This,p) (This)->lpVtbl->get_accelerator(This,p)
#define IHTMLCSSStyleDeclaration_put_layoutFlow(This,v) (This)->lpVtbl->put_layoutFlow(This,v)
#define IHTMLCSSStyleDeclaration_get_layoutFlow(This,p) (This)->lpVtbl->get_layoutFlow(This,p)
#define IHTMLCSSStyleDeclaration_put_zoom(This,v) (This)->lpVtbl->put_zoom(This,v)
#define IHTMLCSSStyleDeclaration_get_zoom(This,p) (This)->lpVtbl->get_zoom(This,p)
#define IHTMLCSSStyleDeclaration_put_wordWrap(This,v) (This)->lpVtbl->put_wordWrap(This,v)
#define IHTMLCSSStyleDeclaration_get_wordWrap(This,p) (This)->lpVtbl->get_wordWrap(This,p)
#define IHTMLCSSStyleDeclaration_put_textUnderlinePosition(This,v) (This)->lpVtbl->put_textUnderlinePosition(This,v)
#define IHTMLCSSStyleDeclaration_get_textUnderlinePosition(This,p) (This)->lpVtbl->get_textUnderlinePosition(This,p)
#define IHTMLCSSStyleDeclaration_put_scrollbarBaseColor(This,v) (This)->lpVtbl->put_scrollbarBaseColor(This,v)
#define IHTMLCSSStyleDeclaration_get_scrollbarBaseColor(This,p) (This)->lpVtbl->get_scrollbarBaseColor(This,p)
#define IHTMLCSSStyleDeclaration_put_scrollbarFaceColor(This,v) (This)->lpVtbl->put_scrollbarFaceColor(This,v)
#define IHTMLCSSStyleDeclaration_get_scrollbarFaceColor(This,p) (This)->lpVtbl->get_scrollbarFaceColor(This,p)
#define IHTMLCSSStyleDeclaration_put_scrollbar3dLightColor(This,v) (This)->lpVtbl->put_scrollbar3dLightColor(This,v)
#define IHTMLCSSStyleDeclaration_get_scrollbar3dLightColor(This,p) (This)->lpVtbl->get_scrollbar3dLightColor(This,p)
#define IHTMLCSSStyleDeclaration_put_scrollbarShadowColor(This,v) (This)->lpVtbl->put_scrollbarShadowColor(This,v)
#define IHTMLCSSStyleDeclaration_get_scrollbarShadowColor(This,p) (This)->lpVtbl->get_scrollbarShadowColor(This,p)
#define IHTMLCSSStyleDeclaration_put_scrollbarHighlightColor(This,v) (This)->lpVtbl->put_scrollbarHighlightColor(This,v)
#define IHTMLCSSStyleDeclaration_get_scrollbarHighlightColor(This,p) (This)->lpVtbl->get_scrollbarHighlightColor(This,p)
#define IHTMLCSSStyleDeclaration_put_scrollbarDarkShadowColor(This,v) (This)->lpVtbl->put_scrollbarDarkShadowColor(This,v)
#define IHTMLCSSStyleDeclaration_get_scrollbarDarkShadowColor(This,p) (This)->lpVtbl->get_scrollbarDarkShadowColor(This,p)
#define IHTMLCSSStyleDeclaration_put_scrollbarArrowColor(This,v) (This)->lpVtbl->put_scrollbarArrowColor(This,v)
#define IHTMLCSSStyleDeclaration_get_scrollbarArrowColor(This,p) (This)->lpVtbl->get_scrollbarArrowColor(This,p)
#define IHTMLCSSStyleDeclaration_put_scrollbarTrackColor(This,v) (This)->lpVtbl->put_scrollbarTrackColor(This,v)
#define IHTMLCSSStyleDeclaration_get_scrollbarTrackColor(This,p) (This)->lpVtbl->get_scrollbarTrackColor(This,p)
#define IHTMLCSSStyleDeclaration_put_writingMode(This,v) (This)->lpVtbl->put_writingMode(This,v)
#define IHTMLCSSStyleDeclaration_get_writingMode(This,p) (This)->lpVtbl->get_writingMode(This,p)
#define IHTMLCSSStyleDeclaration_put_textAlignLast(This,v) (This)->lpVtbl->put_textAlignLast(This,v)
#define IHTMLCSSStyleDeclaration_get_textAlignLast(This,p) (This)->lpVtbl->get_textAlignLast(This,p)
#define IHTMLCSSStyleDeclaration_put_textKashidaSpace(This,v) (This)->lpVtbl->put_textKashidaSpace(This,v)
#define IHTMLCSSStyleDeclaration_get_textKashidaSpace(This,p) (This)->lpVtbl->get_textKashidaSpace(This,p)
#define IHTMLCSSStyleDeclaration_put_textOverflow(This,v) (This)->lpVtbl->put_textOverflow(This,v)
#define IHTMLCSSStyleDeclaration_get_textOverflow(This,p) (This)->lpVtbl->get_textOverflow(This,p)
#define IHTMLCSSStyleDeclaration_put_minHeight(This,v) (This)->lpVtbl->put_minHeight(This,v)
#define IHTMLCSSStyleDeclaration_get_minHeight(This,p) (This)->lpVtbl->get_minHeight(This,p)
#define IHTMLCSSStyleDeclaration_put_msInterpolationMode(This,v) (This)->lpVtbl->put_msInterpolationMode(This,v)
#define IHTMLCSSStyleDeclaration_get_msInterpolationMode(This,p) (This)->lpVtbl->get_msInterpolationMode(This,p)
#define IHTMLCSSStyleDeclaration_put_maxHeight(This,v) (This)->lpVtbl->put_maxHeight(This,v)
#define IHTMLCSSStyleDeclaration_get_maxHeight(This,p) (This)->lpVtbl->get_maxHeight(This,p)
#define IHTMLCSSStyleDeclaration_put_minWidth(This,v) (This)->lpVtbl->put_minWidth(This,v)
#define IHTMLCSSStyleDeclaration_get_minWidth(This,p) (This)->lpVtbl->get_minWidth(This,p)
#define IHTMLCSSStyleDeclaration_put_maxWidth(This,v) (This)->lpVtbl->put_maxWidth(This,v)
#define IHTMLCSSStyleDeclaration_get_maxWidth(This,p) (This)->lpVtbl->get_maxWidth(This,p)
#define IHTMLCSSStyleDeclaration_put_content(This,v) (This)->lpVtbl->put_content(This,v)
#define IHTMLCSSStyleDeclaration_get_content(This,p) (This)->lpVtbl->get_content(This,p)
#define IHTMLCSSStyleDeclaration_put_captionSide(This,v) (This)->lpVtbl->put_captionSide(This,v)
#define IHTMLCSSStyleDeclaration_get_captionSide(This,p) (This)->lpVtbl->get_captionSide(This,p)
#define IHTMLCSSStyleDeclaration_put_counterIncrement(This,v) (This)->lpVtbl->put_counterIncrement(This,v)
#define IHTMLCSSStyleDeclaration_get_counterIncrement(This,p) (This)->lpVtbl->get_counterIncrement(This,p)
#define IHTMLCSSStyleDeclaration_put_counterReset(This,v) (This)->lpVtbl->put_counterReset(This,v)
#define IHTMLCSSStyleDeclaration_get_counterReset(This,p) (This)->lpVtbl->get_counterReset(This,p)
#define IHTMLCSSStyleDeclaration_put_outline(This,v) (This)->lpVtbl->put_outline(This,v)
#define IHTMLCSSStyleDeclaration_get_outline(This,p) (This)->lpVtbl->get_outline(This,p)
#define IHTMLCSSStyleDeclaration_put_outlineWidth(This,v) (This)->lpVtbl->put_outlineWidth(This,v)
#define IHTMLCSSStyleDeclaration_get_outlineWidth(This,p) (This)->lpVtbl->get_outlineWidth(This,p)
#define IHTMLCSSStyleDeclaration_put_outlineStyle(This,v) (This)->lpVtbl->put_outlineStyle(This,v)
#define IHTMLCSSStyleDeclaration_get_outlineStyle(This,p) (This)->lpVtbl->get_outlineStyle(This,p)
#define IHTMLCSSStyleDeclaration_put_outlineColor(This,v) (This)->lpVtbl->put_outlineColor(This,v)
#define IHTMLCSSStyleDeclaration_get_outlineColor(This,p) (This)->lpVtbl->get_outlineColor(This,p)
#define IHTMLCSSStyleDeclaration_put_boxSizing(This,v) (This)->lpVtbl->put_boxSizing(This,v)
#define IHTMLCSSStyleDeclaration_get_boxSizing(This,p) (This)->lpVtbl->get_boxSizing(This,p)
#define IHTMLCSSStyleDeclaration_put_borderSpacing(This,v) (This)->lpVtbl->put_borderSpacing(This,v)
#define IHTMLCSSStyleDeclaration_get_borderSpacing(This,p) (This)->lpVtbl->get_borderSpacing(This,p)
#define IHTMLCSSStyleDeclaration_put_orphans(This,v) (This)->lpVtbl->put_orphans(This,v)
#define IHTMLCSSStyleDeclaration_get_orphans(This,p) (This)->lpVtbl->get_orphans(This,p)
#define IHTMLCSSStyleDeclaration_put_widows(This,v) (This)->lpVtbl->put_widows(This,v)
#define IHTMLCSSStyleDeclaration_get_widows(This,p) (This)->lpVtbl->get_widows(This,p)
#define IHTMLCSSStyleDeclaration_put_pageBreakInside(This,v) (This)->lpVtbl->put_pageBreakInside(This,v)
#define IHTMLCSSStyleDeclaration_get_pageBreakInside(This,p) (This)->lpVtbl->get_pageBreakInside(This,p)
#define IHTMLCSSStyleDeclaration_put_emptyCells(This,v) (This)->lpVtbl->put_emptyCells(This,v)
#define IHTMLCSSStyleDeclaration_get_emptyCells(This,p) (This)->lpVtbl->get_emptyCells(This,p)
#define IHTMLCSSStyleDeclaration_put_msBlockProgression(This,v) (This)->lpVtbl->put_msBlockProgression(This,v)
#define IHTMLCSSStyleDeclaration_get_msBlockProgression(This,p) (This)->lpVtbl->get_msBlockProgression(This,p)
#define IHTMLCSSStyleDeclaration_put_quotes(This,v) (This)->lpVtbl->put_quotes(This,v)
#define IHTMLCSSStyleDeclaration_get_quotes(This,p) (This)->lpVtbl->get_quotes(This,p)
#define IHTMLCSSStyleDeclaration_put_alignmentBaseline(This,v) (This)->lpVtbl->put_alignmentBaseline(This,v)
#define IHTMLCSSStyleDeclaration_get_alignmentBaseline(This,p) (This)->lpVtbl->get_alignmentBaseline(This,p)
#define IHTMLCSSStyleDeclaration_put_baselineShift(This,v) (This)->lpVtbl->put_baselineShift(This,v)
#define IHTMLCSSStyleDeclaration_get_baselineShift(This,p) (This)->lpVtbl->get_baselineShift(This,p)
#define IHTMLCSSStyleDeclaration_put_dominantBaseline(This,v) (This)->lpVtbl->put_dominantBaseline(This,v)
#define IHTMLCSSStyleDeclaration_get_dominantBaseline(This,p) (This)->lpVtbl->get_dominantBaseline(This,p)
#define IHTMLCSSStyleDeclaration_put_fontSizeAdjust(This,v) (This)->lpVtbl->put_fontSizeAdjust(This,v)
#define IHTMLCSSStyleDeclaration_get_fontSizeAdjust(This,p) (This)->lpVtbl->get_fontSizeAdjust(This,p)
#define IHTMLCSSStyleDeclaration_put_fontStretch(This,v) (This)->lpVtbl->put_fontStretch(This,v)
#define IHTMLCSSStyleDeclaration_get_fontStretch(This,p) (This)->lpVtbl->get_fontStretch(This,p)
#define IHTMLCSSStyleDeclaration_put_opacity(This,v) (This)->lpVtbl->put_opacity(This,v)
#define IHTMLCSSStyleDeclaration_get_opacity(This,p) (This)->lpVtbl->get_opacity(This,p)
#define IHTMLCSSStyleDeclaration_put_clipPath(This,v) (This)->lpVtbl->put_clipPath(This,v)
#define IHTMLCSSStyleDeclaration_get_clipPath(This,p) (This)->lpVtbl->get_clipPath(This,p)
#define IHTMLCSSStyleDeclaration_put_clipRule(This,v) (This)->lpVtbl->put_clipRule(This,v)
#define IHTMLCSSStyleDeclaration_get_clipRule(This,p) (This)->lpVtbl->get_clipRule(This,p)
#define IHTMLCSSStyleDeclaration_put_fill(This,v) (This)->lpVtbl->put_fill(This,v)
#define IHTMLCSSStyleDeclaration_get_fill(This,p) (This)->lpVtbl->get_fill(This,p)
#define IHTMLCSSStyleDeclaration_put_fillOpacity(This,v) (This)->lpVtbl->put_fillOpacity(This,v)
#define IHTMLCSSStyleDeclaration_get_fillOpacity(This,p) (This)->lpVtbl->get_fillOpacity(This,p)
#define IHTMLCSSStyleDeclaration_put_fillRule(This,v) (This)->lpVtbl->put_fillRule(This,v)
#define IHTMLCSSStyleDeclaration_get_fillRule(This,p) (This)->lpVtbl->get_fillRule(This,p)
#define IHTMLCSSStyleDeclaration_put_kerning(This,v) (This)->lpVtbl->put_kerning(This,v)
#define IHTMLCSSStyleDeclaration_get_kerning(This,p) (This)->lpVtbl->get_kerning(This,p)
#define IHTMLCSSStyleDeclaration_put_marker(This,v) (This)->lpVtbl->put_marker(This,v)
#define IHTMLCSSStyleDeclaration_get_marker(This,p) (This)->lpVtbl->get_marker(This,p)
#define IHTMLCSSStyleDeclaration_put_markerEnd(This,v) (This)->lpVtbl->put_markerEnd(This,v)
#define IHTMLCSSStyleDeclaration_get_markerEnd(This,p) (This)->lpVtbl->get_markerEnd(This,p)
#define IHTMLCSSStyleDeclaration_put_markerMid(This,v) (This)->lpVtbl->put_markerMid(This,v)
#define IHTMLCSSStyleDeclaration_get_markerMid(This,p) (This)->lpVtbl->get_markerMid(This,p)
#define IHTMLCSSStyleDeclaration_put_markerStart(This,v) (This)->lpVtbl->put_markerStart(This,v)
#define IHTMLCSSStyleDeclaration_get_markerStart(This,p) (This)->lpVtbl->get_markerStart(This,p)
#define IHTMLCSSStyleDeclaration_put_mask(This,v) (This)->lpVtbl->put_mask(This,v)
#define IHTMLCSSStyleDeclaration_get_mask(This,p) (This)->lpVtbl->get_mask(This,p)
#define IHTMLCSSStyleDeclaration_put_pointerEvents(This,v) (This)->lpVtbl->put_pointerEvents(This,v)
#define IHTMLCSSStyleDeclaration_get_pointerEvents(This,p) (This)->lpVtbl->get_pointerEvents(This,p)
#define IHTMLCSSStyleDeclaration_put_stopColor(This,v) (This)->lpVtbl->put_stopColor(This,v)
#define IHTMLCSSStyleDeclaration_get_stopColor(This,p) (This)->lpVtbl->get_stopColor(This,p)
#define IHTMLCSSStyleDeclaration_put_stopOpacity(This,v) (This)->lpVtbl->put_stopOpacity(This,v)
#define IHTMLCSSStyleDeclaration_get_stopOpacity(This,p) (This)->lpVtbl->get_stopOpacity(This,p)
#define IHTMLCSSStyleDeclaration_put_stroke(This,v) (This)->lpVtbl->put_stroke(This,v)
#define IHTMLCSSStyleDeclaration_get_stroke(This,p) (This)->lpVtbl->get_stroke(This,p)
#define IHTMLCSSStyleDeclaration_put_strokeDasharray(This,v) (This)->lpVtbl->put_strokeDasharray(This,v)
#define IHTMLCSSStyleDeclaration_get_strokeDasharray(This,p) (This)->lpVtbl->get_strokeDasharray(This,p)
#define IHTMLCSSStyleDeclaration_put_strokeDashoffset(This,v) (This)->lpVtbl->put_strokeDashoffset(This,v)
#define IHTMLCSSStyleDeclaration_get_strokeDashoffset(This,p) (This)->lpVtbl->get_strokeDashoffset(This,p)
#define IHTMLCSSStyleDeclaration_put_strokeLinecap(This,v) (This)->lpVtbl->put_strokeLinecap(This,v)
#define IHTMLCSSStyleDeclaration_get_strokeLinecap(This,p) (This)->lpVtbl->get_strokeLinecap(This,p)
#define IHTMLCSSStyleDeclaration_put_strokeLinejoin(This,v) (This)->lpVtbl->put_strokeLinejoin(This,v)
#define IHTMLCSSStyleDeclaration_get_strokeLinejoin(This,p) (This)->lpVtbl->get_strokeLinejoin(This,p)
#define IHTMLCSSStyleDeclaration_put_strokeMiterlimit(This,v) (This)->lpVtbl->put_strokeMiterlimit(This,v)
#define IHTMLCSSStyleDeclaration_get_strokeMiterlimit(This,p) (This)->lpVtbl->get_strokeMiterlimit(This,p)
#define IHTMLCSSStyleDeclaration_put_strokeOpacity(This,v) (This)->lpVtbl->put_strokeOpacity(This,v)
#define IHTMLCSSStyleDeclaration_get_strokeOpacity(This,p) (This)->lpVtbl->get_strokeOpacity(This,p)
#define IHTMLCSSStyleDeclaration_put_strokeWidth(This,v) (This)->lpVtbl->put_strokeWidth(This,v)
#define IHTMLCSSStyleDeclaration_get_strokeWidth(This,p) (This)->lpVtbl->get_strokeWidth(This,p)
#define IHTMLCSSStyleDeclaration_put_textAnchor(This,v) (This)->lpVtbl->put_textAnchor(This,v)
#define IHTMLCSSStyleDeclaration_get_textAnchor(This,p) (This)->lpVtbl->get_textAnchor(This,p)
#define IHTMLCSSStyleDeclaration_put_glyphOrientationHorizontal(This,v) (This)->lpVtbl->put_glyphOrientationHorizontal(This,v)
#define IHTMLCSSStyleDeclaration_get_glyphOrientationHorizontal(This,p) (This)->lpVtbl->get_glyphOrientationHorizontal(This,p)
#define IHTMLCSSStyleDeclaration_put_glyphOrientationVertical(This,v) (This)->lpVtbl->put_glyphOrientationVertical(This,v)
#define IHTMLCSSStyleDeclaration_get_glyphOrientationVertical(This,p) (This)->lpVtbl->get_glyphOrientationVertical(This,p)
#define IHTMLCSSStyleDeclaration_put_borderRadius(This,v) (This)->lpVtbl->put_borderRadius(This,v)
#define IHTMLCSSStyleDeclaration_get_borderRadius(This,p) (This)->lpVtbl->get_borderRadius(This,p)
#define IHTMLCSSStyleDeclaration_put_borderTopLeftRadius(This,v) (This)->lpVtbl->put_borderTopLeftRadius(This,v)
#define IHTMLCSSStyleDeclaration_get_borderTopLeftRadius(This,p) (This)->lpVtbl->get_borderTopLeftRadius(This,p)
#define IHTMLCSSStyleDeclaration_put_borderTopRightRadius(This,v) (This)->lpVtbl->put_borderTopRightRadius(This,v)
#define IHTMLCSSStyleDeclaration_get_borderTopRightRadius(This,p) (This)->lpVtbl->get_borderTopRightRadius(This,p)
#define IHTMLCSSStyleDeclaration_put_borderBottomRightRadius(This,v) (This)->lpVtbl->put_borderBottomRightRadius(This,v)
#define IHTMLCSSStyleDeclaration_get_borderBottomRightRadius(This,p) (This)->lpVtbl->get_borderBottomRightRadius(This,p)
#define IHTMLCSSStyleDeclaration_put_borderBottomLeftRadius(This,v) (This)->lpVtbl->put_borderBottomLeftRadius(This,v)
#define IHTMLCSSStyleDeclaration_get_borderBottomLeftRadius(This,p) (This)->lpVtbl->get_borderBottomLeftRadius(This,p)
#define IHTMLCSSStyleDeclaration_put_clipTop(This,v) (This)->lpVtbl->put_clipTop(This,v)
#define IHTMLCSSStyleDeclaration_get_clipTop(This,p) (This)->lpVtbl->get_clipTop(This,p)
#define IHTMLCSSStyleDeclaration_put_clipRight(This,v) (This)->lpVtbl->put_clipRight(This,v)
#define IHTMLCSSStyleDeclaration_get_clipRight(This,p) (This)->lpVtbl->get_clipRight(This,p)
#define IHTMLCSSStyleDeclaration_get_clipBottom(This,p) (This)->lpVtbl->get_clipBottom(This,p)
#define IHTMLCSSStyleDeclaration_put_clipLeft(This,v) (This)->lpVtbl->put_clipLeft(This,v)
#define IHTMLCSSStyleDeclaration_get_clipLeft(This,p) (This)->lpVtbl->get_clipLeft(This,p)
#define IHTMLCSSStyleDeclaration_put_cssFloat(This,v) (This)->lpVtbl->put_cssFloat(This,v)
#define IHTMLCSSStyleDeclaration_get_cssFloat(This,p) (This)->lpVtbl->get_cssFloat(This,p)
#define IHTMLCSSStyleDeclaration_put_backgroundClip(This,v) (This)->lpVtbl->put_backgroundClip(This,v)
#define IHTMLCSSStyleDeclaration_get_backgroundClip(This,p) (This)->lpVtbl->get_backgroundClip(This,p)
#define IHTMLCSSStyleDeclaration_put_backgroundOrigin(This,v) (This)->lpVtbl->put_backgroundOrigin(This,v)
#define IHTMLCSSStyleDeclaration_get_backgroundOrigin(This,p) (This)->lpVtbl->get_backgroundOrigin(This,p)
#define IHTMLCSSStyleDeclaration_put_backgroundSize(This,v) (This)->lpVtbl->put_backgroundSize(This,v)
#define IHTMLCSSStyleDeclaration_get_backgroundSize(This,p) (This)->lpVtbl->get_backgroundSize(This,p)
#define IHTMLCSSStyleDeclaration_put_boxShadow(This,v) (This)->lpVtbl->put_boxShadow(This,v)
#define IHTMLCSSStyleDeclaration_get_boxShadow(This,p) (This)->lpVtbl->get_boxShadow(This,p)
#define IHTMLCSSStyleDeclaration_put_msTransform(This,v) (This)->lpVtbl->put_msTransform(This,v)
#define IHTMLCSSStyleDeclaration_get_msTransform(This,p) (This)->lpVtbl->get_msTransform(This,p)
#define IHTMLCSSStyleDeclaration_put_msTransformOrigin(This,v) (This)->lpVtbl->put_msTransformOrigin(This,v)
#define IHTMLCSSStyleDeclaration_get_msTransformOrigin(This,p) (This)->lpVtbl->get_msTransformOrigin(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_QueryInterface(IHTMLCSSStyleDeclaration* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLCSSStyleDeclaration_AddRef(IHTMLCSSStyleDeclaration* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLCSSStyleDeclaration_Release(IHTMLCSSStyleDeclaration* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_GetTypeInfoCount(IHTMLCSSStyleDeclaration* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_GetTypeInfo(IHTMLCSSStyleDeclaration* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_GetIDsOfNames(IHTMLCSSStyleDeclaration* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_Invoke(IHTMLCSSStyleDeclaration* 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);
}
/*** IHTMLCSSStyleDeclaration methods ***/
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_length(IHTMLCSSStyleDeclaration* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_parentRule(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_parentRule(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_getPropertyValue(IHTMLCSSStyleDeclaration* This,BSTR bstrPropertyName,BSTR *pbstrPropertyValue) {
    return This->lpVtbl->getPropertyValue(This,bstrPropertyName,pbstrPropertyValue);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_getPropertyPriority(IHTMLCSSStyleDeclaration* This,BSTR bstrPropertyName,BSTR *pbstrPropertyPriority) {
    return This->lpVtbl->getPropertyPriority(This,bstrPropertyName,pbstrPropertyPriority);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_removeProperty(IHTMLCSSStyleDeclaration* This,BSTR bstrPropertyName,BSTR *pbstrPropertyValue) {
    return This->lpVtbl->removeProperty(This,bstrPropertyName,pbstrPropertyValue);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_setProperty(IHTMLCSSStyleDeclaration* This,BSTR bstrPropertyName,VARIANT *pvarPropertyValue,VARIANT *pvarPropertyPriority) {
    return This->lpVtbl->setProperty(This,bstrPropertyName,pvarPropertyValue,pvarPropertyPriority);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_item(IHTMLCSSStyleDeclaration* This,LONG index,BSTR *pbstrPropertyName) {
    return This->lpVtbl->item(This,index,pbstrPropertyName);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_fontFamily(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_fontFamily(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_fontFamily(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_fontFamily(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_fontStyle(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_fontStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_fontStyle(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_fontStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_fontVariant(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_fontVariant(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_fontVariant(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_fontVariant(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_fontWeight(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_fontWeight(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_fontWeight(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_fontWeight(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_fontSize(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_fontSize(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_fontSize(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_fontSize(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_font(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_font(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_font(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_font(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_color(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_color(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_color(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_color(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_background(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_background(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_background(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_background(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_backgroundColor(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_backgroundColor(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_backgroundColor(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_backgroundColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_backgroundImage(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_backgroundImage(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_backgroundImage(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_backgroundImage(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_backgroundRepeat(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_backgroundRepeat(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_backgroundRepeat(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_backgroundRepeat(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_backgroundAttachment(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_backgroundAttachment(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_backgroundAttachment(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_backgroundAttachment(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_backgroundPosition(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_backgroundPosition(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_backgroundPosition(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_backgroundPosition(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_backgroundPositionX(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_backgroundPositionX(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_backgroundPositionX(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_backgroundPositionX(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_backgroundPositionY(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_backgroundPositionY(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_backgroundPositionY(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_backgroundPositionY(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_wordSpacing(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_wordSpacing(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_wordSpacing(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_wordSpacing(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_letterSpacing(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_letterSpacing(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_letterSpacing(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_letterSpacing(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_textDecoration(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_textDecoration(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_textDecoration(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_textDecoration(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_verticalAlign(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_verticalAlign(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_verticalAlign(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_verticalAlign(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_textTransform(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_textTransform(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_textTransform(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_textTransform(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_textAlign(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_textAlign(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_textAlign(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_textAlign(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_textIndent(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_textIndent(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_textIndent(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_textIndent(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_lineHeight(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_lineHeight(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_lineHeight(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_lineHeight(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_marginTop(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_marginTop(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_marginTop(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_marginTop(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_marginRight(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_marginRight(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_marginRight(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_marginRight(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_marginBottom(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_marginBottom(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_marginBottom(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_marginBottom(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_marginLeft(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_marginLeft(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_marginLeft(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_marginLeft(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_margin(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_margin(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_margin(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_margin(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_paddingTop(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_paddingTop(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_paddingTop(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_paddingTop(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_paddingRight(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_paddingRight(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_paddingRight(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_paddingRight(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_paddingBottom(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_paddingBottom(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_paddingBottom(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_paddingBottom(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_paddingLeft(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_paddingLeft(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_paddingLeft(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_paddingLeft(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_padding(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_padding(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_padding(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_padding(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_border(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_border(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_border(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_border(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_borderTop(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderTop(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_borderTop(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderTop(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_borderRight(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderRight(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_borderRight(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderRight(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_borderBottom(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderBottom(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_borderBottom(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderBottom(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_borderLeft(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderLeft(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_borderLeft(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderLeft(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_borderColor(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderColor(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_borderColor(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_borderTopColor(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_borderTopColor(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_borderTopColor(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_borderTopColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_borderRightColor(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_borderRightColor(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_borderRightColor(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_borderRightColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_borderBottomColor(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_borderBottomColor(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_borderBottomColor(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_borderBottomColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_borderLeftColor(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_borderLeftColor(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_borderLeftColor(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_borderLeftColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_borderWidth(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_borderWidth(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_borderTopWidth(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_borderTopWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_borderTopWidth(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_borderTopWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_borderRightWidth(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_borderRightWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_borderRightWidth(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_borderRightWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_borderBottomWidth(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_borderBottomWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_borderBottomWidth(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_borderBottomWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_borderLeftWidth(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_borderLeftWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_borderLeftWidth(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_borderLeftWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_borderStyle(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_borderStyle(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_borderTopStyle(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderTopStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_borderTopStyle(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderTopStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_borderRightStyle(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderRightStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_borderRightStyle(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderRightStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_borderBottomStyle(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderBottomStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_borderBottomStyle(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderBottomStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_borderLeftStyle(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderLeftStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_borderLeftStyle(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderLeftStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_width(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_width(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_width(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_width(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_height(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_height(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_height(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_height(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_styleFloat(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_styleFloat(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_styleFloat(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_styleFloat(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_clear(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_clear(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_clear(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_clear(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_display(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_display(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_display(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_display(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_visibility(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_visibility(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_visibility(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_visibility(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_listStyleType(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_listStyleType(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_listStyleType(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_listStyleType(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_listStylePosition(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_listStylePosition(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_listStylePosition(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_listStylePosition(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_listStyleImage(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_listStyleImage(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_listStyleImage(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_listStyleImage(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_listStyle(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_listStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_listStyle(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_listStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_whiteSpace(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_whiteSpace(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_whiteSpace(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_whiteSpace(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_top(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_top(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_top(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_top(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_left(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_left(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_left(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_left(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_zIndex(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_zIndex(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_zIndex(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_zIndex(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_overflow(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_overflow(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_overflow(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_overflow(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_pageBreakBefore(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_pageBreakBefore(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_pageBreakBefore(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_pageBreakBefore(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_pageBreakAfter(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_pageBreakAfter(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_pageBreakAfter(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_pageBreakAfter(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_cssText(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_cssText(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_cssText(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_cssText(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_cursor(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_cursor(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_cursor(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_cursor(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_clip(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_clip(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_clip(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_clip(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_filter(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_filter(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_filter(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_filter(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_tableLayout(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_tableLayout(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_tableLayout(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_tableLayout(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_borderCollapse(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderCollapse(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_borderCollapse(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderCollapse(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_direction(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_direction(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_direction(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_direction(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_behavior(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_behavior(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_behavior(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_behavior(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_position(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_position(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_position(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_position(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_unicodeBidi(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_unicodeBidi(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_unicodeBidi(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_unicodeBidi(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_bottom(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_bottom(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_bottom(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_bottom(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_right(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_right(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_right(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_right(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_imeMode(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_imeMode(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_imeMode(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_imeMode(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_rubyAlign(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_rubyAlign(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_rubyAlign(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_rubyAlign(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_rubyPosition(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_rubyPosition(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_rubyPosition(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_rubyPosition(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_rubyOverhang(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_rubyOverhang(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_rubyOverhang(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_rubyOverhang(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_layoutGridChar(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_layoutGridChar(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_layoutGridChar(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_layoutGridChar(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_layoutGridLine(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_layoutGridLine(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_layoutGridLine(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_layoutGridLine(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_layoutGridMode(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_layoutGridMode(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_layoutGridMode(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_layoutGridMode(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_layoutGridType(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_layoutGridType(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_layoutGridType(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_layoutGridType(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_layoutGrid(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_layoutGrid(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_layoutGrid(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_layoutGrid(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_textAutospace(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_textAutospace(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_textAutospace(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_textAutospace(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_wordBreak(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_wordBreak(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_wordBreak(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_wordBreak(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_lineBreak(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_lineBreak(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_lineBreak(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_lineBreak(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_textJustify(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_textJustify(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_textJustify(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_textJustify(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_textJustifyTrim(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_textJustifyTrim(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_textJustifyTrim(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_textJustifyTrim(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_textKashida(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_textKashida(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_textKashida(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_textKashida(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_overflowX(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_overflowX(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_overflowX(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_overflowX(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_overflowY(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_overflowY(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_overflowY(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_overflowY(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_accelerator(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_accelerator(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_accelerator(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_accelerator(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_layoutFlow(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_layoutFlow(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_layoutFlow(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_layoutFlow(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_zoom(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_zoom(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_zoom(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_zoom(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_wordWrap(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_wordWrap(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_wordWrap(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_wordWrap(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_textUnderlinePosition(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_textUnderlinePosition(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_textUnderlinePosition(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_textUnderlinePosition(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_scrollbarBaseColor(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarBaseColor(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_scrollbarBaseColor(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarBaseColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_scrollbarFaceColor(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarFaceColor(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_scrollbarFaceColor(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarFaceColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_scrollbar3dLightColor(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_scrollbar3dLightColor(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_scrollbar3dLightColor(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbar3dLightColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_scrollbarShadowColor(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarShadowColor(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_scrollbarShadowColor(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarShadowColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_scrollbarHighlightColor(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarHighlightColor(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_scrollbarHighlightColor(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarHighlightColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_scrollbarDarkShadowColor(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarDarkShadowColor(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_scrollbarDarkShadowColor(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarDarkShadowColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_scrollbarArrowColor(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarArrowColor(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_scrollbarArrowColor(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarArrowColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_scrollbarTrackColor(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarTrackColor(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_scrollbarTrackColor(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarTrackColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_writingMode(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_writingMode(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_writingMode(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_writingMode(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_textAlignLast(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_textAlignLast(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_textAlignLast(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_textAlignLast(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_textKashidaSpace(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_textKashidaSpace(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_textKashidaSpace(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_textKashidaSpace(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_textOverflow(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_textOverflow(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_textOverflow(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_textOverflow(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_minHeight(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_minHeight(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_minHeight(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_minHeight(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_msInterpolationMode(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_msInterpolationMode(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_msInterpolationMode(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_msInterpolationMode(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_maxHeight(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_maxHeight(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_maxHeight(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_maxHeight(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_minWidth(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_minWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_minWidth(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_minWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_maxWidth(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_maxWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_maxWidth(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_maxWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_content(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_content(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_content(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_content(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_captionSide(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_captionSide(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_captionSide(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_captionSide(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_counterIncrement(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_counterIncrement(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_counterIncrement(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_counterIncrement(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_counterReset(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_counterReset(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_counterReset(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_counterReset(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_outline(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_outline(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_outline(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_outline(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_outlineWidth(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_outlineWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_outlineWidth(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_outlineWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_outlineStyle(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_outlineStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_outlineStyle(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_outlineStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_outlineColor(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_outlineColor(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_outlineColor(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_outlineColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_boxSizing(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_boxSizing(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_boxSizing(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_boxSizing(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_borderSpacing(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderSpacing(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_borderSpacing(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderSpacing(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_orphans(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_orphans(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_orphans(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_orphans(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_widows(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_widows(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_widows(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_widows(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_pageBreakInside(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_pageBreakInside(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_pageBreakInside(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_pageBreakInside(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_emptyCells(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_emptyCells(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_emptyCells(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_emptyCells(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_msBlockProgression(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_msBlockProgression(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_msBlockProgression(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_msBlockProgression(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_quotes(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_quotes(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_quotes(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_quotes(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_alignmentBaseline(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_alignmentBaseline(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_alignmentBaseline(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_alignmentBaseline(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_baselineShift(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_baselineShift(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_baselineShift(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_baselineShift(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_dominantBaseline(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_dominantBaseline(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_dominantBaseline(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_dominantBaseline(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_fontSizeAdjust(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_fontSizeAdjust(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_fontSizeAdjust(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_fontSizeAdjust(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_fontStretch(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_fontStretch(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_fontStretch(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_fontStretch(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_opacity(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_opacity(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_opacity(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_opacity(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_clipPath(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_clipPath(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_clipPath(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_clipPath(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_clipRule(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_clipRule(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_clipRule(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_clipRule(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_fill(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_fill(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_fill(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_fill(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_fillOpacity(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_fillOpacity(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_fillOpacity(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_fillOpacity(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_fillRule(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_fillRule(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_fillRule(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_fillRule(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_kerning(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_kerning(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_kerning(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_kerning(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_marker(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_marker(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_marker(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_marker(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_markerEnd(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_markerEnd(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_markerEnd(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_markerEnd(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_markerMid(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_markerMid(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_markerMid(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_markerMid(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_markerStart(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_markerStart(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_markerStart(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_markerStart(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_mask(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_mask(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_mask(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_mask(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_pointerEvents(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_pointerEvents(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_pointerEvents(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_pointerEvents(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_stopColor(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_stopColor(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_stopColor(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_stopColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_stopOpacity(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_stopOpacity(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_stopOpacity(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_stopOpacity(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_stroke(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_stroke(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_stroke(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_stroke(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_strokeDasharray(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_strokeDasharray(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_strokeDasharray(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_strokeDasharray(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_strokeDashoffset(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_strokeDashoffset(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_strokeDashoffset(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_strokeDashoffset(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_strokeLinecap(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_strokeLinecap(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_strokeLinecap(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_strokeLinecap(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_strokeLinejoin(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_strokeLinejoin(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_strokeLinejoin(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_strokeLinejoin(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_strokeMiterlimit(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_strokeMiterlimit(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_strokeMiterlimit(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_strokeMiterlimit(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_strokeOpacity(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_strokeOpacity(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_strokeOpacity(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_strokeOpacity(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_strokeWidth(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_strokeWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_strokeWidth(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_strokeWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_textAnchor(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_textAnchor(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_textAnchor(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_textAnchor(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_glyphOrientationHorizontal(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_glyphOrientationHorizontal(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_glyphOrientationHorizontal(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_glyphOrientationHorizontal(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_glyphOrientationVertical(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_glyphOrientationVertical(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_glyphOrientationVertical(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_glyphOrientationVertical(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_borderRadius(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderRadius(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_borderRadius(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderRadius(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_borderTopLeftRadius(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderTopLeftRadius(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_borderTopLeftRadius(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderTopLeftRadius(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_borderTopRightRadius(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderTopRightRadius(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_borderTopRightRadius(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderTopRightRadius(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_borderBottomRightRadius(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderBottomRightRadius(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_borderBottomRightRadius(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderBottomRightRadius(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_borderBottomLeftRadius(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderBottomLeftRadius(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_borderBottomLeftRadius(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderBottomLeftRadius(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_clipTop(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_clipTop(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_clipTop(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_clipTop(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_clipRight(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_clipRight(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_clipRight(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_clipRight(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_clipBottom(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_clipBottom(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_clipLeft(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_clipLeft(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_clipLeft(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_clipLeft(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_cssFloat(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_cssFloat(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_cssFloat(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_cssFloat(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_backgroundClip(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_backgroundClip(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_backgroundClip(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_backgroundClip(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_backgroundOrigin(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_backgroundOrigin(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_backgroundOrigin(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_backgroundOrigin(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_backgroundSize(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_backgroundSize(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_backgroundSize(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_backgroundSize(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_boxShadow(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_boxShadow(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_boxShadow(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_boxShadow(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_msTransform(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_msTransform(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_msTransform(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_msTransform(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_put_msTransformOrigin(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_msTransformOrigin(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration_get_msTransformOrigin(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_msTransformOrigin(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_length_Proxy(
    IHTMLCSSStyleDeclaration* This,
    LONG *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_parentRule_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_parentRule_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_getPropertyValue_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR bstrPropertyName,
    BSTR *pbstrPropertyValue);
void __RPC_STUB IHTMLCSSStyleDeclaration_getPropertyValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_getPropertyPriority_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR bstrPropertyName,
    BSTR *pbstrPropertyPriority);
void __RPC_STUB IHTMLCSSStyleDeclaration_getPropertyPriority_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_removeProperty_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR bstrPropertyName,
    BSTR *pbstrPropertyValue);
void __RPC_STUB IHTMLCSSStyleDeclaration_removeProperty_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_setProperty_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR bstrPropertyName,
    VARIANT *pvarPropertyValue,
    VARIANT *pvarPropertyPriority);
void __RPC_STUB IHTMLCSSStyleDeclaration_setProperty_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_item_Proxy(
    IHTMLCSSStyleDeclaration* This,
    LONG index,
    BSTR *pbstrPropertyName);
void __RPC_STUB IHTMLCSSStyleDeclaration_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_fontFamily_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_fontFamily_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_fontFamily_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_fontFamily_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_fontStyle_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_fontStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_fontStyle_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_fontStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_fontVariant_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_fontVariant_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_fontVariant_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_fontVariant_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_fontWeight_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_fontWeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_fontWeight_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_fontWeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_fontSize_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_fontSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_fontSize_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_fontSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_font_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_font_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_font_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_font_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_color_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_color_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_color_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_color_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_background_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_background_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_background_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_background_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_backgroundColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_backgroundColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_backgroundColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_backgroundColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_backgroundImage_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_backgroundImage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_backgroundImage_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_backgroundImage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_backgroundRepeat_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_backgroundRepeat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_backgroundRepeat_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_backgroundRepeat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_backgroundAttachment_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_backgroundAttachment_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_backgroundAttachment_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_backgroundAttachment_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_backgroundPosition_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_backgroundPosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_backgroundPosition_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_backgroundPosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_backgroundPositionX_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_backgroundPositionX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_backgroundPositionX_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_backgroundPositionX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_backgroundPositionY_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_backgroundPositionY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_backgroundPositionY_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_backgroundPositionY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_wordSpacing_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_wordSpacing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_wordSpacing_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_wordSpacing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_letterSpacing_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_letterSpacing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_letterSpacing_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_letterSpacing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_textDecoration_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_textDecoration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_textDecoration_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_textDecoration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_verticalAlign_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_verticalAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_verticalAlign_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_verticalAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_textTransform_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_textTransform_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_textTransform_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_textTransform_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_textAlign_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_textAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_textAlign_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_textAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_textIndent_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_textIndent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_textIndent_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_textIndent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_lineHeight_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_lineHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_lineHeight_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_lineHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_marginTop_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_marginTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_marginTop_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_marginTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_marginRight_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_marginRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_marginRight_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_marginRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_marginBottom_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_marginBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_marginBottom_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_marginBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_marginLeft_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_marginLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_marginLeft_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_marginLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_margin_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_margin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_margin_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_margin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_paddingTop_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_paddingTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_paddingTop_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_paddingTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_paddingRight_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_paddingRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_paddingRight_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_paddingRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_paddingBottom_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_paddingBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_paddingBottom_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_paddingBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_paddingLeft_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_paddingLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_paddingLeft_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_paddingLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_padding_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_padding_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_padding_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_padding_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_border_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_border_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_border_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_border_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_borderTop_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_borderTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_borderTop_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_borderTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_borderRight_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_borderRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_borderRight_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_borderRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_borderBottom_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_borderBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_borderBottom_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_borderBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_borderLeft_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_borderLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_borderLeft_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_borderLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_borderColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_borderColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_borderColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_borderColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_borderTopColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_borderTopColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_borderTopColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_borderTopColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_borderRightColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_borderRightColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_borderRightColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_borderRightColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_borderBottomColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_borderBottomColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_borderBottomColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_borderBottomColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_borderLeftColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_borderLeftColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_borderLeftColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_borderLeftColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_borderWidth_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_borderWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_borderWidth_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_borderWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_borderTopWidth_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_borderTopWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_borderTopWidth_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_borderTopWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_borderRightWidth_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_borderRightWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_borderRightWidth_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_borderRightWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_borderBottomWidth_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_borderBottomWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_borderBottomWidth_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_borderBottomWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_borderLeftWidth_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_borderLeftWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_borderLeftWidth_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_borderLeftWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_borderStyle_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_borderStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_borderStyle_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_borderStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_borderTopStyle_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_borderTopStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_borderTopStyle_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_borderTopStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_borderRightStyle_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_borderRightStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_borderRightStyle_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_borderRightStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_borderBottomStyle_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_borderBottomStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_borderBottomStyle_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_borderBottomStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_borderLeftStyle_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_borderLeftStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_borderLeftStyle_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_borderLeftStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_width_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_width_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_height_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_height_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_styleFloat_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_styleFloat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_styleFloat_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_styleFloat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_clear_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_clear_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_clear_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_clear_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_display_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_display_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_display_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_display_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_visibility_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_visibility_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_visibility_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_visibility_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_listStyleType_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_listStyleType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_listStyleType_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_listStyleType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_listStylePosition_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_listStylePosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_listStylePosition_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_listStylePosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_listStyleImage_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_listStyleImage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_listStyleImage_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_listStyleImage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_listStyle_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_listStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_listStyle_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_listStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_whiteSpace_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_whiteSpace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_whiteSpace_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_whiteSpace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_top_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_top_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_top_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_top_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_left_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_left_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_left_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_left_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_zIndex_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_zIndex_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_zIndex_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_zIndex_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_overflow_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_overflow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_overflow_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_overflow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_pageBreakBefore_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_pageBreakBefore_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_pageBreakBefore_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_pageBreakBefore_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_pageBreakAfter_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_pageBreakAfter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_pageBreakAfter_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_pageBreakAfter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_cssText_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_cssText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_cssText_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_cssText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_cursor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_cursor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_cursor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_cursor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_clip_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_clip_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_clip_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_clip_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_filter_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_filter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_filter_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_filter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_tableLayout_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_tableLayout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_tableLayout_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_tableLayout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_borderCollapse_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_borderCollapse_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_borderCollapse_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_borderCollapse_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_direction_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_direction_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_direction_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_direction_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_behavior_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_behavior_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_behavior_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_behavior_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_position_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_position_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_position_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_position_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_unicodeBidi_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_unicodeBidi_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_unicodeBidi_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_unicodeBidi_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_bottom_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_bottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_bottom_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_bottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_right_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_right_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_right_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_right_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_imeMode_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_imeMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_imeMode_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_imeMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_rubyAlign_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_rubyAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_rubyAlign_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_rubyAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_rubyPosition_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_rubyPosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_rubyPosition_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_rubyPosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_rubyOverhang_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_rubyOverhang_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_rubyOverhang_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_rubyOverhang_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_layoutGridChar_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_layoutGridChar_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_layoutGridChar_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_layoutGridChar_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_layoutGridLine_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_layoutGridLine_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_layoutGridLine_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_layoutGridLine_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_layoutGridMode_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_layoutGridMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_layoutGridMode_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_layoutGridMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_layoutGridType_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_layoutGridType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_layoutGridType_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_layoutGridType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_layoutGrid_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_layoutGrid_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_layoutGrid_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_layoutGrid_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_textAutospace_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_textAutospace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_textAutospace_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_textAutospace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_wordBreak_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_wordBreak_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_wordBreak_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_wordBreak_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_lineBreak_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_lineBreak_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_lineBreak_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_lineBreak_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_textJustify_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_textJustify_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_textJustify_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_textJustify_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_textJustifyTrim_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_textJustifyTrim_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_textJustifyTrim_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_textJustifyTrim_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_textKashida_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_textKashida_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_textKashida_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_textKashida_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_overflowX_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_overflowX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_overflowX_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_overflowX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_overflowY_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_overflowY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_overflowY_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_overflowY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_accelerator_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_accelerator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_accelerator_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_accelerator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_layoutFlow_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_layoutFlow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_layoutFlow_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_layoutFlow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_zoom_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_zoom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_zoom_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_zoom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_wordWrap_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_wordWrap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_wordWrap_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_wordWrap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_textUnderlinePosition_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_textUnderlinePosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_textUnderlinePosition_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_textUnderlinePosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_scrollbarBaseColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_scrollbarBaseColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_scrollbarBaseColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_scrollbarBaseColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_scrollbarFaceColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_scrollbarFaceColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_scrollbarFaceColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_scrollbarFaceColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_scrollbar3dLightColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_scrollbar3dLightColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_scrollbar3dLightColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_scrollbar3dLightColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_scrollbarShadowColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_scrollbarShadowColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_scrollbarShadowColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_scrollbarShadowColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_scrollbarHighlightColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_scrollbarHighlightColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_scrollbarHighlightColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_scrollbarHighlightColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_scrollbarDarkShadowColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_scrollbarDarkShadowColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_scrollbarDarkShadowColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_scrollbarDarkShadowColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_scrollbarArrowColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_scrollbarArrowColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_scrollbarArrowColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_scrollbarArrowColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_scrollbarTrackColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_scrollbarTrackColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_scrollbarTrackColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_scrollbarTrackColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_writingMode_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_writingMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_writingMode_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_writingMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_textAlignLast_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_textAlignLast_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_textAlignLast_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_textAlignLast_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_textKashidaSpace_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_textKashidaSpace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_textKashidaSpace_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_textKashidaSpace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_textOverflow_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_textOverflow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_textOverflow_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_textOverflow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_minHeight_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_minHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_minHeight_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_minHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_msInterpolationMode_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_msInterpolationMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_msInterpolationMode_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_msInterpolationMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_maxHeight_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_maxHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_maxHeight_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_maxHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_minWidth_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_minWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_minWidth_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_minWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_maxWidth_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_maxWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_maxWidth_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_maxWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_content_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_content_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_content_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_content_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_captionSide_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_captionSide_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_captionSide_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_captionSide_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_counterIncrement_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_counterIncrement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_counterIncrement_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_counterIncrement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_counterReset_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_counterReset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_counterReset_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_counterReset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_outline_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_outline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_outline_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_outline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_outlineWidth_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_outlineWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_outlineWidth_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_outlineWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_outlineStyle_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_outlineStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_outlineStyle_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_outlineStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_outlineColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_outlineColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_outlineColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_outlineColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_boxSizing_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_boxSizing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_boxSizing_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_boxSizing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_borderSpacing_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_borderSpacing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_borderSpacing_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_borderSpacing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_orphans_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_orphans_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_orphans_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_orphans_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_widows_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_widows_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_widows_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_widows_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_pageBreakInside_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_pageBreakInside_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_pageBreakInside_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_pageBreakInside_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_emptyCells_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_emptyCells_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_emptyCells_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_emptyCells_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_msBlockProgression_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_msBlockProgression_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_msBlockProgression_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_msBlockProgression_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_quotes_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_quotes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_quotes_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_quotes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_alignmentBaseline_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_alignmentBaseline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_alignmentBaseline_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_alignmentBaseline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_baselineShift_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_baselineShift_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_baselineShift_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_baselineShift_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_dominantBaseline_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_dominantBaseline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_dominantBaseline_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_dominantBaseline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_fontSizeAdjust_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_fontSizeAdjust_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_fontSizeAdjust_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_fontSizeAdjust_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_fontStretch_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_fontStretch_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_fontStretch_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_fontStretch_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_opacity_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_opacity_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_opacity_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_opacity_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_clipPath_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_clipPath_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_clipPath_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_clipPath_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_clipRule_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_clipRule_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_clipRule_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_clipRule_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_fill_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_fill_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_fill_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_fill_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_fillOpacity_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_fillOpacity_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_fillOpacity_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_fillOpacity_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_fillRule_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_fillRule_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_fillRule_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_fillRule_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_kerning_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_kerning_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_kerning_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_kerning_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_marker_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_marker_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_marker_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_marker_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_markerEnd_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_markerEnd_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_markerEnd_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_markerEnd_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_markerMid_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_markerMid_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_markerMid_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_markerMid_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_markerStart_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_markerStart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_markerStart_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_markerStart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_mask_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_mask_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_mask_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_mask_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_pointerEvents_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_pointerEvents_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_pointerEvents_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_pointerEvents_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_stopColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_stopColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_stopColor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_stopColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_stopOpacity_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_stopOpacity_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_stopOpacity_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_stopOpacity_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_stroke_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_stroke_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_stroke_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_stroke_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_strokeDasharray_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_strokeDasharray_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_strokeDasharray_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_strokeDasharray_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_strokeDashoffset_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_strokeDashoffset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_strokeDashoffset_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_strokeDashoffset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_strokeLinecap_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_strokeLinecap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_strokeLinecap_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_strokeLinecap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_strokeLinejoin_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_strokeLinejoin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_strokeLinejoin_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_strokeLinejoin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_strokeMiterlimit_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_strokeMiterlimit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_strokeMiterlimit_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_strokeMiterlimit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_strokeOpacity_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_strokeOpacity_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_strokeOpacity_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_strokeOpacity_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_strokeWidth_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_strokeWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_strokeWidth_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_strokeWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_textAnchor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_textAnchor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_textAnchor_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_textAnchor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_glyphOrientationHorizontal_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_glyphOrientationHorizontal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_glyphOrientationHorizontal_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_glyphOrientationHorizontal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_glyphOrientationVertical_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_glyphOrientationVertical_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_glyphOrientationVertical_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_glyphOrientationVertical_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_borderRadius_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_borderRadius_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_borderRadius_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_borderRadius_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_borderTopLeftRadius_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_borderTopLeftRadius_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_borderTopLeftRadius_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_borderTopLeftRadius_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_borderTopRightRadius_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_borderTopRightRadius_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_borderTopRightRadius_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_borderTopRightRadius_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_borderBottomRightRadius_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_borderBottomRightRadius_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_borderBottomRightRadius_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_borderBottomRightRadius_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_borderBottomLeftRadius_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_borderBottomLeftRadius_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_borderBottomLeftRadius_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_borderBottomLeftRadius_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_clipTop_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_clipTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_clipTop_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_clipTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_clipRight_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_clipRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_clipRight_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_clipRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_clipBottom_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_clipBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_clipLeft_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_clipLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_clipLeft_Proxy(
    IHTMLCSSStyleDeclaration* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_clipLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_cssFloat_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_cssFloat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_cssFloat_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_cssFloat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_backgroundClip_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_backgroundClip_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_backgroundClip_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_backgroundClip_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_backgroundOrigin_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_backgroundOrigin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_backgroundOrigin_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_backgroundOrigin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_backgroundSize_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_backgroundSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_backgroundSize_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_backgroundSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_boxShadow_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_boxShadow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_boxShadow_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_boxShadow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_msTransform_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_msTransform_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_msTransform_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_msTransform_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_put_msTransformOrigin_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration_put_msTransformOrigin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration_get_msTransformOrigin_Proxy(
    IHTMLCSSStyleDeclaration* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration_get_msTransformOrigin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLCSSStyleDeclaration_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLCSSStyleDeclaration2 interface
 */
#ifndef __IHTMLCSSStyleDeclaration2_INTERFACE_DEFINED__
#define __IHTMLCSSStyleDeclaration2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLCSSStyleDeclaration2, 0x305107d1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305107d1-98b5-11cf-bb82-00aa00bdce0b")
IHTMLCSSStyleDeclaration2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_msScrollChaining(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msScrollChaining(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msContentZooming(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msContentZooming(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msContentZoomSnapType(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msContentZoomSnapType(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msScrollRails(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msScrollRails(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msContentZoomChaining(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msContentZoomChaining(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msScrollSnapType(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msScrollSnapType(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msContentZoomLimit(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msContentZoomLimit(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msContentZoomSnap(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msContentZoomSnap(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msContentZoomSnapPoints(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msContentZoomSnapPoints(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msContentZoomLimitMin(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msContentZoomLimitMin(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msContentZoomLimitMax(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msContentZoomLimitMax(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msScrollSnapX(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msScrollSnapX(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msScrollSnapY(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msScrollSnapY(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msScrollSnapPointsX(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msScrollSnapPointsX(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msScrollSnapPointsY(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msScrollSnapPointsY(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msGridColumn(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msGridColumn(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msGridColumnAlign(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msGridColumnAlign(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msGridColumns(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msGridColumns(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msGridColumnSpan(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msGridColumnSpan(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msGridRow(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msGridRow(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msGridRowAlign(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msGridRowAlign(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msGridRows(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msGridRows(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msGridRowSpan(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msGridRowSpan(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msWrapThrough(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msWrapThrough(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msWrapMargin(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msWrapMargin(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msWrapFlow(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msWrapFlow(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msAnimationName(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msAnimationName(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msAnimationDuration(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msAnimationDuration(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msAnimationTimingFunction(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msAnimationTimingFunction(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msAnimationDelay(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msAnimationDelay(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msAnimationDirection(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msAnimationDirection(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msAnimationPlayState(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msAnimationPlayState(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msAnimationIterationCount(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msAnimationIterationCount(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msAnimation(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msAnimation(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msAnimationFillMode(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msAnimationFillMode(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_colorInterpolationFilters(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_colorInterpolationFilters(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_columnCount(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_columnCount(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_columnWidth(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_columnWidth(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_columnGap(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_columnGap(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_columnFill(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_columnFill(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_columnSpan(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_columnSpan(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_columns(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_columns(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_columnRule(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_columnRule(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_columnRuleColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_columnRuleColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_columnRuleStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_columnRuleStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_columnRuleWidth(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_columnRuleWidth(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_breakBefore(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_breakBefore(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_breakAfter(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_breakAfter(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_breakInside(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_breakInside(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_floodColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_floodColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_floodOpacity(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_floodOpacity(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_lightingColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_lightingColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msScrollLimitXMin(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msScrollLimitXMin(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msScrollLimitYMin(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msScrollLimitYMin(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msScrollLimitXMax(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msScrollLimitXMax(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msScrollLimitYMax(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msScrollLimitYMax(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msScrollLimit(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msScrollLimit(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textShadow(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textShadow(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msFlowFrom(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msFlowFrom(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msFlowInto(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msFlowInto(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msHyphens(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msHyphens(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msHyphenateLimitZone(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msHyphenateLimitZone(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msHyphenateLimitChars(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msHyphenateLimitChars(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msHyphenateLimitLines(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msHyphenateLimitLines(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msHighContrastAdjust(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msHighContrastAdjust(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_enableBackground(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_enableBackground(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msFontFeatureSettings(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msFontFeatureSettings(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msUserSelect(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msUserSelect(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msOverflowStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msOverflowStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msTransformStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msTransformStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msBackfaceVisibility(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msBackfaceVisibility(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msPerspective(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msPerspective(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msPerspectiveOrigin(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msPerspectiveOrigin(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msTransitionProperty(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msTransitionProperty(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msTransitionDuration(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msTransitionDuration(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msTransitionTimingFunction(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msTransitionTimingFunction(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msTransitionDelay(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msTransitionDelay(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msTransition(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msTransition(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msTouchAction(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msTouchAction(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msScrollTranslation(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msScrollTranslation(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msFlex(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msFlex(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msFlexPositive(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msFlexPositive(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msFlexNegative(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msFlexNegative(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msFlexPreferredSize(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msFlexPreferredSize(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msFlexFlow(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msFlexFlow(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msFlexDirection(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msFlexDirection(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msFlexWrap(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msFlexWrap(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msFlexAlign(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msFlexAlign(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msFlexItemAlign(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msFlexItemAlign(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msFlexPack(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msFlexPack(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msFlexLinePack(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msFlexLinePack(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msFlexOrder(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msFlexOrder(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msTouchSelect(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msTouchSelect(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_transform(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_transform(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_transformOrigin(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_transformOrigin(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_transformStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_transformStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_backfaceVisibility(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backfaceVisibility(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_perspective(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_perspective(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_perspectiveOrigin(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_perspectiveOrigin(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_transitionProperty(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_transitionProperty(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_transitionDuration(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_transitionDuration(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_transitionTimingFunction(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_transitionTimingFunction(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_transitionDelay(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_transitionDelay(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_transition(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_transition(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_fontFeatureSettings(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fontFeatureSettings(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_animationName(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_animationName(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_animationDuration(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_animationDuration(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_animationTimingFunction(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_animationTimingFunction(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_animationDelay(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_animationDelay(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_animationDirection(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_animationDirection(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_animationPlayState(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_animationPlayState(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_animationIterationCount(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_animationIterationCount(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_animation(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_animation(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_animationFillMode(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_animationFillMode(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLCSSStyleDeclaration2, 0x305107d1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLCSSStyleDeclaration2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLCSSStyleDeclaration2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_msScrollChaining)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msScrollChaining)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msContentZooming)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msContentZooming)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msContentZoomSnapType)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msContentZoomSnapType)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msScrollRails)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msScrollRails)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msContentZoomChaining)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msContentZoomChaining)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msScrollSnapType)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msScrollSnapType)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msContentZoomLimit)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msContentZoomLimit)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msContentZoomSnap)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msContentZoomSnap)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msContentZoomSnapPoints)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msContentZoomSnapPoints)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msContentZoomLimitMin)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_msContentZoomLimitMin)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_msContentZoomLimitMax)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_msContentZoomLimitMax)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_msScrollSnapX)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msScrollSnapX)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msScrollSnapY)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msScrollSnapY)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msScrollSnapPointsX)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msScrollSnapPointsX)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msScrollSnapPointsY)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msScrollSnapPointsY)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msGridColumn)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_msGridColumn)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_msGridColumnAlign)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msGridColumnAlign)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msGridColumns)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msGridColumns)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msGridColumnSpan)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_msGridColumnSpan)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_msGridRow)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_msGridRow)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_msGridRowAlign)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msGridRowAlign)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msGridRows)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msGridRows)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msGridRowSpan)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_msGridRowSpan)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_msWrapThrough)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msWrapThrough)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msWrapMargin)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_msWrapMargin)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_msWrapFlow)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msWrapFlow)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msAnimationName)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msAnimationName)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msAnimationDuration)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msAnimationDuration)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msAnimationTimingFunction)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msAnimationTimingFunction)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msAnimationDelay)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msAnimationDelay)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msAnimationDirection)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msAnimationDirection)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msAnimationPlayState)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msAnimationPlayState)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msAnimationIterationCount)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msAnimationIterationCount)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msAnimation)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msAnimation)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msAnimationFillMode)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msAnimationFillMode)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_colorInterpolationFilters)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_colorInterpolationFilters)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_columnCount)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_columnCount)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_columnWidth)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_columnWidth)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_columnGap)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_columnGap)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_columnFill)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_columnFill)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_columnSpan)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_columnSpan)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_columns)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_columns)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_columnRule)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_columnRule)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_columnRuleColor)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_columnRuleColor)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_columnRuleStyle)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_columnRuleStyle)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_columnRuleWidth)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_columnRuleWidth)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_breakBefore)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_breakBefore)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_breakAfter)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_breakAfter)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_breakInside)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_breakInside)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_floodColor)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_floodColor)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_floodOpacity)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_floodOpacity)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_lightingColor)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_lightingColor)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_msScrollLimitXMin)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_msScrollLimitXMin)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_msScrollLimitYMin)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_msScrollLimitYMin)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_msScrollLimitXMax)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_msScrollLimitXMax)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_msScrollLimitYMax)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_msScrollLimitYMax)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_msScrollLimit)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msScrollLimit)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textShadow)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textShadow)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msFlowFrom)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msFlowFrom)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msFlowInto)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msFlowInto)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msHyphens)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msHyphens)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msHyphenateLimitZone)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_msHyphenateLimitZone)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_msHyphenateLimitChars)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msHyphenateLimitChars)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msHyphenateLimitLines)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_msHyphenateLimitLines)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_msHighContrastAdjust)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msHighContrastAdjust)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_enableBackground)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_enableBackground)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msFontFeatureSettings)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msFontFeatureSettings)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msUserSelect)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msUserSelect)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msOverflowStyle)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msOverflowStyle)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msTransformStyle)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msTransformStyle)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msBackfaceVisibility)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msBackfaceVisibility)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msPerspective)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_msPerspective)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_msPerspectiveOrigin)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msPerspectiveOrigin)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msTransitionProperty)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msTransitionProperty)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msTransitionDuration)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msTransitionDuration)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msTransitionTimingFunction)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msTransitionTimingFunction)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msTransitionDelay)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msTransitionDelay)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msTransition)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msTransition)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msTouchAction)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msTouchAction)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msScrollTranslation)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msScrollTranslation)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msFlex)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msFlex)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msFlexPositive)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_msFlexPositive)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_msFlexNegative)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_msFlexNegative)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_msFlexPreferredSize)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_msFlexPreferredSize)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_msFlexFlow)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msFlexFlow)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msFlexDirection)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msFlexDirection)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msFlexWrap)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msFlexWrap)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msFlexAlign)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msFlexAlign)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msFlexItemAlign)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msFlexItemAlign)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msFlexPack)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msFlexPack)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msFlexLinePack)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msFlexLinePack)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msFlexOrder)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_msFlexOrder)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_msTouchSelect)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msTouchSelect)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_transform)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_transform)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_transformOrigin)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_transformOrigin)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_transformStyle)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_transformStyle)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_backfaceVisibility)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_backfaceVisibility)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_perspective)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_perspective)(
        IHTMLCSSStyleDeclaration2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_perspectiveOrigin)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_perspectiveOrigin)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_transitionProperty)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_transitionProperty)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_transitionDuration)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_transitionDuration)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_transitionTimingFunction)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_transitionTimingFunction)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_transitionDelay)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_transitionDelay)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_transition)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_transition)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_fontFeatureSettings)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_fontFeatureSettings)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_animationName)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_animationName)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_animationDuration)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_animationDuration)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_animationTimingFunction)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_animationTimingFunction)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_animationDelay)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_animationDelay)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_animationDirection)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_animationDirection)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_animationPlayState)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_animationPlayState)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_animationIterationCount)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_animationIterationCount)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_animation)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_animation)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_animationFillMode)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_animationFillMode)(
        IHTMLCSSStyleDeclaration2* This,
        BSTR *p);

    END_INTERFACE
} IHTMLCSSStyleDeclaration2Vtbl;
interface IHTMLCSSStyleDeclaration2 {
    CONST_VTBL IHTMLCSSStyleDeclaration2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLCSSStyleDeclaration2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLCSSStyleDeclaration2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLCSSStyleDeclaration2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLCSSStyleDeclaration2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLCSSStyleDeclaration2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLCSSStyleDeclaration2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLCSSStyleDeclaration2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLCSSStyleDeclaration2 methods ***/
#define IHTMLCSSStyleDeclaration2_put_msScrollChaining(This,v) (This)->lpVtbl->put_msScrollChaining(This,v)
#define IHTMLCSSStyleDeclaration2_get_msScrollChaining(This,p) (This)->lpVtbl->get_msScrollChaining(This,p)
#define IHTMLCSSStyleDeclaration2_put_msContentZooming(This,v) (This)->lpVtbl->put_msContentZooming(This,v)
#define IHTMLCSSStyleDeclaration2_get_msContentZooming(This,p) (This)->lpVtbl->get_msContentZooming(This,p)
#define IHTMLCSSStyleDeclaration2_put_msContentZoomSnapType(This,v) (This)->lpVtbl->put_msContentZoomSnapType(This,v)
#define IHTMLCSSStyleDeclaration2_get_msContentZoomSnapType(This,p) (This)->lpVtbl->get_msContentZoomSnapType(This,p)
#define IHTMLCSSStyleDeclaration2_put_msScrollRails(This,v) (This)->lpVtbl->put_msScrollRails(This,v)
#define IHTMLCSSStyleDeclaration2_get_msScrollRails(This,p) (This)->lpVtbl->get_msScrollRails(This,p)
#define IHTMLCSSStyleDeclaration2_put_msContentZoomChaining(This,v) (This)->lpVtbl->put_msContentZoomChaining(This,v)
#define IHTMLCSSStyleDeclaration2_get_msContentZoomChaining(This,p) (This)->lpVtbl->get_msContentZoomChaining(This,p)
#define IHTMLCSSStyleDeclaration2_put_msScrollSnapType(This,v) (This)->lpVtbl->put_msScrollSnapType(This,v)
#define IHTMLCSSStyleDeclaration2_get_msScrollSnapType(This,p) (This)->lpVtbl->get_msScrollSnapType(This,p)
#define IHTMLCSSStyleDeclaration2_put_msContentZoomLimit(This,v) (This)->lpVtbl->put_msContentZoomLimit(This,v)
#define IHTMLCSSStyleDeclaration2_get_msContentZoomLimit(This,p) (This)->lpVtbl->get_msContentZoomLimit(This,p)
#define IHTMLCSSStyleDeclaration2_put_msContentZoomSnap(This,v) (This)->lpVtbl->put_msContentZoomSnap(This,v)
#define IHTMLCSSStyleDeclaration2_get_msContentZoomSnap(This,p) (This)->lpVtbl->get_msContentZoomSnap(This,p)
#define IHTMLCSSStyleDeclaration2_put_msContentZoomSnapPoints(This,v) (This)->lpVtbl->put_msContentZoomSnapPoints(This,v)
#define IHTMLCSSStyleDeclaration2_get_msContentZoomSnapPoints(This,p) (This)->lpVtbl->get_msContentZoomSnapPoints(This,p)
#define IHTMLCSSStyleDeclaration2_put_msContentZoomLimitMin(This,v) (This)->lpVtbl->put_msContentZoomLimitMin(This,v)
#define IHTMLCSSStyleDeclaration2_get_msContentZoomLimitMin(This,p) (This)->lpVtbl->get_msContentZoomLimitMin(This,p)
#define IHTMLCSSStyleDeclaration2_put_msContentZoomLimitMax(This,v) (This)->lpVtbl->put_msContentZoomLimitMax(This,v)
#define IHTMLCSSStyleDeclaration2_get_msContentZoomLimitMax(This,p) (This)->lpVtbl->get_msContentZoomLimitMax(This,p)
#define IHTMLCSSStyleDeclaration2_put_msScrollSnapX(This,v) (This)->lpVtbl->put_msScrollSnapX(This,v)
#define IHTMLCSSStyleDeclaration2_get_msScrollSnapX(This,p) (This)->lpVtbl->get_msScrollSnapX(This,p)
#define IHTMLCSSStyleDeclaration2_put_msScrollSnapY(This,v) (This)->lpVtbl->put_msScrollSnapY(This,v)
#define IHTMLCSSStyleDeclaration2_get_msScrollSnapY(This,p) (This)->lpVtbl->get_msScrollSnapY(This,p)
#define IHTMLCSSStyleDeclaration2_put_msScrollSnapPointsX(This,v) (This)->lpVtbl->put_msScrollSnapPointsX(This,v)
#define IHTMLCSSStyleDeclaration2_get_msScrollSnapPointsX(This,p) (This)->lpVtbl->get_msScrollSnapPointsX(This,p)
#define IHTMLCSSStyleDeclaration2_put_msScrollSnapPointsY(This,v) (This)->lpVtbl->put_msScrollSnapPointsY(This,v)
#define IHTMLCSSStyleDeclaration2_get_msScrollSnapPointsY(This,p) (This)->lpVtbl->get_msScrollSnapPointsY(This,p)
#define IHTMLCSSStyleDeclaration2_put_msGridColumn(This,v) (This)->lpVtbl->put_msGridColumn(This,v)
#define IHTMLCSSStyleDeclaration2_get_msGridColumn(This,p) (This)->lpVtbl->get_msGridColumn(This,p)
#define IHTMLCSSStyleDeclaration2_put_msGridColumnAlign(This,v) (This)->lpVtbl->put_msGridColumnAlign(This,v)
#define IHTMLCSSStyleDeclaration2_get_msGridColumnAlign(This,p) (This)->lpVtbl->get_msGridColumnAlign(This,p)
#define IHTMLCSSStyleDeclaration2_put_msGridColumns(This,v) (This)->lpVtbl->put_msGridColumns(This,v)
#define IHTMLCSSStyleDeclaration2_get_msGridColumns(This,p) (This)->lpVtbl->get_msGridColumns(This,p)
#define IHTMLCSSStyleDeclaration2_put_msGridColumnSpan(This,v) (This)->lpVtbl->put_msGridColumnSpan(This,v)
#define IHTMLCSSStyleDeclaration2_get_msGridColumnSpan(This,p) (This)->lpVtbl->get_msGridColumnSpan(This,p)
#define IHTMLCSSStyleDeclaration2_put_msGridRow(This,v) (This)->lpVtbl->put_msGridRow(This,v)
#define IHTMLCSSStyleDeclaration2_get_msGridRow(This,p) (This)->lpVtbl->get_msGridRow(This,p)
#define IHTMLCSSStyleDeclaration2_put_msGridRowAlign(This,v) (This)->lpVtbl->put_msGridRowAlign(This,v)
#define IHTMLCSSStyleDeclaration2_get_msGridRowAlign(This,p) (This)->lpVtbl->get_msGridRowAlign(This,p)
#define IHTMLCSSStyleDeclaration2_put_msGridRows(This,v) (This)->lpVtbl->put_msGridRows(This,v)
#define IHTMLCSSStyleDeclaration2_get_msGridRows(This,p) (This)->lpVtbl->get_msGridRows(This,p)
#define IHTMLCSSStyleDeclaration2_put_msGridRowSpan(This,v) (This)->lpVtbl->put_msGridRowSpan(This,v)
#define IHTMLCSSStyleDeclaration2_get_msGridRowSpan(This,p) (This)->lpVtbl->get_msGridRowSpan(This,p)
#define IHTMLCSSStyleDeclaration2_put_msWrapThrough(This,v) (This)->lpVtbl->put_msWrapThrough(This,v)
#define IHTMLCSSStyleDeclaration2_get_msWrapThrough(This,p) (This)->lpVtbl->get_msWrapThrough(This,p)
#define IHTMLCSSStyleDeclaration2_put_msWrapMargin(This,v) (This)->lpVtbl->put_msWrapMargin(This,v)
#define IHTMLCSSStyleDeclaration2_get_msWrapMargin(This,p) (This)->lpVtbl->get_msWrapMargin(This,p)
#define IHTMLCSSStyleDeclaration2_put_msWrapFlow(This,v) (This)->lpVtbl->put_msWrapFlow(This,v)
#define IHTMLCSSStyleDeclaration2_get_msWrapFlow(This,p) (This)->lpVtbl->get_msWrapFlow(This,p)
#define IHTMLCSSStyleDeclaration2_put_msAnimationName(This,v) (This)->lpVtbl->put_msAnimationName(This,v)
#define IHTMLCSSStyleDeclaration2_get_msAnimationName(This,p) (This)->lpVtbl->get_msAnimationName(This,p)
#define IHTMLCSSStyleDeclaration2_put_msAnimationDuration(This,v) (This)->lpVtbl->put_msAnimationDuration(This,v)
#define IHTMLCSSStyleDeclaration2_get_msAnimationDuration(This,p) (This)->lpVtbl->get_msAnimationDuration(This,p)
#define IHTMLCSSStyleDeclaration2_put_msAnimationTimingFunction(This,v) (This)->lpVtbl->put_msAnimationTimingFunction(This,v)
#define IHTMLCSSStyleDeclaration2_get_msAnimationTimingFunction(This,p) (This)->lpVtbl->get_msAnimationTimingFunction(This,p)
#define IHTMLCSSStyleDeclaration2_put_msAnimationDelay(This,v) (This)->lpVtbl->put_msAnimationDelay(This,v)
#define IHTMLCSSStyleDeclaration2_get_msAnimationDelay(This,p) (This)->lpVtbl->get_msAnimationDelay(This,p)
#define IHTMLCSSStyleDeclaration2_put_msAnimationDirection(This,v) (This)->lpVtbl->put_msAnimationDirection(This,v)
#define IHTMLCSSStyleDeclaration2_get_msAnimationDirection(This,p) (This)->lpVtbl->get_msAnimationDirection(This,p)
#define IHTMLCSSStyleDeclaration2_put_msAnimationPlayState(This,v) (This)->lpVtbl->put_msAnimationPlayState(This,v)
#define IHTMLCSSStyleDeclaration2_get_msAnimationPlayState(This,p) (This)->lpVtbl->get_msAnimationPlayState(This,p)
#define IHTMLCSSStyleDeclaration2_put_msAnimationIterationCount(This,v) (This)->lpVtbl->put_msAnimationIterationCount(This,v)
#define IHTMLCSSStyleDeclaration2_get_msAnimationIterationCount(This,p) (This)->lpVtbl->get_msAnimationIterationCount(This,p)
#define IHTMLCSSStyleDeclaration2_put_msAnimation(This,v) (This)->lpVtbl->put_msAnimation(This,v)
#define IHTMLCSSStyleDeclaration2_get_msAnimation(This,p) (This)->lpVtbl->get_msAnimation(This,p)
#define IHTMLCSSStyleDeclaration2_put_msAnimationFillMode(This,v) (This)->lpVtbl->put_msAnimationFillMode(This,v)
#define IHTMLCSSStyleDeclaration2_get_msAnimationFillMode(This,p) (This)->lpVtbl->get_msAnimationFillMode(This,p)
#define IHTMLCSSStyleDeclaration2_put_colorInterpolationFilters(This,v) (This)->lpVtbl->put_colorInterpolationFilters(This,v)
#define IHTMLCSSStyleDeclaration2_get_colorInterpolationFilters(This,p) (This)->lpVtbl->get_colorInterpolationFilters(This,p)
#define IHTMLCSSStyleDeclaration2_put_columnCount(This,v) (This)->lpVtbl->put_columnCount(This,v)
#define IHTMLCSSStyleDeclaration2_get_columnCount(This,p) (This)->lpVtbl->get_columnCount(This,p)
#define IHTMLCSSStyleDeclaration2_put_columnWidth(This,v) (This)->lpVtbl->put_columnWidth(This,v)
#define IHTMLCSSStyleDeclaration2_get_columnWidth(This,p) (This)->lpVtbl->get_columnWidth(This,p)
#define IHTMLCSSStyleDeclaration2_put_columnGap(This,v) (This)->lpVtbl->put_columnGap(This,v)
#define IHTMLCSSStyleDeclaration2_get_columnGap(This,p) (This)->lpVtbl->get_columnGap(This,p)
#define IHTMLCSSStyleDeclaration2_put_columnFill(This,v) (This)->lpVtbl->put_columnFill(This,v)
#define IHTMLCSSStyleDeclaration2_get_columnFill(This,p) (This)->lpVtbl->get_columnFill(This,p)
#define IHTMLCSSStyleDeclaration2_put_columnSpan(This,v) (This)->lpVtbl->put_columnSpan(This,v)
#define IHTMLCSSStyleDeclaration2_get_columnSpan(This,p) (This)->lpVtbl->get_columnSpan(This,p)
#define IHTMLCSSStyleDeclaration2_put_columns(This,v) (This)->lpVtbl->put_columns(This,v)
#define IHTMLCSSStyleDeclaration2_get_columns(This,p) (This)->lpVtbl->get_columns(This,p)
#define IHTMLCSSStyleDeclaration2_put_columnRule(This,v) (This)->lpVtbl->put_columnRule(This,v)
#define IHTMLCSSStyleDeclaration2_get_columnRule(This,p) (This)->lpVtbl->get_columnRule(This,p)
#define IHTMLCSSStyleDeclaration2_put_columnRuleColor(This,v) (This)->lpVtbl->put_columnRuleColor(This,v)
#define IHTMLCSSStyleDeclaration2_get_columnRuleColor(This,p) (This)->lpVtbl->get_columnRuleColor(This,p)
#define IHTMLCSSStyleDeclaration2_put_columnRuleStyle(This,v) (This)->lpVtbl->put_columnRuleStyle(This,v)
#define IHTMLCSSStyleDeclaration2_get_columnRuleStyle(This,p) (This)->lpVtbl->get_columnRuleStyle(This,p)
#define IHTMLCSSStyleDeclaration2_put_columnRuleWidth(This,v) (This)->lpVtbl->put_columnRuleWidth(This,v)
#define IHTMLCSSStyleDeclaration2_get_columnRuleWidth(This,p) (This)->lpVtbl->get_columnRuleWidth(This,p)
#define IHTMLCSSStyleDeclaration2_put_breakBefore(This,v) (This)->lpVtbl->put_breakBefore(This,v)
#define IHTMLCSSStyleDeclaration2_get_breakBefore(This,p) (This)->lpVtbl->get_breakBefore(This,p)
#define IHTMLCSSStyleDeclaration2_put_breakAfter(This,v) (This)->lpVtbl->put_breakAfter(This,v)
#define IHTMLCSSStyleDeclaration2_get_breakAfter(This,p) (This)->lpVtbl->get_breakAfter(This,p)
#define IHTMLCSSStyleDeclaration2_put_breakInside(This,v) (This)->lpVtbl->put_breakInside(This,v)
#define IHTMLCSSStyleDeclaration2_get_breakInside(This,p) (This)->lpVtbl->get_breakInside(This,p)
#define IHTMLCSSStyleDeclaration2_put_floodColor(This,v) (This)->lpVtbl->put_floodColor(This,v)
#define IHTMLCSSStyleDeclaration2_get_floodColor(This,p) (This)->lpVtbl->get_floodColor(This,p)
#define IHTMLCSSStyleDeclaration2_put_floodOpacity(This,v) (This)->lpVtbl->put_floodOpacity(This,v)
#define IHTMLCSSStyleDeclaration2_get_floodOpacity(This,p) (This)->lpVtbl->get_floodOpacity(This,p)
#define IHTMLCSSStyleDeclaration2_put_lightingColor(This,v) (This)->lpVtbl->put_lightingColor(This,v)
#define IHTMLCSSStyleDeclaration2_get_lightingColor(This,p) (This)->lpVtbl->get_lightingColor(This,p)
#define IHTMLCSSStyleDeclaration2_put_msScrollLimitXMin(This,v) (This)->lpVtbl->put_msScrollLimitXMin(This,v)
#define IHTMLCSSStyleDeclaration2_get_msScrollLimitXMin(This,p) (This)->lpVtbl->get_msScrollLimitXMin(This,p)
#define IHTMLCSSStyleDeclaration2_put_msScrollLimitYMin(This,v) (This)->lpVtbl->put_msScrollLimitYMin(This,v)
#define IHTMLCSSStyleDeclaration2_get_msScrollLimitYMin(This,p) (This)->lpVtbl->get_msScrollLimitYMin(This,p)
#define IHTMLCSSStyleDeclaration2_put_msScrollLimitXMax(This,v) (This)->lpVtbl->put_msScrollLimitXMax(This,v)
#define IHTMLCSSStyleDeclaration2_get_msScrollLimitXMax(This,p) (This)->lpVtbl->get_msScrollLimitXMax(This,p)
#define IHTMLCSSStyleDeclaration2_put_msScrollLimitYMax(This,v) (This)->lpVtbl->put_msScrollLimitYMax(This,v)
#define IHTMLCSSStyleDeclaration2_get_msScrollLimitYMax(This,p) (This)->lpVtbl->get_msScrollLimitYMax(This,p)
#define IHTMLCSSStyleDeclaration2_put_msScrollLimit(This,v) (This)->lpVtbl->put_msScrollLimit(This,v)
#define IHTMLCSSStyleDeclaration2_get_msScrollLimit(This,p) (This)->lpVtbl->get_msScrollLimit(This,p)
#define IHTMLCSSStyleDeclaration2_put_textShadow(This,v) (This)->lpVtbl->put_textShadow(This,v)
#define IHTMLCSSStyleDeclaration2_get_textShadow(This,p) (This)->lpVtbl->get_textShadow(This,p)
#define IHTMLCSSStyleDeclaration2_put_msFlowFrom(This,v) (This)->lpVtbl->put_msFlowFrom(This,v)
#define IHTMLCSSStyleDeclaration2_get_msFlowFrom(This,p) (This)->lpVtbl->get_msFlowFrom(This,p)
#define IHTMLCSSStyleDeclaration2_put_msFlowInto(This,v) (This)->lpVtbl->put_msFlowInto(This,v)
#define IHTMLCSSStyleDeclaration2_get_msFlowInto(This,p) (This)->lpVtbl->get_msFlowInto(This,p)
#define IHTMLCSSStyleDeclaration2_put_msHyphens(This,v) (This)->lpVtbl->put_msHyphens(This,v)
#define IHTMLCSSStyleDeclaration2_get_msHyphens(This,p) (This)->lpVtbl->get_msHyphens(This,p)
#define IHTMLCSSStyleDeclaration2_put_msHyphenateLimitZone(This,v) (This)->lpVtbl->put_msHyphenateLimitZone(This,v)
#define IHTMLCSSStyleDeclaration2_get_msHyphenateLimitZone(This,p) (This)->lpVtbl->get_msHyphenateLimitZone(This,p)
#define IHTMLCSSStyleDeclaration2_put_msHyphenateLimitChars(This,v) (This)->lpVtbl->put_msHyphenateLimitChars(This,v)
#define IHTMLCSSStyleDeclaration2_get_msHyphenateLimitChars(This,p) (This)->lpVtbl->get_msHyphenateLimitChars(This,p)
#define IHTMLCSSStyleDeclaration2_put_msHyphenateLimitLines(This,v) (This)->lpVtbl->put_msHyphenateLimitLines(This,v)
#define IHTMLCSSStyleDeclaration2_get_msHyphenateLimitLines(This,p) (This)->lpVtbl->get_msHyphenateLimitLines(This,p)
#define IHTMLCSSStyleDeclaration2_put_msHighContrastAdjust(This,v) (This)->lpVtbl->put_msHighContrastAdjust(This,v)
#define IHTMLCSSStyleDeclaration2_get_msHighContrastAdjust(This,p) (This)->lpVtbl->get_msHighContrastAdjust(This,p)
#define IHTMLCSSStyleDeclaration2_put_enableBackground(This,v) (This)->lpVtbl->put_enableBackground(This,v)
#define IHTMLCSSStyleDeclaration2_get_enableBackground(This,p) (This)->lpVtbl->get_enableBackground(This,p)
#define IHTMLCSSStyleDeclaration2_put_msFontFeatureSettings(This,v) (This)->lpVtbl->put_msFontFeatureSettings(This,v)
#define IHTMLCSSStyleDeclaration2_get_msFontFeatureSettings(This,p) (This)->lpVtbl->get_msFontFeatureSettings(This,p)
#define IHTMLCSSStyleDeclaration2_put_msUserSelect(This,v) (This)->lpVtbl->put_msUserSelect(This,v)
#define IHTMLCSSStyleDeclaration2_get_msUserSelect(This,p) (This)->lpVtbl->get_msUserSelect(This,p)
#define IHTMLCSSStyleDeclaration2_put_msOverflowStyle(This,v) (This)->lpVtbl->put_msOverflowStyle(This,v)
#define IHTMLCSSStyleDeclaration2_get_msOverflowStyle(This,p) (This)->lpVtbl->get_msOverflowStyle(This,p)
#define IHTMLCSSStyleDeclaration2_put_msTransformStyle(This,v) (This)->lpVtbl->put_msTransformStyle(This,v)
#define IHTMLCSSStyleDeclaration2_get_msTransformStyle(This,p) (This)->lpVtbl->get_msTransformStyle(This,p)
#define IHTMLCSSStyleDeclaration2_put_msBackfaceVisibility(This,v) (This)->lpVtbl->put_msBackfaceVisibility(This,v)
#define IHTMLCSSStyleDeclaration2_get_msBackfaceVisibility(This,p) (This)->lpVtbl->get_msBackfaceVisibility(This,p)
#define IHTMLCSSStyleDeclaration2_put_msPerspective(This,v) (This)->lpVtbl->put_msPerspective(This,v)
#define IHTMLCSSStyleDeclaration2_get_msPerspective(This,p) (This)->lpVtbl->get_msPerspective(This,p)
#define IHTMLCSSStyleDeclaration2_put_msPerspectiveOrigin(This,v) (This)->lpVtbl->put_msPerspectiveOrigin(This,v)
#define IHTMLCSSStyleDeclaration2_get_msPerspectiveOrigin(This,p) (This)->lpVtbl->get_msPerspectiveOrigin(This,p)
#define IHTMLCSSStyleDeclaration2_put_msTransitionProperty(This,v) (This)->lpVtbl->put_msTransitionProperty(This,v)
#define IHTMLCSSStyleDeclaration2_get_msTransitionProperty(This,p) (This)->lpVtbl->get_msTransitionProperty(This,p)
#define IHTMLCSSStyleDeclaration2_put_msTransitionDuration(This,v) (This)->lpVtbl->put_msTransitionDuration(This,v)
#define IHTMLCSSStyleDeclaration2_get_msTransitionDuration(This,p) (This)->lpVtbl->get_msTransitionDuration(This,p)
#define IHTMLCSSStyleDeclaration2_put_msTransitionTimingFunction(This,v) (This)->lpVtbl->put_msTransitionTimingFunction(This,v)
#define IHTMLCSSStyleDeclaration2_get_msTransitionTimingFunction(This,p) (This)->lpVtbl->get_msTransitionTimingFunction(This,p)
#define IHTMLCSSStyleDeclaration2_put_msTransitionDelay(This,v) (This)->lpVtbl->put_msTransitionDelay(This,v)
#define IHTMLCSSStyleDeclaration2_get_msTransitionDelay(This,p) (This)->lpVtbl->get_msTransitionDelay(This,p)
#define IHTMLCSSStyleDeclaration2_put_msTransition(This,v) (This)->lpVtbl->put_msTransition(This,v)
#define IHTMLCSSStyleDeclaration2_get_msTransition(This,p) (This)->lpVtbl->get_msTransition(This,p)
#define IHTMLCSSStyleDeclaration2_put_msTouchAction(This,v) (This)->lpVtbl->put_msTouchAction(This,v)
#define IHTMLCSSStyleDeclaration2_get_msTouchAction(This,p) (This)->lpVtbl->get_msTouchAction(This,p)
#define IHTMLCSSStyleDeclaration2_put_msScrollTranslation(This,v) (This)->lpVtbl->put_msScrollTranslation(This,v)
#define IHTMLCSSStyleDeclaration2_get_msScrollTranslation(This,p) (This)->lpVtbl->get_msScrollTranslation(This,p)
#define IHTMLCSSStyleDeclaration2_put_msFlex(This,v) (This)->lpVtbl->put_msFlex(This,v)
#define IHTMLCSSStyleDeclaration2_get_msFlex(This,p) (This)->lpVtbl->get_msFlex(This,p)
#define IHTMLCSSStyleDeclaration2_put_msFlexPositive(This,v) (This)->lpVtbl->put_msFlexPositive(This,v)
#define IHTMLCSSStyleDeclaration2_get_msFlexPositive(This,p) (This)->lpVtbl->get_msFlexPositive(This,p)
#define IHTMLCSSStyleDeclaration2_put_msFlexNegative(This,v) (This)->lpVtbl->put_msFlexNegative(This,v)
#define IHTMLCSSStyleDeclaration2_get_msFlexNegative(This,p) (This)->lpVtbl->get_msFlexNegative(This,p)
#define IHTMLCSSStyleDeclaration2_put_msFlexPreferredSize(This,v) (This)->lpVtbl->put_msFlexPreferredSize(This,v)
#define IHTMLCSSStyleDeclaration2_get_msFlexPreferredSize(This,p) (This)->lpVtbl->get_msFlexPreferredSize(This,p)
#define IHTMLCSSStyleDeclaration2_put_msFlexFlow(This,v) (This)->lpVtbl->put_msFlexFlow(This,v)
#define IHTMLCSSStyleDeclaration2_get_msFlexFlow(This,p) (This)->lpVtbl->get_msFlexFlow(This,p)
#define IHTMLCSSStyleDeclaration2_put_msFlexDirection(This,v) (This)->lpVtbl->put_msFlexDirection(This,v)
#define IHTMLCSSStyleDeclaration2_get_msFlexDirection(This,p) (This)->lpVtbl->get_msFlexDirection(This,p)
#define IHTMLCSSStyleDeclaration2_put_msFlexWrap(This,v) (This)->lpVtbl->put_msFlexWrap(This,v)
#define IHTMLCSSStyleDeclaration2_get_msFlexWrap(This,p) (This)->lpVtbl->get_msFlexWrap(This,p)
#define IHTMLCSSStyleDeclaration2_put_msFlexAlign(This,v) (This)->lpVtbl->put_msFlexAlign(This,v)
#define IHTMLCSSStyleDeclaration2_get_msFlexAlign(This,p) (This)->lpVtbl->get_msFlexAlign(This,p)
#define IHTMLCSSStyleDeclaration2_put_msFlexItemAlign(This,v) (This)->lpVtbl->put_msFlexItemAlign(This,v)
#define IHTMLCSSStyleDeclaration2_get_msFlexItemAlign(This,p) (This)->lpVtbl->get_msFlexItemAlign(This,p)
#define IHTMLCSSStyleDeclaration2_put_msFlexPack(This,v) (This)->lpVtbl->put_msFlexPack(This,v)
#define IHTMLCSSStyleDeclaration2_get_msFlexPack(This,p) (This)->lpVtbl->get_msFlexPack(This,p)
#define IHTMLCSSStyleDeclaration2_put_msFlexLinePack(This,v) (This)->lpVtbl->put_msFlexLinePack(This,v)
#define IHTMLCSSStyleDeclaration2_get_msFlexLinePack(This,p) (This)->lpVtbl->get_msFlexLinePack(This,p)
#define IHTMLCSSStyleDeclaration2_put_msFlexOrder(This,v) (This)->lpVtbl->put_msFlexOrder(This,v)
#define IHTMLCSSStyleDeclaration2_get_msFlexOrder(This,p) (This)->lpVtbl->get_msFlexOrder(This,p)
#define IHTMLCSSStyleDeclaration2_put_msTouchSelect(This,v) (This)->lpVtbl->put_msTouchSelect(This,v)
#define IHTMLCSSStyleDeclaration2_get_msTouchSelect(This,p) (This)->lpVtbl->get_msTouchSelect(This,p)
#define IHTMLCSSStyleDeclaration2_put_transform(This,v) (This)->lpVtbl->put_transform(This,v)
#define IHTMLCSSStyleDeclaration2_get_transform(This,p) (This)->lpVtbl->get_transform(This,p)
#define IHTMLCSSStyleDeclaration2_put_transformOrigin(This,v) (This)->lpVtbl->put_transformOrigin(This,v)
#define IHTMLCSSStyleDeclaration2_get_transformOrigin(This,p) (This)->lpVtbl->get_transformOrigin(This,p)
#define IHTMLCSSStyleDeclaration2_put_transformStyle(This,v) (This)->lpVtbl->put_transformStyle(This,v)
#define IHTMLCSSStyleDeclaration2_get_transformStyle(This,p) (This)->lpVtbl->get_transformStyle(This,p)
#define IHTMLCSSStyleDeclaration2_put_backfaceVisibility(This,v) (This)->lpVtbl->put_backfaceVisibility(This,v)
#define IHTMLCSSStyleDeclaration2_get_backfaceVisibility(This,p) (This)->lpVtbl->get_backfaceVisibility(This,p)
#define IHTMLCSSStyleDeclaration2_put_perspective(This,v) (This)->lpVtbl->put_perspective(This,v)
#define IHTMLCSSStyleDeclaration2_get_perspective(This,p) (This)->lpVtbl->get_perspective(This,p)
#define IHTMLCSSStyleDeclaration2_put_perspectiveOrigin(This,v) (This)->lpVtbl->put_perspectiveOrigin(This,v)
#define IHTMLCSSStyleDeclaration2_get_perspectiveOrigin(This,p) (This)->lpVtbl->get_perspectiveOrigin(This,p)
#define IHTMLCSSStyleDeclaration2_put_transitionProperty(This,v) (This)->lpVtbl->put_transitionProperty(This,v)
#define IHTMLCSSStyleDeclaration2_get_transitionProperty(This,p) (This)->lpVtbl->get_transitionProperty(This,p)
#define IHTMLCSSStyleDeclaration2_put_transitionDuration(This,v) (This)->lpVtbl->put_transitionDuration(This,v)
#define IHTMLCSSStyleDeclaration2_get_transitionDuration(This,p) (This)->lpVtbl->get_transitionDuration(This,p)
#define IHTMLCSSStyleDeclaration2_put_transitionTimingFunction(This,v) (This)->lpVtbl->put_transitionTimingFunction(This,v)
#define IHTMLCSSStyleDeclaration2_get_transitionTimingFunction(This,p) (This)->lpVtbl->get_transitionTimingFunction(This,p)
#define IHTMLCSSStyleDeclaration2_put_transitionDelay(This,v) (This)->lpVtbl->put_transitionDelay(This,v)
#define IHTMLCSSStyleDeclaration2_get_transitionDelay(This,p) (This)->lpVtbl->get_transitionDelay(This,p)
#define IHTMLCSSStyleDeclaration2_put_transition(This,v) (This)->lpVtbl->put_transition(This,v)
#define IHTMLCSSStyleDeclaration2_get_transition(This,p) (This)->lpVtbl->get_transition(This,p)
#define IHTMLCSSStyleDeclaration2_put_fontFeatureSettings(This,v) (This)->lpVtbl->put_fontFeatureSettings(This,v)
#define IHTMLCSSStyleDeclaration2_get_fontFeatureSettings(This,p) (This)->lpVtbl->get_fontFeatureSettings(This,p)
#define IHTMLCSSStyleDeclaration2_put_animationName(This,v) (This)->lpVtbl->put_animationName(This,v)
#define IHTMLCSSStyleDeclaration2_get_animationName(This,p) (This)->lpVtbl->get_animationName(This,p)
#define IHTMLCSSStyleDeclaration2_put_animationDuration(This,v) (This)->lpVtbl->put_animationDuration(This,v)
#define IHTMLCSSStyleDeclaration2_get_animationDuration(This,p) (This)->lpVtbl->get_animationDuration(This,p)
#define IHTMLCSSStyleDeclaration2_put_animationTimingFunction(This,v) (This)->lpVtbl->put_animationTimingFunction(This,v)
#define IHTMLCSSStyleDeclaration2_get_animationTimingFunction(This,p) (This)->lpVtbl->get_animationTimingFunction(This,p)
#define IHTMLCSSStyleDeclaration2_put_animationDelay(This,v) (This)->lpVtbl->put_animationDelay(This,v)
#define IHTMLCSSStyleDeclaration2_get_animationDelay(This,p) (This)->lpVtbl->get_animationDelay(This,p)
#define IHTMLCSSStyleDeclaration2_put_animationDirection(This,v) (This)->lpVtbl->put_animationDirection(This,v)
#define IHTMLCSSStyleDeclaration2_get_animationDirection(This,p) (This)->lpVtbl->get_animationDirection(This,p)
#define IHTMLCSSStyleDeclaration2_put_animationPlayState(This,v) (This)->lpVtbl->put_animationPlayState(This,v)
#define IHTMLCSSStyleDeclaration2_get_animationPlayState(This,p) (This)->lpVtbl->get_animationPlayState(This,p)
#define IHTMLCSSStyleDeclaration2_put_animationIterationCount(This,v) (This)->lpVtbl->put_animationIterationCount(This,v)
#define IHTMLCSSStyleDeclaration2_get_animationIterationCount(This,p) (This)->lpVtbl->get_animationIterationCount(This,p)
#define IHTMLCSSStyleDeclaration2_put_animation(This,v) (This)->lpVtbl->put_animation(This,v)
#define IHTMLCSSStyleDeclaration2_get_animation(This,p) (This)->lpVtbl->get_animation(This,p)
#define IHTMLCSSStyleDeclaration2_put_animationFillMode(This,v) (This)->lpVtbl->put_animationFillMode(This,v)
#define IHTMLCSSStyleDeclaration2_get_animationFillMode(This,p) (This)->lpVtbl->get_animationFillMode(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_QueryInterface(IHTMLCSSStyleDeclaration2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLCSSStyleDeclaration2_AddRef(IHTMLCSSStyleDeclaration2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLCSSStyleDeclaration2_Release(IHTMLCSSStyleDeclaration2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_GetTypeInfoCount(IHTMLCSSStyleDeclaration2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_GetTypeInfo(IHTMLCSSStyleDeclaration2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_GetIDsOfNames(IHTMLCSSStyleDeclaration2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_Invoke(IHTMLCSSStyleDeclaration2* 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);
}
/*** IHTMLCSSStyleDeclaration2 methods ***/
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msScrollChaining(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msScrollChaining(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msScrollChaining(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msScrollChaining(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msContentZooming(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msContentZooming(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msContentZooming(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msContentZooming(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msContentZoomSnapType(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msContentZoomSnapType(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msContentZoomSnapType(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msContentZoomSnapType(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msScrollRails(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msScrollRails(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msScrollRails(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msScrollRails(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msContentZoomChaining(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msContentZoomChaining(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msContentZoomChaining(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msContentZoomChaining(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msScrollSnapType(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msScrollSnapType(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msScrollSnapType(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msScrollSnapType(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msContentZoomLimit(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msContentZoomLimit(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msContentZoomLimit(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msContentZoomLimit(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msContentZoomSnap(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msContentZoomSnap(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msContentZoomSnap(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msContentZoomSnap(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msContentZoomSnapPoints(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msContentZoomSnapPoints(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msContentZoomSnapPoints(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msContentZoomSnapPoints(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msContentZoomLimitMin(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msContentZoomLimitMin(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msContentZoomLimitMin(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msContentZoomLimitMin(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msContentZoomLimitMax(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msContentZoomLimitMax(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msContentZoomLimitMax(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msContentZoomLimitMax(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msScrollSnapX(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msScrollSnapX(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msScrollSnapX(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msScrollSnapX(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msScrollSnapY(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msScrollSnapY(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msScrollSnapY(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msScrollSnapY(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msScrollSnapPointsX(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msScrollSnapPointsX(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msScrollSnapPointsX(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msScrollSnapPointsX(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msScrollSnapPointsY(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msScrollSnapPointsY(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msScrollSnapPointsY(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msScrollSnapPointsY(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msGridColumn(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msGridColumn(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msGridColumn(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msGridColumn(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msGridColumnAlign(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msGridColumnAlign(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msGridColumnAlign(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msGridColumnAlign(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msGridColumns(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msGridColumns(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msGridColumns(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msGridColumns(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msGridColumnSpan(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msGridColumnSpan(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msGridColumnSpan(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msGridColumnSpan(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msGridRow(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msGridRow(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msGridRow(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msGridRow(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msGridRowAlign(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msGridRowAlign(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msGridRowAlign(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msGridRowAlign(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msGridRows(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msGridRows(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msGridRows(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msGridRows(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msGridRowSpan(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msGridRowSpan(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msGridRowSpan(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msGridRowSpan(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msWrapThrough(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msWrapThrough(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msWrapThrough(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msWrapThrough(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msWrapMargin(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msWrapMargin(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msWrapMargin(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msWrapMargin(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msWrapFlow(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msWrapFlow(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msWrapFlow(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msWrapFlow(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msAnimationName(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msAnimationName(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msAnimationName(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msAnimationName(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msAnimationDuration(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msAnimationDuration(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msAnimationDuration(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msAnimationDuration(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msAnimationTimingFunction(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msAnimationTimingFunction(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msAnimationTimingFunction(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msAnimationTimingFunction(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msAnimationDelay(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msAnimationDelay(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msAnimationDelay(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msAnimationDelay(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msAnimationDirection(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msAnimationDirection(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msAnimationDirection(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msAnimationDirection(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msAnimationPlayState(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msAnimationPlayState(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msAnimationPlayState(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msAnimationPlayState(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msAnimationIterationCount(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msAnimationIterationCount(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msAnimationIterationCount(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msAnimationIterationCount(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msAnimation(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msAnimation(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msAnimation(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msAnimation(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msAnimationFillMode(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msAnimationFillMode(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msAnimationFillMode(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msAnimationFillMode(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_colorInterpolationFilters(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_colorInterpolationFilters(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_colorInterpolationFilters(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_colorInterpolationFilters(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_columnCount(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_columnCount(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_columnCount(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_columnCount(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_columnWidth(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_columnWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_columnWidth(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_columnWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_columnGap(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_columnGap(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_columnGap(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_columnGap(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_columnFill(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_columnFill(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_columnFill(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_columnFill(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_columnSpan(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_columnSpan(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_columnSpan(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_columnSpan(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_columns(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_columns(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_columns(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_columns(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_columnRule(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_columnRule(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_columnRule(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_columnRule(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_columnRuleColor(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_columnRuleColor(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_columnRuleColor(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_columnRuleColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_columnRuleStyle(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_columnRuleStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_columnRuleStyle(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_columnRuleStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_columnRuleWidth(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_columnRuleWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_columnRuleWidth(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_columnRuleWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_breakBefore(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_breakBefore(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_breakBefore(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_breakBefore(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_breakAfter(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_breakAfter(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_breakAfter(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_breakAfter(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_breakInside(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_breakInside(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_breakInside(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_breakInside(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_floodColor(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_floodColor(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_floodColor(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_floodColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_floodOpacity(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_floodOpacity(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_floodOpacity(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_floodOpacity(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_lightingColor(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_lightingColor(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_lightingColor(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_lightingColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msScrollLimitXMin(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msScrollLimitXMin(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msScrollLimitXMin(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msScrollLimitXMin(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msScrollLimitYMin(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msScrollLimitYMin(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msScrollLimitYMin(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msScrollLimitYMin(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msScrollLimitXMax(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msScrollLimitXMax(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msScrollLimitXMax(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msScrollLimitXMax(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msScrollLimitYMax(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msScrollLimitYMax(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msScrollLimitYMax(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msScrollLimitYMax(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msScrollLimit(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msScrollLimit(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msScrollLimit(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msScrollLimit(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_textShadow(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_textShadow(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_textShadow(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_textShadow(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msFlowFrom(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msFlowFrom(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msFlowFrom(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msFlowFrom(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msFlowInto(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msFlowInto(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msFlowInto(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msFlowInto(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msHyphens(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msHyphens(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msHyphens(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msHyphens(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msHyphenateLimitZone(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msHyphenateLimitZone(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msHyphenateLimitZone(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msHyphenateLimitZone(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msHyphenateLimitChars(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msHyphenateLimitChars(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msHyphenateLimitChars(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msHyphenateLimitChars(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msHyphenateLimitLines(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msHyphenateLimitLines(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msHyphenateLimitLines(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msHyphenateLimitLines(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msHighContrastAdjust(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msHighContrastAdjust(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msHighContrastAdjust(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msHighContrastAdjust(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_enableBackground(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_enableBackground(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_enableBackground(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_enableBackground(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msFontFeatureSettings(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msFontFeatureSettings(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msFontFeatureSettings(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msFontFeatureSettings(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msUserSelect(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msUserSelect(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msUserSelect(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msUserSelect(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msOverflowStyle(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msOverflowStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msOverflowStyle(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msOverflowStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msTransformStyle(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msTransformStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msTransformStyle(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msTransformStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msBackfaceVisibility(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msBackfaceVisibility(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msBackfaceVisibility(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msBackfaceVisibility(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msPerspective(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msPerspective(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msPerspective(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msPerspective(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msPerspectiveOrigin(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msPerspectiveOrigin(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msPerspectiveOrigin(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msPerspectiveOrigin(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msTransitionProperty(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msTransitionProperty(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msTransitionProperty(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msTransitionProperty(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msTransitionDuration(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msTransitionDuration(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msTransitionDuration(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msTransitionDuration(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msTransitionTimingFunction(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msTransitionTimingFunction(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msTransitionTimingFunction(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msTransitionTimingFunction(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msTransitionDelay(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msTransitionDelay(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msTransitionDelay(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msTransitionDelay(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msTransition(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msTransition(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msTransition(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msTransition(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msTouchAction(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msTouchAction(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msTouchAction(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msTouchAction(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msScrollTranslation(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msScrollTranslation(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msScrollTranslation(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msScrollTranslation(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msFlex(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msFlex(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msFlex(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msFlex(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msFlexPositive(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msFlexPositive(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msFlexPositive(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msFlexPositive(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msFlexNegative(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msFlexNegative(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msFlexNegative(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msFlexNegative(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msFlexPreferredSize(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msFlexPreferredSize(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msFlexPreferredSize(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msFlexPreferredSize(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msFlexFlow(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msFlexFlow(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msFlexFlow(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msFlexFlow(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msFlexDirection(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msFlexDirection(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msFlexDirection(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msFlexDirection(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msFlexWrap(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msFlexWrap(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msFlexWrap(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msFlexWrap(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msFlexAlign(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msFlexAlign(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msFlexAlign(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msFlexAlign(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msFlexItemAlign(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msFlexItemAlign(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msFlexItemAlign(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msFlexItemAlign(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msFlexPack(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msFlexPack(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msFlexPack(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msFlexPack(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msFlexLinePack(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msFlexLinePack(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msFlexLinePack(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msFlexLinePack(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msFlexOrder(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msFlexOrder(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msFlexOrder(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msFlexOrder(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_msTouchSelect(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msTouchSelect(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_msTouchSelect(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msTouchSelect(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_transform(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_transform(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_transform(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_transform(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_transformOrigin(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_transformOrigin(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_transformOrigin(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_transformOrigin(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_transformStyle(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_transformStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_transformStyle(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_transformStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_backfaceVisibility(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_backfaceVisibility(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_backfaceVisibility(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_backfaceVisibility(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_perspective(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_perspective(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_perspective(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_perspective(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_perspectiveOrigin(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_perspectiveOrigin(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_perspectiveOrigin(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_perspectiveOrigin(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_transitionProperty(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_transitionProperty(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_transitionProperty(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_transitionProperty(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_transitionDuration(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_transitionDuration(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_transitionDuration(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_transitionDuration(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_transitionTimingFunction(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_transitionTimingFunction(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_transitionTimingFunction(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_transitionTimingFunction(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_transitionDelay(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_transitionDelay(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_transitionDelay(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_transitionDelay(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_transition(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_transition(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_transition(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_transition(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_fontFeatureSettings(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_fontFeatureSettings(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_fontFeatureSettings(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_fontFeatureSettings(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_animationName(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_animationName(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_animationName(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_animationName(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_animationDuration(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_animationDuration(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_animationDuration(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_animationDuration(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_animationTimingFunction(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_animationTimingFunction(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_animationTimingFunction(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_animationTimingFunction(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_animationDelay(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_animationDelay(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_animationDelay(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_animationDelay(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_animationDirection(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_animationDirection(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_animationDirection(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_animationDirection(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_animationPlayState(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_animationPlayState(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_animationPlayState(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_animationPlayState(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_animationIterationCount(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_animationIterationCount(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_animationIterationCount(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_animationIterationCount(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_animation(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_animation(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_animation(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_animation(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_put_animationFillMode(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_animationFillMode(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSStyleDeclaration2_get_animationFillMode(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_animationFillMode(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msScrollChaining_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msScrollChaining_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msScrollChaining_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msScrollChaining_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msContentZooming_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msContentZooming_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msContentZooming_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msContentZooming_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msContentZoomSnapType_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msContentZoomSnapType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msContentZoomSnapType_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msContentZoomSnapType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msScrollRails_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msScrollRails_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msScrollRails_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msScrollRails_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msContentZoomChaining_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msContentZoomChaining_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msContentZoomChaining_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msContentZoomChaining_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msScrollSnapType_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msScrollSnapType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msScrollSnapType_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msScrollSnapType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msContentZoomLimit_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msContentZoomLimit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msContentZoomLimit_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msContentZoomLimit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msContentZoomSnap_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msContentZoomSnap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msContentZoomSnap_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msContentZoomSnap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msContentZoomSnapPoints_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msContentZoomSnapPoints_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msContentZoomSnapPoints_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msContentZoomSnapPoints_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msContentZoomLimitMin_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msContentZoomLimitMin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msContentZoomLimitMin_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msContentZoomLimitMin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msContentZoomLimitMax_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msContentZoomLimitMax_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msContentZoomLimitMax_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msContentZoomLimitMax_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msScrollSnapX_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msScrollSnapX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msScrollSnapX_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msScrollSnapX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msScrollSnapY_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msScrollSnapY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msScrollSnapY_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msScrollSnapY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msScrollSnapPointsX_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msScrollSnapPointsX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msScrollSnapPointsX_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msScrollSnapPointsX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msScrollSnapPointsY_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msScrollSnapPointsY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msScrollSnapPointsY_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msScrollSnapPointsY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msGridColumn_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msGridColumn_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msGridColumn_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msGridColumn_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msGridColumnAlign_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msGridColumnAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msGridColumnAlign_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msGridColumnAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msGridColumns_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msGridColumns_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msGridColumns_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msGridColumns_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msGridColumnSpan_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msGridColumnSpan_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msGridColumnSpan_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msGridColumnSpan_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msGridRow_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msGridRow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msGridRow_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msGridRow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msGridRowAlign_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msGridRowAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msGridRowAlign_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msGridRowAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msGridRows_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msGridRows_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msGridRows_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msGridRows_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msGridRowSpan_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msGridRowSpan_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msGridRowSpan_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msGridRowSpan_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msWrapThrough_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msWrapThrough_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msWrapThrough_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msWrapThrough_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msWrapMargin_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msWrapMargin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msWrapMargin_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msWrapMargin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msWrapFlow_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msWrapFlow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msWrapFlow_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msWrapFlow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msAnimationName_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msAnimationName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msAnimationName_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msAnimationName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msAnimationDuration_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msAnimationDuration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msAnimationDuration_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msAnimationDuration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msAnimationTimingFunction_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msAnimationTimingFunction_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msAnimationTimingFunction_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msAnimationTimingFunction_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msAnimationDelay_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msAnimationDelay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msAnimationDelay_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msAnimationDelay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msAnimationDirection_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msAnimationDirection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msAnimationDirection_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msAnimationDirection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msAnimationPlayState_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msAnimationPlayState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msAnimationPlayState_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msAnimationPlayState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msAnimationIterationCount_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msAnimationIterationCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msAnimationIterationCount_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msAnimationIterationCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msAnimation_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msAnimation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msAnimation_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msAnimation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msAnimationFillMode_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msAnimationFillMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msAnimationFillMode_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msAnimationFillMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_colorInterpolationFilters_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_colorInterpolationFilters_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_colorInterpolationFilters_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_colorInterpolationFilters_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_columnCount_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_columnCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_columnCount_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_columnCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_columnWidth_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_columnWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_columnWidth_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_columnWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_columnGap_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_columnGap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_columnGap_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_columnGap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_columnFill_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_columnFill_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_columnFill_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_columnFill_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_columnSpan_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_columnSpan_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_columnSpan_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_columnSpan_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_columns_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_columns_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_columns_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_columns_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_columnRule_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_columnRule_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_columnRule_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_columnRule_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_columnRuleColor_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_columnRuleColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_columnRuleColor_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_columnRuleColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_columnRuleStyle_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_columnRuleStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_columnRuleStyle_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_columnRuleStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_columnRuleWidth_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_columnRuleWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_columnRuleWidth_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_columnRuleWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_breakBefore_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_breakBefore_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_breakBefore_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_breakBefore_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_breakAfter_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_breakAfter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_breakAfter_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_breakAfter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_breakInside_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_breakInside_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_breakInside_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_breakInside_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_floodColor_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_floodColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_floodColor_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_floodColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_floodOpacity_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_floodOpacity_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_floodOpacity_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_floodOpacity_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_lightingColor_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_lightingColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_lightingColor_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_lightingColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msScrollLimitXMin_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msScrollLimitXMin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msScrollLimitXMin_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msScrollLimitXMin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msScrollLimitYMin_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msScrollLimitYMin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msScrollLimitYMin_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msScrollLimitYMin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msScrollLimitXMax_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msScrollLimitXMax_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msScrollLimitXMax_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msScrollLimitXMax_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msScrollLimitYMax_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msScrollLimitYMax_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msScrollLimitYMax_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msScrollLimitYMax_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msScrollLimit_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msScrollLimit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msScrollLimit_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msScrollLimit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_textShadow_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_textShadow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_textShadow_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_textShadow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msFlowFrom_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msFlowFrom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msFlowFrom_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msFlowFrom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msFlowInto_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msFlowInto_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msFlowInto_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msFlowInto_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msHyphens_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msHyphens_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msHyphens_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msHyphens_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msHyphenateLimitZone_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msHyphenateLimitZone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msHyphenateLimitZone_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msHyphenateLimitZone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msHyphenateLimitChars_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msHyphenateLimitChars_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msHyphenateLimitChars_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msHyphenateLimitChars_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msHyphenateLimitLines_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msHyphenateLimitLines_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msHyphenateLimitLines_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msHyphenateLimitLines_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msHighContrastAdjust_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msHighContrastAdjust_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msHighContrastAdjust_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msHighContrastAdjust_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_enableBackground_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_enableBackground_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_enableBackground_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_enableBackground_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msFontFeatureSettings_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msFontFeatureSettings_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msFontFeatureSettings_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msFontFeatureSettings_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msUserSelect_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msUserSelect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msUserSelect_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msUserSelect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msOverflowStyle_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msOverflowStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msOverflowStyle_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msOverflowStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msTransformStyle_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msTransformStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msTransformStyle_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msTransformStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msBackfaceVisibility_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msBackfaceVisibility_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msBackfaceVisibility_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msBackfaceVisibility_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msPerspective_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msPerspective_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msPerspective_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msPerspective_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msPerspectiveOrigin_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msPerspectiveOrigin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msPerspectiveOrigin_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msPerspectiveOrigin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msTransitionProperty_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msTransitionProperty_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msTransitionProperty_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msTransitionProperty_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msTransitionDuration_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msTransitionDuration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msTransitionDuration_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msTransitionDuration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msTransitionTimingFunction_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msTransitionTimingFunction_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msTransitionTimingFunction_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msTransitionTimingFunction_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msTransitionDelay_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msTransitionDelay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msTransitionDelay_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msTransitionDelay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msTransition_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msTransition_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msTouchAction_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msTouchAction_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msTouchAction_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msTouchAction_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msScrollTranslation_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msScrollTranslation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msScrollTranslation_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msScrollTranslation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msFlex_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msFlex_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msFlex_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msFlex_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msFlexPositive_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msFlexPositive_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msFlexPositive_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msFlexPositive_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msFlexNegative_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msFlexNegative_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msFlexNegative_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msFlexNegative_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msFlexPreferredSize_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msFlexPreferredSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msFlexPreferredSize_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msFlexPreferredSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msFlexFlow_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msFlexFlow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msFlexFlow_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msFlexFlow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msFlexDirection_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msFlexDirection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msFlexDirection_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msFlexDirection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msFlexWrap_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msFlexWrap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msFlexWrap_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msFlexWrap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msFlexAlign_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msFlexAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msFlexAlign_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msFlexAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msFlexItemAlign_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msFlexItemAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msFlexItemAlign_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msFlexItemAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msFlexPack_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msFlexPack_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msFlexPack_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msFlexPack_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msFlexLinePack_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msFlexLinePack_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msFlexLinePack_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msFlexLinePack_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msFlexOrder_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msFlexOrder_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msFlexOrder_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msFlexOrder_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_msTouchSelect_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_msTouchSelect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_msTouchSelect_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_msTouchSelect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_transform_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_transform_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_transform_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_transform_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_transformOrigin_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_transformOrigin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_transformOrigin_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_transformOrigin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_transformStyle_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_transformStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_transformStyle_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_transformStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_backfaceVisibility_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_backfaceVisibility_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_backfaceVisibility_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_backfaceVisibility_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_perspective_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_perspective_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_perspective_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_perspective_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_perspectiveOrigin_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_perspectiveOrigin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_perspectiveOrigin_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_perspectiveOrigin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_transitionProperty_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_transitionProperty_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_transitionProperty_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_transitionProperty_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_transitionDuration_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_transitionDuration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_transitionDuration_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_transitionDuration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_transitionTimingFunction_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_transitionTimingFunction_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_transitionTimingFunction_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_transitionTimingFunction_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_transitionDelay_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_transitionDelay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_transitionDelay_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_transitionDelay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_transition_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_transition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_transition_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_transition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_fontFeatureSettings_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_fontFeatureSettings_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_fontFeatureSettings_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_fontFeatureSettings_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_animationName_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_animationName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_animationName_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_animationName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_animationDuration_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_animationDuration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_animationDuration_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_animationDuration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_animationTimingFunction_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_animationTimingFunction_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_animationTimingFunction_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_animationTimingFunction_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_animationDelay_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_animationDelay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_animationDelay_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_animationDelay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_animationDirection_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_animationDirection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_animationDirection_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_animationDirection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_animationPlayState_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_animationPlayState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_animationPlayState_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_animationPlayState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_animationIterationCount_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_animationIterationCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_animationIterationCount_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_animationIterationCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_animation_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_animation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_animation_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_animation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_put_animationFillMode_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR v);
void __RPC_STUB IHTMLCSSStyleDeclaration2_put_animationFillMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSStyleDeclaration2_get_animationFillMode_Proxy(
    IHTMLCSSStyleDeclaration2* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSStyleDeclaration2_get_animationFillMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLCSSStyleDeclaration2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLStyleEnabled interface
 */
#ifndef __IHTMLStyleEnabled_INTERFACE_DEFINED__
#define __IHTMLStyleEnabled_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLStyleEnabled, 0x305104c2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104c2-98b5-11cf-bb82-00aa00bdce0b")
IHTMLStyleEnabled : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE msGetPropertyEnabled(
        BSTR name,
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE msPutPropertyEnabled(
        BSTR name,
        VARIANT_BOOL b) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLStyleEnabled, 0x305104c2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLStyleEnabledVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLStyleEnabled methods ***/
    HRESULT (STDMETHODCALLTYPE *msGetPropertyEnabled)(
        IHTMLStyleEnabled* This,
        BSTR name,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *msPutPropertyEnabled)(
        IHTMLStyleEnabled* This,
        BSTR name,
        VARIANT_BOOL b);

    END_INTERFACE
} IHTMLStyleEnabledVtbl;
interface IHTMLStyleEnabled {
    CONST_VTBL IHTMLStyleEnabledVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLStyleEnabled_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLStyleEnabled_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLStyleEnabled_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLStyleEnabled_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLStyleEnabled_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLStyleEnabled_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLStyleEnabled_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLStyleEnabled methods ***/
#define IHTMLStyleEnabled_msGetPropertyEnabled(This,name,p) (This)->lpVtbl->msGetPropertyEnabled(This,name,p)
#define IHTMLStyleEnabled_msPutPropertyEnabled(This,name,b) (This)->lpVtbl->msPutPropertyEnabled(This,name,b)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLStyleEnabled_QueryInterface(IHTMLStyleEnabled* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLStyleEnabled_AddRef(IHTMLStyleEnabled* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLStyleEnabled_Release(IHTMLStyleEnabled* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLStyleEnabled_GetTypeInfoCount(IHTMLStyleEnabled* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLStyleEnabled_GetTypeInfo(IHTMLStyleEnabled* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLStyleEnabled_GetIDsOfNames(IHTMLStyleEnabled* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLStyleEnabled_Invoke(IHTMLStyleEnabled* 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);
}
/*** IHTMLStyleEnabled methods ***/
static FORCEINLINE HRESULT IHTMLStyleEnabled_msGetPropertyEnabled(IHTMLStyleEnabled* This,BSTR name,VARIANT_BOOL *p) {
    return This->lpVtbl->msGetPropertyEnabled(This,name,p);
}
static FORCEINLINE HRESULT IHTMLStyleEnabled_msPutPropertyEnabled(IHTMLStyleEnabled* This,BSTR name,VARIANT_BOOL b) {
    return This->lpVtbl->msPutPropertyEnabled(This,name,b);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLStyleEnabled_msGetPropertyEnabled_Proxy(
    IHTMLStyleEnabled* This,
    BSTR name,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLStyleEnabled_msGetPropertyEnabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleEnabled_msPutPropertyEnabled_Proxy(
    IHTMLStyleEnabled* This,
    BSTR name,
    VARIANT_BOOL b);
void __RPC_STUB IHTMLStyleEnabled_msPutPropertyEnabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLStyleEnabled_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLCSSStyleDeclaration dispinterface
 */
#ifndef __DispHTMLCSSStyleDeclaration_DISPINTERFACE_DEFINED__
#define __DispHTMLCSSStyleDeclaration_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLCSSStyleDeclaration, 0x3059009a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059009a-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLCSSStyleDeclaration : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLCSSStyleDeclaration, 0x3059009a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLCSSStyleDeclarationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} DispHTMLCSSStyleDeclarationVtbl;
interface DispHTMLCSSStyleDeclaration {
    CONST_VTBL DispHTMLCSSStyleDeclarationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLCSSStyleDeclaration_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLCSSStyleDeclaration_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLCSSStyleDeclaration_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLCSSStyleDeclaration_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLCSSStyleDeclaration_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLCSSStyleDeclaration_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLCSSStyleDeclaration_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 DispHTMLCSSStyleDeclaration_QueryInterface(DispHTMLCSSStyleDeclaration* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLCSSStyleDeclaration_AddRef(DispHTMLCSSStyleDeclaration* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLCSSStyleDeclaration_Release(DispHTMLCSSStyleDeclaration* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLCSSStyleDeclaration_GetTypeInfoCount(DispHTMLCSSStyleDeclaration* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLCSSStyleDeclaration_GetTypeInfo(DispHTMLCSSStyleDeclaration* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLCSSStyleDeclaration_GetIDsOfNames(DispHTMLCSSStyleDeclaration* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLCSSStyleDeclaration_Invoke(DispHTMLCSSStyleDeclaration* 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  /* __DispHTMLCSSStyleDeclaration_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLCSSStyleDeclaration coclass
 */

DEFINE_GUID(CLSID_HTMLCSSStyleDeclaration, 0x30510741, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510741-98b5-11cf-bb82-00aa00bdce0b") HTMLCSSStyleDeclaration;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLCSSStyleDeclaration, 0x30510741, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CCSSStyleDeclaration;
/*****************************************************************************
 * IHTMLStyle interface
 */
#ifndef __IHTMLStyle_INTERFACE_DEFINED__
#define __IHTMLStyle_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLStyle, 0x3050f25e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f25e-98b5-11cf-bb82-00aa00bdce0b")
IHTMLStyle : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_fontFamily(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fontFamily(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_fontStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fontStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_fontVariant(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fontVariant(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_fontWeight(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fontWeight(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_fontSize(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fontSize(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_font(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_font(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_color(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_color(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_background(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_background(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_backgroundColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_backgroundImage(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundImage(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_backgroundRepeat(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundRepeat(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_backgroundAttachment(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundAttachment(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_backgroundPosition(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundPosition(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_backgroundPositionX(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundPositionX(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_backgroundPositionY(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundPositionY(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_wordSpacing(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_wordSpacing(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_letterSpacing(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_letterSpacing(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textDecoration(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textDecoration(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textDecorationNone(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textDecorationNone(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textDecorationUnderline(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textDecorationUnderline(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textDecorationOverline(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textDecorationOverline(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textDecorationLineThrough(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textDecorationLineThrough(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textDecorationBlink(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textDecorationBlink(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_verticalAlign(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_verticalAlign(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textTransform(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textTransform(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textAlign(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textAlign(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textIndent(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textIndent(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_lineHeight(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_lineHeight(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_marginTop(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_marginTop(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_marginRight(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_marginRight(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_marginBottom(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_marginBottom(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_marginLeft(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_marginLeft(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_margin(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_margin(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_paddingTop(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_paddingTop(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_paddingRight(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_paddingRight(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_paddingBottom(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_paddingBottom(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_paddingLeft(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_paddingLeft(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_padding(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_padding(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_border(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_border(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderTop(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderTop(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderRight(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderRight(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderBottom(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderBottom(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderLeft(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderLeft(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderColor(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderColor(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderTopColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderTopColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderRightColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderRightColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderBottomColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderBottomColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderLeftColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderLeftColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderWidth(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderWidth(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderTopWidth(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderTopWidth(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderRightWidth(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderRightWidth(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderBottomWidth(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderBottomWidth(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderLeftWidth(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderLeftWidth(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderTopStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderTopStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderRightStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderRightStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderBottomStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderBottomStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderLeftStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderLeftStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_width(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_width(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_height(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_height(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_styleFloat(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_styleFloat(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_clear(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clear(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_display(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_display(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_visibility(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_visibility(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_listStyleType(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_listStyleType(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_listStylePosition(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_listStylePosition(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_listStyleImage(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_listStyleImage(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_listStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_listStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_whiteSpace(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_whiteSpace(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_top(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_top(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_left(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_left(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_position(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_zIndex(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_zIndex(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_overflow(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_overflow(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_pageBreakBefore(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pageBreakBefore(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_pageBreakAfter(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pageBreakAfter(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_cssText(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cssText(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_pixelTop(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pixelTop(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_pixelLeft(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pixelLeft(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_pixelWidth(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pixelWidth(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_pixelHeight(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pixelHeight(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_posTop(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_posTop(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_posLeft(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_posLeft(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_posWidth(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_posWidth(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_posHeight(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_posHeight(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_cursor(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cursor(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_clip(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clip(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_filter(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_filter(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE setAttribute(
        BSTR strAttributeName,
        VARIANT AttributeValue,
        LONG lFlags = 1) = 0;

    virtual HRESULT STDMETHODCALLTYPE getAttribute(
        BSTR strAttributeName,
        LONG lFlags = 0,
        VARIANT *AttributeValue = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeAttribute(
        BSTR strAttributeName,
        LONG lFlags = 1,
        VARIANT_BOOL *pfSuccess = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE toString(
        BSTR *String) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLStyle, 0x3050f25e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLStyleVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLStyle methods ***/
    HRESULT (STDMETHODCALLTYPE *put_fontFamily)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_fontFamily)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_fontStyle)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_fontStyle)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_fontVariant)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_fontVariant)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_fontWeight)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_fontWeight)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_fontSize)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_fontSize)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_font)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_font)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_color)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_color)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_background)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_background)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_backgroundColor)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_backgroundColor)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_backgroundImage)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_backgroundImage)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_backgroundRepeat)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_backgroundRepeat)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_backgroundAttachment)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_backgroundAttachment)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_backgroundPosition)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_backgroundPosition)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_backgroundPositionX)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_backgroundPositionX)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_backgroundPositionY)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_backgroundPositionY)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_wordSpacing)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_wordSpacing)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_letterSpacing)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_letterSpacing)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_textDecoration)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textDecoration)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textDecorationNone)(
        IHTMLStyle* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_textDecorationNone)(
        IHTMLStyle* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_textDecorationUnderline)(
        IHTMLStyle* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_textDecorationUnderline)(
        IHTMLStyle* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_textDecorationOverline)(
        IHTMLStyle* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_textDecorationOverline)(
        IHTMLStyle* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_textDecorationLineThrough)(
        IHTMLStyle* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_textDecorationLineThrough)(
        IHTMLStyle* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_textDecorationBlink)(
        IHTMLStyle* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_textDecorationBlink)(
        IHTMLStyle* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_verticalAlign)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_verticalAlign)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_textTransform)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textTransform)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textAlign)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textAlign)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textIndent)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_textIndent)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_lineHeight)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_lineHeight)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_marginTop)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_marginTop)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_marginRight)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_marginRight)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_marginBottom)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_marginBottom)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_marginLeft)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_marginLeft)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_margin)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_margin)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_paddingTop)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_paddingTop)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_paddingRight)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_paddingRight)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_paddingBottom)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_paddingBottom)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_paddingLeft)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_paddingLeft)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_padding)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_padding)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_border)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_border)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderTop)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderTop)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderRight)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderRight)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderBottom)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderBottom)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderLeft)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderLeft)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderColor)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderColor)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderTopColor)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderTopColor)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderRightColor)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderRightColor)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderBottomColor)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderBottomColor)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderLeftColor)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderLeftColor)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderWidth)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderWidth)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderTopWidth)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderTopWidth)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderRightWidth)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderRightWidth)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderBottomWidth)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderBottomWidth)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderLeftWidth)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderLeftWidth)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderStyle)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderStyle)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderTopStyle)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderTopStyle)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderRightStyle)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderRightStyle)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderBottomStyle)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderBottomStyle)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderLeftStyle)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderLeftStyle)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_width)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_width)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_height)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_height)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_styleFloat)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_styleFloat)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_clear)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_clear)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_display)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_display)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_visibility)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_visibility)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_listStyleType)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_listStyleType)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_listStylePosition)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_listStylePosition)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_listStyleImage)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_listStyleImage)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_listStyle)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_listStyle)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_whiteSpace)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_whiteSpace)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_top)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_top)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_left)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_left)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_position)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_zIndex)(
        IHTMLStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_zIndex)(
        IHTMLStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_overflow)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_overflow)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_pageBreakBefore)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_pageBreakBefore)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_pageBreakAfter)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_pageBreakAfter)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_cssText)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_cssText)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_pixelTop)(
        IHTMLStyle* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_pixelTop)(
        IHTMLStyle* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_pixelLeft)(
        IHTMLStyle* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_pixelLeft)(
        IHTMLStyle* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_pixelWidth)(
        IHTMLStyle* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_pixelWidth)(
        IHTMLStyle* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_pixelHeight)(
        IHTMLStyle* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_pixelHeight)(
        IHTMLStyle* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_posTop)(
        IHTMLStyle* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_posTop)(
        IHTMLStyle* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_posLeft)(
        IHTMLStyle* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_posLeft)(
        IHTMLStyle* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_posWidth)(
        IHTMLStyle* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_posWidth)(
        IHTMLStyle* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_posHeight)(
        IHTMLStyle* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_posHeight)(
        IHTMLStyle* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_cursor)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_cursor)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_clip)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_clip)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_filter)(
        IHTMLStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_filter)(
        IHTMLStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *setAttribute)(
        IHTMLStyle* This,
        BSTR strAttributeName,
        VARIANT AttributeValue,
        LONG lFlags);

    HRESULT (STDMETHODCALLTYPE *getAttribute)(
        IHTMLStyle* This,
        BSTR strAttributeName,
        LONG lFlags,
        VARIANT *AttributeValue);

    HRESULT (STDMETHODCALLTYPE *removeAttribute)(
        IHTMLStyle* This,
        BSTR strAttributeName,
        LONG lFlags,
        VARIANT_BOOL *pfSuccess);

    HRESULT (STDMETHODCALLTYPE *toString)(
        IHTMLStyle* This,
        BSTR *String);

    END_INTERFACE
} IHTMLStyleVtbl;
interface IHTMLStyle {
    CONST_VTBL IHTMLStyleVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLStyle_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLStyle_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLStyle_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLStyle_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLStyle_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLStyle_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLStyle_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLStyle methods ***/
#define IHTMLStyle_put_fontFamily(This,v) (This)->lpVtbl->put_fontFamily(This,v)
#define IHTMLStyle_get_fontFamily(This,p) (This)->lpVtbl->get_fontFamily(This,p)
#define IHTMLStyle_put_fontStyle(This,v) (This)->lpVtbl->put_fontStyle(This,v)
#define IHTMLStyle_get_fontStyle(This,p) (This)->lpVtbl->get_fontStyle(This,p)
#define IHTMLStyle_put_fontVariant(This,v) (This)->lpVtbl->put_fontVariant(This,v)
#define IHTMLStyle_get_fontVariant(This,p) (This)->lpVtbl->get_fontVariant(This,p)
#define IHTMLStyle_put_fontWeight(This,v) (This)->lpVtbl->put_fontWeight(This,v)
#define IHTMLStyle_get_fontWeight(This,p) (This)->lpVtbl->get_fontWeight(This,p)
#define IHTMLStyle_put_fontSize(This,v) (This)->lpVtbl->put_fontSize(This,v)
#define IHTMLStyle_get_fontSize(This,p) (This)->lpVtbl->get_fontSize(This,p)
#define IHTMLStyle_put_font(This,v) (This)->lpVtbl->put_font(This,v)
#define IHTMLStyle_get_font(This,p) (This)->lpVtbl->get_font(This,p)
#define IHTMLStyle_put_color(This,v) (This)->lpVtbl->put_color(This,v)
#define IHTMLStyle_get_color(This,p) (This)->lpVtbl->get_color(This,p)
#define IHTMLStyle_put_background(This,v) (This)->lpVtbl->put_background(This,v)
#define IHTMLStyle_get_background(This,p) (This)->lpVtbl->get_background(This,p)
#define IHTMLStyle_put_backgroundColor(This,v) (This)->lpVtbl->put_backgroundColor(This,v)
#define IHTMLStyle_get_backgroundColor(This,p) (This)->lpVtbl->get_backgroundColor(This,p)
#define IHTMLStyle_put_backgroundImage(This,v) (This)->lpVtbl->put_backgroundImage(This,v)
#define IHTMLStyle_get_backgroundImage(This,p) (This)->lpVtbl->get_backgroundImage(This,p)
#define IHTMLStyle_put_backgroundRepeat(This,v) (This)->lpVtbl->put_backgroundRepeat(This,v)
#define IHTMLStyle_get_backgroundRepeat(This,p) (This)->lpVtbl->get_backgroundRepeat(This,p)
#define IHTMLStyle_put_backgroundAttachment(This,v) (This)->lpVtbl->put_backgroundAttachment(This,v)
#define IHTMLStyle_get_backgroundAttachment(This,p) (This)->lpVtbl->get_backgroundAttachment(This,p)
#define IHTMLStyle_put_backgroundPosition(This,v) (This)->lpVtbl->put_backgroundPosition(This,v)
#define IHTMLStyle_get_backgroundPosition(This,p) (This)->lpVtbl->get_backgroundPosition(This,p)
#define IHTMLStyle_put_backgroundPositionX(This,v) (This)->lpVtbl->put_backgroundPositionX(This,v)
#define IHTMLStyle_get_backgroundPositionX(This,p) (This)->lpVtbl->get_backgroundPositionX(This,p)
#define IHTMLStyle_put_backgroundPositionY(This,v) (This)->lpVtbl->put_backgroundPositionY(This,v)
#define IHTMLStyle_get_backgroundPositionY(This,p) (This)->lpVtbl->get_backgroundPositionY(This,p)
#define IHTMLStyle_put_wordSpacing(This,v) (This)->lpVtbl->put_wordSpacing(This,v)
#define IHTMLStyle_get_wordSpacing(This,p) (This)->lpVtbl->get_wordSpacing(This,p)
#define IHTMLStyle_put_letterSpacing(This,v) (This)->lpVtbl->put_letterSpacing(This,v)
#define IHTMLStyle_get_letterSpacing(This,p) (This)->lpVtbl->get_letterSpacing(This,p)
#define IHTMLStyle_put_textDecoration(This,v) (This)->lpVtbl->put_textDecoration(This,v)
#define IHTMLStyle_get_textDecoration(This,p) (This)->lpVtbl->get_textDecoration(This,p)
#define IHTMLStyle_put_textDecorationNone(This,v) (This)->lpVtbl->put_textDecorationNone(This,v)
#define IHTMLStyle_get_textDecorationNone(This,p) (This)->lpVtbl->get_textDecorationNone(This,p)
#define IHTMLStyle_put_textDecorationUnderline(This,v) (This)->lpVtbl->put_textDecorationUnderline(This,v)
#define IHTMLStyle_get_textDecorationUnderline(This,p) (This)->lpVtbl->get_textDecorationUnderline(This,p)
#define IHTMLStyle_put_textDecorationOverline(This,v) (This)->lpVtbl->put_textDecorationOverline(This,v)
#define IHTMLStyle_get_textDecorationOverline(This,p) (This)->lpVtbl->get_textDecorationOverline(This,p)
#define IHTMLStyle_put_textDecorationLineThrough(This,v) (This)->lpVtbl->put_textDecorationLineThrough(This,v)
#define IHTMLStyle_get_textDecorationLineThrough(This,p) (This)->lpVtbl->get_textDecorationLineThrough(This,p)
#define IHTMLStyle_put_textDecorationBlink(This,v) (This)->lpVtbl->put_textDecorationBlink(This,v)
#define IHTMLStyle_get_textDecorationBlink(This,p) (This)->lpVtbl->get_textDecorationBlink(This,p)
#define IHTMLStyle_put_verticalAlign(This,v) (This)->lpVtbl->put_verticalAlign(This,v)
#define IHTMLStyle_get_verticalAlign(This,p) (This)->lpVtbl->get_verticalAlign(This,p)
#define IHTMLStyle_put_textTransform(This,v) (This)->lpVtbl->put_textTransform(This,v)
#define IHTMLStyle_get_textTransform(This,p) (This)->lpVtbl->get_textTransform(This,p)
#define IHTMLStyle_put_textAlign(This,v) (This)->lpVtbl->put_textAlign(This,v)
#define IHTMLStyle_get_textAlign(This,p) (This)->lpVtbl->get_textAlign(This,p)
#define IHTMLStyle_put_textIndent(This,v) (This)->lpVtbl->put_textIndent(This,v)
#define IHTMLStyle_get_textIndent(This,p) (This)->lpVtbl->get_textIndent(This,p)
#define IHTMLStyle_put_lineHeight(This,v) (This)->lpVtbl->put_lineHeight(This,v)
#define IHTMLStyle_get_lineHeight(This,p) (This)->lpVtbl->get_lineHeight(This,p)
#define IHTMLStyle_put_marginTop(This,v) (This)->lpVtbl->put_marginTop(This,v)
#define IHTMLStyle_get_marginTop(This,p) (This)->lpVtbl->get_marginTop(This,p)
#define IHTMLStyle_put_marginRight(This,v) (This)->lpVtbl->put_marginRight(This,v)
#define IHTMLStyle_get_marginRight(This,p) (This)->lpVtbl->get_marginRight(This,p)
#define IHTMLStyle_put_marginBottom(This,v) (This)->lpVtbl->put_marginBottom(This,v)
#define IHTMLStyle_get_marginBottom(This,p) (This)->lpVtbl->get_marginBottom(This,p)
#define IHTMLStyle_put_marginLeft(This,v) (This)->lpVtbl->put_marginLeft(This,v)
#define IHTMLStyle_get_marginLeft(This,p) (This)->lpVtbl->get_marginLeft(This,p)
#define IHTMLStyle_put_margin(This,v) (This)->lpVtbl->put_margin(This,v)
#define IHTMLStyle_get_margin(This,p) (This)->lpVtbl->get_margin(This,p)
#define IHTMLStyle_put_paddingTop(This,v) (This)->lpVtbl->put_paddingTop(This,v)
#define IHTMLStyle_get_paddingTop(This,p) (This)->lpVtbl->get_paddingTop(This,p)
#define IHTMLStyle_put_paddingRight(This,v) (This)->lpVtbl->put_paddingRight(This,v)
#define IHTMLStyle_get_paddingRight(This,p) (This)->lpVtbl->get_paddingRight(This,p)
#define IHTMLStyle_put_paddingBottom(This,v) (This)->lpVtbl->put_paddingBottom(This,v)
#define IHTMLStyle_get_paddingBottom(This,p) (This)->lpVtbl->get_paddingBottom(This,p)
#define IHTMLStyle_put_paddingLeft(This,v) (This)->lpVtbl->put_paddingLeft(This,v)
#define IHTMLStyle_get_paddingLeft(This,p) (This)->lpVtbl->get_paddingLeft(This,p)
#define IHTMLStyle_put_padding(This,v) (This)->lpVtbl->put_padding(This,v)
#define IHTMLStyle_get_padding(This,p) (This)->lpVtbl->get_padding(This,p)
#define IHTMLStyle_put_border(This,v) (This)->lpVtbl->put_border(This,v)
#define IHTMLStyle_get_border(This,p) (This)->lpVtbl->get_border(This,p)
#define IHTMLStyle_put_borderTop(This,v) (This)->lpVtbl->put_borderTop(This,v)
#define IHTMLStyle_get_borderTop(This,p) (This)->lpVtbl->get_borderTop(This,p)
#define IHTMLStyle_put_borderRight(This,v) (This)->lpVtbl->put_borderRight(This,v)
#define IHTMLStyle_get_borderRight(This,p) (This)->lpVtbl->get_borderRight(This,p)
#define IHTMLStyle_put_borderBottom(This,v) (This)->lpVtbl->put_borderBottom(This,v)
#define IHTMLStyle_get_borderBottom(This,p) (This)->lpVtbl->get_borderBottom(This,p)
#define IHTMLStyle_put_borderLeft(This,v) (This)->lpVtbl->put_borderLeft(This,v)
#define IHTMLStyle_get_borderLeft(This,p) (This)->lpVtbl->get_borderLeft(This,p)
#define IHTMLStyle_put_borderColor(This,v) (This)->lpVtbl->put_borderColor(This,v)
#define IHTMLStyle_get_borderColor(This,p) (This)->lpVtbl->get_borderColor(This,p)
#define IHTMLStyle_put_borderTopColor(This,v) (This)->lpVtbl->put_borderTopColor(This,v)
#define IHTMLStyle_get_borderTopColor(This,p) (This)->lpVtbl->get_borderTopColor(This,p)
#define IHTMLStyle_put_borderRightColor(This,v) (This)->lpVtbl->put_borderRightColor(This,v)
#define IHTMLStyle_get_borderRightColor(This,p) (This)->lpVtbl->get_borderRightColor(This,p)
#define IHTMLStyle_put_borderBottomColor(This,v) (This)->lpVtbl->put_borderBottomColor(This,v)
#define IHTMLStyle_get_borderBottomColor(This,p) (This)->lpVtbl->get_borderBottomColor(This,p)
#define IHTMLStyle_put_borderLeftColor(This,v) (This)->lpVtbl->put_borderLeftColor(This,v)
#define IHTMLStyle_get_borderLeftColor(This,p) (This)->lpVtbl->get_borderLeftColor(This,p)
#define IHTMLStyle_put_borderWidth(This,v) (This)->lpVtbl->put_borderWidth(This,v)
#define IHTMLStyle_get_borderWidth(This,p) (This)->lpVtbl->get_borderWidth(This,p)
#define IHTMLStyle_put_borderTopWidth(This,v) (This)->lpVtbl->put_borderTopWidth(This,v)
#define IHTMLStyle_get_borderTopWidth(This,p) (This)->lpVtbl->get_borderTopWidth(This,p)
#define IHTMLStyle_put_borderRightWidth(This,v) (This)->lpVtbl->put_borderRightWidth(This,v)
#define IHTMLStyle_get_borderRightWidth(This,p) (This)->lpVtbl->get_borderRightWidth(This,p)
#define IHTMLStyle_put_borderBottomWidth(This,v) (This)->lpVtbl->put_borderBottomWidth(This,v)
#define IHTMLStyle_get_borderBottomWidth(This,p) (This)->lpVtbl->get_borderBottomWidth(This,p)
#define IHTMLStyle_put_borderLeftWidth(This,v) (This)->lpVtbl->put_borderLeftWidth(This,v)
#define IHTMLStyle_get_borderLeftWidth(This,p) (This)->lpVtbl->get_borderLeftWidth(This,p)
#define IHTMLStyle_put_borderStyle(This,v) (This)->lpVtbl->put_borderStyle(This,v)
#define IHTMLStyle_get_borderStyle(This,p) (This)->lpVtbl->get_borderStyle(This,p)
#define IHTMLStyle_put_borderTopStyle(This,v) (This)->lpVtbl->put_borderTopStyle(This,v)
#define IHTMLStyle_get_borderTopStyle(This,p) (This)->lpVtbl->get_borderTopStyle(This,p)
#define IHTMLStyle_put_borderRightStyle(This,v) (This)->lpVtbl->put_borderRightStyle(This,v)
#define IHTMLStyle_get_borderRightStyle(This,p) (This)->lpVtbl->get_borderRightStyle(This,p)
#define IHTMLStyle_put_borderBottomStyle(This,v) (This)->lpVtbl->put_borderBottomStyle(This,v)
#define IHTMLStyle_get_borderBottomStyle(This,p) (This)->lpVtbl->get_borderBottomStyle(This,p)
#define IHTMLStyle_put_borderLeftStyle(This,v) (This)->lpVtbl->put_borderLeftStyle(This,v)
#define IHTMLStyle_get_borderLeftStyle(This,p) (This)->lpVtbl->get_borderLeftStyle(This,p)
#define IHTMLStyle_put_width(This,v) (This)->lpVtbl->put_width(This,v)
#define IHTMLStyle_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#define IHTMLStyle_put_height(This,v) (This)->lpVtbl->put_height(This,v)
#define IHTMLStyle_get_height(This,p) (This)->lpVtbl->get_height(This,p)
#define IHTMLStyle_put_styleFloat(This,v) (This)->lpVtbl->put_styleFloat(This,v)
#define IHTMLStyle_get_styleFloat(This,p) (This)->lpVtbl->get_styleFloat(This,p)
#define IHTMLStyle_put_clear(This,v) (This)->lpVtbl->put_clear(This,v)
#define IHTMLStyle_get_clear(This,p) (This)->lpVtbl->get_clear(This,p)
#define IHTMLStyle_put_display(This,v) (This)->lpVtbl->put_display(This,v)
#define IHTMLStyle_get_display(This,p) (This)->lpVtbl->get_display(This,p)
#define IHTMLStyle_put_visibility(This,v) (This)->lpVtbl->put_visibility(This,v)
#define IHTMLStyle_get_visibility(This,p) (This)->lpVtbl->get_visibility(This,p)
#define IHTMLStyle_put_listStyleType(This,v) (This)->lpVtbl->put_listStyleType(This,v)
#define IHTMLStyle_get_listStyleType(This,p) (This)->lpVtbl->get_listStyleType(This,p)
#define IHTMLStyle_put_listStylePosition(This,v) (This)->lpVtbl->put_listStylePosition(This,v)
#define IHTMLStyle_get_listStylePosition(This,p) (This)->lpVtbl->get_listStylePosition(This,p)
#define IHTMLStyle_put_listStyleImage(This,v) (This)->lpVtbl->put_listStyleImage(This,v)
#define IHTMLStyle_get_listStyleImage(This,p) (This)->lpVtbl->get_listStyleImage(This,p)
#define IHTMLStyle_put_listStyle(This,v) (This)->lpVtbl->put_listStyle(This,v)
#define IHTMLStyle_get_listStyle(This,p) (This)->lpVtbl->get_listStyle(This,p)
#define IHTMLStyle_put_whiteSpace(This,v) (This)->lpVtbl->put_whiteSpace(This,v)
#define IHTMLStyle_get_whiteSpace(This,p) (This)->lpVtbl->get_whiteSpace(This,p)
#define IHTMLStyle_put_top(This,v) (This)->lpVtbl->put_top(This,v)
#define IHTMLStyle_get_top(This,p) (This)->lpVtbl->get_top(This,p)
#define IHTMLStyle_put_left(This,v) (This)->lpVtbl->put_left(This,v)
#define IHTMLStyle_get_left(This,p) (This)->lpVtbl->get_left(This,p)
#define IHTMLStyle_get_position(This,p) (This)->lpVtbl->get_position(This,p)
#define IHTMLStyle_put_zIndex(This,v) (This)->lpVtbl->put_zIndex(This,v)
#define IHTMLStyle_get_zIndex(This,p) (This)->lpVtbl->get_zIndex(This,p)
#define IHTMLStyle_put_overflow(This,v) (This)->lpVtbl->put_overflow(This,v)
#define IHTMLStyle_get_overflow(This,p) (This)->lpVtbl->get_overflow(This,p)
#define IHTMLStyle_put_pageBreakBefore(This,v) (This)->lpVtbl->put_pageBreakBefore(This,v)
#define IHTMLStyle_get_pageBreakBefore(This,p) (This)->lpVtbl->get_pageBreakBefore(This,p)
#define IHTMLStyle_put_pageBreakAfter(This,v) (This)->lpVtbl->put_pageBreakAfter(This,v)
#define IHTMLStyle_get_pageBreakAfter(This,p) (This)->lpVtbl->get_pageBreakAfter(This,p)
#define IHTMLStyle_put_cssText(This,v) (This)->lpVtbl->put_cssText(This,v)
#define IHTMLStyle_get_cssText(This,p) (This)->lpVtbl->get_cssText(This,p)
#define IHTMLStyle_put_pixelTop(This,v) (This)->lpVtbl->put_pixelTop(This,v)
#define IHTMLStyle_get_pixelTop(This,p) (This)->lpVtbl->get_pixelTop(This,p)
#define IHTMLStyle_put_pixelLeft(This,v) (This)->lpVtbl->put_pixelLeft(This,v)
#define IHTMLStyle_get_pixelLeft(This,p) (This)->lpVtbl->get_pixelLeft(This,p)
#define IHTMLStyle_put_pixelWidth(This,v) (This)->lpVtbl->put_pixelWidth(This,v)
#define IHTMLStyle_get_pixelWidth(This,p) (This)->lpVtbl->get_pixelWidth(This,p)
#define IHTMLStyle_put_pixelHeight(This,v) (This)->lpVtbl->put_pixelHeight(This,v)
#define IHTMLStyle_get_pixelHeight(This,p) (This)->lpVtbl->get_pixelHeight(This,p)
#define IHTMLStyle_put_posTop(This,v) (This)->lpVtbl->put_posTop(This,v)
#define IHTMLStyle_get_posTop(This,p) (This)->lpVtbl->get_posTop(This,p)
#define IHTMLStyle_put_posLeft(This,v) (This)->lpVtbl->put_posLeft(This,v)
#define IHTMLStyle_get_posLeft(This,p) (This)->lpVtbl->get_posLeft(This,p)
#define IHTMLStyle_put_posWidth(This,v) (This)->lpVtbl->put_posWidth(This,v)
#define IHTMLStyle_get_posWidth(This,p) (This)->lpVtbl->get_posWidth(This,p)
#define IHTMLStyle_put_posHeight(This,v) (This)->lpVtbl->put_posHeight(This,v)
#define IHTMLStyle_get_posHeight(This,p) (This)->lpVtbl->get_posHeight(This,p)
#define IHTMLStyle_put_cursor(This,v) (This)->lpVtbl->put_cursor(This,v)
#define IHTMLStyle_get_cursor(This,p) (This)->lpVtbl->get_cursor(This,p)
#define IHTMLStyle_put_clip(This,v) (This)->lpVtbl->put_clip(This,v)
#define IHTMLStyle_get_clip(This,p) (This)->lpVtbl->get_clip(This,p)
#define IHTMLStyle_put_filter(This,v) (This)->lpVtbl->put_filter(This,v)
#define IHTMLStyle_get_filter(This,p) (This)->lpVtbl->get_filter(This,p)
#define IHTMLStyle_setAttribute(This,strAttributeName,AttributeValue,lFlags) (This)->lpVtbl->setAttribute(This,strAttributeName,AttributeValue,lFlags)
#define IHTMLStyle_getAttribute(This,strAttributeName,lFlags,AttributeValue) (This)->lpVtbl->getAttribute(This,strAttributeName,lFlags,AttributeValue)
#define IHTMLStyle_removeAttribute(This,strAttributeName,lFlags,pfSuccess) (This)->lpVtbl->removeAttribute(This,strAttributeName,lFlags,pfSuccess)
#define IHTMLStyle_toString(This,String) (This)->lpVtbl->toString(This,String)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLStyle_QueryInterface(IHTMLStyle* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLStyle_AddRef(IHTMLStyle* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLStyle_Release(IHTMLStyle* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLStyle_GetTypeInfoCount(IHTMLStyle* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLStyle_GetTypeInfo(IHTMLStyle* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLStyle_GetIDsOfNames(IHTMLStyle* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLStyle_Invoke(IHTMLStyle* 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);
}
/*** IHTMLStyle methods ***/
static FORCEINLINE HRESULT IHTMLStyle_put_fontFamily(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_fontFamily(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_fontFamily(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_fontFamily(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_fontStyle(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_fontStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_fontStyle(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_fontStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_fontVariant(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_fontVariant(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_fontVariant(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_fontVariant(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_fontWeight(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_fontWeight(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_fontWeight(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_fontWeight(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_fontSize(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_fontSize(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_fontSize(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_fontSize(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_font(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_font(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_font(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_font(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_color(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_color(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_color(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_color(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_background(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_background(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_background(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_background(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_backgroundColor(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_backgroundColor(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_backgroundColor(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_backgroundColor(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_backgroundImage(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_backgroundImage(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_backgroundImage(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_backgroundImage(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_backgroundRepeat(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_backgroundRepeat(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_backgroundRepeat(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_backgroundRepeat(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_backgroundAttachment(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_backgroundAttachment(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_backgroundAttachment(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_backgroundAttachment(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_backgroundPosition(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_backgroundPosition(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_backgroundPosition(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_backgroundPosition(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_backgroundPositionX(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_backgroundPositionX(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_backgroundPositionX(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_backgroundPositionX(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_backgroundPositionY(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_backgroundPositionY(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_backgroundPositionY(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_backgroundPositionY(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_wordSpacing(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_wordSpacing(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_wordSpacing(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_wordSpacing(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_letterSpacing(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_letterSpacing(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_letterSpacing(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_letterSpacing(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_textDecoration(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_textDecoration(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_textDecoration(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_textDecoration(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_textDecorationNone(IHTMLStyle* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_textDecorationNone(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_textDecorationNone(IHTMLStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_textDecorationNone(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_textDecorationUnderline(IHTMLStyle* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_textDecorationUnderline(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_textDecorationUnderline(IHTMLStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_textDecorationUnderline(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_textDecorationOverline(IHTMLStyle* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_textDecorationOverline(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_textDecorationOverline(IHTMLStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_textDecorationOverline(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_textDecorationLineThrough(IHTMLStyle* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_textDecorationLineThrough(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_textDecorationLineThrough(IHTMLStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_textDecorationLineThrough(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_textDecorationBlink(IHTMLStyle* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_textDecorationBlink(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_textDecorationBlink(IHTMLStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_textDecorationBlink(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_verticalAlign(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_verticalAlign(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_verticalAlign(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_verticalAlign(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_textTransform(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_textTransform(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_textTransform(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_textTransform(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_textAlign(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_textAlign(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_textAlign(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_textAlign(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_textIndent(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_textIndent(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_textIndent(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_textIndent(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_lineHeight(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_lineHeight(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_lineHeight(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_lineHeight(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_marginTop(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_marginTop(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_marginTop(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_marginTop(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_marginRight(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_marginRight(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_marginRight(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_marginRight(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_marginBottom(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_marginBottom(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_marginBottom(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_marginBottom(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_marginLeft(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_marginLeft(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_marginLeft(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_marginLeft(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_margin(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_margin(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_margin(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_margin(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_paddingTop(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_paddingTop(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_paddingTop(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_paddingTop(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_paddingRight(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_paddingRight(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_paddingRight(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_paddingRight(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_paddingBottom(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_paddingBottom(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_paddingBottom(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_paddingBottom(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_paddingLeft(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_paddingLeft(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_paddingLeft(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_paddingLeft(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_padding(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_padding(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_padding(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_padding(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_border(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_border(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_border(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_border(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_borderTop(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_borderTop(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_borderTop(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderTop(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_borderRight(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_borderRight(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_borderRight(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderRight(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_borderBottom(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_borderBottom(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_borderBottom(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderBottom(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_borderLeft(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_borderLeft(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_borderLeft(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderLeft(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_borderColor(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_borderColor(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_borderColor(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderColor(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_borderTopColor(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderTopColor(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_borderTopColor(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderTopColor(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_borderRightColor(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderRightColor(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_borderRightColor(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderRightColor(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_borderBottomColor(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderBottomColor(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_borderBottomColor(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderBottomColor(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_borderLeftColor(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderLeftColor(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_borderLeftColor(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderLeftColor(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_borderWidth(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_borderWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_borderWidth(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_borderTopWidth(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderTopWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_borderTopWidth(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderTopWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_borderRightWidth(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderRightWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_borderRightWidth(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderRightWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_borderBottomWidth(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderBottomWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_borderBottomWidth(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderBottomWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_borderLeftWidth(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderLeftWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_borderLeftWidth(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderLeftWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_borderStyle(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_borderStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_borderStyle(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_borderTopStyle(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_borderTopStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_borderTopStyle(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderTopStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_borderRightStyle(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_borderRightStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_borderRightStyle(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderRightStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_borderBottomStyle(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_borderBottomStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_borderBottomStyle(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderBottomStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_borderLeftStyle(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_borderLeftStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_borderLeftStyle(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderLeftStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_width(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_width(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_width(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_width(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_height(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_height(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_height(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_height(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_styleFloat(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_styleFloat(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_styleFloat(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_styleFloat(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_clear(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_clear(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_clear(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_clear(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_display(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_display(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_display(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_display(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_visibility(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_visibility(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_visibility(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_visibility(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_listStyleType(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_listStyleType(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_listStyleType(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_listStyleType(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_listStylePosition(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_listStylePosition(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_listStylePosition(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_listStylePosition(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_listStyleImage(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_listStyleImage(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_listStyleImage(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_listStyleImage(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_listStyle(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_listStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_listStyle(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_listStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_whiteSpace(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_whiteSpace(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_whiteSpace(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_whiteSpace(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_top(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_top(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_top(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_top(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_left(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_left(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_left(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_left(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_get_position(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_position(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_zIndex(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_zIndex(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_zIndex(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_zIndex(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_overflow(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_overflow(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_overflow(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_overflow(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_pageBreakBefore(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_pageBreakBefore(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_pageBreakBefore(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_pageBreakBefore(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_pageBreakAfter(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_pageBreakAfter(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_pageBreakAfter(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_pageBreakAfter(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_cssText(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_cssText(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_cssText(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_cssText(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_pixelTop(IHTMLStyle* This,LONG v) {
    return This->lpVtbl->put_pixelTop(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_pixelTop(IHTMLStyle* This,LONG *p) {
    return This->lpVtbl->get_pixelTop(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_pixelLeft(IHTMLStyle* This,LONG v) {
    return This->lpVtbl->put_pixelLeft(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_pixelLeft(IHTMLStyle* This,LONG *p) {
    return This->lpVtbl->get_pixelLeft(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_pixelWidth(IHTMLStyle* This,LONG v) {
    return This->lpVtbl->put_pixelWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_pixelWidth(IHTMLStyle* This,LONG *p) {
    return This->lpVtbl->get_pixelWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_pixelHeight(IHTMLStyle* This,LONG v) {
    return This->lpVtbl->put_pixelHeight(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_pixelHeight(IHTMLStyle* This,LONG *p) {
    return This->lpVtbl->get_pixelHeight(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_posTop(IHTMLStyle* This,float v) {
    return This->lpVtbl->put_posTop(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_posTop(IHTMLStyle* This,float *p) {
    return This->lpVtbl->get_posTop(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_posLeft(IHTMLStyle* This,float v) {
    return This->lpVtbl->put_posLeft(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_posLeft(IHTMLStyle* This,float *p) {
    return This->lpVtbl->get_posLeft(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_posWidth(IHTMLStyle* This,float v) {
    return This->lpVtbl->put_posWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_posWidth(IHTMLStyle* This,float *p) {
    return This->lpVtbl->get_posWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_posHeight(IHTMLStyle* This,float v) {
    return This->lpVtbl->put_posHeight(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_posHeight(IHTMLStyle* This,float *p) {
    return This->lpVtbl->get_posHeight(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_cursor(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_cursor(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_cursor(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_cursor(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_clip(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_clip(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_clip(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_clip(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_put_filter(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_filter(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle_get_filter(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_filter(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle_setAttribute(IHTMLStyle* This,BSTR strAttributeName,VARIANT AttributeValue,LONG lFlags) {
    return This->lpVtbl->setAttribute(This,strAttributeName,AttributeValue,lFlags);
}
static FORCEINLINE HRESULT IHTMLStyle_getAttribute(IHTMLStyle* This,BSTR strAttributeName,LONG lFlags,VARIANT *AttributeValue) {
    return This->lpVtbl->getAttribute(This,strAttributeName,lFlags,AttributeValue);
}
static FORCEINLINE HRESULT IHTMLStyle_removeAttribute(IHTMLStyle* This,BSTR strAttributeName,LONG lFlags,VARIANT_BOOL *pfSuccess) {
    return This->lpVtbl->removeAttribute(This,strAttributeName,lFlags,pfSuccess);
}
static FORCEINLINE HRESULT IHTMLStyle_toString(IHTMLStyle* This,BSTR *String) {
    return This->lpVtbl->toString(This,String);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLStyle_put_fontFamily_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_fontFamily_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_fontFamily_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_fontFamily_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_fontStyle_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_fontStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_fontStyle_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_fontStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_fontVariant_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_fontVariant_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_fontVariant_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_fontVariant_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_fontWeight_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_fontWeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_fontWeight_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_fontWeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_fontSize_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_fontSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_fontSize_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_fontSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_font_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_font_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_font_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_font_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_color_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_color_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_color_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_color_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_background_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_background_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_background_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_background_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_backgroundColor_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_backgroundColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_backgroundColor_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_backgroundColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_backgroundImage_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_backgroundImage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_backgroundImage_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_backgroundImage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_backgroundRepeat_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_backgroundRepeat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_backgroundRepeat_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_backgroundRepeat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_backgroundAttachment_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_backgroundAttachment_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_backgroundAttachment_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_backgroundAttachment_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_backgroundPosition_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_backgroundPosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_backgroundPosition_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_backgroundPosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_backgroundPositionX_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_backgroundPositionX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_backgroundPositionX_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_backgroundPositionX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_backgroundPositionY_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_backgroundPositionY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_backgroundPositionY_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_backgroundPositionY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_wordSpacing_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_wordSpacing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_wordSpacing_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_wordSpacing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_letterSpacing_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_letterSpacing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_letterSpacing_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_letterSpacing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_textDecoration_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_textDecoration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_textDecoration_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_textDecoration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_textDecorationNone_Proxy(
    IHTMLStyle* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLStyle_put_textDecorationNone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_textDecorationNone_Proxy(
    IHTMLStyle* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLStyle_get_textDecorationNone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_textDecorationUnderline_Proxy(
    IHTMLStyle* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLStyle_put_textDecorationUnderline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_textDecorationUnderline_Proxy(
    IHTMLStyle* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLStyle_get_textDecorationUnderline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_textDecorationOverline_Proxy(
    IHTMLStyle* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLStyle_put_textDecorationOverline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_textDecorationOverline_Proxy(
    IHTMLStyle* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLStyle_get_textDecorationOverline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_textDecorationLineThrough_Proxy(
    IHTMLStyle* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLStyle_put_textDecorationLineThrough_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_textDecorationLineThrough_Proxy(
    IHTMLStyle* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLStyle_get_textDecorationLineThrough_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_textDecorationBlink_Proxy(
    IHTMLStyle* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLStyle_put_textDecorationBlink_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_textDecorationBlink_Proxy(
    IHTMLStyle* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLStyle_get_textDecorationBlink_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_verticalAlign_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_verticalAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_verticalAlign_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_verticalAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_textTransform_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_textTransform_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_textTransform_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_textTransform_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_textAlign_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_textAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_textAlign_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_textAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_textIndent_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_textIndent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_textIndent_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_textIndent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_lineHeight_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_lineHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_lineHeight_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_lineHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_marginTop_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_marginTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_marginTop_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_marginTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_marginRight_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_marginRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_marginRight_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_marginRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_marginBottom_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_marginBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_marginBottom_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_marginBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_marginLeft_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_marginLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_marginLeft_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_marginLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_margin_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_margin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_margin_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_margin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_paddingTop_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_paddingTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_paddingTop_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_paddingTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_paddingRight_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_paddingRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_paddingRight_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_paddingRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_paddingBottom_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_paddingBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_paddingBottom_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_paddingBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_paddingLeft_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_paddingLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_paddingLeft_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_paddingLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_padding_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_padding_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_padding_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_padding_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_border_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_border_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_border_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_border_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_borderTop_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_borderTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_borderTop_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_borderTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_borderRight_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_borderRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_borderRight_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_borderRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_borderBottom_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_borderBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_borderBottom_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_borderBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_borderLeft_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_borderLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_borderLeft_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_borderLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_borderColor_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_borderColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_borderColor_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_borderColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_borderTopColor_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_borderTopColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_borderTopColor_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_borderTopColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_borderRightColor_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_borderRightColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_borderRightColor_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_borderRightColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_borderBottomColor_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_borderBottomColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_borderBottomColor_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_borderBottomColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_borderLeftColor_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_borderLeftColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_borderLeftColor_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_borderLeftColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_borderWidth_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_borderWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_borderWidth_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_borderWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_borderTopWidth_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_borderTopWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_borderTopWidth_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_borderTopWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_borderRightWidth_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_borderRightWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_borderRightWidth_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_borderRightWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_borderBottomWidth_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_borderBottomWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_borderBottomWidth_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_borderBottomWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_borderLeftWidth_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_borderLeftWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_borderLeftWidth_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_borderLeftWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_borderStyle_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_borderStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_borderStyle_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_borderStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_borderTopStyle_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_borderTopStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_borderTopStyle_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_borderTopStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_borderRightStyle_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_borderRightStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_borderRightStyle_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_borderRightStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_borderBottomStyle_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_borderBottomStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_borderBottomStyle_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_borderBottomStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_borderLeftStyle_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_borderLeftStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_borderLeftStyle_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_borderLeftStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_width_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_width_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_height_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_height_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_styleFloat_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_styleFloat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_styleFloat_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_styleFloat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_clear_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_clear_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_clear_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_clear_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_display_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_display_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_display_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_display_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_visibility_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_visibility_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_visibility_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_visibility_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_listStyleType_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_listStyleType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_listStyleType_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_listStyleType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_listStylePosition_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_listStylePosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_listStylePosition_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_listStylePosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_listStyleImage_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_listStyleImage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_listStyleImage_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_listStyleImage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_listStyle_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_listStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_listStyle_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_listStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_whiteSpace_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_whiteSpace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_whiteSpace_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_whiteSpace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_top_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_top_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_top_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_top_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_left_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_left_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_left_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_left_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_position_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_position_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_zIndex_Proxy(
    IHTMLStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle_put_zIndex_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_zIndex_Proxy(
    IHTMLStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle_get_zIndex_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_overflow_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_overflow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_overflow_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_overflow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_pageBreakBefore_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_pageBreakBefore_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_pageBreakBefore_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_pageBreakBefore_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_pageBreakAfter_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_pageBreakAfter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_pageBreakAfter_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_pageBreakAfter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_cssText_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_cssText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_cssText_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_cssText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_pixelTop_Proxy(
    IHTMLStyle* This,
    LONG v);
void __RPC_STUB IHTMLStyle_put_pixelTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_pixelTop_Proxy(
    IHTMLStyle* This,
    LONG *p);
void __RPC_STUB IHTMLStyle_get_pixelTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_pixelLeft_Proxy(
    IHTMLStyle* This,
    LONG v);
void __RPC_STUB IHTMLStyle_put_pixelLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_pixelLeft_Proxy(
    IHTMLStyle* This,
    LONG *p);
void __RPC_STUB IHTMLStyle_get_pixelLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_pixelWidth_Proxy(
    IHTMLStyle* This,
    LONG v);
void __RPC_STUB IHTMLStyle_put_pixelWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_pixelWidth_Proxy(
    IHTMLStyle* This,
    LONG *p);
void __RPC_STUB IHTMLStyle_get_pixelWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_pixelHeight_Proxy(
    IHTMLStyle* This,
    LONG v);
void __RPC_STUB IHTMLStyle_put_pixelHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_pixelHeight_Proxy(
    IHTMLStyle* This,
    LONG *p);
void __RPC_STUB IHTMLStyle_get_pixelHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_posTop_Proxy(
    IHTMLStyle* This,
    float v);
void __RPC_STUB IHTMLStyle_put_posTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_posTop_Proxy(
    IHTMLStyle* This,
    float *p);
void __RPC_STUB IHTMLStyle_get_posTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_posLeft_Proxy(
    IHTMLStyle* This,
    float v);
void __RPC_STUB IHTMLStyle_put_posLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_posLeft_Proxy(
    IHTMLStyle* This,
    float *p);
void __RPC_STUB IHTMLStyle_get_posLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_posWidth_Proxy(
    IHTMLStyle* This,
    float v);
void __RPC_STUB IHTMLStyle_put_posWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_posWidth_Proxy(
    IHTMLStyle* This,
    float *p);
void __RPC_STUB IHTMLStyle_get_posWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_posHeight_Proxy(
    IHTMLStyle* This,
    float v);
void __RPC_STUB IHTMLStyle_put_posHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_posHeight_Proxy(
    IHTMLStyle* This,
    float *p);
void __RPC_STUB IHTMLStyle_get_posHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_cursor_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_cursor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_cursor_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_cursor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_clip_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_clip_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_clip_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_clip_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_put_filter_Proxy(
    IHTMLStyle* This,
    BSTR v);
void __RPC_STUB IHTMLStyle_put_filter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_get_filter_Proxy(
    IHTMLStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle_get_filter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_setAttribute_Proxy(
    IHTMLStyle* This,
    BSTR strAttributeName,
    VARIANT AttributeValue,
    LONG lFlags);
void __RPC_STUB IHTMLStyle_setAttribute_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_getAttribute_Proxy(
    IHTMLStyle* This,
    BSTR strAttributeName,
    LONG lFlags,
    VARIANT *AttributeValue);
void __RPC_STUB IHTMLStyle_getAttribute_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_removeAttribute_Proxy(
    IHTMLStyle* This,
    BSTR strAttributeName,
    LONG lFlags,
    VARIANT_BOOL *pfSuccess);
void __RPC_STUB IHTMLStyle_removeAttribute_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle_toString_Proxy(
    IHTMLStyle* This,
    BSTR *String);
void __RPC_STUB IHTMLStyle_toString_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLStyle_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLStyle2 interface
 */
#ifndef __IHTMLStyle2_INTERFACE_DEFINED__
#define __IHTMLStyle2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLStyle2, 0x3050f4a2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f4a2-98b5-11cf-bb82-00aa00bdce0b")
IHTMLStyle2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_tableLayout(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_tableLayout(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderCollapse(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderCollapse(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_direction(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_direction(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_behavior(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_behavior(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE setExpression(
        BSTR propname,
        BSTR expression,
        BSTR language = L"") = 0;

    virtual HRESULT STDMETHODCALLTYPE getExpression(
        BSTR propname,
        VARIANT *expression) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeExpression(
        BSTR propname,
        VARIANT_BOOL *pfSuccess) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_position(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_position(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_unicodeBidi(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_unicodeBidi(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_bottom(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_bottom(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_right(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_right(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_pixelBottom(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pixelBottom(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_pixelRight(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pixelRight(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_posBottom(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_posBottom(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_posRight(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_posRight(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_imeMode(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_imeMode(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_rubyAlign(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_rubyAlign(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_rubyPosition(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_rubyPosition(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_rubyOverhang(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_rubyOverhang(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_layoutGridChar(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_layoutGridChar(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_layoutGridLine(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_layoutGridLine(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_layoutGridMode(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_layoutGridMode(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_layoutGridType(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_layoutGridType(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_layoutGrid(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_layoutGrid(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_wordBreak(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_wordBreak(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_lineBreak(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_lineBreak(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textJustify(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textJustify(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textJustifyTrim(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textJustifyTrim(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textKashida(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textKashida(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textAutospace(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textAutospace(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_overflowX(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_overflowX(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_overflowY(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_overflowY(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_accelerator(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_accelerator(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLStyle2, 0x3050f4a2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLStyle2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLStyle2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_tableLayout)(
        IHTMLStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_tableLayout)(
        IHTMLStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderCollapse)(
        IHTMLStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderCollapse)(
        IHTMLStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_direction)(
        IHTMLStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_direction)(
        IHTMLStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_behavior)(
        IHTMLStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_behavior)(
        IHTMLStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *setExpression)(
        IHTMLStyle2* This,
        BSTR propname,
        BSTR expression,
        BSTR language);

    HRESULT (STDMETHODCALLTYPE *getExpression)(
        IHTMLStyle2* This,
        BSTR propname,
        VARIANT *expression);

    HRESULT (STDMETHODCALLTYPE *removeExpression)(
        IHTMLStyle2* This,
        BSTR propname,
        VARIANT_BOOL *pfSuccess);

    HRESULT (STDMETHODCALLTYPE *put_position)(
        IHTMLStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_position)(
        IHTMLStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_unicodeBidi)(
        IHTMLStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_unicodeBidi)(
        IHTMLStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_bottom)(
        IHTMLStyle2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_bottom)(
        IHTMLStyle2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_right)(
        IHTMLStyle2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_right)(
        IHTMLStyle2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_pixelBottom)(
        IHTMLStyle2* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_pixelBottom)(
        IHTMLStyle2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_pixelRight)(
        IHTMLStyle2* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_pixelRight)(
        IHTMLStyle2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_posBottom)(
        IHTMLStyle2* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_posBottom)(
        IHTMLStyle2* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_posRight)(
        IHTMLStyle2* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_posRight)(
        IHTMLStyle2* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_imeMode)(
        IHTMLStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_imeMode)(
        IHTMLStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_rubyAlign)(
        IHTMLStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_rubyAlign)(
        IHTMLStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_rubyPosition)(
        IHTMLStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_rubyPosition)(
        IHTMLStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_rubyOverhang)(
        IHTMLStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_rubyOverhang)(
        IHTMLStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_layoutGridChar)(
        IHTMLStyle2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_layoutGridChar)(
        IHTMLStyle2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_layoutGridLine)(
        IHTMLStyle2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_layoutGridLine)(
        IHTMLStyle2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_layoutGridMode)(
        IHTMLStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_layoutGridMode)(
        IHTMLStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_layoutGridType)(
        IHTMLStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_layoutGridType)(
        IHTMLStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_layoutGrid)(
        IHTMLStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_layoutGrid)(
        IHTMLStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_wordBreak)(
        IHTMLStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_wordBreak)(
        IHTMLStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_lineBreak)(
        IHTMLStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_lineBreak)(
        IHTMLStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textJustify)(
        IHTMLStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textJustify)(
        IHTMLStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textJustifyTrim)(
        IHTMLStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textJustifyTrim)(
        IHTMLStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textKashida)(
        IHTMLStyle2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_textKashida)(
        IHTMLStyle2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_textAutospace)(
        IHTMLStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textAutospace)(
        IHTMLStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_overflowX)(
        IHTMLStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_overflowX)(
        IHTMLStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_overflowY)(
        IHTMLStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_overflowY)(
        IHTMLStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_accelerator)(
        IHTMLStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_accelerator)(
        IHTMLStyle2* This,
        BSTR *p);

    END_INTERFACE
} IHTMLStyle2Vtbl;
interface IHTMLStyle2 {
    CONST_VTBL IHTMLStyle2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLStyle2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLStyle2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLStyle2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLStyle2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLStyle2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLStyle2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLStyle2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLStyle2 methods ***/
#define IHTMLStyle2_put_tableLayout(This,v) (This)->lpVtbl->put_tableLayout(This,v)
#define IHTMLStyle2_get_tableLayout(This,p) (This)->lpVtbl->get_tableLayout(This,p)
#define IHTMLStyle2_put_borderCollapse(This,v) (This)->lpVtbl->put_borderCollapse(This,v)
#define IHTMLStyle2_get_borderCollapse(This,p) (This)->lpVtbl->get_borderCollapse(This,p)
#define IHTMLStyle2_put_direction(This,v) (This)->lpVtbl->put_direction(This,v)
#define IHTMLStyle2_get_direction(This,p) (This)->lpVtbl->get_direction(This,p)
#define IHTMLStyle2_put_behavior(This,v) (This)->lpVtbl->put_behavior(This,v)
#define IHTMLStyle2_get_behavior(This,p) (This)->lpVtbl->get_behavior(This,p)
#define IHTMLStyle2_setExpression(This,propname,expression,language) (This)->lpVtbl->setExpression(This,propname,expression,language)
#define IHTMLStyle2_getExpression(This,propname,expression) (This)->lpVtbl->getExpression(This,propname,expression)
#define IHTMLStyle2_removeExpression(This,propname,pfSuccess) (This)->lpVtbl->removeExpression(This,propname,pfSuccess)
#define IHTMLStyle2_put_position(This,v) (This)->lpVtbl->put_position(This,v)
#define IHTMLStyle2_get_position(This,p) (This)->lpVtbl->get_position(This,p)
#define IHTMLStyle2_put_unicodeBidi(This,v) (This)->lpVtbl->put_unicodeBidi(This,v)
#define IHTMLStyle2_get_unicodeBidi(This,p) (This)->lpVtbl->get_unicodeBidi(This,p)
#define IHTMLStyle2_put_bottom(This,v) (This)->lpVtbl->put_bottom(This,v)
#define IHTMLStyle2_get_bottom(This,p) (This)->lpVtbl->get_bottom(This,p)
#define IHTMLStyle2_put_right(This,v) (This)->lpVtbl->put_right(This,v)
#define IHTMLStyle2_get_right(This,p) (This)->lpVtbl->get_right(This,p)
#define IHTMLStyle2_put_pixelBottom(This,v) (This)->lpVtbl->put_pixelBottom(This,v)
#define IHTMLStyle2_get_pixelBottom(This,p) (This)->lpVtbl->get_pixelBottom(This,p)
#define IHTMLStyle2_put_pixelRight(This,v) (This)->lpVtbl->put_pixelRight(This,v)
#define IHTMLStyle2_get_pixelRight(This,p) (This)->lpVtbl->get_pixelRight(This,p)
#define IHTMLStyle2_put_posBottom(This,v) (This)->lpVtbl->put_posBottom(This,v)
#define IHTMLStyle2_get_posBottom(This,p) (This)->lpVtbl->get_posBottom(This,p)
#define IHTMLStyle2_put_posRight(This,v) (This)->lpVtbl->put_posRight(This,v)
#define IHTMLStyle2_get_posRight(This,p) (This)->lpVtbl->get_posRight(This,p)
#define IHTMLStyle2_put_imeMode(This,v) (This)->lpVtbl->put_imeMode(This,v)
#define IHTMLStyle2_get_imeMode(This,p) (This)->lpVtbl->get_imeMode(This,p)
#define IHTMLStyle2_put_rubyAlign(This,v) (This)->lpVtbl->put_rubyAlign(This,v)
#define IHTMLStyle2_get_rubyAlign(This,p) (This)->lpVtbl->get_rubyAlign(This,p)
#define IHTMLStyle2_put_rubyPosition(This,v) (This)->lpVtbl->put_rubyPosition(This,v)
#define IHTMLStyle2_get_rubyPosition(This,p) (This)->lpVtbl->get_rubyPosition(This,p)
#define IHTMLStyle2_put_rubyOverhang(This,v) (This)->lpVtbl->put_rubyOverhang(This,v)
#define IHTMLStyle2_get_rubyOverhang(This,p) (This)->lpVtbl->get_rubyOverhang(This,p)
#define IHTMLStyle2_put_layoutGridChar(This,v) (This)->lpVtbl->put_layoutGridChar(This,v)
#define IHTMLStyle2_get_layoutGridChar(This,p) (This)->lpVtbl->get_layoutGridChar(This,p)
#define IHTMLStyle2_put_layoutGridLine(This,v) (This)->lpVtbl->put_layoutGridLine(This,v)
#define IHTMLStyle2_get_layoutGridLine(This,p) (This)->lpVtbl->get_layoutGridLine(This,p)
#define IHTMLStyle2_put_layoutGridMode(This,v) (This)->lpVtbl->put_layoutGridMode(This,v)
#define IHTMLStyle2_get_layoutGridMode(This,p) (This)->lpVtbl->get_layoutGridMode(This,p)
#define IHTMLStyle2_put_layoutGridType(This,v) (This)->lpVtbl->put_layoutGridType(This,v)
#define IHTMLStyle2_get_layoutGridType(This,p) (This)->lpVtbl->get_layoutGridType(This,p)
#define IHTMLStyle2_put_layoutGrid(This,v) (This)->lpVtbl->put_layoutGrid(This,v)
#define IHTMLStyle2_get_layoutGrid(This,p) (This)->lpVtbl->get_layoutGrid(This,p)
#define IHTMLStyle2_put_wordBreak(This,v) (This)->lpVtbl->put_wordBreak(This,v)
#define IHTMLStyle2_get_wordBreak(This,p) (This)->lpVtbl->get_wordBreak(This,p)
#define IHTMLStyle2_put_lineBreak(This,v) (This)->lpVtbl->put_lineBreak(This,v)
#define IHTMLStyle2_get_lineBreak(This,p) (This)->lpVtbl->get_lineBreak(This,p)
#define IHTMLStyle2_put_textJustify(This,v) (This)->lpVtbl->put_textJustify(This,v)
#define IHTMLStyle2_get_textJustify(This,p) (This)->lpVtbl->get_textJustify(This,p)
#define IHTMLStyle2_put_textJustifyTrim(This,v) (This)->lpVtbl->put_textJustifyTrim(This,v)
#define IHTMLStyle2_get_textJustifyTrim(This,p) (This)->lpVtbl->get_textJustifyTrim(This,p)
#define IHTMLStyle2_put_textKashida(This,v) (This)->lpVtbl->put_textKashida(This,v)
#define IHTMLStyle2_get_textKashida(This,p) (This)->lpVtbl->get_textKashida(This,p)
#define IHTMLStyle2_put_textAutospace(This,v) (This)->lpVtbl->put_textAutospace(This,v)
#define IHTMLStyle2_get_textAutospace(This,p) (This)->lpVtbl->get_textAutospace(This,p)
#define IHTMLStyle2_put_overflowX(This,v) (This)->lpVtbl->put_overflowX(This,v)
#define IHTMLStyle2_get_overflowX(This,p) (This)->lpVtbl->get_overflowX(This,p)
#define IHTMLStyle2_put_overflowY(This,v) (This)->lpVtbl->put_overflowY(This,v)
#define IHTMLStyle2_get_overflowY(This,p) (This)->lpVtbl->get_overflowY(This,p)
#define IHTMLStyle2_put_accelerator(This,v) (This)->lpVtbl->put_accelerator(This,v)
#define IHTMLStyle2_get_accelerator(This,p) (This)->lpVtbl->get_accelerator(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLStyle2_QueryInterface(IHTMLStyle2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLStyle2_AddRef(IHTMLStyle2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLStyle2_Release(IHTMLStyle2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLStyle2_GetTypeInfoCount(IHTMLStyle2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLStyle2_GetTypeInfo(IHTMLStyle2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLStyle2_GetIDsOfNames(IHTMLStyle2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLStyle2_Invoke(IHTMLStyle2* 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);
}
/*** IHTMLStyle2 methods ***/
static FORCEINLINE HRESULT IHTMLStyle2_put_tableLayout(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_tableLayout(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle2_get_tableLayout(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_tableLayout(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle2_put_borderCollapse(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_borderCollapse(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle2_get_borderCollapse(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_borderCollapse(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle2_put_direction(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_direction(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle2_get_direction(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_direction(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle2_put_behavior(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_behavior(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle2_get_behavior(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_behavior(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle2_setExpression(IHTMLStyle2* This,BSTR propname,BSTR expression,BSTR language) {
    return This->lpVtbl->setExpression(This,propname,expression,language);
}
static FORCEINLINE HRESULT IHTMLStyle2_getExpression(IHTMLStyle2* This,BSTR propname,VARIANT *expression) {
    return This->lpVtbl->getExpression(This,propname,expression);
}
static FORCEINLINE HRESULT IHTMLStyle2_removeExpression(IHTMLStyle2* This,BSTR propname,VARIANT_BOOL *pfSuccess) {
    return This->lpVtbl->removeExpression(This,propname,pfSuccess);
}
static FORCEINLINE HRESULT IHTMLStyle2_put_position(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_position(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle2_get_position(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_position(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle2_put_unicodeBidi(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_unicodeBidi(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle2_get_unicodeBidi(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_unicodeBidi(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle2_put_bottom(IHTMLStyle2* This,VARIANT v) {
    return This->lpVtbl->put_bottom(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle2_get_bottom(IHTMLStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_bottom(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle2_put_right(IHTMLStyle2* This,VARIANT v) {
    return This->lpVtbl->put_right(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle2_get_right(IHTMLStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_right(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle2_put_pixelBottom(IHTMLStyle2* This,LONG v) {
    return This->lpVtbl->put_pixelBottom(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle2_get_pixelBottom(IHTMLStyle2* This,LONG *p) {
    return This->lpVtbl->get_pixelBottom(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle2_put_pixelRight(IHTMLStyle2* This,LONG v) {
    return This->lpVtbl->put_pixelRight(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle2_get_pixelRight(IHTMLStyle2* This,LONG *p) {
    return This->lpVtbl->get_pixelRight(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle2_put_posBottom(IHTMLStyle2* This,float v) {
    return This->lpVtbl->put_posBottom(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle2_get_posBottom(IHTMLStyle2* This,float *p) {
    return This->lpVtbl->get_posBottom(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle2_put_posRight(IHTMLStyle2* This,float v) {
    return This->lpVtbl->put_posRight(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle2_get_posRight(IHTMLStyle2* This,float *p) {
    return This->lpVtbl->get_posRight(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle2_put_imeMode(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_imeMode(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle2_get_imeMode(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_imeMode(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle2_put_rubyAlign(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_rubyAlign(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle2_get_rubyAlign(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_rubyAlign(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle2_put_rubyPosition(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_rubyPosition(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle2_get_rubyPosition(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_rubyPosition(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle2_put_rubyOverhang(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_rubyOverhang(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle2_get_rubyOverhang(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_rubyOverhang(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle2_put_layoutGridChar(IHTMLStyle2* This,VARIANT v) {
    return This->lpVtbl->put_layoutGridChar(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle2_get_layoutGridChar(IHTMLStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_layoutGridChar(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle2_put_layoutGridLine(IHTMLStyle2* This,VARIANT v) {
    return This->lpVtbl->put_layoutGridLine(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle2_get_layoutGridLine(IHTMLStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_layoutGridLine(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle2_put_layoutGridMode(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_layoutGridMode(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle2_get_layoutGridMode(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_layoutGridMode(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle2_put_layoutGridType(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_layoutGridType(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle2_get_layoutGridType(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_layoutGridType(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle2_put_layoutGrid(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_layoutGrid(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle2_get_layoutGrid(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_layoutGrid(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle2_put_wordBreak(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_wordBreak(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle2_get_wordBreak(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_wordBreak(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle2_put_lineBreak(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_lineBreak(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle2_get_lineBreak(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_lineBreak(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle2_put_textJustify(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_textJustify(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle2_get_textJustify(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_textJustify(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle2_put_textJustifyTrim(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_textJustifyTrim(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle2_get_textJustifyTrim(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_textJustifyTrim(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle2_put_textKashida(IHTMLStyle2* This,VARIANT v) {
    return This->lpVtbl->put_textKashida(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle2_get_textKashida(IHTMLStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_textKashida(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle2_put_textAutospace(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_textAutospace(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle2_get_textAutospace(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_textAutospace(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle2_put_overflowX(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_overflowX(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle2_get_overflowX(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_overflowX(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle2_put_overflowY(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_overflowY(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle2_get_overflowY(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_overflowY(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle2_put_accelerator(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_accelerator(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle2_get_accelerator(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_accelerator(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLStyle2_put_tableLayout_Proxy(
    IHTMLStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLStyle2_put_tableLayout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_get_tableLayout_Proxy(
    IHTMLStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle2_get_tableLayout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_put_borderCollapse_Proxy(
    IHTMLStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLStyle2_put_borderCollapse_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_get_borderCollapse_Proxy(
    IHTMLStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle2_get_borderCollapse_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_put_direction_Proxy(
    IHTMLStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLStyle2_put_direction_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_get_direction_Proxy(
    IHTMLStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle2_get_direction_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_put_behavior_Proxy(
    IHTMLStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLStyle2_put_behavior_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_get_behavior_Proxy(
    IHTMLStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle2_get_behavior_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_setExpression_Proxy(
    IHTMLStyle2* This,
    BSTR propname,
    BSTR expression,
    BSTR language);
void __RPC_STUB IHTMLStyle2_setExpression_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_getExpression_Proxy(
    IHTMLStyle2* This,
    BSTR propname,
    VARIANT *expression);
void __RPC_STUB IHTMLStyle2_getExpression_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_removeExpression_Proxy(
    IHTMLStyle2* This,
    BSTR propname,
    VARIANT_BOOL *pfSuccess);
void __RPC_STUB IHTMLStyle2_removeExpression_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_put_position_Proxy(
    IHTMLStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLStyle2_put_position_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_get_position_Proxy(
    IHTMLStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle2_get_position_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_put_unicodeBidi_Proxy(
    IHTMLStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLStyle2_put_unicodeBidi_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_get_unicodeBidi_Proxy(
    IHTMLStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle2_get_unicodeBidi_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_put_bottom_Proxy(
    IHTMLStyle2* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle2_put_bottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_get_bottom_Proxy(
    IHTMLStyle2* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle2_get_bottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_put_right_Proxy(
    IHTMLStyle2* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle2_put_right_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_get_right_Proxy(
    IHTMLStyle2* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle2_get_right_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_put_pixelBottom_Proxy(
    IHTMLStyle2* This,
    LONG v);
void __RPC_STUB IHTMLStyle2_put_pixelBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_get_pixelBottom_Proxy(
    IHTMLStyle2* This,
    LONG *p);
void __RPC_STUB IHTMLStyle2_get_pixelBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_put_pixelRight_Proxy(
    IHTMLStyle2* This,
    LONG v);
void __RPC_STUB IHTMLStyle2_put_pixelRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_get_pixelRight_Proxy(
    IHTMLStyle2* This,
    LONG *p);
void __RPC_STUB IHTMLStyle2_get_pixelRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_put_posBottom_Proxy(
    IHTMLStyle2* This,
    float v);
void __RPC_STUB IHTMLStyle2_put_posBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_get_posBottom_Proxy(
    IHTMLStyle2* This,
    float *p);
void __RPC_STUB IHTMLStyle2_get_posBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_put_posRight_Proxy(
    IHTMLStyle2* This,
    float v);
void __RPC_STUB IHTMLStyle2_put_posRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_get_posRight_Proxy(
    IHTMLStyle2* This,
    float *p);
void __RPC_STUB IHTMLStyle2_get_posRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_put_imeMode_Proxy(
    IHTMLStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLStyle2_put_imeMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_get_imeMode_Proxy(
    IHTMLStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle2_get_imeMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_put_rubyAlign_Proxy(
    IHTMLStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLStyle2_put_rubyAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_get_rubyAlign_Proxy(
    IHTMLStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle2_get_rubyAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_put_rubyPosition_Proxy(
    IHTMLStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLStyle2_put_rubyPosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_get_rubyPosition_Proxy(
    IHTMLStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle2_get_rubyPosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_put_rubyOverhang_Proxy(
    IHTMLStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLStyle2_put_rubyOverhang_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_get_rubyOverhang_Proxy(
    IHTMLStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle2_get_rubyOverhang_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_put_layoutGridChar_Proxy(
    IHTMLStyle2* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle2_put_layoutGridChar_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_get_layoutGridChar_Proxy(
    IHTMLStyle2* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle2_get_layoutGridChar_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_put_layoutGridLine_Proxy(
    IHTMLStyle2* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle2_put_layoutGridLine_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_get_layoutGridLine_Proxy(
    IHTMLStyle2* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle2_get_layoutGridLine_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_put_layoutGridMode_Proxy(
    IHTMLStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLStyle2_put_layoutGridMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_get_layoutGridMode_Proxy(
    IHTMLStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle2_get_layoutGridMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_put_layoutGridType_Proxy(
    IHTMLStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLStyle2_put_layoutGridType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_get_layoutGridType_Proxy(
    IHTMLStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle2_get_layoutGridType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_put_layoutGrid_Proxy(
    IHTMLStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLStyle2_put_layoutGrid_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_get_layoutGrid_Proxy(
    IHTMLStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle2_get_layoutGrid_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_put_wordBreak_Proxy(
    IHTMLStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLStyle2_put_wordBreak_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_get_wordBreak_Proxy(
    IHTMLStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle2_get_wordBreak_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_put_lineBreak_Proxy(
    IHTMLStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLStyle2_put_lineBreak_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_get_lineBreak_Proxy(
    IHTMLStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle2_get_lineBreak_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_put_textJustify_Proxy(
    IHTMLStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLStyle2_put_textJustify_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_get_textJustify_Proxy(
    IHTMLStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle2_get_textJustify_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_put_textJustifyTrim_Proxy(
    IHTMLStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLStyle2_put_textJustifyTrim_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_get_textJustifyTrim_Proxy(
    IHTMLStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle2_get_textJustifyTrim_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_put_textKashida_Proxy(
    IHTMLStyle2* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle2_put_textKashida_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_get_textKashida_Proxy(
    IHTMLStyle2* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle2_get_textKashida_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_put_textAutospace_Proxy(
    IHTMLStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLStyle2_put_textAutospace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_get_textAutospace_Proxy(
    IHTMLStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle2_get_textAutospace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_put_overflowX_Proxy(
    IHTMLStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLStyle2_put_overflowX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_get_overflowX_Proxy(
    IHTMLStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle2_get_overflowX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_put_overflowY_Proxy(
    IHTMLStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLStyle2_put_overflowY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_get_overflowY_Proxy(
    IHTMLStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle2_get_overflowY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_put_accelerator_Proxy(
    IHTMLStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLStyle2_put_accelerator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle2_get_accelerator_Proxy(
    IHTMLStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle2_get_accelerator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLStyle2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLStyle3 interface
 */
#ifndef __IHTMLStyle3_INTERFACE_DEFINED__
#define __IHTMLStyle3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLStyle3, 0x3050f656, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f656-98b5-11cf-bb82-00aa00bdce0b")
IHTMLStyle3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_layoutFlow(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_layoutFlow(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_zoom(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_zoom(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_wordWrap(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_wordWrap(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textUnderlinePosition(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textUnderlinePosition(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollbarBaseColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbarBaseColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollbarFaceColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbarFaceColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollbar3dLightColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbar3dLightColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollbarShadowColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbarShadowColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollbarHighlightColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbarHighlightColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollbarDarkShadowColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbarDarkShadowColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollbarArrowColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbarArrowColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollbarTrackColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbarTrackColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_writingMode(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_writingMode(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textAlignLast(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textAlignLast(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textKashidaSpace(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textKashidaSpace(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLStyle3, 0x3050f656, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLStyle3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLStyle3 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_layoutFlow)(
        IHTMLStyle3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_layoutFlow)(
        IHTMLStyle3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_zoom)(
        IHTMLStyle3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_zoom)(
        IHTMLStyle3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_wordWrap)(
        IHTMLStyle3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_wordWrap)(
        IHTMLStyle3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textUnderlinePosition)(
        IHTMLStyle3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textUnderlinePosition)(
        IHTMLStyle3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollbarBaseColor)(
        IHTMLStyle3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_scrollbarBaseColor)(
        IHTMLStyle3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollbarFaceColor)(
        IHTMLStyle3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_scrollbarFaceColor)(
        IHTMLStyle3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollbar3dLightColor)(
        IHTMLStyle3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_scrollbar3dLightColor)(
        IHTMLStyle3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollbarShadowColor)(
        IHTMLStyle3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_scrollbarShadowColor)(
        IHTMLStyle3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollbarHighlightColor)(
        IHTMLStyle3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_scrollbarHighlightColor)(
        IHTMLStyle3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollbarDarkShadowColor)(
        IHTMLStyle3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_scrollbarDarkShadowColor)(
        IHTMLStyle3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollbarArrowColor)(
        IHTMLStyle3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_scrollbarArrowColor)(
        IHTMLStyle3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollbarTrackColor)(
        IHTMLStyle3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_scrollbarTrackColor)(
        IHTMLStyle3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_writingMode)(
        IHTMLStyle3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_writingMode)(
        IHTMLStyle3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textAlignLast)(
        IHTMLStyle3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textAlignLast)(
        IHTMLStyle3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textKashidaSpace)(
        IHTMLStyle3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_textKashidaSpace)(
        IHTMLStyle3* This,
        VARIANT *p);

    END_INTERFACE
} IHTMLStyle3Vtbl;
interface IHTMLStyle3 {
    CONST_VTBL IHTMLStyle3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLStyle3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLStyle3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLStyle3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLStyle3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLStyle3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLStyle3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLStyle3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLStyle3 methods ***/
#define IHTMLStyle3_put_layoutFlow(This,v) (This)->lpVtbl->put_layoutFlow(This,v)
#define IHTMLStyle3_get_layoutFlow(This,p) (This)->lpVtbl->get_layoutFlow(This,p)
#define IHTMLStyle3_put_zoom(This,v) (This)->lpVtbl->put_zoom(This,v)
#define IHTMLStyle3_get_zoom(This,p) (This)->lpVtbl->get_zoom(This,p)
#define IHTMLStyle3_put_wordWrap(This,v) (This)->lpVtbl->put_wordWrap(This,v)
#define IHTMLStyle3_get_wordWrap(This,p) (This)->lpVtbl->get_wordWrap(This,p)
#define IHTMLStyle3_put_textUnderlinePosition(This,v) (This)->lpVtbl->put_textUnderlinePosition(This,v)
#define IHTMLStyle3_get_textUnderlinePosition(This,p) (This)->lpVtbl->get_textUnderlinePosition(This,p)
#define IHTMLStyle3_put_scrollbarBaseColor(This,v) (This)->lpVtbl->put_scrollbarBaseColor(This,v)
#define IHTMLStyle3_get_scrollbarBaseColor(This,p) (This)->lpVtbl->get_scrollbarBaseColor(This,p)
#define IHTMLStyle3_put_scrollbarFaceColor(This,v) (This)->lpVtbl->put_scrollbarFaceColor(This,v)
#define IHTMLStyle3_get_scrollbarFaceColor(This,p) (This)->lpVtbl->get_scrollbarFaceColor(This,p)
#define IHTMLStyle3_put_scrollbar3dLightColor(This,v) (This)->lpVtbl->put_scrollbar3dLightColor(This,v)
#define IHTMLStyle3_get_scrollbar3dLightColor(This,p) (This)->lpVtbl->get_scrollbar3dLightColor(This,p)
#define IHTMLStyle3_put_scrollbarShadowColor(This,v) (This)->lpVtbl->put_scrollbarShadowColor(This,v)
#define IHTMLStyle3_get_scrollbarShadowColor(This,p) (This)->lpVtbl->get_scrollbarShadowColor(This,p)
#define IHTMLStyle3_put_scrollbarHighlightColor(This,v) (This)->lpVtbl->put_scrollbarHighlightColor(This,v)
#define IHTMLStyle3_get_scrollbarHighlightColor(This,p) (This)->lpVtbl->get_scrollbarHighlightColor(This,p)
#define IHTMLStyle3_put_scrollbarDarkShadowColor(This,v) (This)->lpVtbl->put_scrollbarDarkShadowColor(This,v)
#define IHTMLStyle3_get_scrollbarDarkShadowColor(This,p) (This)->lpVtbl->get_scrollbarDarkShadowColor(This,p)
#define IHTMLStyle3_put_scrollbarArrowColor(This,v) (This)->lpVtbl->put_scrollbarArrowColor(This,v)
#define IHTMLStyle3_get_scrollbarArrowColor(This,p) (This)->lpVtbl->get_scrollbarArrowColor(This,p)
#define IHTMLStyle3_put_scrollbarTrackColor(This,v) (This)->lpVtbl->put_scrollbarTrackColor(This,v)
#define IHTMLStyle3_get_scrollbarTrackColor(This,p) (This)->lpVtbl->get_scrollbarTrackColor(This,p)
#define IHTMLStyle3_put_writingMode(This,v) (This)->lpVtbl->put_writingMode(This,v)
#define IHTMLStyle3_get_writingMode(This,p) (This)->lpVtbl->get_writingMode(This,p)
#define IHTMLStyle3_put_textAlignLast(This,v) (This)->lpVtbl->put_textAlignLast(This,v)
#define IHTMLStyle3_get_textAlignLast(This,p) (This)->lpVtbl->get_textAlignLast(This,p)
#define IHTMLStyle3_put_textKashidaSpace(This,v) (This)->lpVtbl->put_textKashidaSpace(This,v)
#define IHTMLStyle3_get_textKashidaSpace(This,p) (This)->lpVtbl->get_textKashidaSpace(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLStyle3_QueryInterface(IHTMLStyle3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLStyle3_AddRef(IHTMLStyle3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLStyle3_Release(IHTMLStyle3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLStyle3_GetTypeInfoCount(IHTMLStyle3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLStyle3_GetTypeInfo(IHTMLStyle3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLStyle3_GetIDsOfNames(IHTMLStyle3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLStyle3_Invoke(IHTMLStyle3* 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);
}
/*** IHTMLStyle3 methods ***/
static FORCEINLINE HRESULT IHTMLStyle3_put_layoutFlow(IHTMLStyle3* This,BSTR v) {
    return This->lpVtbl->put_layoutFlow(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle3_get_layoutFlow(IHTMLStyle3* This,BSTR *p) {
    return This->lpVtbl->get_layoutFlow(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle3_put_zoom(IHTMLStyle3* This,VARIANT v) {
    return This->lpVtbl->put_zoom(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle3_get_zoom(IHTMLStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_zoom(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle3_put_wordWrap(IHTMLStyle3* This,BSTR v) {
    return This->lpVtbl->put_wordWrap(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle3_get_wordWrap(IHTMLStyle3* This,BSTR *p) {
    return This->lpVtbl->get_wordWrap(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle3_put_textUnderlinePosition(IHTMLStyle3* This,BSTR v) {
    return This->lpVtbl->put_textUnderlinePosition(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle3_get_textUnderlinePosition(IHTMLStyle3* This,BSTR *p) {
    return This->lpVtbl->get_textUnderlinePosition(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle3_put_scrollbarBaseColor(IHTMLStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarBaseColor(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle3_get_scrollbarBaseColor(IHTMLStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarBaseColor(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle3_put_scrollbarFaceColor(IHTMLStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarFaceColor(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle3_get_scrollbarFaceColor(IHTMLStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarFaceColor(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle3_put_scrollbar3dLightColor(IHTMLStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbar3dLightColor(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle3_get_scrollbar3dLightColor(IHTMLStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbar3dLightColor(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle3_put_scrollbarShadowColor(IHTMLStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarShadowColor(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle3_get_scrollbarShadowColor(IHTMLStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarShadowColor(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle3_put_scrollbarHighlightColor(IHTMLStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarHighlightColor(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle3_get_scrollbarHighlightColor(IHTMLStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarHighlightColor(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle3_put_scrollbarDarkShadowColor(IHTMLStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarDarkShadowColor(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle3_get_scrollbarDarkShadowColor(IHTMLStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarDarkShadowColor(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle3_put_scrollbarArrowColor(IHTMLStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarArrowColor(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle3_get_scrollbarArrowColor(IHTMLStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarArrowColor(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle3_put_scrollbarTrackColor(IHTMLStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarTrackColor(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle3_get_scrollbarTrackColor(IHTMLStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarTrackColor(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle3_put_writingMode(IHTMLStyle3* This,BSTR v) {
    return This->lpVtbl->put_writingMode(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle3_get_writingMode(IHTMLStyle3* This,BSTR *p) {
    return This->lpVtbl->get_writingMode(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle3_put_textAlignLast(IHTMLStyle3* This,BSTR v) {
    return This->lpVtbl->put_textAlignLast(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle3_get_textAlignLast(IHTMLStyle3* This,BSTR *p) {
    return This->lpVtbl->get_textAlignLast(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle3_put_textKashidaSpace(IHTMLStyle3* This,VARIANT v) {
    return This->lpVtbl->put_textKashidaSpace(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle3_get_textKashidaSpace(IHTMLStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_textKashidaSpace(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLStyle3_put_layoutFlow_Proxy(
    IHTMLStyle3* This,
    BSTR v);
void __RPC_STUB IHTMLStyle3_put_layoutFlow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle3_get_layoutFlow_Proxy(
    IHTMLStyle3* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle3_get_layoutFlow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle3_put_zoom_Proxy(
    IHTMLStyle3* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle3_put_zoom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle3_get_zoom_Proxy(
    IHTMLStyle3* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle3_get_zoom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle3_put_wordWrap_Proxy(
    IHTMLStyle3* This,
    BSTR v);
void __RPC_STUB IHTMLStyle3_put_wordWrap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle3_get_wordWrap_Proxy(
    IHTMLStyle3* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle3_get_wordWrap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle3_put_textUnderlinePosition_Proxy(
    IHTMLStyle3* This,
    BSTR v);
void __RPC_STUB IHTMLStyle3_put_textUnderlinePosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle3_get_textUnderlinePosition_Proxy(
    IHTMLStyle3* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle3_get_textUnderlinePosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle3_put_scrollbarBaseColor_Proxy(
    IHTMLStyle3* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle3_put_scrollbarBaseColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle3_get_scrollbarBaseColor_Proxy(
    IHTMLStyle3* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle3_get_scrollbarBaseColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle3_put_scrollbarFaceColor_Proxy(
    IHTMLStyle3* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle3_put_scrollbarFaceColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle3_get_scrollbarFaceColor_Proxy(
    IHTMLStyle3* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle3_get_scrollbarFaceColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle3_put_scrollbar3dLightColor_Proxy(
    IHTMLStyle3* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle3_put_scrollbar3dLightColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle3_get_scrollbar3dLightColor_Proxy(
    IHTMLStyle3* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle3_get_scrollbar3dLightColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle3_put_scrollbarShadowColor_Proxy(
    IHTMLStyle3* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle3_put_scrollbarShadowColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle3_get_scrollbarShadowColor_Proxy(
    IHTMLStyle3* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle3_get_scrollbarShadowColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle3_put_scrollbarHighlightColor_Proxy(
    IHTMLStyle3* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle3_put_scrollbarHighlightColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle3_get_scrollbarHighlightColor_Proxy(
    IHTMLStyle3* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle3_get_scrollbarHighlightColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle3_put_scrollbarDarkShadowColor_Proxy(
    IHTMLStyle3* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle3_put_scrollbarDarkShadowColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle3_get_scrollbarDarkShadowColor_Proxy(
    IHTMLStyle3* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle3_get_scrollbarDarkShadowColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle3_put_scrollbarArrowColor_Proxy(
    IHTMLStyle3* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle3_put_scrollbarArrowColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle3_get_scrollbarArrowColor_Proxy(
    IHTMLStyle3* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle3_get_scrollbarArrowColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle3_put_scrollbarTrackColor_Proxy(
    IHTMLStyle3* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle3_put_scrollbarTrackColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle3_get_scrollbarTrackColor_Proxy(
    IHTMLStyle3* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle3_get_scrollbarTrackColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle3_put_writingMode_Proxy(
    IHTMLStyle3* This,
    BSTR v);
void __RPC_STUB IHTMLStyle3_put_writingMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle3_get_writingMode_Proxy(
    IHTMLStyle3* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle3_get_writingMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle3_put_textAlignLast_Proxy(
    IHTMLStyle3* This,
    BSTR v);
void __RPC_STUB IHTMLStyle3_put_textAlignLast_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle3_get_textAlignLast_Proxy(
    IHTMLStyle3* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle3_get_textAlignLast_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle3_put_textKashidaSpace_Proxy(
    IHTMLStyle3* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle3_put_textKashidaSpace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle3_get_textKashidaSpace_Proxy(
    IHTMLStyle3* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle3_get_textKashidaSpace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLStyle3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLStyle4 interface
 */
#ifndef __IHTMLStyle4_INTERFACE_DEFINED__
#define __IHTMLStyle4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLStyle4, 0x3050f816, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f816-98b5-11cf-bb82-00aa00bdce0b")
IHTMLStyle4 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_textOverflow(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textOverflow(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_minHeight(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_minHeight(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLStyle4, 0x3050f816, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLStyle4Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLStyle4 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_textOverflow)(
        IHTMLStyle4* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textOverflow)(
        IHTMLStyle4* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_minHeight)(
        IHTMLStyle4* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_minHeight)(
        IHTMLStyle4* This,
        VARIANT *p);

    END_INTERFACE
} IHTMLStyle4Vtbl;
interface IHTMLStyle4 {
    CONST_VTBL IHTMLStyle4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLStyle4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLStyle4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLStyle4_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLStyle4_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLStyle4_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLStyle4_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLStyle4_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLStyle4 methods ***/
#define IHTMLStyle4_put_textOverflow(This,v) (This)->lpVtbl->put_textOverflow(This,v)
#define IHTMLStyle4_get_textOverflow(This,p) (This)->lpVtbl->get_textOverflow(This,p)
#define IHTMLStyle4_put_minHeight(This,v) (This)->lpVtbl->put_minHeight(This,v)
#define IHTMLStyle4_get_minHeight(This,p) (This)->lpVtbl->get_minHeight(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLStyle4_QueryInterface(IHTMLStyle4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLStyle4_AddRef(IHTMLStyle4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLStyle4_Release(IHTMLStyle4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLStyle4_GetTypeInfoCount(IHTMLStyle4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLStyle4_GetTypeInfo(IHTMLStyle4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLStyle4_GetIDsOfNames(IHTMLStyle4* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLStyle4_Invoke(IHTMLStyle4* 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);
}
/*** IHTMLStyle4 methods ***/
static FORCEINLINE HRESULT IHTMLStyle4_put_textOverflow(IHTMLStyle4* This,BSTR v) {
    return This->lpVtbl->put_textOverflow(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle4_get_textOverflow(IHTMLStyle4* This,BSTR *p) {
    return This->lpVtbl->get_textOverflow(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle4_put_minHeight(IHTMLStyle4* This,VARIANT v) {
    return This->lpVtbl->put_minHeight(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle4_get_minHeight(IHTMLStyle4* This,VARIANT *p) {
    return This->lpVtbl->get_minHeight(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLStyle4_put_textOverflow_Proxy(
    IHTMLStyle4* This,
    BSTR v);
void __RPC_STUB IHTMLStyle4_put_textOverflow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle4_get_textOverflow_Proxy(
    IHTMLStyle4* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle4_get_textOverflow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle4_put_minHeight_Proxy(
    IHTMLStyle4* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle4_put_minHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle4_get_minHeight_Proxy(
    IHTMLStyle4* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle4_get_minHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLStyle4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLStyle5 interface
 */
#ifndef __IHTMLStyle5_INTERFACE_DEFINED__
#define __IHTMLStyle5_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLStyle5, 0x3050f33a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f33a-98b5-11cf-bb82-00aa00bdce0b")
IHTMLStyle5 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_msInterpolationMode(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msInterpolationMode(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_maxHeight(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_maxHeight(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_minWidth(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_minWidth(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_maxWidth(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_maxWidth(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLStyle5, 0x3050f33a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLStyle5Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLStyle5 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_msInterpolationMode)(
        IHTMLStyle5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msInterpolationMode)(
        IHTMLStyle5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_maxHeight)(
        IHTMLStyle5* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_maxHeight)(
        IHTMLStyle5* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_minWidth)(
        IHTMLStyle5* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_minWidth)(
        IHTMLStyle5* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_maxWidth)(
        IHTMLStyle5* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_maxWidth)(
        IHTMLStyle5* This,
        VARIANT *p);

    END_INTERFACE
} IHTMLStyle5Vtbl;
interface IHTMLStyle5 {
    CONST_VTBL IHTMLStyle5Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLStyle5_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLStyle5_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLStyle5_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLStyle5_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLStyle5_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLStyle5_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLStyle5_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLStyle5 methods ***/
#define IHTMLStyle5_put_msInterpolationMode(This,v) (This)->lpVtbl->put_msInterpolationMode(This,v)
#define IHTMLStyle5_get_msInterpolationMode(This,p) (This)->lpVtbl->get_msInterpolationMode(This,p)
#define IHTMLStyle5_put_maxHeight(This,v) (This)->lpVtbl->put_maxHeight(This,v)
#define IHTMLStyle5_get_maxHeight(This,p) (This)->lpVtbl->get_maxHeight(This,p)
#define IHTMLStyle5_put_minWidth(This,v) (This)->lpVtbl->put_minWidth(This,v)
#define IHTMLStyle5_get_minWidth(This,p) (This)->lpVtbl->get_minWidth(This,p)
#define IHTMLStyle5_put_maxWidth(This,v) (This)->lpVtbl->put_maxWidth(This,v)
#define IHTMLStyle5_get_maxWidth(This,p) (This)->lpVtbl->get_maxWidth(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLStyle5_QueryInterface(IHTMLStyle5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLStyle5_AddRef(IHTMLStyle5* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLStyle5_Release(IHTMLStyle5* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLStyle5_GetTypeInfoCount(IHTMLStyle5* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLStyle5_GetTypeInfo(IHTMLStyle5* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLStyle5_GetIDsOfNames(IHTMLStyle5* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLStyle5_Invoke(IHTMLStyle5* 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);
}
/*** IHTMLStyle5 methods ***/
static FORCEINLINE HRESULT IHTMLStyle5_put_msInterpolationMode(IHTMLStyle5* This,BSTR v) {
    return This->lpVtbl->put_msInterpolationMode(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle5_get_msInterpolationMode(IHTMLStyle5* This,BSTR *p) {
    return This->lpVtbl->get_msInterpolationMode(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle5_put_maxHeight(IHTMLStyle5* This,VARIANT v) {
    return This->lpVtbl->put_maxHeight(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle5_get_maxHeight(IHTMLStyle5* This,VARIANT *p) {
    return This->lpVtbl->get_maxHeight(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle5_put_minWidth(IHTMLStyle5* This,VARIANT v) {
    return This->lpVtbl->put_minWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle5_get_minWidth(IHTMLStyle5* This,VARIANT *p) {
    return This->lpVtbl->get_minWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle5_put_maxWidth(IHTMLStyle5* This,VARIANT v) {
    return This->lpVtbl->put_maxWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle5_get_maxWidth(IHTMLStyle5* This,VARIANT *p) {
    return This->lpVtbl->get_maxWidth(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLStyle5_put_msInterpolationMode_Proxy(
    IHTMLStyle5* This,
    BSTR v);
void __RPC_STUB IHTMLStyle5_put_msInterpolationMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle5_get_msInterpolationMode_Proxy(
    IHTMLStyle5* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle5_get_msInterpolationMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle5_put_maxHeight_Proxy(
    IHTMLStyle5* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle5_put_maxHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle5_get_maxHeight_Proxy(
    IHTMLStyle5* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle5_get_maxHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle5_put_minWidth_Proxy(
    IHTMLStyle5* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle5_put_minWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle5_get_minWidth_Proxy(
    IHTMLStyle5* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle5_get_minWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle5_put_maxWidth_Proxy(
    IHTMLStyle5* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle5_put_maxWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle5_get_maxWidth_Proxy(
    IHTMLStyle5* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle5_get_maxWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLStyle5_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLStyle6 interface
 */
#ifndef __IHTMLStyle6_INTERFACE_DEFINED__
#define __IHTMLStyle6_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLStyle6, 0x30510480, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510480-98b5-11cf-bb82-00aa00bdce0b")
IHTMLStyle6 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_content(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_content(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_captionSide(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_captionSide(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_counterIncrement(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_counterIncrement(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_counterReset(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_counterReset(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_outline(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_outline(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_outlineWidth(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_outlineWidth(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_outlineStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_outlineStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_outlineColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_outlineColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_boxSizing(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_boxSizing(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderSpacing(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderSpacing(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_orphans(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_orphans(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_widows(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_widows(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_pageBreakInside(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pageBreakInside(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_emptyCells(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_emptyCells(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msBlockProgression(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msBlockProgression(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_quotes(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_quotes(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLStyle6, 0x30510480, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLStyle6Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLStyle6 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_content)(
        IHTMLStyle6* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_content)(
        IHTMLStyle6* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_captionSide)(
        IHTMLStyle6* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_captionSide)(
        IHTMLStyle6* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_counterIncrement)(
        IHTMLStyle6* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_counterIncrement)(
        IHTMLStyle6* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_counterReset)(
        IHTMLStyle6* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_counterReset)(
        IHTMLStyle6* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_outline)(
        IHTMLStyle6* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_outline)(
        IHTMLStyle6* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_outlineWidth)(
        IHTMLStyle6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_outlineWidth)(
        IHTMLStyle6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_outlineStyle)(
        IHTMLStyle6* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_outlineStyle)(
        IHTMLStyle6* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_outlineColor)(
        IHTMLStyle6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_outlineColor)(
        IHTMLStyle6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_boxSizing)(
        IHTMLStyle6* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_boxSizing)(
        IHTMLStyle6* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderSpacing)(
        IHTMLStyle6* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderSpacing)(
        IHTMLStyle6* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_orphans)(
        IHTMLStyle6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_orphans)(
        IHTMLStyle6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_widows)(
        IHTMLStyle6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_widows)(
        IHTMLStyle6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_pageBreakInside)(
        IHTMLStyle6* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_pageBreakInside)(
        IHTMLStyle6* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_emptyCells)(
        IHTMLStyle6* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_emptyCells)(
        IHTMLStyle6* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msBlockProgression)(
        IHTMLStyle6* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msBlockProgression)(
        IHTMLStyle6* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_quotes)(
        IHTMLStyle6* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_quotes)(
        IHTMLStyle6* This,
        BSTR *p);

    END_INTERFACE
} IHTMLStyle6Vtbl;
interface IHTMLStyle6 {
    CONST_VTBL IHTMLStyle6Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLStyle6_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLStyle6_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLStyle6_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLStyle6_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLStyle6_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLStyle6_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLStyle6_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLStyle6 methods ***/
#define IHTMLStyle6_put_content(This,v) (This)->lpVtbl->put_content(This,v)
#define IHTMLStyle6_get_content(This,p) (This)->lpVtbl->get_content(This,p)
#define IHTMLStyle6_put_captionSide(This,v) (This)->lpVtbl->put_captionSide(This,v)
#define IHTMLStyle6_get_captionSide(This,p) (This)->lpVtbl->get_captionSide(This,p)
#define IHTMLStyle6_put_counterIncrement(This,v) (This)->lpVtbl->put_counterIncrement(This,v)
#define IHTMLStyle6_get_counterIncrement(This,p) (This)->lpVtbl->get_counterIncrement(This,p)
#define IHTMLStyle6_put_counterReset(This,v) (This)->lpVtbl->put_counterReset(This,v)
#define IHTMLStyle6_get_counterReset(This,p) (This)->lpVtbl->get_counterReset(This,p)
#define IHTMLStyle6_put_outline(This,v) (This)->lpVtbl->put_outline(This,v)
#define IHTMLStyle6_get_outline(This,p) (This)->lpVtbl->get_outline(This,p)
#define IHTMLStyle6_put_outlineWidth(This,v) (This)->lpVtbl->put_outlineWidth(This,v)
#define IHTMLStyle6_get_outlineWidth(This,p) (This)->lpVtbl->get_outlineWidth(This,p)
#define IHTMLStyle6_put_outlineStyle(This,v) (This)->lpVtbl->put_outlineStyle(This,v)
#define IHTMLStyle6_get_outlineStyle(This,p) (This)->lpVtbl->get_outlineStyle(This,p)
#define IHTMLStyle6_put_outlineColor(This,v) (This)->lpVtbl->put_outlineColor(This,v)
#define IHTMLStyle6_get_outlineColor(This,p) (This)->lpVtbl->get_outlineColor(This,p)
#define IHTMLStyle6_put_boxSizing(This,v) (This)->lpVtbl->put_boxSizing(This,v)
#define IHTMLStyle6_get_boxSizing(This,p) (This)->lpVtbl->get_boxSizing(This,p)
#define IHTMLStyle6_put_borderSpacing(This,v) (This)->lpVtbl->put_borderSpacing(This,v)
#define IHTMLStyle6_get_borderSpacing(This,p) (This)->lpVtbl->get_borderSpacing(This,p)
#define IHTMLStyle6_put_orphans(This,v) (This)->lpVtbl->put_orphans(This,v)
#define IHTMLStyle6_get_orphans(This,p) (This)->lpVtbl->get_orphans(This,p)
#define IHTMLStyle6_put_widows(This,v) (This)->lpVtbl->put_widows(This,v)
#define IHTMLStyle6_get_widows(This,p) (This)->lpVtbl->get_widows(This,p)
#define IHTMLStyle6_put_pageBreakInside(This,v) (This)->lpVtbl->put_pageBreakInside(This,v)
#define IHTMLStyle6_get_pageBreakInside(This,p) (This)->lpVtbl->get_pageBreakInside(This,p)
#define IHTMLStyle6_put_emptyCells(This,v) (This)->lpVtbl->put_emptyCells(This,v)
#define IHTMLStyle6_get_emptyCells(This,p) (This)->lpVtbl->get_emptyCells(This,p)
#define IHTMLStyle6_put_msBlockProgression(This,v) (This)->lpVtbl->put_msBlockProgression(This,v)
#define IHTMLStyle6_get_msBlockProgression(This,p) (This)->lpVtbl->get_msBlockProgression(This,p)
#define IHTMLStyle6_put_quotes(This,v) (This)->lpVtbl->put_quotes(This,v)
#define IHTMLStyle6_get_quotes(This,p) (This)->lpVtbl->get_quotes(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLStyle6_QueryInterface(IHTMLStyle6* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLStyle6_AddRef(IHTMLStyle6* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLStyle6_Release(IHTMLStyle6* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLStyle6_GetTypeInfoCount(IHTMLStyle6* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLStyle6_GetTypeInfo(IHTMLStyle6* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLStyle6_GetIDsOfNames(IHTMLStyle6* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLStyle6_Invoke(IHTMLStyle6* 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);
}
/*** IHTMLStyle6 methods ***/
static FORCEINLINE HRESULT IHTMLStyle6_put_content(IHTMLStyle6* This,BSTR v) {
    return This->lpVtbl->put_content(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle6_get_content(IHTMLStyle6* This,BSTR *p) {
    return This->lpVtbl->get_content(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle6_put_captionSide(IHTMLStyle6* This,BSTR v) {
    return This->lpVtbl->put_captionSide(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle6_get_captionSide(IHTMLStyle6* This,BSTR *p) {
    return This->lpVtbl->get_captionSide(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle6_put_counterIncrement(IHTMLStyle6* This,BSTR v) {
    return This->lpVtbl->put_counterIncrement(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle6_get_counterIncrement(IHTMLStyle6* This,BSTR *p) {
    return This->lpVtbl->get_counterIncrement(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle6_put_counterReset(IHTMLStyle6* This,BSTR v) {
    return This->lpVtbl->put_counterReset(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle6_get_counterReset(IHTMLStyle6* This,BSTR *p) {
    return This->lpVtbl->get_counterReset(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle6_put_outline(IHTMLStyle6* This,BSTR v) {
    return This->lpVtbl->put_outline(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle6_get_outline(IHTMLStyle6* This,BSTR *p) {
    return This->lpVtbl->get_outline(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle6_put_outlineWidth(IHTMLStyle6* This,VARIANT v) {
    return This->lpVtbl->put_outlineWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle6_get_outlineWidth(IHTMLStyle6* This,VARIANT *p) {
    return This->lpVtbl->get_outlineWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle6_put_outlineStyle(IHTMLStyle6* This,BSTR v) {
    return This->lpVtbl->put_outlineStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle6_get_outlineStyle(IHTMLStyle6* This,BSTR *p) {
    return This->lpVtbl->get_outlineStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle6_put_outlineColor(IHTMLStyle6* This,VARIANT v) {
    return This->lpVtbl->put_outlineColor(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle6_get_outlineColor(IHTMLStyle6* This,VARIANT *p) {
    return This->lpVtbl->get_outlineColor(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle6_put_boxSizing(IHTMLStyle6* This,BSTR v) {
    return This->lpVtbl->put_boxSizing(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle6_get_boxSizing(IHTMLStyle6* This,BSTR *p) {
    return This->lpVtbl->get_boxSizing(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle6_put_borderSpacing(IHTMLStyle6* This,BSTR v) {
    return This->lpVtbl->put_borderSpacing(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle6_get_borderSpacing(IHTMLStyle6* This,BSTR *p) {
    return This->lpVtbl->get_borderSpacing(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle6_put_orphans(IHTMLStyle6* This,VARIANT v) {
    return This->lpVtbl->put_orphans(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle6_get_orphans(IHTMLStyle6* This,VARIANT *p) {
    return This->lpVtbl->get_orphans(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle6_put_widows(IHTMLStyle6* This,VARIANT v) {
    return This->lpVtbl->put_widows(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle6_get_widows(IHTMLStyle6* This,VARIANT *p) {
    return This->lpVtbl->get_widows(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle6_put_pageBreakInside(IHTMLStyle6* This,BSTR v) {
    return This->lpVtbl->put_pageBreakInside(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle6_get_pageBreakInside(IHTMLStyle6* This,BSTR *p) {
    return This->lpVtbl->get_pageBreakInside(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle6_put_emptyCells(IHTMLStyle6* This,BSTR v) {
    return This->lpVtbl->put_emptyCells(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle6_get_emptyCells(IHTMLStyle6* This,BSTR *p) {
    return This->lpVtbl->get_emptyCells(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle6_put_msBlockProgression(IHTMLStyle6* This,BSTR v) {
    return This->lpVtbl->put_msBlockProgression(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle6_get_msBlockProgression(IHTMLStyle6* This,BSTR *p) {
    return This->lpVtbl->get_msBlockProgression(This,p);
}
static FORCEINLINE HRESULT IHTMLStyle6_put_quotes(IHTMLStyle6* This,BSTR v) {
    return This->lpVtbl->put_quotes(This,v);
}
static FORCEINLINE HRESULT IHTMLStyle6_get_quotes(IHTMLStyle6* This,BSTR *p) {
    return This->lpVtbl->get_quotes(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLStyle6_put_content_Proxy(
    IHTMLStyle6* This,
    BSTR v);
void __RPC_STUB IHTMLStyle6_put_content_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_get_content_Proxy(
    IHTMLStyle6* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle6_get_content_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_put_captionSide_Proxy(
    IHTMLStyle6* This,
    BSTR v);
void __RPC_STUB IHTMLStyle6_put_captionSide_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_get_captionSide_Proxy(
    IHTMLStyle6* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle6_get_captionSide_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_put_counterIncrement_Proxy(
    IHTMLStyle6* This,
    BSTR v);
void __RPC_STUB IHTMLStyle6_put_counterIncrement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_get_counterIncrement_Proxy(
    IHTMLStyle6* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle6_get_counterIncrement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_put_counterReset_Proxy(
    IHTMLStyle6* This,
    BSTR v);
void __RPC_STUB IHTMLStyle6_put_counterReset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_get_counterReset_Proxy(
    IHTMLStyle6* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle6_get_counterReset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_put_outline_Proxy(
    IHTMLStyle6* This,
    BSTR v);
void __RPC_STUB IHTMLStyle6_put_outline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_get_outline_Proxy(
    IHTMLStyle6* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle6_get_outline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_put_outlineWidth_Proxy(
    IHTMLStyle6* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle6_put_outlineWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_get_outlineWidth_Proxy(
    IHTMLStyle6* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle6_get_outlineWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_put_outlineStyle_Proxy(
    IHTMLStyle6* This,
    BSTR v);
void __RPC_STUB IHTMLStyle6_put_outlineStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_get_outlineStyle_Proxy(
    IHTMLStyle6* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle6_get_outlineStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_put_outlineColor_Proxy(
    IHTMLStyle6* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle6_put_outlineColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_get_outlineColor_Proxy(
    IHTMLStyle6* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle6_get_outlineColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_put_boxSizing_Proxy(
    IHTMLStyle6* This,
    BSTR v);
void __RPC_STUB IHTMLStyle6_put_boxSizing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_get_boxSizing_Proxy(
    IHTMLStyle6* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle6_get_boxSizing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_put_borderSpacing_Proxy(
    IHTMLStyle6* This,
    BSTR v);
void __RPC_STUB IHTMLStyle6_put_borderSpacing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_get_borderSpacing_Proxy(
    IHTMLStyle6* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle6_get_borderSpacing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_put_orphans_Proxy(
    IHTMLStyle6* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle6_put_orphans_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_get_orphans_Proxy(
    IHTMLStyle6* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle6_get_orphans_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_put_widows_Proxy(
    IHTMLStyle6* This,
    VARIANT v);
void __RPC_STUB IHTMLStyle6_put_widows_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_get_widows_Proxy(
    IHTMLStyle6* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyle6_get_widows_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_put_pageBreakInside_Proxy(
    IHTMLStyle6* This,
    BSTR v);
void __RPC_STUB IHTMLStyle6_put_pageBreakInside_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_get_pageBreakInside_Proxy(
    IHTMLStyle6* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle6_get_pageBreakInside_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_put_emptyCells_Proxy(
    IHTMLStyle6* This,
    BSTR v);
void __RPC_STUB IHTMLStyle6_put_emptyCells_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_get_emptyCells_Proxy(
    IHTMLStyle6* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle6_get_emptyCells_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_put_msBlockProgression_Proxy(
    IHTMLStyle6* This,
    BSTR v);
void __RPC_STUB IHTMLStyle6_put_msBlockProgression_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_get_msBlockProgression_Proxy(
    IHTMLStyle6* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle6_get_msBlockProgression_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_put_quotes_Proxy(
    IHTMLStyle6* This,
    BSTR v);
void __RPC_STUB IHTMLStyle6_put_quotes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyle6_get_quotes_Proxy(
    IHTMLStyle6* This,
    BSTR *p);
void __RPC_STUB IHTMLStyle6_get_quotes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLStyle6_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLRuleStyle interface
 */
#ifndef __IHTMLRuleStyle_INTERFACE_DEFINED__
#define __IHTMLRuleStyle_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLRuleStyle, 0x3050f3cf, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f3cf-98b5-11cf-bb82-00aa00bdce0b")
IHTMLRuleStyle : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_fontFamily(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fontFamily(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_fontStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fontStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_fontVariant(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fontVariant(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_fontWeight(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fontWeight(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_fontSize(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fontSize(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_font(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_font(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_color(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_color(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_background(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_background(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_backgroundColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_backgroundImage(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundImage(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_backgroundRepeat(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundRepeat(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_backgroundAttachment(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundAttachment(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_backgroundPosition(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundPosition(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_backgroundPositionX(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundPositionX(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_backgroundPositionY(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundPositionY(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_wordSpacing(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_wordSpacing(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_letterSpacing(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_letterSpacing(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textDecoration(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textDecoration(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textDecorationNone(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textDecorationNone(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textDecorationUnderline(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textDecorationUnderline(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textDecorationOverline(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textDecorationOverline(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textDecorationLineThrough(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textDecorationLineThrough(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textDecorationBlink(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textDecorationBlink(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_verticalAlign(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_verticalAlign(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textTransform(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textTransform(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textAlign(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textAlign(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textIndent(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textIndent(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_lineHeight(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_lineHeight(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_marginTop(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_marginTop(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_marginRight(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_marginRight(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_marginBottom(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_marginBottom(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_marginLeft(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_marginLeft(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_margin(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_margin(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_paddingTop(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_paddingTop(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_paddingRight(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_paddingRight(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_paddingBottom(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_paddingBottom(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_paddingLeft(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_paddingLeft(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_padding(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_padding(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_border(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_border(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderTop(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderTop(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderRight(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderRight(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderBottom(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderBottom(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderLeft(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderLeft(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderColor(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderColor(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderTopColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderTopColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderRightColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderRightColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderBottomColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderBottomColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderLeftColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderLeftColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderWidth(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderWidth(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderTopWidth(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderTopWidth(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderRightWidth(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderRightWidth(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderBottomWidth(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderBottomWidth(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderLeftWidth(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderLeftWidth(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderTopStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderTopStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderRightStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderRightStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderBottomStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderBottomStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderLeftStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderLeftStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_width(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_width(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_height(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_height(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_styleFloat(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_styleFloat(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_clear(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clear(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_display(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_display(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_visibility(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_visibility(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_listStyleType(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_listStyleType(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_listStylePosition(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_listStylePosition(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_listStyleImage(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_listStyleImage(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_listStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_listStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_whiteSpace(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_whiteSpace(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_top(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_top(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_left(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_left(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_position(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_zIndex(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_zIndex(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_overflow(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_overflow(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_pageBreakBefore(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pageBreakBefore(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_pageBreakAfter(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pageBreakAfter(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_cssText(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cssText(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_cursor(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cursor(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_clip(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clip(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_filter(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_filter(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE setAttribute(
        BSTR strAttributeName,
        VARIANT AttributeValue,
        LONG lFlags = 1) = 0;

    virtual HRESULT STDMETHODCALLTYPE getAttribute(
        BSTR strAttributeName,
        LONG lFlags = 0,
        VARIANT *AttributeValue = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeAttribute(
        BSTR strAttributeName,
        LONG lFlags = 1,
        VARIANT_BOOL *pfSuccess = 0) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLRuleStyle, 0x3050f3cf, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLRuleStyleVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLRuleStyle methods ***/
    HRESULT (STDMETHODCALLTYPE *put_fontFamily)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_fontFamily)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_fontStyle)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_fontStyle)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_fontVariant)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_fontVariant)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_fontWeight)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_fontWeight)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_fontSize)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_fontSize)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_font)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_font)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_color)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_color)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_background)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_background)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_backgroundColor)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_backgroundColor)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_backgroundImage)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_backgroundImage)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_backgroundRepeat)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_backgroundRepeat)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_backgroundAttachment)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_backgroundAttachment)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_backgroundPosition)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_backgroundPosition)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_backgroundPositionX)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_backgroundPositionX)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_backgroundPositionY)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_backgroundPositionY)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_wordSpacing)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_wordSpacing)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_letterSpacing)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_letterSpacing)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_textDecoration)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textDecoration)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textDecorationNone)(
        IHTMLRuleStyle* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_textDecorationNone)(
        IHTMLRuleStyle* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_textDecorationUnderline)(
        IHTMLRuleStyle* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_textDecorationUnderline)(
        IHTMLRuleStyle* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_textDecorationOverline)(
        IHTMLRuleStyle* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_textDecorationOverline)(
        IHTMLRuleStyle* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_textDecorationLineThrough)(
        IHTMLRuleStyle* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_textDecorationLineThrough)(
        IHTMLRuleStyle* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_textDecorationBlink)(
        IHTMLRuleStyle* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_textDecorationBlink)(
        IHTMLRuleStyle* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_verticalAlign)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_verticalAlign)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_textTransform)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textTransform)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textAlign)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textAlign)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textIndent)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_textIndent)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_lineHeight)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_lineHeight)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_marginTop)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_marginTop)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_marginRight)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_marginRight)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_marginBottom)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_marginBottom)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_marginLeft)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_marginLeft)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_margin)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_margin)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_paddingTop)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_paddingTop)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_paddingRight)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_paddingRight)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_paddingBottom)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_paddingBottom)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_paddingLeft)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_paddingLeft)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_padding)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_padding)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_border)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_border)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderTop)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderTop)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderRight)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderRight)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderBottom)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderBottom)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderLeft)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderLeft)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderColor)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderColor)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderTopColor)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderTopColor)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderRightColor)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderRightColor)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderBottomColor)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderBottomColor)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderLeftColor)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderLeftColor)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderWidth)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderWidth)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderTopWidth)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderTopWidth)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderRightWidth)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderRightWidth)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderBottomWidth)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderBottomWidth)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderLeftWidth)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderLeftWidth)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderStyle)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderStyle)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderTopStyle)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderTopStyle)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderRightStyle)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderRightStyle)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderBottomStyle)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderBottomStyle)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderLeftStyle)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderLeftStyle)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_width)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_width)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_height)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_height)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_styleFloat)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_styleFloat)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_clear)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_clear)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_display)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_display)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_visibility)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_visibility)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_listStyleType)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_listStyleType)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_listStylePosition)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_listStylePosition)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_listStyleImage)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_listStyleImage)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_listStyle)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_listStyle)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_whiteSpace)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_whiteSpace)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_top)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_top)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_left)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_left)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_position)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_zIndex)(
        IHTMLRuleStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_zIndex)(
        IHTMLRuleStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_overflow)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_overflow)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_pageBreakBefore)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_pageBreakBefore)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_pageBreakAfter)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_pageBreakAfter)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_cssText)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_cssText)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_cursor)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_cursor)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_clip)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_clip)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_filter)(
        IHTMLRuleStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_filter)(
        IHTMLRuleStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *setAttribute)(
        IHTMLRuleStyle* This,
        BSTR strAttributeName,
        VARIANT AttributeValue,
        LONG lFlags);

    HRESULT (STDMETHODCALLTYPE *getAttribute)(
        IHTMLRuleStyle* This,
        BSTR strAttributeName,
        LONG lFlags,
        VARIANT *AttributeValue);

    HRESULT (STDMETHODCALLTYPE *removeAttribute)(
        IHTMLRuleStyle* This,
        BSTR strAttributeName,
        LONG lFlags,
        VARIANT_BOOL *pfSuccess);

    END_INTERFACE
} IHTMLRuleStyleVtbl;
interface IHTMLRuleStyle {
    CONST_VTBL IHTMLRuleStyleVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLRuleStyle_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLRuleStyle_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLRuleStyle_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLRuleStyle_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLRuleStyle_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLRuleStyle_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLRuleStyle_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLRuleStyle methods ***/
#define IHTMLRuleStyle_put_fontFamily(This,v) (This)->lpVtbl->put_fontFamily(This,v)
#define IHTMLRuleStyle_get_fontFamily(This,p) (This)->lpVtbl->get_fontFamily(This,p)
#define IHTMLRuleStyle_put_fontStyle(This,v) (This)->lpVtbl->put_fontStyle(This,v)
#define IHTMLRuleStyle_get_fontStyle(This,p) (This)->lpVtbl->get_fontStyle(This,p)
#define IHTMLRuleStyle_put_fontVariant(This,v) (This)->lpVtbl->put_fontVariant(This,v)
#define IHTMLRuleStyle_get_fontVariant(This,p) (This)->lpVtbl->get_fontVariant(This,p)
#define IHTMLRuleStyle_put_fontWeight(This,v) (This)->lpVtbl->put_fontWeight(This,v)
#define IHTMLRuleStyle_get_fontWeight(This,p) (This)->lpVtbl->get_fontWeight(This,p)
#define IHTMLRuleStyle_put_fontSize(This,v) (This)->lpVtbl->put_fontSize(This,v)
#define IHTMLRuleStyle_get_fontSize(This,p) (This)->lpVtbl->get_fontSize(This,p)
#define IHTMLRuleStyle_put_font(This,v) (This)->lpVtbl->put_font(This,v)
#define IHTMLRuleStyle_get_font(This,p) (This)->lpVtbl->get_font(This,p)
#define IHTMLRuleStyle_put_color(This,v) (This)->lpVtbl->put_color(This,v)
#define IHTMLRuleStyle_get_color(This,p) (This)->lpVtbl->get_color(This,p)
#define IHTMLRuleStyle_put_background(This,v) (This)->lpVtbl->put_background(This,v)
#define IHTMLRuleStyle_get_background(This,p) (This)->lpVtbl->get_background(This,p)
#define IHTMLRuleStyle_put_backgroundColor(This,v) (This)->lpVtbl->put_backgroundColor(This,v)
#define IHTMLRuleStyle_get_backgroundColor(This,p) (This)->lpVtbl->get_backgroundColor(This,p)
#define IHTMLRuleStyle_put_backgroundImage(This,v) (This)->lpVtbl->put_backgroundImage(This,v)
#define IHTMLRuleStyle_get_backgroundImage(This,p) (This)->lpVtbl->get_backgroundImage(This,p)
#define IHTMLRuleStyle_put_backgroundRepeat(This,v) (This)->lpVtbl->put_backgroundRepeat(This,v)
#define IHTMLRuleStyle_get_backgroundRepeat(This,p) (This)->lpVtbl->get_backgroundRepeat(This,p)
#define IHTMLRuleStyle_put_backgroundAttachment(This,v) (This)->lpVtbl->put_backgroundAttachment(This,v)
#define IHTMLRuleStyle_get_backgroundAttachment(This,p) (This)->lpVtbl->get_backgroundAttachment(This,p)
#define IHTMLRuleStyle_put_backgroundPosition(This,v) (This)->lpVtbl->put_backgroundPosition(This,v)
#define IHTMLRuleStyle_get_backgroundPosition(This,p) (This)->lpVtbl->get_backgroundPosition(This,p)
#define IHTMLRuleStyle_put_backgroundPositionX(This,v) (This)->lpVtbl->put_backgroundPositionX(This,v)
#define IHTMLRuleStyle_get_backgroundPositionX(This,p) (This)->lpVtbl->get_backgroundPositionX(This,p)
#define IHTMLRuleStyle_put_backgroundPositionY(This,v) (This)->lpVtbl->put_backgroundPositionY(This,v)
#define IHTMLRuleStyle_get_backgroundPositionY(This,p) (This)->lpVtbl->get_backgroundPositionY(This,p)
#define IHTMLRuleStyle_put_wordSpacing(This,v) (This)->lpVtbl->put_wordSpacing(This,v)
#define IHTMLRuleStyle_get_wordSpacing(This,p) (This)->lpVtbl->get_wordSpacing(This,p)
#define IHTMLRuleStyle_put_letterSpacing(This,v) (This)->lpVtbl->put_letterSpacing(This,v)
#define IHTMLRuleStyle_get_letterSpacing(This,p) (This)->lpVtbl->get_letterSpacing(This,p)
#define IHTMLRuleStyle_put_textDecoration(This,v) (This)->lpVtbl->put_textDecoration(This,v)
#define IHTMLRuleStyle_get_textDecoration(This,p) (This)->lpVtbl->get_textDecoration(This,p)
#define IHTMLRuleStyle_put_textDecorationNone(This,v) (This)->lpVtbl->put_textDecorationNone(This,v)
#define IHTMLRuleStyle_get_textDecorationNone(This,p) (This)->lpVtbl->get_textDecorationNone(This,p)
#define IHTMLRuleStyle_put_textDecorationUnderline(This,v) (This)->lpVtbl->put_textDecorationUnderline(This,v)
#define IHTMLRuleStyle_get_textDecorationUnderline(This,p) (This)->lpVtbl->get_textDecorationUnderline(This,p)
#define IHTMLRuleStyle_put_textDecorationOverline(This,v) (This)->lpVtbl->put_textDecorationOverline(This,v)
#define IHTMLRuleStyle_get_textDecorationOverline(This,p) (This)->lpVtbl->get_textDecorationOverline(This,p)
#define IHTMLRuleStyle_put_textDecorationLineThrough(This,v) (This)->lpVtbl->put_textDecorationLineThrough(This,v)
#define IHTMLRuleStyle_get_textDecorationLineThrough(This,p) (This)->lpVtbl->get_textDecorationLineThrough(This,p)
#define IHTMLRuleStyle_put_textDecorationBlink(This,v) (This)->lpVtbl->put_textDecorationBlink(This,v)
#define IHTMLRuleStyle_get_textDecorationBlink(This,p) (This)->lpVtbl->get_textDecorationBlink(This,p)
#define IHTMLRuleStyle_put_verticalAlign(This,v) (This)->lpVtbl->put_verticalAlign(This,v)
#define IHTMLRuleStyle_get_verticalAlign(This,p) (This)->lpVtbl->get_verticalAlign(This,p)
#define IHTMLRuleStyle_put_textTransform(This,v) (This)->lpVtbl->put_textTransform(This,v)
#define IHTMLRuleStyle_get_textTransform(This,p) (This)->lpVtbl->get_textTransform(This,p)
#define IHTMLRuleStyle_put_textAlign(This,v) (This)->lpVtbl->put_textAlign(This,v)
#define IHTMLRuleStyle_get_textAlign(This,p) (This)->lpVtbl->get_textAlign(This,p)
#define IHTMLRuleStyle_put_textIndent(This,v) (This)->lpVtbl->put_textIndent(This,v)
#define IHTMLRuleStyle_get_textIndent(This,p) (This)->lpVtbl->get_textIndent(This,p)
#define IHTMLRuleStyle_put_lineHeight(This,v) (This)->lpVtbl->put_lineHeight(This,v)
#define IHTMLRuleStyle_get_lineHeight(This,p) (This)->lpVtbl->get_lineHeight(This,p)
#define IHTMLRuleStyle_put_marginTop(This,v) (This)->lpVtbl->put_marginTop(This,v)
#define IHTMLRuleStyle_get_marginTop(This,p) (This)->lpVtbl->get_marginTop(This,p)
#define IHTMLRuleStyle_put_marginRight(This,v) (This)->lpVtbl->put_marginRight(This,v)
#define IHTMLRuleStyle_get_marginRight(This,p) (This)->lpVtbl->get_marginRight(This,p)
#define IHTMLRuleStyle_put_marginBottom(This,v) (This)->lpVtbl->put_marginBottom(This,v)
#define IHTMLRuleStyle_get_marginBottom(This,p) (This)->lpVtbl->get_marginBottom(This,p)
#define IHTMLRuleStyle_put_marginLeft(This,v) (This)->lpVtbl->put_marginLeft(This,v)
#define IHTMLRuleStyle_get_marginLeft(This,p) (This)->lpVtbl->get_marginLeft(This,p)
#define IHTMLRuleStyle_put_margin(This,v) (This)->lpVtbl->put_margin(This,v)
#define IHTMLRuleStyle_get_margin(This,p) (This)->lpVtbl->get_margin(This,p)
#define IHTMLRuleStyle_put_paddingTop(This,v) (This)->lpVtbl->put_paddingTop(This,v)
#define IHTMLRuleStyle_get_paddingTop(This,p) (This)->lpVtbl->get_paddingTop(This,p)
#define IHTMLRuleStyle_put_paddingRight(This,v) (This)->lpVtbl->put_paddingRight(This,v)
#define IHTMLRuleStyle_get_paddingRight(This,p) (This)->lpVtbl->get_paddingRight(This,p)
#define IHTMLRuleStyle_put_paddingBottom(This,v) (This)->lpVtbl->put_paddingBottom(This,v)
#define IHTMLRuleStyle_get_paddingBottom(This,p) (This)->lpVtbl->get_paddingBottom(This,p)
#define IHTMLRuleStyle_put_paddingLeft(This,v) (This)->lpVtbl->put_paddingLeft(This,v)
#define IHTMLRuleStyle_get_paddingLeft(This,p) (This)->lpVtbl->get_paddingLeft(This,p)
#define IHTMLRuleStyle_put_padding(This,v) (This)->lpVtbl->put_padding(This,v)
#define IHTMLRuleStyle_get_padding(This,p) (This)->lpVtbl->get_padding(This,p)
#define IHTMLRuleStyle_put_border(This,v) (This)->lpVtbl->put_border(This,v)
#define IHTMLRuleStyle_get_border(This,p) (This)->lpVtbl->get_border(This,p)
#define IHTMLRuleStyle_put_borderTop(This,v) (This)->lpVtbl->put_borderTop(This,v)
#define IHTMLRuleStyle_get_borderTop(This,p) (This)->lpVtbl->get_borderTop(This,p)
#define IHTMLRuleStyle_put_borderRight(This,v) (This)->lpVtbl->put_borderRight(This,v)
#define IHTMLRuleStyle_get_borderRight(This,p) (This)->lpVtbl->get_borderRight(This,p)
#define IHTMLRuleStyle_put_borderBottom(This,v) (This)->lpVtbl->put_borderBottom(This,v)
#define IHTMLRuleStyle_get_borderBottom(This,p) (This)->lpVtbl->get_borderBottom(This,p)
#define IHTMLRuleStyle_put_borderLeft(This,v) (This)->lpVtbl->put_borderLeft(This,v)
#define IHTMLRuleStyle_get_borderLeft(This,p) (This)->lpVtbl->get_borderLeft(This,p)
#define IHTMLRuleStyle_put_borderColor(This,v) (This)->lpVtbl->put_borderColor(This,v)
#define IHTMLRuleStyle_get_borderColor(This,p) (This)->lpVtbl->get_borderColor(This,p)
#define IHTMLRuleStyle_put_borderTopColor(This,v) (This)->lpVtbl->put_borderTopColor(This,v)
#define IHTMLRuleStyle_get_borderTopColor(This,p) (This)->lpVtbl->get_borderTopColor(This,p)
#define IHTMLRuleStyle_put_borderRightColor(This,v) (This)->lpVtbl->put_borderRightColor(This,v)
#define IHTMLRuleStyle_get_borderRightColor(This,p) (This)->lpVtbl->get_borderRightColor(This,p)
#define IHTMLRuleStyle_put_borderBottomColor(This,v) (This)->lpVtbl->put_borderBottomColor(This,v)
#define IHTMLRuleStyle_get_borderBottomColor(This,p) (This)->lpVtbl->get_borderBottomColor(This,p)
#define IHTMLRuleStyle_put_borderLeftColor(This,v) (This)->lpVtbl->put_borderLeftColor(This,v)
#define IHTMLRuleStyle_get_borderLeftColor(This,p) (This)->lpVtbl->get_borderLeftColor(This,p)
#define IHTMLRuleStyle_put_borderWidth(This,v) (This)->lpVtbl->put_borderWidth(This,v)
#define IHTMLRuleStyle_get_borderWidth(This,p) (This)->lpVtbl->get_borderWidth(This,p)
#define IHTMLRuleStyle_put_borderTopWidth(This,v) (This)->lpVtbl->put_borderTopWidth(This,v)
#define IHTMLRuleStyle_get_borderTopWidth(This,p) (This)->lpVtbl->get_borderTopWidth(This,p)
#define IHTMLRuleStyle_put_borderRightWidth(This,v) (This)->lpVtbl->put_borderRightWidth(This,v)
#define IHTMLRuleStyle_get_borderRightWidth(This,p) (This)->lpVtbl->get_borderRightWidth(This,p)
#define IHTMLRuleStyle_put_borderBottomWidth(This,v) (This)->lpVtbl->put_borderBottomWidth(This,v)
#define IHTMLRuleStyle_get_borderBottomWidth(This,p) (This)->lpVtbl->get_borderBottomWidth(This,p)
#define IHTMLRuleStyle_put_borderLeftWidth(This,v) (This)->lpVtbl->put_borderLeftWidth(This,v)
#define IHTMLRuleStyle_get_borderLeftWidth(This,p) (This)->lpVtbl->get_borderLeftWidth(This,p)
#define IHTMLRuleStyle_put_borderStyle(This,v) (This)->lpVtbl->put_borderStyle(This,v)
#define IHTMLRuleStyle_get_borderStyle(This,p) (This)->lpVtbl->get_borderStyle(This,p)
#define IHTMLRuleStyle_put_borderTopStyle(This,v) (This)->lpVtbl->put_borderTopStyle(This,v)
#define IHTMLRuleStyle_get_borderTopStyle(This,p) (This)->lpVtbl->get_borderTopStyle(This,p)
#define IHTMLRuleStyle_put_borderRightStyle(This,v) (This)->lpVtbl->put_borderRightStyle(This,v)
#define IHTMLRuleStyle_get_borderRightStyle(This,p) (This)->lpVtbl->get_borderRightStyle(This,p)
#define IHTMLRuleStyle_put_borderBottomStyle(This,v) (This)->lpVtbl->put_borderBottomStyle(This,v)
#define IHTMLRuleStyle_get_borderBottomStyle(This,p) (This)->lpVtbl->get_borderBottomStyle(This,p)
#define IHTMLRuleStyle_put_borderLeftStyle(This,v) (This)->lpVtbl->put_borderLeftStyle(This,v)
#define IHTMLRuleStyle_get_borderLeftStyle(This,p) (This)->lpVtbl->get_borderLeftStyle(This,p)
#define IHTMLRuleStyle_put_width(This,v) (This)->lpVtbl->put_width(This,v)
#define IHTMLRuleStyle_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#define IHTMLRuleStyle_put_height(This,v) (This)->lpVtbl->put_height(This,v)
#define IHTMLRuleStyle_get_height(This,p) (This)->lpVtbl->get_height(This,p)
#define IHTMLRuleStyle_put_styleFloat(This,v) (This)->lpVtbl->put_styleFloat(This,v)
#define IHTMLRuleStyle_get_styleFloat(This,p) (This)->lpVtbl->get_styleFloat(This,p)
#define IHTMLRuleStyle_put_clear(This,v) (This)->lpVtbl->put_clear(This,v)
#define IHTMLRuleStyle_get_clear(This,p) (This)->lpVtbl->get_clear(This,p)
#define IHTMLRuleStyle_put_display(This,v) (This)->lpVtbl->put_display(This,v)
#define IHTMLRuleStyle_get_display(This,p) (This)->lpVtbl->get_display(This,p)
#define IHTMLRuleStyle_put_visibility(This,v) (This)->lpVtbl->put_visibility(This,v)
#define IHTMLRuleStyle_get_visibility(This,p) (This)->lpVtbl->get_visibility(This,p)
#define IHTMLRuleStyle_put_listStyleType(This,v) (This)->lpVtbl->put_listStyleType(This,v)
#define IHTMLRuleStyle_get_listStyleType(This,p) (This)->lpVtbl->get_listStyleType(This,p)
#define IHTMLRuleStyle_put_listStylePosition(This,v) (This)->lpVtbl->put_listStylePosition(This,v)
#define IHTMLRuleStyle_get_listStylePosition(This,p) (This)->lpVtbl->get_listStylePosition(This,p)
#define IHTMLRuleStyle_put_listStyleImage(This,v) (This)->lpVtbl->put_listStyleImage(This,v)
#define IHTMLRuleStyle_get_listStyleImage(This,p) (This)->lpVtbl->get_listStyleImage(This,p)
#define IHTMLRuleStyle_put_listStyle(This,v) (This)->lpVtbl->put_listStyle(This,v)
#define IHTMLRuleStyle_get_listStyle(This,p) (This)->lpVtbl->get_listStyle(This,p)
#define IHTMLRuleStyle_put_whiteSpace(This,v) (This)->lpVtbl->put_whiteSpace(This,v)
#define IHTMLRuleStyle_get_whiteSpace(This,p) (This)->lpVtbl->get_whiteSpace(This,p)
#define IHTMLRuleStyle_put_top(This,v) (This)->lpVtbl->put_top(This,v)
#define IHTMLRuleStyle_get_top(This,p) (This)->lpVtbl->get_top(This,p)
#define IHTMLRuleStyle_put_left(This,v) (This)->lpVtbl->put_left(This,v)
#define IHTMLRuleStyle_get_left(This,p) (This)->lpVtbl->get_left(This,p)
#define IHTMLRuleStyle_get_position(This,p) (This)->lpVtbl->get_position(This,p)
#define IHTMLRuleStyle_put_zIndex(This,v) (This)->lpVtbl->put_zIndex(This,v)
#define IHTMLRuleStyle_get_zIndex(This,p) (This)->lpVtbl->get_zIndex(This,p)
#define IHTMLRuleStyle_put_overflow(This,v) (This)->lpVtbl->put_overflow(This,v)
#define IHTMLRuleStyle_get_overflow(This,p) (This)->lpVtbl->get_overflow(This,p)
#define IHTMLRuleStyle_put_pageBreakBefore(This,v) (This)->lpVtbl->put_pageBreakBefore(This,v)
#define IHTMLRuleStyle_get_pageBreakBefore(This,p) (This)->lpVtbl->get_pageBreakBefore(This,p)
#define IHTMLRuleStyle_put_pageBreakAfter(This,v) (This)->lpVtbl->put_pageBreakAfter(This,v)
#define IHTMLRuleStyle_get_pageBreakAfter(This,p) (This)->lpVtbl->get_pageBreakAfter(This,p)
#define IHTMLRuleStyle_put_cssText(This,v) (This)->lpVtbl->put_cssText(This,v)
#define IHTMLRuleStyle_get_cssText(This,p) (This)->lpVtbl->get_cssText(This,p)
#define IHTMLRuleStyle_put_cursor(This,v) (This)->lpVtbl->put_cursor(This,v)
#define IHTMLRuleStyle_get_cursor(This,p) (This)->lpVtbl->get_cursor(This,p)
#define IHTMLRuleStyle_put_clip(This,v) (This)->lpVtbl->put_clip(This,v)
#define IHTMLRuleStyle_get_clip(This,p) (This)->lpVtbl->get_clip(This,p)
#define IHTMLRuleStyle_put_filter(This,v) (This)->lpVtbl->put_filter(This,v)
#define IHTMLRuleStyle_get_filter(This,p) (This)->lpVtbl->get_filter(This,p)
#define IHTMLRuleStyle_setAttribute(This,strAttributeName,AttributeValue,lFlags) (This)->lpVtbl->setAttribute(This,strAttributeName,AttributeValue,lFlags)
#define IHTMLRuleStyle_getAttribute(This,strAttributeName,lFlags,AttributeValue) (This)->lpVtbl->getAttribute(This,strAttributeName,lFlags,AttributeValue)
#define IHTMLRuleStyle_removeAttribute(This,strAttributeName,lFlags,pfSuccess) (This)->lpVtbl->removeAttribute(This,strAttributeName,lFlags,pfSuccess)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLRuleStyle_QueryInterface(IHTMLRuleStyle* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLRuleStyle_AddRef(IHTMLRuleStyle* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLRuleStyle_Release(IHTMLRuleStyle* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLRuleStyle_GetTypeInfoCount(IHTMLRuleStyle* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_GetTypeInfo(IHTMLRuleStyle* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_GetIDsOfNames(IHTMLRuleStyle* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_Invoke(IHTMLRuleStyle* 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);
}
/*** IHTMLRuleStyle methods ***/
static FORCEINLINE HRESULT IHTMLRuleStyle_put_fontFamily(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_fontFamily(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_fontFamily(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_fontFamily(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_fontStyle(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_fontStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_fontStyle(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_fontStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_fontVariant(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_fontVariant(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_fontVariant(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_fontVariant(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_fontWeight(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_fontWeight(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_fontWeight(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_fontWeight(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_fontSize(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_fontSize(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_fontSize(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_fontSize(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_font(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_font(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_font(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_font(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_color(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_color(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_color(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_color(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_background(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_background(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_background(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_background(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_backgroundColor(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_backgroundColor(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_backgroundColor(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_backgroundColor(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_backgroundImage(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_backgroundImage(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_backgroundImage(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_backgroundImage(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_backgroundRepeat(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_backgroundRepeat(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_backgroundRepeat(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_backgroundRepeat(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_backgroundAttachment(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_backgroundAttachment(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_backgroundAttachment(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_backgroundAttachment(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_backgroundPosition(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_backgroundPosition(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_backgroundPosition(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_backgroundPosition(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_backgroundPositionX(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_backgroundPositionX(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_backgroundPositionX(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_backgroundPositionX(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_backgroundPositionY(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_backgroundPositionY(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_backgroundPositionY(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_backgroundPositionY(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_wordSpacing(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_wordSpacing(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_wordSpacing(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_wordSpacing(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_letterSpacing(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_letterSpacing(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_letterSpacing(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_letterSpacing(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_textDecoration(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_textDecoration(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_textDecoration(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_textDecoration(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_textDecorationNone(IHTMLRuleStyle* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_textDecorationNone(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_textDecorationNone(IHTMLRuleStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_textDecorationNone(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_textDecorationUnderline(IHTMLRuleStyle* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_textDecorationUnderline(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_textDecorationUnderline(IHTMLRuleStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_textDecorationUnderline(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_textDecorationOverline(IHTMLRuleStyle* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_textDecorationOverline(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_textDecorationOverline(IHTMLRuleStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_textDecorationOverline(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_textDecorationLineThrough(IHTMLRuleStyle* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_textDecorationLineThrough(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_textDecorationLineThrough(IHTMLRuleStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_textDecorationLineThrough(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_textDecorationBlink(IHTMLRuleStyle* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_textDecorationBlink(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_textDecorationBlink(IHTMLRuleStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_textDecorationBlink(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_verticalAlign(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_verticalAlign(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_verticalAlign(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_verticalAlign(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_textTransform(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_textTransform(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_textTransform(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_textTransform(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_textAlign(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_textAlign(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_textAlign(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_textAlign(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_textIndent(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_textIndent(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_textIndent(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_textIndent(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_lineHeight(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_lineHeight(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_lineHeight(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_lineHeight(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_marginTop(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_marginTop(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_marginTop(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_marginTop(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_marginRight(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_marginRight(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_marginRight(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_marginRight(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_marginBottom(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_marginBottom(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_marginBottom(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_marginBottom(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_marginLeft(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_marginLeft(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_marginLeft(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_marginLeft(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_margin(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_margin(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_margin(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_margin(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_paddingTop(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_paddingTop(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_paddingTop(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_paddingTop(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_paddingRight(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_paddingRight(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_paddingRight(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_paddingRight(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_paddingBottom(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_paddingBottom(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_paddingBottom(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_paddingBottom(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_paddingLeft(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_paddingLeft(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_paddingLeft(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_paddingLeft(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_padding(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_padding(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_padding(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_padding(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_border(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_border(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_border(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_border(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_borderTop(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_borderTop(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_borderTop(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderTop(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_borderRight(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_borderRight(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_borderRight(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderRight(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_borderBottom(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_borderBottom(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_borderBottom(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderBottom(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_borderLeft(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_borderLeft(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_borderLeft(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderLeft(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_borderColor(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_borderColor(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_borderColor(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderColor(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_borderTopColor(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderTopColor(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_borderTopColor(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderTopColor(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_borderRightColor(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderRightColor(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_borderRightColor(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderRightColor(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_borderBottomColor(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderBottomColor(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_borderBottomColor(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderBottomColor(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_borderLeftColor(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderLeftColor(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_borderLeftColor(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderLeftColor(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_borderWidth(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_borderWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_borderWidth(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_borderTopWidth(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderTopWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_borderTopWidth(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderTopWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_borderRightWidth(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderRightWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_borderRightWidth(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderRightWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_borderBottomWidth(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderBottomWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_borderBottomWidth(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderBottomWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_borderLeftWidth(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderLeftWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_borderLeftWidth(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderLeftWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_borderStyle(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_borderStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_borderStyle(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_borderTopStyle(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_borderTopStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_borderTopStyle(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderTopStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_borderRightStyle(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_borderRightStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_borderRightStyle(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderRightStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_borderBottomStyle(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_borderBottomStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_borderBottomStyle(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderBottomStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_borderLeftStyle(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_borderLeftStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_borderLeftStyle(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderLeftStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_width(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_width(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_width(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_width(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_height(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_height(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_height(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_height(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_styleFloat(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_styleFloat(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_styleFloat(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_styleFloat(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_clear(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_clear(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_clear(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_clear(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_display(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_display(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_display(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_display(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_visibility(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_visibility(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_visibility(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_visibility(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_listStyleType(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_listStyleType(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_listStyleType(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_listStyleType(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_listStylePosition(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_listStylePosition(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_listStylePosition(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_listStylePosition(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_listStyleImage(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_listStyleImage(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_listStyleImage(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_listStyleImage(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_listStyle(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_listStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_listStyle(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_listStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_whiteSpace(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_whiteSpace(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_whiteSpace(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_whiteSpace(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_top(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_top(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_top(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_top(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_left(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_left(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_left(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_left(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_position(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_position(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_zIndex(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_zIndex(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_zIndex(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_zIndex(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_overflow(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_overflow(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_overflow(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_overflow(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_pageBreakBefore(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_pageBreakBefore(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_pageBreakBefore(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_pageBreakBefore(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_pageBreakAfter(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_pageBreakAfter(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_pageBreakAfter(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_pageBreakAfter(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_cssText(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_cssText(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_cssText(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_cssText(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_cursor(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_cursor(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_cursor(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_cursor(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_clip(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_clip(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_clip(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_clip(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_put_filter(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_filter(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_get_filter(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_filter(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_setAttribute(IHTMLRuleStyle* This,BSTR strAttributeName,VARIANT AttributeValue,LONG lFlags) {
    return This->lpVtbl->setAttribute(This,strAttributeName,AttributeValue,lFlags);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_getAttribute(IHTMLRuleStyle* This,BSTR strAttributeName,LONG lFlags,VARIANT *AttributeValue) {
    return This->lpVtbl->getAttribute(This,strAttributeName,lFlags,AttributeValue);
}
static FORCEINLINE HRESULT IHTMLRuleStyle_removeAttribute(IHTMLRuleStyle* This,BSTR strAttributeName,LONG lFlags,VARIANT_BOOL *pfSuccess) {
    return This->lpVtbl->removeAttribute(This,strAttributeName,lFlags,pfSuccess);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_fontFamily_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_fontFamily_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_fontFamily_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_fontFamily_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_fontStyle_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_fontStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_fontStyle_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_fontStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_fontVariant_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_fontVariant_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_fontVariant_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_fontVariant_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_fontWeight_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_fontWeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_fontWeight_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_fontWeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_fontSize_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_fontSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_fontSize_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_fontSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_font_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_font_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_font_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_font_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_color_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_color_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_color_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_color_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_background_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_background_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_background_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_background_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_backgroundColor_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_backgroundColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_backgroundColor_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_backgroundColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_backgroundImage_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_backgroundImage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_backgroundImage_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_backgroundImage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_backgroundRepeat_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_backgroundRepeat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_backgroundRepeat_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_backgroundRepeat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_backgroundAttachment_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_backgroundAttachment_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_backgroundAttachment_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_backgroundAttachment_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_backgroundPosition_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_backgroundPosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_backgroundPosition_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_backgroundPosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_backgroundPositionX_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_backgroundPositionX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_backgroundPositionX_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_backgroundPositionX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_backgroundPositionY_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_backgroundPositionY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_backgroundPositionY_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_backgroundPositionY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_wordSpacing_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_wordSpacing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_wordSpacing_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_wordSpacing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_letterSpacing_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_letterSpacing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_letterSpacing_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_letterSpacing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_textDecoration_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_textDecoration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_textDecoration_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_textDecoration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_textDecorationNone_Proxy(
    IHTMLRuleStyle* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLRuleStyle_put_textDecorationNone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_textDecorationNone_Proxy(
    IHTMLRuleStyle* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLRuleStyle_get_textDecorationNone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_textDecorationUnderline_Proxy(
    IHTMLRuleStyle* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLRuleStyle_put_textDecorationUnderline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_textDecorationUnderline_Proxy(
    IHTMLRuleStyle* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLRuleStyle_get_textDecorationUnderline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_textDecorationOverline_Proxy(
    IHTMLRuleStyle* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLRuleStyle_put_textDecorationOverline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_textDecorationOverline_Proxy(
    IHTMLRuleStyle* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLRuleStyle_get_textDecorationOverline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_textDecorationLineThrough_Proxy(
    IHTMLRuleStyle* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLRuleStyle_put_textDecorationLineThrough_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_textDecorationLineThrough_Proxy(
    IHTMLRuleStyle* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLRuleStyle_get_textDecorationLineThrough_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_textDecorationBlink_Proxy(
    IHTMLRuleStyle* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLRuleStyle_put_textDecorationBlink_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_textDecorationBlink_Proxy(
    IHTMLRuleStyle* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLRuleStyle_get_textDecorationBlink_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_verticalAlign_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_verticalAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_verticalAlign_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_verticalAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_textTransform_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_textTransform_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_textTransform_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_textTransform_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_textAlign_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_textAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_textAlign_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_textAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_textIndent_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_textIndent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_textIndent_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_textIndent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_lineHeight_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_lineHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_lineHeight_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_lineHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_marginTop_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_marginTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_marginTop_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_marginTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_marginRight_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_marginRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_marginRight_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_marginRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_marginBottom_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_marginBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_marginBottom_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_marginBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_marginLeft_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_marginLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_marginLeft_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_marginLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_margin_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_margin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_margin_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_margin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_paddingTop_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_paddingTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_paddingTop_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_paddingTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_paddingRight_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_paddingRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_paddingRight_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_paddingRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_paddingBottom_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_paddingBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_paddingBottom_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_paddingBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_paddingLeft_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_paddingLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_paddingLeft_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_paddingLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_padding_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_padding_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_padding_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_padding_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_border_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_border_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_border_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_border_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_borderTop_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_borderTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_borderTop_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_borderTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_borderRight_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_borderRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_borderRight_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_borderRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_borderBottom_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_borderBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_borderBottom_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_borderBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_borderLeft_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_borderLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_borderLeft_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_borderLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_borderColor_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_borderColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_borderColor_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_borderColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_borderTopColor_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_borderTopColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_borderTopColor_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_borderTopColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_borderRightColor_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_borderRightColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_borderRightColor_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_borderRightColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_borderBottomColor_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_borderBottomColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_borderBottomColor_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_borderBottomColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_borderLeftColor_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_borderLeftColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_borderLeftColor_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_borderLeftColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_borderWidth_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_borderWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_borderWidth_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_borderWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_borderTopWidth_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_borderTopWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_borderTopWidth_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_borderTopWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_borderRightWidth_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_borderRightWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_borderRightWidth_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_borderRightWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_borderBottomWidth_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_borderBottomWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_borderBottomWidth_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_borderBottomWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_borderLeftWidth_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_borderLeftWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_borderLeftWidth_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_borderLeftWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_borderStyle_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_borderStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_borderStyle_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_borderStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_borderTopStyle_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_borderTopStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_borderTopStyle_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_borderTopStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_borderRightStyle_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_borderRightStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_borderRightStyle_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_borderRightStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_borderBottomStyle_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_borderBottomStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_borderBottomStyle_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_borderBottomStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_borderLeftStyle_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_borderLeftStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_borderLeftStyle_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_borderLeftStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_width_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_width_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_height_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_height_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_styleFloat_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_styleFloat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_styleFloat_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_styleFloat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_clear_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_clear_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_clear_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_clear_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_display_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_display_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_display_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_display_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_visibility_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_visibility_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_visibility_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_visibility_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_listStyleType_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_listStyleType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_listStyleType_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_listStyleType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_listStylePosition_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_listStylePosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_listStylePosition_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_listStylePosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_listStyleImage_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_listStyleImage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_listStyleImage_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_listStyleImage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_listStyle_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_listStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_listStyle_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_listStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_whiteSpace_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_whiteSpace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_whiteSpace_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_whiteSpace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_top_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_top_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_top_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_top_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_left_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_left_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_left_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_left_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_position_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_position_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_zIndex_Proxy(
    IHTMLRuleStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle_put_zIndex_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_zIndex_Proxy(
    IHTMLRuleStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle_get_zIndex_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_overflow_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_overflow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_overflow_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_overflow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_pageBreakBefore_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_pageBreakBefore_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_pageBreakBefore_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_pageBreakBefore_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_pageBreakAfter_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_pageBreakAfter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_pageBreakAfter_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_pageBreakAfter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_cssText_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_cssText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_cssText_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_cssText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_cursor_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_cursor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_cursor_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_cursor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_clip_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_clip_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_clip_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_clip_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_put_filter_Proxy(
    IHTMLRuleStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle_put_filter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_get_filter_Proxy(
    IHTMLRuleStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle_get_filter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_setAttribute_Proxy(
    IHTMLRuleStyle* This,
    BSTR strAttributeName,
    VARIANT AttributeValue,
    LONG lFlags);
void __RPC_STUB IHTMLRuleStyle_setAttribute_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_getAttribute_Proxy(
    IHTMLRuleStyle* This,
    BSTR strAttributeName,
    LONG lFlags,
    VARIANT *AttributeValue);
void __RPC_STUB IHTMLRuleStyle_getAttribute_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle_removeAttribute_Proxy(
    IHTMLRuleStyle* This,
    BSTR strAttributeName,
    LONG lFlags,
    VARIANT_BOOL *pfSuccess);
void __RPC_STUB IHTMLRuleStyle_removeAttribute_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLRuleStyle_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLRuleStyle2 interface
 */
#ifndef __IHTMLRuleStyle2_INTERFACE_DEFINED__
#define __IHTMLRuleStyle2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLRuleStyle2, 0x3050f4ac, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f4ac-98b5-11cf-bb82-00aa00bdce0b")
IHTMLRuleStyle2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_tableLayout(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_tableLayout(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderCollapse(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderCollapse(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_direction(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_direction(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_behavior(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_behavior(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_position(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_position(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_unicodeBidi(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_unicodeBidi(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_bottom(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_bottom(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_right(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_right(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_pixelBottom(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pixelBottom(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_pixelRight(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pixelRight(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_posBottom(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_posBottom(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_posRight(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_posRight(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_imeMode(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_imeMode(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_rubyAlign(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_rubyAlign(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_rubyPosition(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_rubyPosition(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_rubyOverhang(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_rubyOverhang(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_layoutGridChar(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_layoutGridChar(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_layoutGridLine(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_layoutGridLine(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_layoutGridMode(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_layoutGridMode(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_layoutGridType(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_layoutGridType(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_layoutGrid(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_layoutGrid(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textAutospace(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textAutospace(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_wordBreak(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_wordBreak(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_lineBreak(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_lineBreak(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textJustify(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textJustify(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textJustifyTrim(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textJustifyTrim(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textKashida(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textKashida(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_overflowX(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_overflowX(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_overflowY(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_overflowY(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_accelerator(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_accelerator(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLRuleStyle2, 0x3050f4ac, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLRuleStyle2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLRuleStyle2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_tableLayout)(
        IHTMLRuleStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_tableLayout)(
        IHTMLRuleStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderCollapse)(
        IHTMLRuleStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderCollapse)(
        IHTMLRuleStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_direction)(
        IHTMLRuleStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_direction)(
        IHTMLRuleStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_behavior)(
        IHTMLRuleStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_behavior)(
        IHTMLRuleStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_position)(
        IHTMLRuleStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_position)(
        IHTMLRuleStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_unicodeBidi)(
        IHTMLRuleStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_unicodeBidi)(
        IHTMLRuleStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_bottom)(
        IHTMLRuleStyle2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_bottom)(
        IHTMLRuleStyle2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_right)(
        IHTMLRuleStyle2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_right)(
        IHTMLRuleStyle2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_pixelBottom)(
        IHTMLRuleStyle2* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_pixelBottom)(
        IHTMLRuleStyle2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_pixelRight)(
        IHTMLRuleStyle2* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_pixelRight)(
        IHTMLRuleStyle2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_posBottom)(
        IHTMLRuleStyle2* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_posBottom)(
        IHTMLRuleStyle2* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_posRight)(
        IHTMLRuleStyle2* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_posRight)(
        IHTMLRuleStyle2* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_imeMode)(
        IHTMLRuleStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_imeMode)(
        IHTMLRuleStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_rubyAlign)(
        IHTMLRuleStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_rubyAlign)(
        IHTMLRuleStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_rubyPosition)(
        IHTMLRuleStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_rubyPosition)(
        IHTMLRuleStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_rubyOverhang)(
        IHTMLRuleStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_rubyOverhang)(
        IHTMLRuleStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_layoutGridChar)(
        IHTMLRuleStyle2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_layoutGridChar)(
        IHTMLRuleStyle2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_layoutGridLine)(
        IHTMLRuleStyle2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_layoutGridLine)(
        IHTMLRuleStyle2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_layoutGridMode)(
        IHTMLRuleStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_layoutGridMode)(
        IHTMLRuleStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_layoutGridType)(
        IHTMLRuleStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_layoutGridType)(
        IHTMLRuleStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_layoutGrid)(
        IHTMLRuleStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_layoutGrid)(
        IHTMLRuleStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textAutospace)(
        IHTMLRuleStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textAutospace)(
        IHTMLRuleStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_wordBreak)(
        IHTMLRuleStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_wordBreak)(
        IHTMLRuleStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_lineBreak)(
        IHTMLRuleStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_lineBreak)(
        IHTMLRuleStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textJustify)(
        IHTMLRuleStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textJustify)(
        IHTMLRuleStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textJustifyTrim)(
        IHTMLRuleStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textJustifyTrim)(
        IHTMLRuleStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textKashida)(
        IHTMLRuleStyle2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_textKashida)(
        IHTMLRuleStyle2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_overflowX)(
        IHTMLRuleStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_overflowX)(
        IHTMLRuleStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_overflowY)(
        IHTMLRuleStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_overflowY)(
        IHTMLRuleStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_accelerator)(
        IHTMLRuleStyle2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_accelerator)(
        IHTMLRuleStyle2* This,
        BSTR *p);

    END_INTERFACE
} IHTMLRuleStyle2Vtbl;
interface IHTMLRuleStyle2 {
    CONST_VTBL IHTMLRuleStyle2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLRuleStyle2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLRuleStyle2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLRuleStyle2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLRuleStyle2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLRuleStyle2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLRuleStyle2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLRuleStyle2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLRuleStyle2 methods ***/
#define IHTMLRuleStyle2_put_tableLayout(This,v) (This)->lpVtbl->put_tableLayout(This,v)
#define IHTMLRuleStyle2_get_tableLayout(This,p) (This)->lpVtbl->get_tableLayout(This,p)
#define IHTMLRuleStyle2_put_borderCollapse(This,v) (This)->lpVtbl->put_borderCollapse(This,v)
#define IHTMLRuleStyle2_get_borderCollapse(This,p) (This)->lpVtbl->get_borderCollapse(This,p)
#define IHTMLRuleStyle2_put_direction(This,v) (This)->lpVtbl->put_direction(This,v)
#define IHTMLRuleStyle2_get_direction(This,p) (This)->lpVtbl->get_direction(This,p)
#define IHTMLRuleStyle2_put_behavior(This,v) (This)->lpVtbl->put_behavior(This,v)
#define IHTMLRuleStyle2_get_behavior(This,p) (This)->lpVtbl->get_behavior(This,p)
#define IHTMLRuleStyle2_put_position(This,v) (This)->lpVtbl->put_position(This,v)
#define IHTMLRuleStyle2_get_position(This,p) (This)->lpVtbl->get_position(This,p)
#define IHTMLRuleStyle2_put_unicodeBidi(This,v) (This)->lpVtbl->put_unicodeBidi(This,v)
#define IHTMLRuleStyle2_get_unicodeBidi(This,p) (This)->lpVtbl->get_unicodeBidi(This,p)
#define IHTMLRuleStyle2_put_bottom(This,v) (This)->lpVtbl->put_bottom(This,v)
#define IHTMLRuleStyle2_get_bottom(This,p) (This)->lpVtbl->get_bottom(This,p)
#define IHTMLRuleStyle2_put_right(This,v) (This)->lpVtbl->put_right(This,v)
#define IHTMLRuleStyle2_get_right(This,p) (This)->lpVtbl->get_right(This,p)
#define IHTMLRuleStyle2_put_pixelBottom(This,v) (This)->lpVtbl->put_pixelBottom(This,v)
#define IHTMLRuleStyle2_get_pixelBottom(This,p) (This)->lpVtbl->get_pixelBottom(This,p)
#define IHTMLRuleStyle2_put_pixelRight(This,v) (This)->lpVtbl->put_pixelRight(This,v)
#define IHTMLRuleStyle2_get_pixelRight(This,p) (This)->lpVtbl->get_pixelRight(This,p)
#define IHTMLRuleStyle2_put_posBottom(This,v) (This)->lpVtbl->put_posBottom(This,v)
#define IHTMLRuleStyle2_get_posBottom(This,p) (This)->lpVtbl->get_posBottom(This,p)
#define IHTMLRuleStyle2_put_posRight(This,v) (This)->lpVtbl->put_posRight(This,v)
#define IHTMLRuleStyle2_get_posRight(This,p) (This)->lpVtbl->get_posRight(This,p)
#define IHTMLRuleStyle2_put_imeMode(This,v) (This)->lpVtbl->put_imeMode(This,v)
#define IHTMLRuleStyle2_get_imeMode(This,p) (This)->lpVtbl->get_imeMode(This,p)
#define IHTMLRuleStyle2_put_rubyAlign(This,v) (This)->lpVtbl->put_rubyAlign(This,v)
#define IHTMLRuleStyle2_get_rubyAlign(This,p) (This)->lpVtbl->get_rubyAlign(This,p)
#define IHTMLRuleStyle2_put_rubyPosition(This,v) (This)->lpVtbl->put_rubyPosition(This,v)
#define IHTMLRuleStyle2_get_rubyPosition(This,p) (This)->lpVtbl->get_rubyPosition(This,p)
#define IHTMLRuleStyle2_put_rubyOverhang(This,v) (This)->lpVtbl->put_rubyOverhang(This,v)
#define IHTMLRuleStyle2_get_rubyOverhang(This,p) (This)->lpVtbl->get_rubyOverhang(This,p)
#define IHTMLRuleStyle2_put_layoutGridChar(This,v) (This)->lpVtbl->put_layoutGridChar(This,v)
#define IHTMLRuleStyle2_get_layoutGridChar(This,p) (This)->lpVtbl->get_layoutGridChar(This,p)
#define IHTMLRuleStyle2_put_layoutGridLine(This,v) (This)->lpVtbl->put_layoutGridLine(This,v)
#define IHTMLRuleStyle2_get_layoutGridLine(This,p) (This)->lpVtbl->get_layoutGridLine(This,p)
#define IHTMLRuleStyle2_put_layoutGridMode(This,v) (This)->lpVtbl->put_layoutGridMode(This,v)
#define IHTMLRuleStyle2_get_layoutGridMode(This,p) (This)->lpVtbl->get_layoutGridMode(This,p)
#define IHTMLRuleStyle2_put_layoutGridType(This,v) (This)->lpVtbl->put_layoutGridType(This,v)
#define IHTMLRuleStyle2_get_layoutGridType(This,p) (This)->lpVtbl->get_layoutGridType(This,p)
#define IHTMLRuleStyle2_put_layoutGrid(This,v) (This)->lpVtbl->put_layoutGrid(This,v)
#define IHTMLRuleStyle2_get_layoutGrid(This,p) (This)->lpVtbl->get_layoutGrid(This,p)
#define IHTMLRuleStyle2_put_textAutospace(This,v) (This)->lpVtbl->put_textAutospace(This,v)
#define IHTMLRuleStyle2_get_textAutospace(This,p) (This)->lpVtbl->get_textAutospace(This,p)
#define IHTMLRuleStyle2_put_wordBreak(This,v) (This)->lpVtbl->put_wordBreak(This,v)
#define IHTMLRuleStyle2_get_wordBreak(This,p) (This)->lpVtbl->get_wordBreak(This,p)
#define IHTMLRuleStyle2_put_lineBreak(This,v) (This)->lpVtbl->put_lineBreak(This,v)
#define IHTMLRuleStyle2_get_lineBreak(This,p) (This)->lpVtbl->get_lineBreak(This,p)
#define IHTMLRuleStyle2_put_textJustify(This,v) (This)->lpVtbl->put_textJustify(This,v)
#define IHTMLRuleStyle2_get_textJustify(This,p) (This)->lpVtbl->get_textJustify(This,p)
#define IHTMLRuleStyle2_put_textJustifyTrim(This,v) (This)->lpVtbl->put_textJustifyTrim(This,v)
#define IHTMLRuleStyle2_get_textJustifyTrim(This,p) (This)->lpVtbl->get_textJustifyTrim(This,p)
#define IHTMLRuleStyle2_put_textKashida(This,v) (This)->lpVtbl->put_textKashida(This,v)
#define IHTMLRuleStyle2_get_textKashida(This,p) (This)->lpVtbl->get_textKashida(This,p)
#define IHTMLRuleStyle2_put_overflowX(This,v) (This)->lpVtbl->put_overflowX(This,v)
#define IHTMLRuleStyle2_get_overflowX(This,p) (This)->lpVtbl->get_overflowX(This,p)
#define IHTMLRuleStyle2_put_overflowY(This,v) (This)->lpVtbl->put_overflowY(This,v)
#define IHTMLRuleStyle2_get_overflowY(This,p) (This)->lpVtbl->get_overflowY(This,p)
#define IHTMLRuleStyle2_put_accelerator(This,v) (This)->lpVtbl->put_accelerator(This,v)
#define IHTMLRuleStyle2_get_accelerator(This,p) (This)->lpVtbl->get_accelerator(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLRuleStyle2_QueryInterface(IHTMLRuleStyle2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLRuleStyle2_AddRef(IHTMLRuleStyle2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLRuleStyle2_Release(IHTMLRuleStyle2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLRuleStyle2_GetTypeInfoCount(IHTMLRuleStyle2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_GetTypeInfo(IHTMLRuleStyle2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_GetIDsOfNames(IHTMLRuleStyle2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_Invoke(IHTMLRuleStyle2* 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);
}
/*** IHTMLRuleStyle2 methods ***/
static FORCEINLINE HRESULT IHTMLRuleStyle2_put_tableLayout(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_tableLayout(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_get_tableLayout(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_tableLayout(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_put_borderCollapse(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_borderCollapse(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_get_borderCollapse(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_borderCollapse(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_put_direction(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_direction(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_get_direction(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_direction(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_put_behavior(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_behavior(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_get_behavior(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_behavior(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_put_position(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_position(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_get_position(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_position(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_put_unicodeBidi(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_unicodeBidi(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_get_unicodeBidi(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_unicodeBidi(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_put_bottom(IHTMLRuleStyle2* This,VARIANT v) {
    return This->lpVtbl->put_bottom(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_get_bottom(IHTMLRuleStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_bottom(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_put_right(IHTMLRuleStyle2* This,VARIANT v) {
    return This->lpVtbl->put_right(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_get_right(IHTMLRuleStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_right(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_put_pixelBottom(IHTMLRuleStyle2* This,LONG v) {
    return This->lpVtbl->put_pixelBottom(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_get_pixelBottom(IHTMLRuleStyle2* This,LONG *p) {
    return This->lpVtbl->get_pixelBottom(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_put_pixelRight(IHTMLRuleStyle2* This,LONG v) {
    return This->lpVtbl->put_pixelRight(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_get_pixelRight(IHTMLRuleStyle2* This,LONG *p) {
    return This->lpVtbl->get_pixelRight(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_put_posBottom(IHTMLRuleStyle2* This,float v) {
    return This->lpVtbl->put_posBottom(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_get_posBottom(IHTMLRuleStyle2* This,float *p) {
    return This->lpVtbl->get_posBottom(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_put_posRight(IHTMLRuleStyle2* This,float v) {
    return This->lpVtbl->put_posRight(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_get_posRight(IHTMLRuleStyle2* This,float *p) {
    return This->lpVtbl->get_posRight(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_put_imeMode(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_imeMode(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_get_imeMode(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_imeMode(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_put_rubyAlign(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_rubyAlign(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_get_rubyAlign(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_rubyAlign(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_put_rubyPosition(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_rubyPosition(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_get_rubyPosition(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_rubyPosition(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_put_rubyOverhang(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_rubyOverhang(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_get_rubyOverhang(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_rubyOverhang(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_put_layoutGridChar(IHTMLRuleStyle2* This,VARIANT v) {
    return This->lpVtbl->put_layoutGridChar(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_get_layoutGridChar(IHTMLRuleStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_layoutGridChar(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_put_layoutGridLine(IHTMLRuleStyle2* This,VARIANT v) {
    return This->lpVtbl->put_layoutGridLine(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_get_layoutGridLine(IHTMLRuleStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_layoutGridLine(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_put_layoutGridMode(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_layoutGridMode(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_get_layoutGridMode(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_layoutGridMode(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_put_layoutGridType(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_layoutGridType(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_get_layoutGridType(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_layoutGridType(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_put_layoutGrid(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_layoutGrid(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_get_layoutGrid(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_layoutGrid(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_put_textAutospace(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_textAutospace(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_get_textAutospace(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_textAutospace(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_put_wordBreak(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_wordBreak(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_get_wordBreak(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_wordBreak(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_put_lineBreak(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_lineBreak(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_get_lineBreak(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_lineBreak(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_put_textJustify(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_textJustify(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_get_textJustify(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_textJustify(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_put_textJustifyTrim(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_textJustifyTrim(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_get_textJustifyTrim(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_textJustifyTrim(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_put_textKashida(IHTMLRuleStyle2* This,VARIANT v) {
    return This->lpVtbl->put_textKashida(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_get_textKashida(IHTMLRuleStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_textKashida(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_put_overflowX(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_overflowX(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_get_overflowX(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_overflowX(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_put_overflowY(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_overflowY(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_get_overflowY(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_overflowY(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_put_accelerator(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_accelerator(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle2_get_accelerator(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_accelerator(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_put_tableLayout_Proxy(
    IHTMLRuleStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle2_put_tableLayout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_get_tableLayout_Proxy(
    IHTMLRuleStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle2_get_tableLayout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_put_borderCollapse_Proxy(
    IHTMLRuleStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle2_put_borderCollapse_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_get_borderCollapse_Proxy(
    IHTMLRuleStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle2_get_borderCollapse_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_put_direction_Proxy(
    IHTMLRuleStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle2_put_direction_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_get_direction_Proxy(
    IHTMLRuleStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle2_get_direction_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_put_behavior_Proxy(
    IHTMLRuleStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle2_put_behavior_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_get_behavior_Proxy(
    IHTMLRuleStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle2_get_behavior_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_put_position_Proxy(
    IHTMLRuleStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle2_put_position_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_get_position_Proxy(
    IHTMLRuleStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle2_get_position_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_put_unicodeBidi_Proxy(
    IHTMLRuleStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle2_put_unicodeBidi_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_get_unicodeBidi_Proxy(
    IHTMLRuleStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle2_get_unicodeBidi_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_put_bottom_Proxy(
    IHTMLRuleStyle2* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle2_put_bottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_get_bottom_Proxy(
    IHTMLRuleStyle2* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle2_get_bottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_put_right_Proxy(
    IHTMLRuleStyle2* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle2_put_right_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_get_right_Proxy(
    IHTMLRuleStyle2* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle2_get_right_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_put_pixelBottom_Proxy(
    IHTMLRuleStyle2* This,
    LONG v);
void __RPC_STUB IHTMLRuleStyle2_put_pixelBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_get_pixelBottom_Proxy(
    IHTMLRuleStyle2* This,
    LONG *p);
void __RPC_STUB IHTMLRuleStyle2_get_pixelBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_put_pixelRight_Proxy(
    IHTMLRuleStyle2* This,
    LONG v);
void __RPC_STUB IHTMLRuleStyle2_put_pixelRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_get_pixelRight_Proxy(
    IHTMLRuleStyle2* This,
    LONG *p);
void __RPC_STUB IHTMLRuleStyle2_get_pixelRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_put_posBottom_Proxy(
    IHTMLRuleStyle2* This,
    float v);
void __RPC_STUB IHTMLRuleStyle2_put_posBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_get_posBottom_Proxy(
    IHTMLRuleStyle2* This,
    float *p);
void __RPC_STUB IHTMLRuleStyle2_get_posBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_put_posRight_Proxy(
    IHTMLRuleStyle2* This,
    float v);
void __RPC_STUB IHTMLRuleStyle2_put_posRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_get_posRight_Proxy(
    IHTMLRuleStyle2* This,
    float *p);
void __RPC_STUB IHTMLRuleStyle2_get_posRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_put_imeMode_Proxy(
    IHTMLRuleStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle2_put_imeMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_get_imeMode_Proxy(
    IHTMLRuleStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle2_get_imeMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_put_rubyAlign_Proxy(
    IHTMLRuleStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle2_put_rubyAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_get_rubyAlign_Proxy(
    IHTMLRuleStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle2_get_rubyAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_put_rubyPosition_Proxy(
    IHTMLRuleStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle2_put_rubyPosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_get_rubyPosition_Proxy(
    IHTMLRuleStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle2_get_rubyPosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_put_rubyOverhang_Proxy(
    IHTMLRuleStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle2_put_rubyOverhang_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_get_rubyOverhang_Proxy(
    IHTMLRuleStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle2_get_rubyOverhang_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_put_layoutGridChar_Proxy(
    IHTMLRuleStyle2* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle2_put_layoutGridChar_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_get_layoutGridChar_Proxy(
    IHTMLRuleStyle2* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle2_get_layoutGridChar_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_put_layoutGridLine_Proxy(
    IHTMLRuleStyle2* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle2_put_layoutGridLine_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_get_layoutGridLine_Proxy(
    IHTMLRuleStyle2* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle2_get_layoutGridLine_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_put_layoutGridMode_Proxy(
    IHTMLRuleStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle2_put_layoutGridMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_get_layoutGridMode_Proxy(
    IHTMLRuleStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle2_get_layoutGridMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_put_layoutGridType_Proxy(
    IHTMLRuleStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle2_put_layoutGridType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_get_layoutGridType_Proxy(
    IHTMLRuleStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle2_get_layoutGridType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_put_layoutGrid_Proxy(
    IHTMLRuleStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle2_put_layoutGrid_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_get_layoutGrid_Proxy(
    IHTMLRuleStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle2_get_layoutGrid_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_put_textAutospace_Proxy(
    IHTMLRuleStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle2_put_textAutospace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_get_textAutospace_Proxy(
    IHTMLRuleStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle2_get_textAutospace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_put_wordBreak_Proxy(
    IHTMLRuleStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle2_put_wordBreak_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_get_wordBreak_Proxy(
    IHTMLRuleStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle2_get_wordBreak_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_put_lineBreak_Proxy(
    IHTMLRuleStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle2_put_lineBreak_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_get_lineBreak_Proxy(
    IHTMLRuleStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle2_get_lineBreak_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_put_textJustify_Proxy(
    IHTMLRuleStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle2_put_textJustify_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_get_textJustify_Proxy(
    IHTMLRuleStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle2_get_textJustify_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_put_textJustifyTrim_Proxy(
    IHTMLRuleStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle2_put_textJustifyTrim_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_get_textJustifyTrim_Proxy(
    IHTMLRuleStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle2_get_textJustifyTrim_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_put_textKashida_Proxy(
    IHTMLRuleStyle2* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle2_put_textKashida_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_get_textKashida_Proxy(
    IHTMLRuleStyle2* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle2_get_textKashida_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_put_overflowX_Proxy(
    IHTMLRuleStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle2_put_overflowX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_get_overflowX_Proxy(
    IHTMLRuleStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle2_get_overflowX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_put_overflowY_Proxy(
    IHTMLRuleStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle2_put_overflowY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_get_overflowY_Proxy(
    IHTMLRuleStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle2_get_overflowY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_put_accelerator_Proxy(
    IHTMLRuleStyle2* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle2_put_accelerator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle2_get_accelerator_Proxy(
    IHTMLRuleStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle2_get_accelerator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLRuleStyle2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLRuleStyle3 interface
 */
#ifndef __IHTMLRuleStyle3_INTERFACE_DEFINED__
#define __IHTMLRuleStyle3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLRuleStyle3, 0x3050f657, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f657-98b5-11cf-bb82-00aa00bdce0b")
IHTMLRuleStyle3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_layoutFlow(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_layoutFlow(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_zoom(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_zoom(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_wordWrap(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_wordWrap(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textUnderlinePosition(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textUnderlinePosition(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollbarBaseColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbarBaseColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollbarFaceColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbarFaceColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollbar3dLightColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbar3dLightColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollbarShadowColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbarShadowColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollbarHighlightColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbarHighlightColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollbarDarkShadowColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbarDarkShadowColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollbarArrowColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbarArrowColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollbarTrackColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbarTrackColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_writingMode(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_writingMode(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textAlignLast(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textAlignLast(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textKashidaSpace(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textKashidaSpace(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLRuleStyle3, 0x3050f657, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLRuleStyle3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLRuleStyle3 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_layoutFlow)(
        IHTMLRuleStyle3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_layoutFlow)(
        IHTMLRuleStyle3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_zoom)(
        IHTMLRuleStyle3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_zoom)(
        IHTMLRuleStyle3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_wordWrap)(
        IHTMLRuleStyle3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_wordWrap)(
        IHTMLRuleStyle3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textUnderlinePosition)(
        IHTMLRuleStyle3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textUnderlinePosition)(
        IHTMLRuleStyle3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollbarBaseColor)(
        IHTMLRuleStyle3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_scrollbarBaseColor)(
        IHTMLRuleStyle3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollbarFaceColor)(
        IHTMLRuleStyle3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_scrollbarFaceColor)(
        IHTMLRuleStyle3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollbar3dLightColor)(
        IHTMLRuleStyle3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_scrollbar3dLightColor)(
        IHTMLRuleStyle3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollbarShadowColor)(
        IHTMLRuleStyle3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_scrollbarShadowColor)(
        IHTMLRuleStyle3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollbarHighlightColor)(
        IHTMLRuleStyle3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_scrollbarHighlightColor)(
        IHTMLRuleStyle3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollbarDarkShadowColor)(
        IHTMLRuleStyle3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_scrollbarDarkShadowColor)(
        IHTMLRuleStyle3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollbarArrowColor)(
        IHTMLRuleStyle3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_scrollbarArrowColor)(
        IHTMLRuleStyle3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollbarTrackColor)(
        IHTMLRuleStyle3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_scrollbarTrackColor)(
        IHTMLRuleStyle3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_writingMode)(
        IHTMLRuleStyle3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_writingMode)(
        IHTMLRuleStyle3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textAlignLast)(
        IHTMLRuleStyle3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textAlignLast)(
        IHTMLRuleStyle3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textKashidaSpace)(
        IHTMLRuleStyle3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_textKashidaSpace)(
        IHTMLRuleStyle3* This,
        VARIANT *p);

    END_INTERFACE
} IHTMLRuleStyle3Vtbl;
interface IHTMLRuleStyle3 {
    CONST_VTBL IHTMLRuleStyle3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLRuleStyle3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLRuleStyle3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLRuleStyle3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLRuleStyle3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLRuleStyle3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLRuleStyle3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLRuleStyle3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLRuleStyle3 methods ***/
#define IHTMLRuleStyle3_put_layoutFlow(This,v) (This)->lpVtbl->put_layoutFlow(This,v)
#define IHTMLRuleStyle3_get_layoutFlow(This,p) (This)->lpVtbl->get_layoutFlow(This,p)
#define IHTMLRuleStyle3_put_zoom(This,v) (This)->lpVtbl->put_zoom(This,v)
#define IHTMLRuleStyle3_get_zoom(This,p) (This)->lpVtbl->get_zoom(This,p)
#define IHTMLRuleStyle3_put_wordWrap(This,v) (This)->lpVtbl->put_wordWrap(This,v)
#define IHTMLRuleStyle3_get_wordWrap(This,p) (This)->lpVtbl->get_wordWrap(This,p)
#define IHTMLRuleStyle3_put_textUnderlinePosition(This,v) (This)->lpVtbl->put_textUnderlinePosition(This,v)
#define IHTMLRuleStyle3_get_textUnderlinePosition(This,p) (This)->lpVtbl->get_textUnderlinePosition(This,p)
#define IHTMLRuleStyle3_put_scrollbarBaseColor(This,v) (This)->lpVtbl->put_scrollbarBaseColor(This,v)
#define IHTMLRuleStyle3_get_scrollbarBaseColor(This,p) (This)->lpVtbl->get_scrollbarBaseColor(This,p)
#define IHTMLRuleStyle3_put_scrollbarFaceColor(This,v) (This)->lpVtbl->put_scrollbarFaceColor(This,v)
#define IHTMLRuleStyle3_get_scrollbarFaceColor(This,p) (This)->lpVtbl->get_scrollbarFaceColor(This,p)
#define IHTMLRuleStyle3_put_scrollbar3dLightColor(This,v) (This)->lpVtbl->put_scrollbar3dLightColor(This,v)
#define IHTMLRuleStyle3_get_scrollbar3dLightColor(This,p) (This)->lpVtbl->get_scrollbar3dLightColor(This,p)
#define IHTMLRuleStyle3_put_scrollbarShadowColor(This,v) (This)->lpVtbl->put_scrollbarShadowColor(This,v)
#define IHTMLRuleStyle3_get_scrollbarShadowColor(This,p) (This)->lpVtbl->get_scrollbarShadowColor(This,p)
#define IHTMLRuleStyle3_put_scrollbarHighlightColor(This,v) (This)->lpVtbl->put_scrollbarHighlightColor(This,v)
#define IHTMLRuleStyle3_get_scrollbarHighlightColor(This,p) (This)->lpVtbl->get_scrollbarHighlightColor(This,p)
#define IHTMLRuleStyle3_put_scrollbarDarkShadowColor(This,v) (This)->lpVtbl->put_scrollbarDarkShadowColor(This,v)
#define IHTMLRuleStyle3_get_scrollbarDarkShadowColor(This,p) (This)->lpVtbl->get_scrollbarDarkShadowColor(This,p)
#define IHTMLRuleStyle3_put_scrollbarArrowColor(This,v) (This)->lpVtbl->put_scrollbarArrowColor(This,v)
#define IHTMLRuleStyle3_get_scrollbarArrowColor(This,p) (This)->lpVtbl->get_scrollbarArrowColor(This,p)
#define IHTMLRuleStyle3_put_scrollbarTrackColor(This,v) (This)->lpVtbl->put_scrollbarTrackColor(This,v)
#define IHTMLRuleStyle3_get_scrollbarTrackColor(This,p) (This)->lpVtbl->get_scrollbarTrackColor(This,p)
#define IHTMLRuleStyle3_put_writingMode(This,v) (This)->lpVtbl->put_writingMode(This,v)
#define IHTMLRuleStyle3_get_writingMode(This,p) (This)->lpVtbl->get_writingMode(This,p)
#define IHTMLRuleStyle3_put_textAlignLast(This,v) (This)->lpVtbl->put_textAlignLast(This,v)
#define IHTMLRuleStyle3_get_textAlignLast(This,p) (This)->lpVtbl->get_textAlignLast(This,p)
#define IHTMLRuleStyle3_put_textKashidaSpace(This,v) (This)->lpVtbl->put_textKashidaSpace(This,v)
#define IHTMLRuleStyle3_get_textKashidaSpace(This,p) (This)->lpVtbl->get_textKashidaSpace(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLRuleStyle3_QueryInterface(IHTMLRuleStyle3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLRuleStyle3_AddRef(IHTMLRuleStyle3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLRuleStyle3_Release(IHTMLRuleStyle3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLRuleStyle3_GetTypeInfoCount(IHTMLRuleStyle3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_GetTypeInfo(IHTMLRuleStyle3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_GetIDsOfNames(IHTMLRuleStyle3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_Invoke(IHTMLRuleStyle3* 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);
}
/*** IHTMLRuleStyle3 methods ***/
static FORCEINLINE HRESULT IHTMLRuleStyle3_put_layoutFlow(IHTMLRuleStyle3* This,BSTR v) {
    return This->lpVtbl->put_layoutFlow(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_get_layoutFlow(IHTMLRuleStyle3* This,BSTR *p) {
    return This->lpVtbl->get_layoutFlow(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_put_zoom(IHTMLRuleStyle3* This,VARIANT v) {
    return This->lpVtbl->put_zoom(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_get_zoom(IHTMLRuleStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_zoom(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_put_wordWrap(IHTMLRuleStyle3* This,BSTR v) {
    return This->lpVtbl->put_wordWrap(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_get_wordWrap(IHTMLRuleStyle3* This,BSTR *p) {
    return This->lpVtbl->get_wordWrap(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_put_textUnderlinePosition(IHTMLRuleStyle3* This,BSTR v) {
    return This->lpVtbl->put_textUnderlinePosition(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_get_textUnderlinePosition(IHTMLRuleStyle3* This,BSTR *p) {
    return This->lpVtbl->get_textUnderlinePosition(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_put_scrollbarBaseColor(IHTMLRuleStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarBaseColor(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_get_scrollbarBaseColor(IHTMLRuleStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarBaseColor(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_put_scrollbarFaceColor(IHTMLRuleStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarFaceColor(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_get_scrollbarFaceColor(IHTMLRuleStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarFaceColor(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_put_scrollbar3dLightColor(IHTMLRuleStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbar3dLightColor(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_get_scrollbar3dLightColor(IHTMLRuleStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbar3dLightColor(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_put_scrollbarShadowColor(IHTMLRuleStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarShadowColor(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_get_scrollbarShadowColor(IHTMLRuleStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarShadowColor(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_put_scrollbarHighlightColor(IHTMLRuleStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarHighlightColor(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_get_scrollbarHighlightColor(IHTMLRuleStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarHighlightColor(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_put_scrollbarDarkShadowColor(IHTMLRuleStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarDarkShadowColor(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_get_scrollbarDarkShadowColor(IHTMLRuleStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarDarkShadowColor(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_put_scrollbarArrowColor(IHTMLRuleStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarArrowColor(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_get_scrollbarArrowColor(IHTMLRuleStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarArrowColor(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_put_scrollbarTrackColor(IHTMLRuleStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarTrackColor(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_get_scrollbarTrackColor(IHTMLRuleStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarTrackColor(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_put_writingMode(IHTMLRuleStyle3* This,BSTR v) {
    return This->lpVtbl->put_writingMode(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_get_writingMode(IHTMLRuleStyle3* This,BSTR *p) {
    return This->lpVtbl->get_writingMode(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_put_textAlignLast(IHTMLRuleStyle3* This,BSTR v) {
    return This->lpVtbl->put_textAlignLast(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_get_textAlignLast(IHTMLRuleStyle3* This,BSTR *p) {
    return This->lpVtbl->get_textAlignLast(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_put_textKashidaSpace(IHTMLRuleStyle3* This,VARIANT v) {
    return This->lpVtbl->put_textKashidaSpace(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle3_get_textKashidaSpace(IHTMLRuleStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_textKashidaSpace(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLRuleStyle3_put_layoutFlow_Proxy(
    IHTMLRuleStyle3* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle3_put_layoutFlow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle3_get_layoutFlow_Proxy(
    IHTMLRuleStyle3* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle3_get_layoutFlow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle3_put_zoom_Proxy(
    IHTMLRuleStyle3* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle3_put_zoom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle3_get_zoom_Proxy(
    IHTMLRuleStyle3* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle3_get_zoom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle3_put_wordWrap_Proxy(
    IHTMLRuleStyle3* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle3_put_wordWrap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle3_get_wordWrap_Proxy(
    IHTMLRuleStyle3* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle3_get_wordWrap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle3_put_textUnderlinePosition_Proxy(
    IHTMLRuleStyle3* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle3_put_textUnderlinePosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle3_get_textUnderlinePosition_Proxy(
    IHTMLRuleStyle3* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle3_get_textUnderlinePosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle3_put_scrollbarBaseColor_Proxy(
    IHTMLRuleStyle3* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle3_put_scrollbarBaseColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle3_get_scrollbarBaseColor_Proxy(
    IHTMLRuleStyle3* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle3_get_scrollbarBaseColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle3_put_scrollbarFaceColor_Proxy(
    IHTMLRuleStyle3* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle3_put_scrollbarFaceColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle3_get_scrollbarFaceColor_Proxy(
    IHTMLRuleStyle3* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle3_get_scrollbarFaceColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle3_put_scrollbar3dLightColor_Proxy(
    IHTMLRuleStyle3* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle3_put_scrollbar3dLightColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle3_get_scrollbar3dLightColor_Proxy(
    IHTMLRuleStyle3* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle3_get_scrollbar3dLightColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle3_put_scrollbarShadowColor_Proxy(
    IHTMLRuleStyle3* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle3_put_scrollbarShadowColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle3_get_scrollbarShadowColor_Proxy(
    IHTMLRuleStyle3* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle3_get_scrollbarShadowColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle3_put_scrollbarHighlightColor_Proxy(
    IHTMLRuleStyle3* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle3_put_scrollbarHighlightColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle3_get_scrollbarHighlightColor_Proxy(
    IHTMLRuleStyle3* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle3_get_scrollbarHighlightColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle3_put_scrollbarDarkShadowColor_Proxy(
    IHTMLRuleStyle3* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle3_put_scrollbarDarkShadowColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle3_get_scrollbarDarkShadowColor_Proxy(
    IHTMLRuleStyle3* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle3_get_scrollbarDarkShadowColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle3_put_scrollbarArrowColor_Proxy(
    IHTMLRuleStyle3* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle3_put_scrollbarArrowColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle3_get_scrollbarArrowColor_Proxy(
    IHTMLRuleStyle3* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle3_get_scrollbarArrowColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle3_put_scrollbarTrackColor_Proxy(
    IHTMLRuleStyle3* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle3_put_scrollbarTrackColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle3_get_scrollbarTrackColor_Proxy(
    IHTMLRuleStyle3* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle3_get_scrollbarTrackColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle3_put_writingMode_Proxy(
    IHTMLRuleStyle3* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle3_put_writingMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle3_get_writingMode_Proxy(
    IHTMLRuleStyle3* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle3_get_writingMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle3_put_textAlignLast_Proxy(
    IHTMLRuleStyle3* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle3_put_textAlignLast_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle3_get_textAlignLast_Proxy(
    IHTMLRuleStyle3* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle3_get_textAlignLast_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle3_put_textKashidaSpace_Proxy(
    IHTMLRuleStyle3* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle3_put_textKashidaSpace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle3_get_textKashidaSpace_Proxy(
    IHTMLRuleStyle3* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle3_get_textKashidaSpace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLRuleStyle3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLRuleStyle4 interface
 */
#ifndef __IHTMLRuleStyle4_INTERFACE_DEFINED__
#define __IHTMLRuleStyle4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLRuleStyle4, 0x3050f817, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f817-98b5-11cf-bb82-00aa00bdce0b")
IHTMLRuleStyle4 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_textOverflow(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textOverflow(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_minHeight(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_minHeight(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLRuleStyle4, 0x3050f817, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLRuleStyle4Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLRuleStyle4 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_textOverflow)(
        IHTMLRuleStyle4* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textOverflow)(
        IHTMLRuleStyle4* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_minHeight)(
        IHTMLRuleStyle4* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_minHeight)(
        IHTMLRuleStyle4* This,
        VARIANT *p);

    END_INTERFACE
} IHTMLRuleStyle4Vtbl;
interface IHTMLRuleStyle4 {
    CONST_VTBL IHTMLRuleStyle4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLRuleStyle4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLRuleStyle4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLRuleStyle4_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLRuleStyle4_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLRuleStyle4_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLRuleStyle4_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLRuleStyle4_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLRuleStyle4 methods ***/
#define IHTMLRuleStyle4_put_textOverflow(This,v) (This)->lpVtbl->put_textOverflow(This,v)
#define IHTMLRuleStyle4_get_textOverflow(This,p) (This)->lpVtbl->get_textOverflow(This,p)
#define IHTMLRuleStyle4_put_minHeight(This,v) (This)->lpVtbl->put_minHeight(This,v)
#define IHTMLRuleStyle4_get_minHeight(This,p) (This)->lpVtbl->get_minHeight(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLRuleStyle4_QueryInterface(IHTMLRuleStyle4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLRuleStyle4_AddRef(IHTMLRuleStyle4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLRuleStyle4_Release(IHTMLRuleStyle4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLRuleStyle4_GetTypeInfoCount(IHTMLRuleStyle4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLRuleStyle4_GetTypeInfo(IHTMLRuleStyle4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLRuleStyle4_GetIDsOfNames(IHTMLRuleStyle4* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLRuleStyle4_Invoke(IHTMLRuleStyle4* 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);
}
/*** IHTMLRuleStyle4 methods ***/
static FORCEINLINE HRESULT IHTMLRuleStyle4_put_textOverflow(IHTMLRuleStyle4* This,BSTR v) {
    return This->lpVtbl->put_textOverflow(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle4_get_textOverflow(IHTMLRuleStyle4* This,BSTR *p) {
    return This->lpVtbl->get_textOverflow(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle4_put_minHeight(IHTMLRuleStyle4* This,VARIANT v) {
    return This->lpVtbl->put_minHeight(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle4_get_minHeight(IHTMLRuleStyle4* This,VARIANT *p) {
    return This->lpVtbl->get_minHeight(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLRuleStyle4_put_textOverflow_Proxy(
    IHTMLRuleStyle4* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle4_put_textOverflow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle4_get_textOverflow_Proxy(
    IHTMLRuleStyle4* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle4_get_textOverflow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle4_put_minHeight_Proxy(
    IHTMLRuleStyle4* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle4_put_minHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle4_get_minHeight_Proxy(
    IHTMLRuleStyle4* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle4_get_minHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLRuleStyle4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLRuleStyle5 interface
 */
#ifndef __IHTMLRuleStyle5_INTERFACE_DEFINED__
#define __IHTMLRuleStyle5_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLRuleStyle5, 0x3050f335, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f335-98b5-11cf-bb82-00aa00bdce0b")
IHTMLRuleStyle5 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_msInterpolationMode(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msInterpolationMode(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_maxHeight(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_maxHeight(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_minWidth(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_minWidth(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_maxWidth(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_maxWidth(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLRuleStyle5, 0x3050f335, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLRuleStyle5Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLRuleStyle5 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_msInterpolationMode)(
        IHTMLRuleStyle5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msInterpolationMode)(
        IHTMLRuleStyle5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_maxHeight)(
        IHTMLRuleStyle5* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_maxHeight)(
        IHTMLRuleStyle5* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_minWidth)(
        IHTMLRuleStyle5* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_minWidth)(
        IHTMLRuleStyle5* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_maxWidth)(
        IHTMLRuleStyle5* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_maxWidth)(
        IHTMLRuleStyle5* This,
        VARIANT *p);

    END_INTERFACE
} IHTMLRuleStyle5Vtbl;
interface IHTMLRuleStyle5 {
    CONST_VTBL IHTMLRuleStyle5Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLRuleStyle5_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLRuleStyle5_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLRuleStyle5_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLRuleStyle5_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLRuleStyle5_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLRuleStyle5_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLRuleStyle5_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLRuleStyle5 methods ***/
#define IHTMLRuleStyle5_put_msInterpolationMode(This,v) (This)->lpVtbl->put_msInterpolationMode(This,v)
#define IHTMLRuleStyle5_get_msInterpolationMode(This,p) (This)->lpVtbl->get_msInterpolationMode(This,p)
#define IHTMLRuleStyle5_put_maxHeight(This,v) (This)->lpVtbl->put_maxHeight(This,v)
#define IHTMLRuleStyle5_get_maxHeight(This,p) (This)->lpVtbl->get_maxHeight(This,p)
#define IHTMLRuleStyle5_put_minWidth(This,v) (This)->lpVtbl->put_minWidth(This,v)
#define IHTMLRuleStyle5_get_minWidth(This,p) (This)->lpVtbl->get_minWidth(This,p)
#define IHTMLRuleStyle5_put_maxWidth(This,v) (This)->lpVtbl->put_maxWidth(This,v)
#define IHTMLRuleStyle5_get_maxWidth(This,p) (This)->lpVtbl->get_maxWidth(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLRuleStyle5_QueryInterface(IHTMLRuleStyle5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLRuleStyle5_AddRef(IHTMLRuleStyle5* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLRuleStyle5_Release(IHTMLRuleStyle5* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLRuleStyle5_GetTypeInfoCount(IHTMLRuleStyle5* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLRuleStyle5_GetTypeInfo(IHTMLRuleStyle5* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLRuleStyle5_GetIDsOfNames(IHTMLRuleStyle5* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLRuleStyle5_Invoke(IHTMLRuleStyle5* 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);
}
/*** IHTMLRuleStyle5 methods ***/
static FORCEINLINE HRESULT IHTMLRuleStyle5_put_msInterpolationMode(IHTMLRuleStyle5* This,BSTR v) {
    return This->lpVtbl->put_msInterpolationMode(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle5_get_msInterpolationMode(IHTMLRuleStyle5* This,BSTR *p) {
    return This->lpVtbl->get_msInterpolationMode(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle5_put_maxHeight(IHTMLRuleStyle5* This,VARIANT v) {
    return This->lpVtbl->put_maxHeight(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle5_get_maxHeight(IHTMLRuleStyle5* This,VARIANT *p) {
    return This->lpVtbl->get_maxHeight(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle5_put_minWidth(IHTMLRuleStyle5* This,VARIANT v) {
    return This->lpVtbl->put_minWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle5_get_minWidth(IHTMLRuleStyle5* This,VARIANT *p) {
    return This->lpVtbl->get_minWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle5_put_maxWidth(IHTMLRuleStyle5* This,VARIANT v) {
    return This->lpVtbl->put_maxWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle5_get_maxWidth(IHTMLRuleStyle5* This,VARIANT *p) {
    return This->lpVtbl->get_maxWidth(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLRuleStyle5_put_msInterpolationMode_Proxy(
    IHTMLRuleStyle5* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle5_put_msInterpolationMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle5_get_msInterpolationMode_Proxy(
    IHTMLRuleStyle5* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle5_get_msInterpolationMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle5_put_maxHeight_Proxy(
    IHTMLRuleStyle5* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle5_put_maxHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle5_get_maxHeight_Proxy(
    IHTMLRuleStyle5* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle5_get_maxHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle5_put_minWidth_Proxy(
    IHTMLRuleStyle5* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle5_put_minWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle5_get_minWidth_Proxy(
    IHTMLRuleStyle5* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle5_get_minWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle5_put_maxWidth_Proxy(
    IHTMLRuleStyle5* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle5_put_maxWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle5_get_maxWidth_Proxy(
    IHTMLRuleStyle5* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle5_get_maxWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLRuleStyle5_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLRuleStyle6 interface
 */
#ifndef __IHTMLRuleStyle6_INTERFACE_DEFINED__
#define __IHTMLRuleStyle6_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLRuleStyle6, 0x30510471, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510471-98b5-11cf-bb82-00aa00bdce0b")
IHTMLRuleStyle6 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_content(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_content(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_captionSide(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_captionSide(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_counterIncrement(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_counterIncrement(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_counterReset(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_counterReset(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_outline(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_outline(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_outlineWidth(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_outlineWidth(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_outlineStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_outlineStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_outlineColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_outlineColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_boxSizing(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_boxSizing(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderSpacing(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderSpacing(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_orphans(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_orphans(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_widows(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_widows(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_pageBreakInside(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pageBreakInside(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_emptyCells(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_emptyCells(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msBlockProgression(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msBlockProgression(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_quotes(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_quotes(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLRuleStyle6, 0x30510471, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLRuleStyle6Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLRuleStyle6 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_content)(
        IHTMLRuleStyle6* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_content)(
        IHTMLRuleStyle6* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_captionSide)(
        IHTMLRuleStyle6* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_captionSide)(
        IHTMLRuleStyle6* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_counterIncrement)(
        IHTMLRuleStyle6* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_counterIncrement)(
        IHTMLRuleStyle6* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_counterReset)(
        IHTMLRuleStyle6* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_counterReset)(
        IHTMLRuleStyle6* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_outline)(
        IHTMLRuleStyle6* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_outline)(
        IHTMLRuleStyle6* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_outlineWidth)(
        IHTMLRuleStyle6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_outlineWidth)(
        IHTMLRuleStyle6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_outlineStyle)(
        IHTMLRuleStyle6* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_outlineStyle)(
        IHTMLRuleStyle6* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_outlineColor)(
        IHTMLRuleStyle6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_outlineColor)(
        IHTMLRuleStyle6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_boxSizing)(
        IHTMLRuleStyle6* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_boxSizing)(
        IHTMLRuleStyle6* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderSpacing)(
        IHTMLRuleStyle6* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderSpacing)(
        IHTMLRuleStyle6* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_orphans)(
        IHTMLRuleStyle6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_orphans)(
        IHTMLRuleStyle6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_widows)(
        IHTMLRuleStyle6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_widows)(
        IHTMLRuleStyle6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_pageBreakInside)(
        IHTMLRuleStyle6* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_pageBreakInside)(
        IHTMLRuleStyle6* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_emptyCells)(
        IHTMLRuleStyle6* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_emptyCells)(
        IHTMLRuleStyle6* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_msBlockProgression)(
        IHTMLRuleStyle6* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_msBlockProgression)(
        IHTMLRuleStyle6* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_quotes)(
        IHTMLRuleStyle6* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_quotes)(
        IHTMLRuleStyle6* This,
        BSTR *p);

    END_INTERFACE
} IHTMLRuleStyle6Vtbl;
interface IHTMLRuleStyle6 {
    CONST_VTBL IHTMLRuleStyle6Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLRuleStyle6_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLRuleStyle6_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLRuleStyle6_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLRuleStyle6_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLRuleStyle6_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLRuleStyle6_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLRuleStyle6_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLRuleStyle6 methods ***/
#define IHTMLRuleStyle6_put_content(This,v) (This)->lpVtbl->put_content(This,v)
#define IHTMLRuleStyle6_get_content(This,p) (This)->lpVtbl->get_content(This,p)
#define IHTMLRuleStyle6_put_captionSide(This,v) (This)->lpVtbl->put_captionSide(This,v)
#define IHTMLRuleStyle6_get_captionSide(This,p) (This)->lpVtbl->get_captionSide(This,p)
#define IHTMLRuleStyle6_put_counterIncrement(This,v) (This)->lpVtbl->put_counterIncrement(This,v)
#define IHTMLRuleStyle6_get_counterIncrement(This,p) (This)->lpVtbl->get_counterIncrement(This,p)
#define IHTMLRuleStyle6_put_counterReset(This,v) (This)->lpVtbl->put_counterReset(This,v)
#define IHTMLRuleStyle6_get_counterReset(This,p) (This)->lpVtbl->get_counterReset(This,p)
#define IHTMLRuleStyle6_put_outline(This,v) (This)->lpVtbl->put_outline(This,v)
#define IHTMLRuleStyle6_get_outline(This,p) (This)->lpVtbl->get_outline(This,p)
#define IHTMLRuleStyle6_put_outlineWidth(This,v) (This)->lpVtbl->put_outlineWidth(This,v)
#define IHTMLRuleStyle6_get_outlineWidth(This,p) (This)->lpVtbl->get_outlineWidth(This,p)
#define IHTMLRuleStyle6_put_outlineStyle(This,v) (This)->lpVtbl->put_outlineStyle(This,v)
#define IHTMLRuleStyle6_get_outlineStyle(This,p) (This)->lpVtbl->get_outlineStyle(This,p)
#define IHTMLRuleStyle6_put_outlineColor(This,v) (This)->lpVtbl->put_outlineColor(This,v)
#define IHTMLRuleStyle6_get_outlineColor(This,p) (This)->lpVtbl->get_outlineColor(This,p)
#define IHTMLRuleStyle6_put_boxSizing(This,v) (This)->lpVtbl->put_boxSizing(This,v)
#define IHTMLRuleStyle6_get_boxSizing(This,p) (This)->lpVtbl->get_boxSizing(This,p)
#define IHTMLRuleStyle6_put_borderSpacing(This,v) (This)->lpVtbl->put_borderSpacing(This,v)
#define IHTMLRuleStyle6_get_borderSpacing(This,p) (This)->lpVtbl->get_borderSpacing(This,p)
#define IHTMLRuleStyle6_put_orphans(This,v) (This)->lpVtbl->put_orphans(This,v)
#define IHTMLRuleStyle6_get_orphans(This,p) (This)->lpVtbl->get_orphans(This,p)
#define IHTMLRuleStyle6_put_widows(This,v) (This)->lpVtbl->put_widows(This,v)
#define IHTMLRuleStyle6_get_widows(This,p) (This)->lpVtbl->get_widows(This,p)
#define IHTMLRuleStyle6_put_pageBreakInside(This,v) (This)->lpVtbl->put_pageBreakInside(This,v)
#define IHTMLRuleStyle6_get_pageBreakInside(This,p) (This)->lpVtbl->get_pageBreakInside(This,p)
#define IHTMLRuleStyle6_put_emptyCells(This,v) (This)->lpVtbl->put_emptyCells(This,v)
#define IHTMLRuleStyle6_get_emptyCells(This,p) (This)->lpVtbl->get_emptyCells(This,p)
#define IHTMLRuleStyle6_put_msBlockProgression(This,v) (This)->lpVtbl->put_msBlockProgression(This,v)
#define IHTMLRuleStyle6_get_msBlockProgression(This,p) (This)->lpVtbl->get_msBlockProgression(This,p)
#define IHTMLRuleStyle6_put_quotes(This,v) (This)->lpVtbl->put_quotes(This,v)
#define IHTMLRuleStyle6_get_quotes(This,p) (This)->lpVtbl->get_quotes(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLRuleStyle6_QueryInterface(IHTMLRuleStyle6* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLRuleStyle6_AddRef(IHTMLRuleStyle6* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLRuleStyle6_Release(IHTMLRuleStyle6* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLRuleStyle6_GetTypeInfoCount(IHTMLRuleStyle6* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_GetTypeInfo(IHTMLRuleStyle6* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_GetIDsOfNames(IHTMLRuleStyle6* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_Invoke(IHTMLRuleStyle6* 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);
}
/*** IHTMLRuleStyle6 methods ***/
static FORCEINLINE HRESULT IHTMLRuleStyle6_put_content(IHTMLRuleStyle6* This,BSTR v) {
    return This->lpVtbl->put_content(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_get_content(IHTMLRuleStyle6* This,BSTR *p) {
    return This->lpVtbl->get_content(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_put_captionSide(IHTMLRuleStyle6* This,BSTR v) {
    return This->lpVtbl->put_captionSide(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_get_captionSide(IHTMLRuleStyle6* This,BSTR *p) {
    return This->lpVtbl->get_captionSide(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_put_counterIncrement(IHTMLRuleStyle6* This,BSTR v) {
    return This->lpVtbl->put_counterIncrement(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_get_counterIncrement(IHTMLRuleStyle6* This,BSTR *p) {
    return This->lpVtbl->get_counterIncrement(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_put_counterReset(IHTMLRuleStyle6* This,BSTR v) {
    return This->lpVtbl->put_counterReset(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_get_counterReset(IHTMLRuleStyle6* This,BSTR *p) {
    return This->lpVtbl->get_counterReset(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_put_outline(IHTMLRuleStyle6* This,BSTR v) {
    return This->lpVtbl->put_outline(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_get_outline(IHTMLRuleStyle6* This,BSTR *p) {
    return This->lpVtbl->get_outline(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_put_outlineWidth(IHTMLRuleStyle6* This,VARIANT v) {
    return This->lpVtbl->put_outlineWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_get_outlineWidth(IHTMLRuleStyle6* This,VARIANT *p) {
    return This->lpVtbl->get_outlineWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_put_outlineStyle(IHTMLRuleStyle6* This,BSTR v) {
    return This->lpVtbl->put_outlineStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_get_outlineStyle(IHTMLRuleStyle6* This,BSTR *p) {
    return This->lpVtbl->get_outlineStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_put_outlineColor(IHTMLRuleStyle6* This,VARIANT v) {
    return This->lpVtbl->put_outlineColor(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_get_outlineColor(IHTMLRuleStyle6* This,VARIANT *p) {
    return This->lpVtbl->get_outlineColor(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_put_boxSizing(IHTMLRuleStyle6* This,BSTR v) {
    return This->lpVtbl->put_boxSizing(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_get_boxSizing(IHTMLRuleStyle6* This,BSTR *p) {
    return This->lpVtbl->get_boxSizing(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_put_borderSpacing(IHTMLRuleStyle6* This,BSTR v) {
    return This->lpVtbl->put_borderSpacing(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_get_borderSpacing(IHTMLRuleStyle6* This,BSTR *p) {
    return This->lpVtbl->get_borderSpacing(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_put_orphans(IHTMLRuleStyle6* This,VARIANT v) {
    return This->lpVtbl->put_orphans(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_get_orphans(IHTMLRuleStyle6* This,VARIANT *p) {
    return This->lpVtbl->get_orphans(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_put_widows(IHTMLRuleStyle6* This,VARIANT v) {
    return This->lpVtbl->put_widows(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_get_widows(IHTMLRuleStyle6* This,VARIANT *p) {
    return This->lpVtbl->get_widows(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_put_pageBreakInside(IHTMLRuleStyle6* This,BSTR v) {
    return This->lpVtbl->put_pageBreakInside(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_get_pageBreakInside(IHTMLRuleStyle6* This,BSTR *p) {
    return This->lpVtbl->get_pageBreakInside(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_put_emptyCells(IHTMLRuleStyle6* This,BSTR v) {
    return This->lpVtbl->put_emptyCells(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_get_emptyCells(IHTMLRuleStyle6* This,BSTR *p) {
    return This->lpVtbl->get_emptyCells(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_put_msBlockProgression(IHTMLRuleStyle6* This,BSTR v) {
    return This->lpVtbl->put_msBlockProgression(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_get_msBlockProgression(IHTMLRuleStyle6* This,BSTR *p) {
    return This->lpVtbl->get_msBlockProgression(This,p);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_put_quotes(IHTMLRuleStyle6* This,BSTR v) {
    return This->lpVtbl->put_quotes(This,v);
}
static FORCEINLINE HRESULT IHTMLRuleStyle6_get_quotes(IHTMLRuleStyle6* This,BSTR *p) {
    return This->lpVtbl->get_quotes(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_put_content_Proxy(
    IHTMLRuleStyle6* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle6_put_content_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_get_content_Proxy(
    IHTMLRuleStyle6* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle6_get_content_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_put_captionSide_Proxy(
    IHTMLRuleStyle6* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle6_put_captionSide_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_get_captionSide_Proxy(
    IHTMLRuleStyle6* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle6_get_captionSide_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_put_counterIncrement_Proxy(
    IHTMLRuleStyle6* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle6_put_counterIncrement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_get_counterIncrement_Proxy(
    IHTMLRuleStyle6* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle6_get_counterIncrement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_put_counterReset_Proxy(
    IHTMLRuleStyle6* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle6_put_counterReset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_get_counterReset_Proxy(
    IHTMLRuleStyle6* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle6_get_counterReset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_put_outline_Proxy(
    IHTMLRuleStyle6* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle6_put_outline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_get_outline_Proxy(
    IHTMLRuleStyle6* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle6_get_outline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_put_outlineWidth_Proxy(
    IHTMLRuleStyle6* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle6_put_outlineWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_get_outlineWidth_Proxy(
    IHTMLRuleStyle6* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle6_get_outlineWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_put_outlineStyle_Proxy(
    IHTMLRuleStyle6* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle6_put_outlineStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_get_outlineStyle_Proxy(
    IHTMLRuleStyle6* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle6_get_outlineStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_put_outlineColor_Proxy(
    IHTMLRuleStyle6* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle6_put_outlineColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_get_outlineColor_Proxy(
    IHTMLRuleStyle6* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle6_get_outlineColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_put_boxSizing_Proxy(
    IHTMLRuleStyle6* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle6_put_boxSizing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_get_boxSizing_Proxy(
    IHTMLRuleStyle6* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle6_get_boxSizing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_put_borderSpacing_Proxy(
    IHTMLRuleStyle6* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle6_put_borderSpacing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_get_borderSpacing_Proxy(
    IHTMLRuleStyle6* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle6_get_borderSpacing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_put_orphans_Proxy(
    IHTMLRuleStyle6* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle6_put_orphans_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_get_orphans_Proxy(
    IHTMLRuleStyle6* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle6_get_orphans_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_put_widows_Proxy(
    IHTMLRuleStyle6* This,
    VARIANT v);
void __RPC_STUB IHTMLRuleStyle6_put_widows_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_get_widows_Proxy(
    IHTMLRuleStyle6* This,
    VARIANT *p);
void __RPC_STUB IHTMLRuleStyle6_get_widows_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_put_pageBreakInside_Proxy(
    IHTMLRuleStyle6* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle6_put_pageBreakInside_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_get_pageBreakInside_Proxy(
    IHTMLRuleStyle6* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle6_get_pageBreakInside_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_put_emptyCells_Proxy(
    IHTMLRuleStyle6* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle6_put_emptyCells_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_get_emptyCells_Proxy(
    IHTMLRuleStyle6* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle6_get_emptyCells_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_put_msBlockProgression_Proxy(
    IHTMLRuleStyle6* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle6_put_msBlockProgression_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_get_msBlockProgression_Proxy(
    IHTMLRuleStyle6* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle6_get_msBlockProgression_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_put_quotes_Proxy(
    IHTMLRuleStyle6* This,
    BSTR v);
void __RPC_STUB IHTMLRuleStyle6_put_quotes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRuleStyle6_get_quotes_Proxy(
    IHTMLRuleStyle6* This,
    BSTR *p);
void __RPC_STUB IHTMLRuleStyle6_get_quotes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLRuleStyle6_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLStyle dispinterface
 */
#ifndef __DispHTMLStyle_DISPINTERFACE_DEFINED__
#define __DispHTMLStyle_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLStyle, 0x3050f55a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f55a-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLStyle : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLStyle, 0x3050f55a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLStyleVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} DispHTMLStyleVtbl;
interface DispHTMLStyle {
    CONST_VTBL DispHTMLStyleVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLStyle_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLStyle_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLStyle_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLStyle_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLStyle_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLStyle_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLStyle_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 DispHTMLStyle_QueryInterface(DispHTMLStyle* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLStyle_AddRef(DispHTMLStyle* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLStyle_Release(DispHTMLStyle* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLStyle_GetTypeInfoCount(DispHTMLStyle* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLStyle_GetTypeInfo(DispHTMLStyle* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLStyle_GetIDsOfNames(DispHTMLStyle* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLStyle_Invoke(DispHTMLStyle* 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  /* __DispHTMLStyle_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLStyle coclass
 */

DEFINE_GUID(CLSID_HTMLStyle, 0x3050f285, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f285-98b5-11cf-bb82-00aa00bdce0b") HTMLStyle;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLStyle, 0x3050f285, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

/*****************************************************************************
 * DispHTMLRuleStyle dispinterface
 */
#ifndef __DispHTMLRuleStyle_DISPINTERFACE_DEFINED__
#define __DispHTMLRuleStyle_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLRuleStyle, 0x3050f55c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f55c-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLRuleStyle : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLRuleStyle, 0x3050f55c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLRuleStyleVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} DispHTMLRuleStyleVtbl;
interface DispHTMLRuleStyle {
    CONST_VTBL DispHTMLRuleStyleVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLRuleStyle_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLRuleStyle_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLRuleStyle_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLRuleStyle_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLRuleStyle_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLRuleStyle_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLRuleStyle_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 DispHTMLRuleStyle_QueryInterface(DispHTMLRuleStyle* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLRuleStyle_AddRef(DispHTMLRuleStyle* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLRuleStyle_Release(DispHTMLRuleStyle* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLRuleStyle_GetTypeInfoCount(DispHTMLRuleStyle* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLRuleStyle_GetTypeInfo(DispHTMLRuleStyle* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLRuleStyle_GetIDsOfNames(DispHTMLRuleStyle* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLRuleStyle_Invoke(DispHTMLRuleStyle* 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  /* __DispHTMLRuleStyle_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLRuleStyle coclass
 */

DEFINE_GUID(CLSID_HTMLRuleStyle, 0x3050f3d0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f3d0-98b5-11cf-bb82-00aa00bdce0b") HTMLRuleStyle;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLRuleStyle, 0x3050f3d0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CRuleStyle;
EXTERN_C const GUID CLSID_CCSSRule;
EXTERN_C const GUID CLSID_CCSSImportRule;
EXTERN_C const GUID CLSID_CCSSMediaRule;
EXTERN_C const GUID CLSID_CCSSNamespaceRule;
EXTERN_C const GUID CLSID_CCSSMediaList;
EXTERN_C const GUID CLSID_CMSCSSKeyframeRule;
EXTERN_C const GUID CLSID_CMSCSSKeyframesRule;
#ifndef __IHTMLStyleSheetRulesCollection_FWD_DEFINED__
#define __IHTMLStyleSheetRulesCollection_FWD_DEFINED__
typedef interface IHTMLStyleSheetRulesCollection IHTMLStyleSheetRulesCollection;
#endif

#ifndef __IHTMLStyleSheet_FWD_DEFINED__
#define __IHTMLStyleSheet_FWD_DEFINED__
typedef interface IHTMLStyleSheet IHTMLStyleSheet;
#endif

#ifndef __IHTMLRuleStyle_FWD_DEFINED__
#define __IHTMLRuleStyle_FWD_DEFINED__
typedef interface IHTMLRuleStyle IHTMLRuleStyle;
#endif

typedef enum _styleViewportSize {
    styleViewportSizeAuto = 0,
    styleViewportSizeDeviceWidth = 1,
    styleViewportSizeDeviceHeight = 2,
    styleViewportSize_Max = 0x7fffffff
} styleViewportSize;
typedef enum _styleUserZoom {
    styleUserZoomNotSet = 0,
    styleUserZoomZoom = 1,
    styleUserZoomFixed = 2,
    styleUserZoom_Max = 0x7fffffff
} styleUserZoom;
/*****************************************************************************
 * IHTMLCSSRule interface
 */
#ifndef __IHTMLCSSRule_INTERFACE_DEFINED__
#define __IHTMLCSSRule_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLCSSRule, 0x305106e9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106e9-98b5-11cf-bb82-00aa00bdce0b")
IHTMLCSSRule : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_type(
        USHORT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_cssText(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cssText(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_parentRule(
        IHTMLCSSRule **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_parentStyleSheet(
        IHTMLStyleSheet **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLCSSRule, 0x305106e9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLCSSRuleVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLCSSRule methods ***/
    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLCSSRule* This,
        USHORT *p);

    HRESULT (STDMETHODCALLTYPE *put_cssText)(
        IHTMLCSSRule* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_cssText)(
        IHTMLCSSRule* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_parentRule)(
        IHTMLCSSRule* This,
        IHTMLCSSRule **p);

    HRESULT (STDMETHODCALLTYPE *get_parentStyleSheet)(
        IHTMLCSSRule* This,
        IHTMLStyleSheet **p);

    END_INTERFACE
} IHTMLCSSRuleVtbl;
interface IHTMLCSSRule {
    CONST_VTBL IHTMLCSSRuleVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLCSSRule_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLCSSRule_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLCSSRule_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLCSSRule_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLCSSRule_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLCSSRule_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLCSSRule_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLCSSRule methods ***/
#define IHTMLCSSRule_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#define IHTMLCSSRule_put_cssText(This,v) (This)->lpVtbl->put_cssText(This,v)
#define IHTMLCSSRule_get_cssText(This,p) (This)->lpVtbl->get_cssText(This,p)
#define IHTMLCSSRule_get_parentRule(This,p) (This)->lpVtbl->get_parentRule(This,p)
#define IHTMLCSSRule_get_parentStyleSheet(This,p) (This)->lpVtbl->get_parentStyleSheet(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLCSSRule_QueryInterface(IHTMLCSSRule* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLCSSRule_AddRef(IHTMLCSSRule* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLCSSRule_Release(IHTMLCSSRule* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLCSSRule_GetTypeInfoCount(IHTMLCSSRule* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLCSSRule_GetTypeInfo(IHTMLCSSRule* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLCSSRule_GetIDsOfNames(IHTMLCSSRule* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLCSSRule_Invoke(IHTMLCSSRule* 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);
}
/*** IHTMLCSSRule methods ***/
static FORCEINLINE HRESULT IHTMLCSSRule_get_type(IHTMLCSSRule* This,USHORT *p) {
    return This->lpVtbl->get_type(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSRule_put_cssText(IHTMLCSSRule* This,BSTR v) {
    return This->lpVtbl->put_cssText(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSRule_get_cssText(IHTMLCSSRule* This,BSTR *p) {
    return This->lpVtbl->get_cssText(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSRule_get_parentRule(IHTMLCSSRule* This,IHTMLCSSRule **p) {
    return This->lpVtbl->get_parentRule(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSRule_get_parentStyleSheet(IHTMLCSSRule* This,IHTMLStyleSheet **p) {
    return This->lpVtbl->get_parentStyleSheet(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLCSSRule_get_type_Proxy(
    IHTMLCSSRule* This,
    USHORT *p);
void __RPC_STUB IHTMLCSSRule_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSRule_put_cssText_Proxy(
    IHTMLCSSRule* This,
    BSTR v);
void __RPC_STUB IHTMLCSSRule_put_cssText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSRule_get_cssText_Proxy(
    IHTMLCSSRule* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSRule_get_cssText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSRule_get_parentRule_Proxy(
    IHTMLCSSRule* This,
    IHTMLCSSRule **p);
void __RPC_STUB IHTMLCSSRule_get_parentRule_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSRule_get_parentStyleSheet_Proxy(
    IHTMLCSSRule* This,
    IHTMLStyleSheet **p);
void __RPC_STUB IHTMLCSSRule_get_parentStyleSheet_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLCSSRule_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLCSSImportRule interface
 */
#ifndef __IHTMLCSSImportRule_INTERFACE_DEFINED__
#define __IHTMLCSSImportRule_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLCSSImportRule, 0x305106ea, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106ea-98b5-11cf-bb82-00aa00bdce0b")
IHTMLCSSImportRule : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_href(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_media(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_media(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_styleSheet(
        IHTMLStyleSheet **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLCSSImportRule, 0x305106ea, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLCSSImportRuleVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLCSSImportRule methods ***/
    HRESULT (STDMETHODCALLTYPE *get_href)(
        IHTMLCSSImportRule* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_media)(
        IHTMLCSSImportRule* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_media)(
        IHTMLCSSImportRule* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_styleSheet)(
        IHTMLCSSImportRule* This,
        IHTMLStyleSheet **p);

    END_INTERFACE
} IHTMLCSSImportRuleVtbl;
interface IHTMLCSSImportRule {
    CONST_VTBL IHTMLCSSImportRuleVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLCSSImportRule_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLCSSImportRule_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLCSSImportRule_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLCSSImportRule_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLCSSImportRule_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLCSSImportRule_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLCSSImportRule_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLCSSImportRule methods ***/
#define IHTMLCSSImportRule_get_href(This,p) (This)->lpVtbl->get_href(This,p)
#define IHTMLCSSImportRule_put_media(This,v) (This)->lpVtbl->put_media(This,v)
#define IHTMLCSSImportRule_get_media(This,p) (This)->lpVtbl->get_media(This,p)
#define IHTMLCSSImportRule_get_styleSheet(This,p) (This)->lpVtbl->get_styleSheet(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLCSSImportRule_QueryInterface(IHTMLCSSImportRule* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLCSSImportRule_AddRef(IHTMLCSSImportRule* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLCSSImportRule_Release(IHTMLCSSImportRule* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLCSSImportRule_GetTypeInfoCount(IHTMLCSSImportRule* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLCSSImportRule_GetTypeInfo(IHTMLCSSImportRule* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLCSSImportRule_GetIDsOfNames(IHTMLCSSImportRule* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLCSSImportRule_Invoke(IHTMLCSSImportRule* 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);
}
/*** IHTMLCSSImportRule methods ***/
static FORCEINLINE HRESULT IHTMLCSSImportRule_get_href(IHTMLCSSImportRule* This,BSTR *p) {
    return This->lpVtbl->get_href(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSImportRule_put_media(IHTMLCSSImportRule* This,VARIANT v) {
    return This->lpVtbl->put_media(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSImportRule_get_media(IHTMLCSSImportRule* This,VARIANT *p) {
    return This->lpVtbl->get_media(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSImportRule_get_styleSheet(IHTMLCSSImportRule* This,IHTMLStyleSheet **p) {
    return This->lpVtbl->get_styleSheet(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLCSSImportRule_get_href_Proxy(
    IHTMLCSSImportRule* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSImportRule_get_href_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSImportRule_put_media_Proxy(
    IHTMLCSSImportRule* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSImportRule_put_media_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSImportRule_get_media_Proxy(
    IHTMLCSSImportRule* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSImportRule_get_media_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSImportRule_get_styleSheet_Proxy(
    IHTMLCSSImportRule* This,
    IHTMLStyleSheet **p);
void __RPC_STUB IHTMLCSSImportRule_get_styleSheet_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLCSSImportRule_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLCSSMediaRule interface
 */
#ifndef __IHTMLCSSMediaRule_INTERFACE_DEFINED__
#define __IHTMLCSSMediaRule_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLCSSMediaRule, 0x305106eb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106eb-98b5-11cf-bb82-00aa00bdce0b")
IHTMLCSSMediaRule : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_media(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_media(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cssRules(
        IHTMLStyleSheetRulesCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE insertRule(
        BSTR bstrRule,
        LONG lIndex = -1,
        LONG *plNewIndex = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE deleteRule(
        LONG lIndex = -1) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLCSSMediaRule, 0x305106eb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLCSSMediaRuleVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLCSSMediaRule methods ***/
    HRESULT (STDMETHODCALLTYPE *put_media)(
        IHTMLCSSMediaRule* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_media)(
        IHTMLCSSMediaRule* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_cssRules)(
        IHTMLCSSMediaRule* This,
        IHTMLStyleSheetRulesCollection **p);

    HRESULT (STDMETHODCALLTYPE *insertRule)(
        IHTMLCSSMediaRule* This,
        BSTR bstrRule,
        LONG lIndex,
        LONG *plNewIndex);

    HRESULT (STDMETHODCALLTYPE *deleteRule)(
        IHTMLCSSMediaRule* This,
        LONG lIndex);

    END_INTERFACE
} IHTMLCSSMediaRuleVtbl;
interface IHTMLCSSMediaRule {
    CONST_VTBL IHTMLCSSMediaRuleVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLCSSMediaRule_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLCSSMediaRule_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLCSSMediaRule_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLCSSMediaRule_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLCSSMediaRule_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLCSSMediaRule_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLCSSMediaRule_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLCSSMediaRule methods ***/
#define IHTMLCSSMediaRule_put_media(This,v) (This)->lpVtbl->put_media(This,v)
#define IHTMLCSSMediaRule_get_media(This,p) (This)->lpVtbl->get_media(This,p)
#define IHTMLCSSMediaRule_get_cssRules(This,p) (This)->lpVtbl->get_cssRules(This,p)
#define IHTMLCSSMediaRule_insertRule(This,bstrRule,lIndex,plNewIndex) (This)->lpVtbl->insertRule(This,bstrRule,lIndex,plNewIndex)
#define IHTMLCSSMediaRule_deleteRule(This,lIndex) (This)->lpVtbl->deleteRule(This,lIndex)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLCSSMediaRule_QueryInterface(IHTMLCSSMediaRule* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLCSSMediaRule_AddRef(IHTMLCSSMediaRule* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLCSSMediaRule_Release(IHTMLCSSMediaRule* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLCSSMediaRule_GetTypeInfoCount(IHTMLCSSMediaRule* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLCSSMediaRule_GetTypeInfo(IHTMLCSSMediaRule* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLCSSMediaRule_GetIDsOfNames(IHTMLCSSMediaRule* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLCSSMediaRule_Invoke(IHTMLCSSMediaRule* 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);
}
/*** IHTMLCSSMediaRule methods ***/
static FORCEINLINE HRESULT IHTMLCSSMediaRule_put_media(IHTMLCSSMediaRule* This,VARIANT v) {
    return This->lpVtbl->put_media(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSMediaRule_get_media(IHTMLCSSMediaRule* This,VARIANT *p) {
    return This->lpVtbl->get_media(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSMediaRule_get_cssRules(IHTMLCSSMediaRule* This,IHTMLStyleSheetRulesCollection **p) {
    return This->lpVtbl->get_cssRules(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSMediaRule_insertRule(IHTMLCSSMediaRule* This,BSTR bstrRule,LONG lIndex,LONG *plNewIndex) {
    return This->lpVtbl->insertRule(This,bstrRule,lIndex,plNewIndex);
}
static FORCEINLINE HRESULT IHTMLCSSMediaRule_deleteRule(IHTMLCSSMediaRule* This,LONG lIndex) {
    return This->lpVtbl->deleteRule(This,lIndex);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLCSSMediaRule_put_media_Proxy(
    IHTMLCSSMediaRule* This,
    VARIANT v);
void __RPC_STUB IHTMLCSSMediaRule_put_media_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSMediaRule_get_media_Proxy(
    IHTMLCSSMediaRule* This,
    VARIANT *p);
void __RPC_STUB IHTMLCSSMediaRule_get_media_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSMediaRule_get_cssRules_Proxy(
    IHTMLCSSMediaRule* This,
    IHTMLStyleSheetRulesCollection **p);
void __RPC_STUB IHTMLCSSMediaRule_get_cssRules_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSMediaRule_insertRule_Proxy(
    IHTMLCSSMediaRule* This,
    BSTR bstrRule,
    LONG lIndex,
    LONG *plNewIndex);
void __RPC_STUB IHTMLCSSMediaRule_insertRule_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSMediaRule_deleteRule_Proxy(
    IHTMLCSSMediaRule* This,
    LONG lIndex);
void __RPC_STUB IHTMLCSSMediaRule_deleteRule_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLCSSMediaRule_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLCSSMediaList interface
 */
#ifndef __IHTMLCSSMediaList_INTERFACE_DEFINED__
#define __IHTMLCSSMediaList_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLCSSMediaList, 0x30510731, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510731-98b5-11cf-bb82-00aa00bdce0b")
IHTMLCSSMediaList : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_mediaText(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_mediaText(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE item(
        LONG index,
        BSTR *pbstrMedium) = 0;

    virtual HRESULT STDMETHODCALLTYPE appendMedium(
        BSTR bstrMedium) = 0;

    virtual HRESULT STDMETHODCALLTYPE deleteMedium(
        BSTR bstrMedium) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLCSSMediaList, 0x30510731, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLCSSMediaListVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLCSSMediaList methods ***/
    HRESULT (STDMETHODCALLTYPE *put_mediaText)(
        IHTMLCSSMediaList* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_mediaText)(
        IHTMLCSSMediaList* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLCSSMediaList* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLCSSMediaList* This,
        LONG index,
        BSTR *pbstrMedium);

    HRESULT (STDMETHODCALLTYPE *appendMedium)(
        IHTMLCSSMediaList* This,
        BSTR bstrMedium);

    HRESULT (STDMETHODCALLTYPE *deleteMedium)(
        IHTMLCSSMediaList* This,
        BSTR bstrMedium);

    END_INTERFACE
} IHTMLCSSMediaListVtbl;
interface IHTMLCSSMediaList {
    CONST_VTBL IHTMLCSSMediaListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLCSSMediaList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLCSSMediaList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLCSSMediaList_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLCSSMediaList_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLCSSMediaList_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLCSSMediaList_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLCSSMediaList_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLCSSMediaList methods ***/
#define IHTMLCSSMediaList_put_mediaText(This,v) (This)->lpVtbl->put_mediaText(This,v)
#define IHTMLCSSMediaList_get_mediaText(This,p) (This)->lpVtbl->get_mediaText(This,p)
#define IHTMLCSSMediaList_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLCSSMediaList_item(This,index,pbstrMedium) (This)->lpVtbl->item(This,index,pbstrMedium)
#define IHTMLCSSMediaList_appendMedium(This,bstrMedium) (This)->lpVtbl->appendMedium(This,bstrMedium)
#define IHTMLCSSMediaList_deleteMedium(This,bstrMedium) (This)->lpVtbl->deleteMedium(This,bstrMedium)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLCSSMediaList_QueryInterface(IHTMLCSSMediaList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLCSSMediaList_AddRef(IHTMLCSSMediaList* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLCSSMediaList_Release(IHTMLCSSMediaList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLCSSMediaList_GetTypeInfoCount(IHTMLCSSMediaList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLCSSMediaList_GetTypeInfo(IHTMLCSSMediaList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLCSSMediaList_GetIDsOfNames(IHTMLCSSMediaList* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLCSSMediaList_Invoke(IHTMLCSSMediaList* 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);
}
/*** IHTMLCSSMediaList methods ***/
static FORCEINLINE HRESULT IHTMLCSSMediaList_put_mediaText(IHTMLCSSMediaList* This,BSTR v) {
    return This->lpVtbl->put_mediaText(This,v);
}
static FORCEINLINE HRESULT IHTMLCSSMediaList_get_mediaText(IHTMLCSSMediaList* This,BSTR *p) {
    return This->lpVtbl->get_mediaText(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSMediaList_get_length(IHTMLCSSMediaList* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSMediaList_item(IHTMLCSSMediaList* This,LONG index,BSTR *pbstrMedium) {
    return This->lpVtbl->item(This,index,pbstrMedium);
}
static FORCEINLINE HRESULT IHTMLCSSMediaList_appendMedium(IHTMLCSSMediaList* This,BSTR bstrMedium) {
    return This->lpVtbl->appendMedium(This,bstrMedium);
}
static FORCEINLINE HRESULT IHTMLCSSMediaList_deleteMedium(IHTMLCSSMediaList* This,BSTR bstrMedium) {
    return This->lpVtbl->deleteMedium(This,bstrMedium);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLCSSMediaList_put_mediaText_Proxy(
    IHTMLCSSMediaList* This,
    BSTR v);
void __RPC_STUB IHTMLCSSMediaList_put_mediaText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSMediaList_get_mediaText_Proxy(
    IHTMLCSSMediaList* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSMediaList_get_mediaText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSMediaList_get_length_Proxy(
    IHTMLCSSMediaList* This,
    LONG *p);
void __RPC_STUB IHTMLCSSMediaList_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSMediaList_item_Proxy(
    IHTMLCSSMediaList* This,
    LONG index,
    BSTR *pbstrMedium);
void __RPC_STUB IHTMLCSSMediaList_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSMediaList_appendMedium_Proxy(
    IHTMLCSSMediaList* This,
    BSTR bstrMedium);
void __RPC_STUB IHTMLCSSMediaList_appendMedium_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSMediaList_deleteMedium_Proxy(
    IHTMLCSSMediaList* This,
    BSTR bstrMedium);
void __RPC_STUB IHTMLCSSMediaList_deleteMedium_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLCSSMediaList_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLCSSNamespaceRule interface
 */
#ifndef __IHTMLCSSNamespaceRule_INTERFACE_DEFINED__
#define __IHTMLCSSNamespaceRule_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLCSSNamespaceRule, 0x305106ee, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106ee-98b5-11cf-bb82-00aa00bdce0b")
IHTMLCSSNamespaceRule : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_namespaceURI(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_prefix(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLCSSNamespaceRule, 0x305106ee, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLCSSNamespaceRuleVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLCSSNamespaceRule methods ***/
    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        IHTMLCSSNamespaceRule* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_prefix)(
        IHTMLCSSNamespaceRule* This,
        BSTR *p);

    END_INTERFACE
} IHTMLCSSNamespaceRuleVtbl;
interface IHTMLCSSNamespaceRule {
    CONST_VTBL IHTMLCSSNamespaceRuleVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLCSSNamespaceRule_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLCSSNamespaceRule_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLCSSNamespaceRule_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLCSSNamespaceRule_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLCSSNamespaceRule_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLCSSNamespaceRule_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLCSSNamespaceRule_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLCSSNamespaceRule methods ***/
#define IHTMLCSSNamespaceRule_get_namespaceURI(This,p) (This)->lpVtbl->get_namespaceURI(This,p)
#define IHTMLCSSNamespaceRule_get_prefix(This,p) (This)->lpVtbl->get_prefix(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLCSSNamespaceRule_QueryInterface(IHTMLCSSNamespaceRule* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLCSSNamespaceRule_AddRef(IHTMLCSSNamespaceRule* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLCSSNamespaceRule_Release(IHTMLCSSNamespaceRule* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLCSSNamespaceRule_GetTypeInfoCount(IHTMLCSSNamespaceRule* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLCSSNamespaceRule_GetTypeInfo(IHTMLCSSNamespaceRule* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLCSSNamespaceRule_GetIDsOfNames(IHTMLCSSNamespaceRule* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLCSSNamespaceRule_Invoke(IHTMLCSSNamespaceRule* 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);
}
/*** IHTMLCSSNamespaceRule methods ***/
static FORCEINLINE HRESULT IHTMLCSSNamespaceRule_get_namespaceURI(IHTMLCSSNamespaceRule* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static FORCEINLINE HRESULT IHTMLCSSNamespaceRule_get_prefix(IHTMLCSSNamespaceRule* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLCSSNamespaceRule_get_namespaceURI_Proxy(
    IHTMLCSSNamespaceRule* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSNamespaceRule_get_namespaceURI_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCSSNamespaceRule_get_prefix_Proxy(
    IHTMLCSSNamespaceRule* This,
    BSTR *p);
void __RPC_STUB IHTMLCSSNamespaceRule_get_prefix_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLCSSNamespaceRule_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLMSCSSKeyframeRule interface
 */
#ifndef __IHTMLMSCSSKeyframeRule_INTERFACE_DEFINED__
#define __IHTMLMSCSSKeyframeRule_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLMSCSSKeyframeRule, 0x3051080c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051080c-98b5-11cf-bb82-00aa00bdce0b")
IHTMLMSCSSKeyframeRule : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_keyText(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_keyText(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_style(
        IHTMLRuleStyle **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLMSCSSKeyframeRule, 0x3051080c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLMSCSSKeyframeRuleVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLMSCSSKeyframeRule methods ***/
    HRESULT (STDMETHODCALLTYPE *put_keyText)(
        IHTMLMSCSSKeyframeRule* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_keyText)(
        IHTMLMSCSSKeyframeRule* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_style)(
        IHTMLMSCSSKeyframeRule* This,
        IHTMLRuleStyle **p);

    END_INTERFACE
} IHTMLMSCSSKeyframeRuleVtbl;
interface IHTMLMSCSSKeyframeRule {
    CONST_VTBL IHTMLMSCSSKeyframeRuleVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLMSCSSKeyframeRule_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLMSCSSKeyframeRule_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLMSCSSKeyframeRule_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLMSCSSKeyframeRule_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLMSCSSKeyframeRule_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLMSCSSKeyframeRule_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLMSCSSKeyframeRule_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLMSCSSKeyframeRule methods ***/
#define IHTMLMSCSSKeyframeRule_put_keyText(This,v) (This)->lpVtbl->put_keyText(This,v)
#define IHTMLMSCSSKeyframeRule_get_keyText(This,p) (This)->lpVtbl->get_keyText(This,p)
#define IHTMLMSCSSKeyframeRule_get_style(This,p) (This)->lpVtbl->get_style(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLMSCSSKeyframeRule_QueryInterface(IHTMLMSCSSKeyframeRule* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLMSCSSKeyframeRule_AddRef(IHTMLMSCSSKeyframeRule* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLMSCSSKeyframeRule_Release(IHTMLMSCSSKeyframeRule* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLMSCSSKeyframeRule_GetTypeInfoCount(IHTMLMSCSSKeyframeRule* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLMSCSSKeyframeRule_GetTypeInfo(IHTMLMSCSSKeyframeRule* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLMSCSSKeyframeRule_GetIDsOfNames(IHTMLMSCSSKeyframeRule* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLMSCSSKeyframeRule_Invoke(IHTMLMSCSSKeyframeRule* 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);
}
/*** IHTMLMSCSSKeyframeRule methods ***/
static FORCEINLINE HRESULT IHTMLMSCSSKeyframeRule_put_keyText(IHTMLMSCSSKeyframeRule* This,BSTR v) {
    return This->lpVtbl->put_keyText(This,v);
}
static FORCEINLINE HRESULT IHTMLMSCSSKeyframeRule_get_keyText(IHTMLMSCSSKeyframeRule* This,BSTR *p) {
    return This->lpVtbl->get_keyText(This,p);
}
static FORCEINLINE HRESULT IHTMLMSCSSKeyframeRule_get_style(IHTMLMSCSSKeyframeRule* This,IHTMLRuleStyle **p) {
    return This->lpVtbl->get_style(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLMSCSSKeyframeRule_put_keyText_Proxy(
    IHTMLMSCSSKeyframeRule* This,
    BSTR v);
void __RPC_STUB IHTMLMSCSSKeyframeRule_put_keyText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMSCSSKeyframeRule_get_keyText_Proxy(
    IHTMLMSCSSKeyframeRule* This,
    BSTR *p);
void __RPC_STUB IHTMLMSCSSKeyframeRule_get_keyText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMSCSSKeyframeRule_get_style_Proxy(
    IHTMLMSCSSKeyframeRule* This,
    IHTMLRuleStyle **p);
void __RPC_STUB IHTMLMSCSSKeyframeRule_get_style_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLMSCSSKeyframeRule_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLMSCSSKeyframesRule interface
 */
#ifndef __IHTMLMSCSSKeyframesRule_INTERFACE_DEFINED__
#define __IHTMLMSCSSKeyframesRule_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLMSCSSKeyframesRule, 0x3051080d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051080d-98b5-11cf-bb82-00aa00bdce0b")
IHTMLMSCSSKeyframesRule : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_name(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cssRules(
        IHTMLStyleSheetRulesCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE appendRule(
        BSTR bstrRule) = 0;

    virtual HRESULT STDMETHODCALLTYPE deleteRule(
        BSTR bstrKey) = 0;

    virtual HRESULT STDMETHODCALLTYPE findRule(
        BSTR bstrKey,
        IHTMLMSCSSKeyframeRule **ppMSKeyframeRule) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLMSCSSKeyframesRule, 0x3051080d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLMSCSSKeyframesRuleVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLMSCSSKeyframesRule methods ***/
    HRESULT (STDMETHODCALLTYPE *put_name)(
        IHTMLMSCSSKeyframesRule* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_name)(
        IHTMLMSCSSKeyframesRule* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_cssRules)(
        IHTMLMSCSSKeyframesRule* This,
        IHTMLStyleSheetRulesCollection **p);

    HRESULT (STDMETHODCALLTYPE *appendRule)(
        IHTMLMSCSSKeyframesRule* This,
        BSTR bstrRule);

    HRESULT (STDMETHODCALLTYPE *deleteRule)(
        IHTMLMSCSSKeyframesRule* This,
        BSTR bstrKey);

    HRESULT (STDMETHODCALLTYPE *findRule)(
        IHTMLMSCSSKeyframesRule* This,
        BSTR bstrKey,
        IHTMLMSCSSKeyframeRule **ppMSKeyframeRule);

    END_INTERFACE
} IHTMLMSCSSKeyframesRuleVtbl;
interface IHTMLMSCSSKeyframesRule {
    CONST_VTBL IHTMLMSCSSKeyframesRuleVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLMSCSSKeyframesRule_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLMSCSSKeyframesRule_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLMSCSSKeyframesRule_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLMSCSSKeyframesRule_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLMSCSSKeyframesRule_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLMSCSSKeyframesRule_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLMSCSSKeyframesRule_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLMSCSSKeyframesRule methods ***/
#define IHTMLMSCSSKeyframesRule_put_name(This,v) (This)->lpVtbl->put_name(This,v)
#define IHTMLMSCSSKeyframesRule_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#define IHTMLMSCSSKeyframesRule_get_cssRules(This,p) (This)->lpVtbl->get_cssRules(This,p)
#define IHTMLMSCSSKeyframesRule_appendRule(This,bstrRule) (This)->lpVtbl->appendRule(This,bstrRule)
#define IHTMLMSCSSKeyframesRule_deleteRule(This,bstrKey) (This)->lpVtbl->deleteRule(This,bstrKey)
#define IHTMLMSCSSKeyframesRule_findRule(This,bstrKey,ppMSKeyframeRule) (This)->lpVtbl->findRule(This,bstrKey,ppMSKeyframeRule)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLMSCSSKeyframesRule_QueryInterface(IHTMLMSCSSKeyframesRule* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLMSCSSKeyframesRule_AddRef(IHTMLMSCSSKeyframesRule* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLMSCSSKeyframesRule_Release(IHTMLMSCSSKeyframesRule* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLMSCSSKeyframesRule_GetTypeInfoCount(IHTMLMSCSSKeyframesRule* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLMSCSSKeyframesRule_GetTypeInfo(IHTMLMSCSSKeyframesRule* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLMSCSSKeyframesRule_GetIDsOfNames(IHTMLMSCSSKeyframesRule* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLMSCSSKeyframesRule_Invoke(IHTMLMSCSSKeyframesRule* 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);
}
/*** IHTMLMSCSSKeyframesRule methods ***/
static FORCEINLINE HRESULT IHTMLMSCSSKeyframesRule_put_name(IHTMLMSCSSKeyframesRule* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static FORCEINLINE HRESULT IHTMLMSCSSKeyframesRule_get_name(IHTMLMSCSSKeyframesRule* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static FORCEINLINE HRESULT IHTMLMSCSSKeyframesRule_get_cssRules(IHTMLMSCSSKeyframesRule* This,IHTMLStyleSheetRulesCollection **p) {
    return This->lpVtbl->get_cssRules(This,p);
}
static FORCEINLINE HRESULT IHTMLMSCSSKeyframesRule_appendRule(IHTMLMSCSSKeyframesRule* This,BSTR bstrRule) {
    return This->lpVtbl->appendRule(This,bstrRule);
}
static FORCEINLINE HRESULT IHTMLMSCSSKeyframesRule_deleteRule(IHTMLMSCSSKeyframesRule* This,BSTR bstrKey) {
    return This->lpVtbl->deleteRule(This,bstrKey);
}
static FORCEINLINE HRESULT IHTMLMSCSSKeyframesRule_findRule(IHTMLMSCSSKeyframesRule* This,BSTR bstrKey,IHTMLMSCSSKeyframeRule **ppMSKeyframeRule) {
    return This->lpVtbl->findRule(This,bstrKey,ppMSKeyframeRule);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLMSCSSKeyframesRule_put_name_Proxy(
    IHTMLMSCSSKeyframesRule* This,
    BSTR v);
void __RPC_STUB IHTMLMSCSSKeyframesRule_put_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMSCSSKeyframesRule_get_name_Proxy(
    IHTMLMSCSSKeyframesRule* This,
    BSTR *p);
void __RPC_STUB IHTMLMSCSSKeyframesRule_get_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMSCSSKeyframesRule_get_cssRules_Proxy(
    IHTMLMSCSSKeyframesRule* This,
    IHTMLStyleSheetRulesCollection **p);
void __RPC_STUB IHTMLMSCSSKeyframesRule_get_cssRules_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMSCSSKeyframesRule_appendRule_Proxy(
    IHTMLMSCSSKeyframesRule* This,
    BSTR bstrRule);
void __RPC_STUB IHTMLMSCSSKeyframesRule_appendRule_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMSCSSKeyframesRule_deleteRule_Proxy(
    IHTMLMSCSSKeyframesRule* This,
    BSTR bstrKey);
void __RPC_STUB IHTMLMSCSSKeyframesRule_deleteRule_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMSCSSKeyframesRule_findRule_Proxy(
    IHTMLMSCSSKeyframesRule* This,
    BSTR bstrKey,
    IHTMLMSCSSKeyframeRule **ppMSKeyframeRule);
void __RPC_STUB IHTMLMSCSSKeyframesRule_findRule_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLMSCSSKeyframesRule_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLCSSRule dispinterface
 */
#ifndef __DispHTMLCSSRule_DISPINTERFACE_DEFINED__
#define __DispHTMLCSSRule_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLCSSRule, 0x3059007d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059007d-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLCSSRule : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLCSSRule, 0x3059007d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLCSSRuleVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} DispHTMLCSSRuleVtbl;
interface DispHTMLCSSRule {
    CONST_VTBL DispHTMLCSSRuleVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLCSSRule_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLCSSRule_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLCSSRule_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLCSSRule_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLCSSRule_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLCSSRule_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLCSSRule_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 DispHTMLCSSRule_QueryInterface(DispHTMLCSSRule* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLCSSRule_AddRef(DispHTMLCSSRule* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLCSSRule_Release(DispHTMLCSSRule* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLCSSRule_GetTypeInfoCount(DispHTMLCSSRule* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLCSSRule_GetTypeInfo(DispHTMLCSSRule* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLCSSRule_GetIDsOfNames(DispHTMLCSSRule* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLCSSRule_Invoke(DispHTMLCSSRule* 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  /* __DispHTMLCSSRule_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLCSSRule coclass
 */

DEFINE_GUID(CLSID_HTMLCSSRule, 0x305106ef, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305106ef-98b5-11cf-bb82-00aa00bdce0b") HTMLCSSRule;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLCSSRule, 0x305106ef, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

/*****************************************************************************
 * DispHTMLCSSImportRule dispinterface
 */
#ifndef __DispHTMLCSSImportRule_DISPINTERFACE_DEFINED__
#define __DispHTMLCSSImportRule_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLCSSImportRule, 0x3059007e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059007e-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLCSSImportRule : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLCSSImportRule, 0x3059007e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLCSSImportRuleVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} DispHTMLCSSImportRuleVtbl;
interface DispHTMLCSSImportRule {
    CONST_VTBL DispHTMLCSSImportRuleVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLCSSImportRule_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLCSSImportRule_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLCSSImportRule_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLCSSImportRule_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLCSSImportRule_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLCSSImportRule_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLCSSImportRule_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 DispHTMLCSSImportRule_QueryInterface(DispHTMLCSSImportRule* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLCSSImportRule_AddRef(DispHTMLCSSImportRule* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLCSSImportRule_Release(DispHTMLCSSImportRule* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLCSSImportRule_GetTypeInfoCount(DispHTMLCSSImportRule* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLCSSImportRule_GetTypeInfo(DispHTMLCSSImportRule* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLCSSImportRule_GetIDsOfNames(DispHTMLCSSImportRule* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLCSSImportRule_Invoke(DispHTMLCSSImportRule* 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  /* __DispHTMLCSSImportRule_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLCSSImportRule coclass
 */

DEFINE_GUID(CLSID_HTMLCSSImportRule, 0x305106f0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305106f0-98b5-11cf-bb82-00aa00bdce0b") HTMLCSSImportRule;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLCSSImportRule, 0x305106f0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

/*****************************************************************************
 * DispHTMLCSSMediaRule dispinterface
 */
#ifndef __DispHTMLCSSMediaRule_DISPINTERFACE_DEFINED__
#define __DispHTMLCSSMediaRule_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLCSSMediaRule, 0x3059007f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059007f-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLCSSMediaRule : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLCSSMediaRule, 0x3059007f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLCSSMediaRuleVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} DispHTMLCSSMediaRuleVtbl;
interface DispHTMLCSSMediaRule {
    CONST_VTBL DispHTMLCSSMediaRuleVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLCSSMediaRule_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLCSSMediaRule_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLCSSMediaRule_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLCSSMediaRule_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLCSSMediaRule_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLCSSMediaRule_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLCSSMediaRule_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 DispHTMLCSSMediaRule_QueryInterface(DispHTMLCSSMediaRule* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLCSSMediaRule_AddRef(DispHTMLCSSMediaRule* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLCSSMediaRule_Release(DispHTMLCSSMediaRule* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLCSSMediaRule_GetTypeInfoCount(DispHTMLCSSMediaRule* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLCSSMediaRule_GetTypeInfo(DispHTMLCSSMediaRule* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLCSSMediaRule_GetIDsOfNames(DispHTMLCSSMediaRule* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLCSSMediaRule_Invoke(DispHTMLCSSMediaRule* 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  /* __DispHTMLCSSMediaRule_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLCSSMediaRule coclass
 */

DEFINE_GUID(CLSID_HTMLCSSMediaRule, 0x305106f1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305106f1-98b5-11cf-bb82-00aa00bdce0b") HTMLCSSMediaRule;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLCSSMediaRule, 0x305106f1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

/*****************************************************************************
 * DispHTMLCSSMediaList dispinterface
 */
#ifndef __DispHTMLCSSMediaList_DISPINTERFACE_DEFINED__
#define __DispHTMLCSSMediaList_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLCSSMediaList, 0x30590097, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590097-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLCSSMediaList : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLCSSMediaList, 0x30590097, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLCSSMediaListVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} DispHTMLCSSMediaListVtbl;
interface DispHTMLCSSMediaList {
    CONST_VTBL DispHTMLCSSMediaListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLCSSMediaList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLCSSMediaList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLCSSMediaList_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLCSSMediaList_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLCSSMediaList_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLCSSMediaList_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLCSSMediaList_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 DispHTMLCSSMediaList_QueryInterface(DispHTMLCSSMediaList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLCSSMediaList_AddRef(DispHTMLCSSMediaList* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLCSSMediaList_Release(DispHTMLCSSMediaList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLCSSMediaList_GetTypeInfoCount(DispHTMLCSSMediaList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLCSSMediaList_GetTypeInfo(DispHTMLCSSMediaList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLCSSMediaList_GetIDsOfNames(DispHTMLCSSMediaList* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLCSSMediaList_Invoke(DispHTMLCSSMediaList* 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  /* __DispHTMLCSSMediaList_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLCSSMediaList coclass
 */

DEFINE_GUID(CLSID_HTMLCSSMediaList, 0x30510732, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510732-98b5-11cf-bb82-00aa00bdce0b") HTMLCSSMediaList;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLCSSMediaList, 0x30510732, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

/*****************************************************************************
 * DispHTMLCSSNamespaceRule dispinterface
 */
#ifndef __DispHTMLCSSNamespaceRule_DISPINTERFACE_DEFINED__
#define __DispHTMLCSSNamespaceRule_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLCSSNamespaceRule, 0x30590080, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590080-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLCSSNamespaceRule : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLCSSNamespaceRule, 0x30590080, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLCSSNamespaceRuleVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} DispHTMLCSSNamespaceRuleVtbl;
interface DispHTMLCSSNamespaceRule {
    CONST_VTBL DispHTMLCSSNamespaceRuleVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLCSSNamespaceRule_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLCSSNamespaceRule_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLCSSNamespaceRule_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLCSSNamespaceRule_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLCSSNamespaceRule_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLCSSNamespaceRule_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLCSSNamespaceRule_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 DispHTMLCSSNamespaceRule_QueryInterface(DispHTMLCSSNamespaceRule* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLCSSNamespaceRule_AddRef(DispHTMLCSSNamespaceRule* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLCSSNamespaceRule_Release(DispHTMLCSSNamespaceRule* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLCSSNamespaceRule_GetTypeInfoCount(DispHTMLCSSNamespaceRule* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLCSSNamespaceRule_GetTypeInfo(DispHTMLCSSNamespaceRule* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLCSSNamespaceRule_GetIDsOfNames(DispHTMLCSSNamespaceRule* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLCSSNamespaceRule_Invoke(DispHTMLCSSNamespaceRule* 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  /* __DispHTMLCSSNamespaceRule_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLCSSNamespaceRule coclass
 */

DEFINE_GUID(CLSID_HTMLCSSNamespaceRule, 0x305106f2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305106f2-98b5-11cf-bb82-00aa00bdce0b") HTMLCSSNamespaceRule;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLCSSNamespaceRule, 0x305106f2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

/*****************************************************************************
 * DispHTMLMSCSSKeyframeRule dispinterface
 */
#ifndef __DispHTMLMSCSSKeyframeRule_DISPINTERFACE_DEFINED__
#define __DispHTMLMSCSSKeyframeRule_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLMSCSSKeyframeRule, 0x305900de, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305900de-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLMSCSSKeyframeRule : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLMSCSSKeyframeRule, 0x305900de, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLMSCSSKeyframeRuleVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} DispHTMLMSCSSKeyframeRuleVtbl;
interface DispHTMLMSCSSKeyframeRule {
    CONST_VTBL DispHTMLMSCSSKeyframeRuleVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLMSCSSKeyframeRule_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLMSCSSKeyframeRule_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLMSCSSKeyframeRule_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLMSCSSKeyframeRule_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLMSCSSKeyframeRule_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLMSCSSKeyframeRule_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLMSCSSKeyframeRule_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 DispHTMLMSCSSKeyframeRule_QueryInterface(DispHTMLMSCSSKeyframeRule* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLMSCSSKeyframeRule_AddRef(DispHTMLMSCSSKeyframeRule* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLMSCSSKeyframeRule_Release(DispHTMLMSCSSKeyframeRule* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLMSCSSKeyframeRule_GetTypeInfoCount(DispHTMLMSCSSKeyframeRule* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLMSCSSKeyframeRule_GetTypeInfo(DispHTMLMSCSSKeyframeRule* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLMSCSSKeyframeRule_GetIDsOfNames(DispHTMLMSCSSKeyframeRule* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLMSCSSKeyframeRule_Invoke(DispHTMLMSCSSKeyframeRule* 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  /* __DispHTMLMSCSSKeyframeRule_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLMSCSSKeyframeRule coclass
 */

DEFINE_GUID(CLSID_HTMLMSCSSKeyframeRule, 0x3051080e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3051080e-98b5-11cf-bb82-00aa00bdce0b") HTMLMSCSSKeyframeRule;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLMSCSSKeyframeRule, 0x3051080e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

/*****************************************************************************
 * DispHTMLMSCSSKeyframesRule dispinterface
 */
#ifndef __DispHTMLMSCSSKeyframesRule_DISPINTERFACE_DEFINED__
#define __DispHTMLMSCSSKeyframesRule_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLMSCSSKeyframesRule, 0x305900df, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305900df-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLMSCSSKeyframesRule : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLMSCSSKeyframesRule, 0x305900df, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLMSCSSKeyframesRuleVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} DispHTMLMSCSSKeyframesRuleVtbl;
interface DispHTMLMSCSSKeyframesRule {
    CONST_VTBL DispHTMLMSCSSKeyframesRuleVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLMSCSSKeyframesRule_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLMSCSSKeyframesRule_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLMSCSSKeyframesRule_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLMSCSSKeyframesRule_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLMSCSSKeyframesRule_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLMSCSSKeyframesRule_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLMSCSSKeyframesRule_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 DispHTMLMSCSSKeyframesRule_QueryInterface(DispHTMLMSCSSKeyframesRule* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLMSCSSKeyframesRule_AddRef(DispHTMLMSCSSKeyframesRule* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLMSCSSKeyframesRule_Release(DispHTMLMSCSSKeyframesRule* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLMSCSSKeyframesRule_GetTypeInfoCount(DispHTMLMSCSSKeyframesRule* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLMSCSSKeyframesRule_GetTypeInfo(DispHTMLMSCSSKeyframesRule* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLMSCSSKeyframesRule_GetIDsOfNames(DispHTMLMSCSSKeyframesRule* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLMSCSSKeyframesRule_Invoke(DispHTMLMSCSSKeyframesRule* 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  /* __DispHTMLMSCSSKeyframesRule_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLMSCSSKeyframesRule coclass
 */

DEFINE_GUID(CLSID_HTMLMSCSSKeyframesRule, 0x3051080f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3051080f-98b5-11cf-bb82-00aa00bdce0b") HTMLMSCSSKeyframesRule;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLMSCSSKeyframesRule, 0x3051080f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

typedef enum _styleTextLineThroughStyle {
    styleTextLineThroughStyleUndefined = 0,
    styleTextLineThroughStyleSingle = 1,
    styleTextLineThroughStyleDouble = 2,
    styleTextLineThroughStyle_Max = 0x7fffffff
} styleTextLineThroughStyle;
typedef enum _styleTextUnderlineStyle {
    styleTextUnderlineStyleUndefined = 0,
    styleTextUnderlineStyleSingle = 1,
    styleTextUnderlineStyleDouble = 2,
    styleTextUnderlineStyleWords = 3,
    styleTextUnderlineStyleDotted = 4,
    styleTextUnderlineStyleThick = 5,
    styleTextUnderlineStyleDash = 6,
    styleTextUnderlineStyleDotDash = 7,
    styleTextUnderlineStyleDotDotDash = 8,
    styleTextUnderlineStyleWave = 9,
    styleTextUnderlineStyleSingleAccounting = 10,
    styleTextUnderlineStyleDoubleAccounting = 11,
    styleTextUnderlineStyleThickDash = 12,
    styleTextUnderlineStyle_Max = 0x7fffffff
} styleTextUnderlineStyle;
typedef enum _styleTextEffect {
    styleTextEffectNone = 0,
    styleTextEffectEmboss = 1,
    styleTextEffectEngrave = 2,
    styleTextEffectOutline = 3,
    styleTextEffect_Max = 0x7fffffff
} styleTextEffect;
typedef enum _styleDefaultTextSelection {
    styleDefaultTextSelectionFalse = 0,
    styleDefaultTextSelectionTrue = 1,
    styleDefaultTextSelection_Max = 0x7fffffff
} styleDefaultTextSelection;
typedef enum _styleTextDecoration {
    styleTextDecorationNone = 0,
    styleTextDecorationUnderline = 1,
    styleTextDecorationOverline = 2,
    styleTextDecorationLineThrough = 3,
    styleTextDecorationBlink = 4,
    styleTextDecoration_Max = 0x7fffffff
} styleTextDecoration;
/*****************************************************************************
 * IHTMLRenderStyle interface
 */
#ifndef __IHTMLRenderStyle_INTERFACE_DEFINED__
#define __IHTMLRenderStyle_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLRenderStyle, 0x3050f6ae, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f6ae-98b5-11cf-bb82-00aa00bdce0b")
IHTMLRenderStyle : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_textLineThroughStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textLineThroughStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textUnderlineStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textUnderlineStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textEffect(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textEffect(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textBackgroundColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textBackgroundColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textDecorationColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textDecorationColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_renderingPriority(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_renderingPriority(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_defaultTextSelection(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_defaultTextSelection(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textDecoration(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textDecoration(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLRenderStyle, 0x3050f6ae, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLRenderStyleVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLRenderStyle methods ***/
    HRESULT (STDMETHODCALLTYPE *put_textLineThroughStyle)(
        IHTMLRenderStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textLineThroughStyle)(
        IHTMLRenderStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textUnderlineStyle)(
        IHTMLRenderStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textUnderlineStyle)(
        IHTMLRenderStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textEffect)(
        IHTMLRenderStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textEffect)(
        IHTMLRenderStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textColor)(
        IHTMLRenderStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_textColor)(
        IHTMLRenderStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_textBackgroundColor)(
        IHTMLRenderStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_textBackgroundColor)(
        IHTMLRenderStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_textDecorationColor)(
        IHTMLRenderStyle* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_textDecorationColor)(
        IHTMLRenderStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_renderingPriority)(
        IHTMLRenderStyle* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_renderingPriority)(
        IHTMLRenderStyle* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_defaultTextSelection)(
        IHTMLRenderStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_defaultTextSelection)(
        IHTMLRenderStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textDecoration)(
        IHTMLRenderStyle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textDecoration)(
        IHTMLRenderStyle* This,
        BSTR *p);

    END_INTERFACE
} IHTMLRenderStyleVtbl;
interface IHTMLRenderStyle {
    CONST_VTBL IHTMLRenderStyleVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLRenderStyle_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLRenderStyle_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLRenderStyle_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLRenderStyle_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLRenderStyle_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLRenderStyle_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLRenderStyle_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLRenderStyle methods ***/
#define IHTMLRenderStyle_put_textLineThroughStyle(This,v) (This)->lpVtbl->put_textLineThroughStyle(This,v)
#define IHTMLRenderStyle_get_textLineThroughStyle(This,p) (This)->lpVtbl->get_textLineThroughStyle(This,p)
#define IHTMLRenderStyle_put_textUnderlineStyle(This,v) (This)->lpVtbl->put_textUnderlineStyle(This,v)
#define IHTMLRenderStyle_get_textUnderlineStyle(This,p) (This)->lpVtbl->get_textUnderlineStyle(This,p)
#define IHTMLRenderStyle_put_textEffect(This,v) (This)->lpVtbl->put_textEffect(This,v)
#define IHTMLRenderStyle_get_textEffect(This,p) (This)->lpVtbl->get_textEffect(This,p)
#define IHTMLRenderStyle_put_textColor(This,v) (This)->lpVtbl->put_textColor(This,v)
#define IHTMLRenderStyle_get_textColor(This,p) (This)->lpVtbl->get_textColor(This,p)
#define IHTMLRenderStyle_put_textBackgroundColor(This,v) (This)->lpVtbl->put_textBackgroundColor(This,v)
#define IHTMLRenderStyle_get_textBackgroundColor(This,p) (This)->lpVtbl->get_textBackgroundColor(This,p)
#define IHTMLRenderStyle_put_textDecorationColor(This,v) (This)->lpVtbl->put_textDecorationColor(This,v)
#define IHTMLRenderStyle_get_textDecorationColor(This,p) (This)->lpVtbl->get_textDecorationColor(This,p)
#define IHTMLRenderStyle_put_renderingPriority(This,v) (This)->lpVtbl->put_renderingPriority(This,v)
#define IHTMLRenderStyle_get_renderingPriority(This,p) (This)->lpVtbl->get_renderingPriority(This,p)
#define IHTMLRenderStyle_put_defaultTextSelection(This,v) (This)->lpVtbl->put_defaultTextSelection(This,v)
#define IHTMLRenderStyle_get_defaultTextSelection(This,p) (This)->lpVtbl->get_defaultTextSelection(This,p)
#define IHTMLRenderStyle_put_textDecoration(This,v) (This)->lpVtbl->put_textDecoration(This,v)
#define IHTMLRenderStyle_get_textDecoration(This,p) (This)->lpVtbl->get_textDecoration(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLRenderStyle_QueryInterface(IHTMLRenderStyle* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLRenderStyle_AddRef(IHTMLRenderStyle* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLRenderStyle_Release(IHTMLRenderStyle* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLRenderStyle_GetTypeInfoCount(IHTMLRenderStyle* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLRenderStyle_GetTypeInfo(IHTMLRenderStyle* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLRenderStyle_GetIDsOfNames(IHTMLRenderStyle* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLRenderStyle_Invoke(IHTMLRenderStyle* 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);
}
/*** IHTMLRenderStyle methods ***/
static FORCEINLINE HRESULT IHTMLRenderStyle_put_textLineThroughStyle(IHTMLRenderStyle* This,BSTR v) {
    return This->lpVtbl->put_textLineThroughStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLRenderStyle_get_textLineThroughStyle(IHTMLRenderStyle* This,BSTR *p) {
    return This->lpVtbl->get_textLineThroughStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLRenderStyle_put_textUnderlineStyle(IHTMLRenderStyle* This,BSTR v) {
    return This->lpVtbl->put_textUnderlineStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLRenderStyle_get_textUnderlineStyle(IHTMLRenderStyle* This,BSTR *p) {
    return This->lpVtbl->get_textUnderlineStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLRenderStyle_put_textEffect(IHTMLRenderStyle* This,BSTR v) {
    return This->lpVtbl->put_textEffect(This,v);
}
static FORCEINLINE HRESULT IHTMLRenderStyle_get_textEffect(IHTMLRenderStyle* This,BSTR *p) {
    return This->lpVtbl->get_textEffect(This,p);
}
static FORCEINLINE HRESULT IHTMLRenderStyle_put_textColor(IHTMLRenderStyle* This,VARIANT v) {
    return This->lpVtbl->put_textColor(This,v);
}
static FORCEINLINE HRESULT IHTMLRenderStyle_get_textColor(IHTMLRenderStyle* This,VARIANT *p) {
    return This->lpVtbl->get_textColor(This,p);
}
static FORCEINLINE HRESULT IHTMLRenderStyle_put_textBackgroundColor(IHTMLRenderStyle* This,VARIANT v) {
    return This->lpVtbl->put_textBackgroundColor(This,v);
}
static FORCEINLINE HRESULT IHTMLRenderStyle_get_textBackgroundColor(IHTMLRenderStyle* This,VARIANT *p) {
    return This->lpVtbl->get_textBackgroundColor(This,p);
}
static FORCEINLINE HRESULT IHTMLRenderStyle_put_textDecorationColor(IHTMLRenderStyle* This,VARIANT v) {
    return This->lpVtbl->put_textDecorationColor(This,v);
}
static FORCEINLINE HRESULT IHTMLRenderStyle_get_textDecorationColor(IHTMLRenderStyle* This,VARIANT *p) {
    return This->lpVtbl->get_textDecorationColor(This,p);
}
static FORCEINLINE HRESULT IHTMLRenderStyle_put_renderingPriority(IHTMLRenderStyle* This,LONG v) {
    return This->lpVtbl->put_renderingPriority(This,v);
}
static FORCEINLINE HRESULT IHTMLRenderStyle_get_renderingPriority(IHTMLRenderStyle* This,LONG *p) {
    return This->lpVtbl->get_renderingPriority(This,p);
}
static FORCEINLINE HRESULT IHTMLRenderStyle_put_defaultTextSelection(IHTMLRenderStyle* This,BSTR v) {
    return This->lpVtbl->put_defaultTextSelection(This,v);
}
static FORCEINLINE HRESULT IHTMLRenderStyle_get_defaultTextSelection(IHTMLRenderStyle* This,BSTR *p) {
    return This->lpVtbl->get_defaultTextSelection(This,p);
}
static FORCEINLINE HRESULT IHTMLRenderStyle_put_textDecoration(IHTMLRenderStyle* This,BSTR v) {
    return This->lpVtbl->put_textDecoration(This,v);
}
static FORCEINLINE HRESULT IHTMLRenderStyle_get_textDecoration(IHTMLRenderStyle* This,BSTR *p) {
    return This->lpVtbl->get_textDecoration(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLRenderStyle_put_textLineThroughStyle_Proxy(
    IHTMLRenderStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRenderStyle_put_textLineThroughStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRenderStyle_get_textLineThroughStyle_Proxy(
    IHTMLRenderStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRenderStyle_get_textLineThroughStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRenderStyle_put_textUnderlineStyle_Proxy(
    IHTMLRenderStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRenderStyle_put_textUnderlineStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRenderStyle_get_textUnderlineStyle_Proxy(
    IHTMLRenderStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRenderStyle_get_textUnderlineStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRenderStyle_put_textEffect_Proxy(
    IHTMLRenderStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRenderStyle_put_textEffect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRenderStyle_get_textEffect_Proxy(
    IHTMLRenderStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRenderStyle_get_textEffect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRenderStyle_put_textColor_Proxy(
    IHTMLRenderStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRenderStyle_put_textColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRenderStyle_get_textColor_Proxy(
    IHTMLRenderStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRenderStyle_get_textColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRenderStyle_put_textBackgroundColor_Proxy(
    IHTMLRenderStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRenderStyle_put_textBackgroundColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRenderStyle_get_textBackgroundColor_Proxy(
    IHTMLRenderStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRenderStyle_get_textBackgroundColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRenderStyle_put_textDecorationColor_Proxy(
    IHTMLRenderStyle* This,
    VARIANT v);
void __RPC_STUB IHTMLRenderStyle_put_textDecorationColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRenderStyle_get_textDecorationColor_Proxy(
    IHTMLRenderStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLRenderStyle_get_textDecorationColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRenderStyle_put_renderingPriority_Proxy(
    IHTMLRenderStyle* This,
    LONG v);
void __RPC_STUB IHTMLRenderStyle_put_renderingPriority_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRenderStyle_get_renderingPriority_Proxy(
    IHTMLRenderStyle* This,
    LONG *p);
void __RPC_STUB IHTMLRenderStyle_get_renderingPriority_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRenderStyle_put_defaultTextSelection_Proxy(
    IHTMLRenderStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRenderStyle_put_defaultTextSelection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRenderStyle_get_defaultTextSelection_Proxy(
    IHTMLRenderStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRenderStyle_get_defaultTextSelection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRenderStyle_put_textDecoration_Proxy(
    IHTMLRenderStyle* This,
    BSTR v);
void __RPC_STUB IHTMLRenderStyle_put_textDecoration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRenderStyle_get_textDecoration_Proxy(
    IHTMLRenderStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLRenderStyle_get_textDecoration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLRenderStyle_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLRenderStyle dispinterface
 */
#ifndef __DispHTMLRenderStyle_DISPINTERFACE_DEFINED__
#define __DispHTMLRenderStyle_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLRenderStyle, 0x3050f58b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f58b-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLRenderStyle : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLRenderStyle, 0x3050f58b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLRenderStyleVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} DispHTMLRenderStyleVtbl;
interface DispHTMLRenderStyle {
    CONST_VTBL DispHTMLRenderStyleVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLRenderStyle_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLRenderStyle_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLRenderStyle_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLRenderStyle_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLRenderStyle_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLRenderStyle_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLRenderStyle_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 DispHTMLRenderStyle_QueryInterface(DispHTMLRenderStyle* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLRenderStyle_AddRef(DispHTMLRenderStyle* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLRenderStyle_Release(DispHTMLRenderStyle* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLRenderStyle_GetTypeInfoCount(DispHTMLRenderStyle* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLRenderStyle_GetTypeInfo(DispHTMLRenderStyle* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLRenderStyle_GetIDsOfNames(DispHTMLRenderStyle* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLRenderStyle_Invoke(DispHTMLRenderStyle* 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  /* __DispHTMLRenderStyle_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLRenderStyle coclass
 */

DEFINE_GUID(CLSID_HTMLRenderStyle, 0x3050f6aa, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f6aa-98b5-11cf-bb82-00aa00bdce0b") HTMLRenderStyle;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLRenderStyle, 0x3050f6aa, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CRenderStyle;
typedef enum _textDecoration {
    textDecorationNone = 0,
    textDecorationUnderline = 1,
    textDecorationOverline = 2,
    textDecorationLineThrough = 3,
    textDecorationBlink = 4,
    textDecoration_Max = 0x7fffffff
} textDecoration;
/*****************************************************************************
 * IHTMLCurrentStyle interface
 */
#ifndef __IHTMLCurrentStyle_INTERFACE_DEFINED__
#define __IHTMLCurrentStyle_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLCurrentStyle, 0x3050f3db, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f3db-98b5-11cf-bb82-00aa00bdce0b")
IHTMLCurrentStyle : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_position(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_styleFloat(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_color(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fontFamily(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fontStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fontVariant(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fontWeight(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fontSize(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundImage(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundPositionX(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundPositionY(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundRepeat(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderLeftColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderTopColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderRightColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderBottomColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderTopStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderRightStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderBottomStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderLeftStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderTopWidth(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderRightWidth(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderBottomWidth(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderLeftWidth(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_left(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_top(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_width(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_height(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_paddingLeft(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_paddingTop(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_paddingRight(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_paddingBottom(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textAlign(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textDecoration(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_display(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_visibility(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_zIndex(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_letterSpacing(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_lineHeight(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textIndent(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_verticalAlign(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundAttachment(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_marginTop(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_marginRight(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_marginBottom(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_marginLeft(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clear(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_listStyleType(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_listStylePosition(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_listStyleImage(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clipTop(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clipRight(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clipBottom(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clipLeft(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_overflow(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pageBreakBefore(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pageBreakAfter(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cursor(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_tableLayout(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderCollapse(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_direction(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_behavior(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE getAttribute(
        BSTR strAttributeName,
        LONG lFlags = 0,
        VARIANT *AttributeValue = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_unicodeBidi(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_right(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_bottom(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_imeMode(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_rubyAlign(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_rubyPosition(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_rubyOverhang(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textAutospace(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_lineBreak(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_wordBreak(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textJustify(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textJustifyTrim(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textKashida(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_blockDirection(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_layoutGridChar(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_layoutGridLine(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_layoutGridMode(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_layoutGridType(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderColor(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderWidth(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_padding(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_margin(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_accelerator(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_overflowX(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_overflowY(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textTransform(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLCurrentStyle, 0x3050f3db, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLCurrentStyleVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLCurrentStyle methods ***/
    HRESULT (STDMETHODCALLTYPE *get_position)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_styleFloat)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_color)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_backgroundColor)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_fontFamily)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_fontStyle)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_fontVariant)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_fontWeight)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_fontSize)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_backgroundImage)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_backgroundPositionX)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_backgroundPositionY)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_backgroundRepeat)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_borderLeftColor)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_borderTopColor)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_borderRightColor)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_borderBottomColor)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_borderTopStyle)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_borderRightStyle)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_borderBottomStyle)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_borderLeftStyle)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_borderTopWidth)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_borderRightWidth)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_borderBottomWidth)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_borderLeftWidth)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_left)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_top)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_width)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_height)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_paddingLeft)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_paddingTop)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_paddingRight)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_paddingBottom)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_textAlign)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_textDecoration)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_display)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_visibility)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_zIndex)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_letterSpacing)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_lineHeight)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_textIndent)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_verticalAlign)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_backgroundAttachment)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_marginTop)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_marginRight)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_marginBottom)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_marginLeft)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_clear)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_listStyleType)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_listStylePosition)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_listStyleImage)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_clipTop)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_clipRight)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_clipBottom)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_clipLeft)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_overflow)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_pageBreakBefore)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_pageBreakAfter)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_cursor)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_tableLayout)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_borderCollapse)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_direction)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_behavior)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *getAttribute)(
        IHTMLCurrentStyle* This,
        BSTR strAttributeName,
        LONG lFlags,
        VARIANT *AttributeValue);

    HRESULT (STDMETHODCALLTYPE *get_unicodeBidi)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_right)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_bottom)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_imeMode)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_rubyAlign)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_rubyPosition)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_rubyOverhang)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_textAutospace)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_lineBreak)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_wordBreak)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_textJustify)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_textJustifyTrim)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_textKashida)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_blockDirection)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_layoutGridChar)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_layoutGridLine)(
        IHTMLCurrentStyle* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_layoutGridMode)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_layoutGridType)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_borderStyle)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_borderColor)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_borderWidth)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_padding)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_margin)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_accelerator)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_overflowX)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_overflowY)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_textTransform)(
        IHTMLCurrentStyle* This,
        BSTR *p);

    END_INTERFACE
} IHTMLCurrentStyleVtbl;
interface IHTMLCurrentStyle {
    CONST_VTBL IHTMLCurrentStyleVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLCurrentStyle_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLCurrentStyle_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLCurrentStyle_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLCurrentStyle_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLCurrentStyle_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLCurrentStyle_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLCurrentStyle_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLCurrentStyle methods ***/
#define IHTMLCurrentStyle_get_position(This,p) (This)->lpVtbl->get_position(This,p)
#define IHTMLCurrentStyle_get_styleFloat(This,p) (This)->lpVtbl->get_styleFloat(This,p)
#define IHTMLCurrentStyle_get_color(This,p) (This)->lpVtbl->get_color(This,p)
#define IHTMLCurrentStyle_get_backgroundColor(This,p) (This)->lpVtbl->get_backgroundColor(This,p)
#define IHTMLCurrentStyle_get_fontFamily(This,p) (This)->lpVtbl->get_fontFamily(This,p)
#define IHTMLCurrentStyle_get_fontStyle(This,p) (This)->lpVtbl->get_fontStyle(This,p)
#define IHTMLCurrentStyle_get_fontVariant(This,p) (This)->lpVtbl->get_fontVariant(This,p)
#define IHTMLCurrentStyle_get_fontWeight(This,p) (This)->lpVtbl->get_fontWeight(This,p)
#define IHTMLCurrentStyle_get_fontSize(This,p) (This)->lpVtbl->get_fontSize(This,p)
#define IHTMLCurrentStyle_get_backgroundImage(This,p) (This)->lpVtbl->get_backgroundImage(This,p)
#define IHTMLCurrentStyle_get_backgroundPositionX(This,p) (This)->lpVtbl->get_backgroundPositionX(This,p)
#define IHTMLCurrentStyle_get_backgroundPositionY(This,p) (This)->lpVtbl->get_backgroundPositionY(This,p)
#define IHTMLCurrentStyle_get_backgroundRepeat(This,p) (This)->lpVtbl->get_backgroundRepeat(This,p)
#define IHTMLCurrentStyle_get_borderLeftColor(This,p) (This)->lpVtbl->get_borderLeftColor(This,p)
#define IHTMLCurrentStyle_get_borderTopColor(This,p) (This)->lpVtbl->get_borderTopColor(This,p)
#define IHTMLCurrentStyle_get_borderRightColor(This,p) (This)->lpVtbl->get_borderRightColor(This,p)
#define IHTMLCurrentStyle_get_borderBottomColor(This,p) (This)->lpVtbl->get_borderBottomColor(This,p)
#define IHTMLCurrentStyle_get_borderTopStyle(This,p) (This)->lpVtbl->get_borderTopStyle(This,p)
#define IHTMLCurrentStyle_get_borderRightStyle(This,p) (This)->lpVtbl->get_borderRightStyle(This,p)
#define IHTMLCurrentStyle_get_borderBottomStyle(This,p) (This)->lpVtbl->get_borderBottomStyle(This,p)
#define IHTMLCurrentStyle_get_borderLeftStyle(This,p) (This)->lpVtbl->get_borderLeftStyle(This,p)
#define IHTMLCurrentStyle_get_borderTopWidth(This,p) (This)->lpVtbl->get_borderTopWidth(This,p)
#define IHTMLCurrentStyle_get_borderRightWidth(This,p) (This)->lpVtbl->get_borderRightWidth(This,p)
#define IHTMLCurrentStyle_get_borderBottomWidth(This,p) (This)->lpVtbl->get_borderBottomWidth(This,p)
#define IHTMLCurrentStyle_get_borderLeftWidth(This,p) (This)->lpVtbl->get_borderLeftWidth(This,p)
#define IHTMLCurrentStyle_get_left(This,p) (This)->lpVtbl->get_left(This,p)
#define IHTMLCurrentStyle_get_top(This,p) (This)->lpVtbl->get_top(This,p)
#define IHTMLCurrentStyle_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#define IHTMLCurrentStyle_get_height(This,p) (This)->lpVtbl->get_height(This,p)
#define IHTMLCurrentStyle_get_paddingLeft(This,p) (This)->lpVtbl->get_paddingLeft(This,p)
#define IHTMLCurrentStyle_get_paddingTop(This,p) (This)->lpVtbl->get_paddingTop(This,p)
#define IHTMLCurrentStyle_get_paddingRight(This,p) (This)->lpVtbl->get_paddingRight(This,p)
#define IHTMLCurrentStyle_get_paddingBottom(This,p) (This)->lpVtbl->get_paddingBottom(This,p)
#define IHTMLCurrentStyle_get_textAlign(This,p) (This)->lpVtbl->get_textAlign(This,p)
#define IHTMLCurrentStyle_get_textDecoration(This,p) (This)->lpVtbl->get_textDecoration(This,p)
#define IHTMLCurrentStyle_get_display(This,p) (This)->lpVtbl->get_display(This,p)
#define IHTMLCurrentStyle_get_visibility(This,p) (This)->lpVtbl->get_visibility(This,p)
#define IHTMLCurrentStyle_get_zIndex(This,p) (This)->lpVtbl->get_zIndex(This,p)
#define IHTMLCurrentStyle_get_letterSpacing(This,p) (This)->lpVtbl->get_letterSpacing(This,p)
#define IHTMLCurrentStyle_get_lineHeight(This,p) (This)->lpVtbl->get_lineHeight(This,p)
#define IHTMLCurrentStyle_get_textIndent(This,p) (This)->lpVtbl->get_textIndent(This,p)
#define IHTMLCurrentStyle_get_verticalAlign(This,p) (This)->lpVtbl->get_verticalAlign(This,p)
#define IHTMLCurrentStyle_get_backgroundAttachment(This,p) (This)->lpVtbl->get_backgroundAttachment(This,p)
#define IHTMLCurrentStyle_get_marginTop(This,p) (This)->lpVtbl->get_marginTop(This,p)
#define IHTMLCurrentStyle_get_marginRight(This,p) (This)->lpVtbl->get_marginRight(This,p)
#define IHTMLCurrentStyle_get_marginBottom(This,p) (This)->lpVtbl->get_marginBottom(This,p)
#define IHTMLCurrentStyle_get_marginLeft(This,p) (This)->lpVtbl->get_marginLeft(This,p)
#define IHTMLCurrentStyle_get_clear(This,p) (This)->lpVtbl->get_clear(This,p)
#define IHTMLCurrentStyle_get_listStyleType(This,p) (This)->lpVtbl->get_listStyleType(This,p)
#define IHTMLCurrentStyle_get_listStylePosition(This,p) (This)->lpVtbl->get_listStylePosition(This,p)
#define IHTMLCurrentStyle_get_listStyleImage(This,p) (This)->lpVtbl->get_listStyleImage(This,p)
#define IHTMLCurrentStyle_get_clipTop(This,p) (This)->lpVtbl->get_clipTop(This,p)
#define IHTMLCurrentStyle_get_clipRight(This,p) (This)->lpVtbl->get_clipRight(This,p)
#define IHTMLCurrentStyle_get_clipBottom(This,p) (This)->lpVtbl->get_clipBottom(This,p)
#define IHTMLCurrentStyle_get_clipLeft(This,p) (This)->lpVtbl->get_clipLeft(This,p)
#define IHTMLCurrentStyle_get_overflow(This,p) (This)->lpVtbl->get_overflow(This,p)
#define IHTMLCurrentStyle_get_pageBreakBefore(This,p) (This)->lpVtbl->get_pageBreakBefore(This,p)
#define IHTMLCurrentStyle_get_pageBreakAfter(This,p) (This)->lpVtbl->get_pageBreakAfter(This,p)
#define IHTMLCurrentStyle_get_cursor(This,p) (This)->lpVtbl->get_cursor(This,p)
#define IHTMLCurrentStyle_get_tableLayout(This,p) (This)->lpVtbl->get_tableLayout(This,p)
#define IHTMLCurrentStyle_get_borderCollapse(This,p) (This)->lpVtbl->get_borderCollapse(This,p)
#define IHTMLCurrentStyle_get_direction(This,p) (This)->lpVtbl->get_direction(This,p)
#define IHTMLCurrentStyle_get_behavior(This,p) (This)->lpVtbl->get_behavior(This,p)
#define IHTMLCurrentStyle_getAttribute(This,strAttributeName,lFlags,AttributeValue) (This)->lpVtbl->getAttribute(This,strAttributeName,lFlags,AttributeValue)
#define IHTMLCurrentStyle_get_unicodeBidi(This,p) (This)->lpVtbl->get_unicodeBidi(This,p)
#define IHTMLCurrentStyle_get_right(This,p) (This)->lpVtbl->get_right(This,p)
#define IHTMLCurrentStyle_get_bottom(This,p) (This)->lpVtbl->get_bottom(This,p)
#define IHTMLCurrentStyle_get_imeMode(This,p) (This)->lpVtbl->get_imeMode(This,p)
#define IHTMLCurrentStyle_get_rubyAlign(This,p) (This)->lpVtbl->get_rubyAlign(This,p)
#define IHTMLCurrentStyle_get_rubyPosition(This,p) (This)->lpVtbl->get_rubyPosition(This,p)
#define IHTMLCurrentStyle_get_rubyOverhang(This,p) (This)->lpVtbl->get_rubyOverhang(This,p)
#define IHTMLCurrentStyle_get_textAutospace(This,p) (This)->lpVtbl->get_textAutospace(This,p)
#define IHTMLCurrentStyle_get_lineBreak(This,p) (This)->lpVtbl->get_lineBreak(This,p)
#define IHTMLCurrentStyle_get_wordBreak(This,p) (This)->lpVtbl->get_wordBreak(This,p)
#define IHTMLCurrentStyle_get_textJustify(This,p) (This)->lpVtbl->get_textJustify(This,p)
#define IHTMLCurrentStyle_get_textJustifyTrim(This,p) (This)->lpVtbl->get_textJustifyTrim(This,p)
#define IHTMLCurrentStyle_get_textKashida(This,p) (This)->lpVtbl->get_textKashida(This,p)
#define IHTMLCurrentStyle_get_blockDirection(This,p) (This)->lpVtbl->get_blockDirection(This,p)
#define IHTMLCurrentStyle_get_layoutGridChar(This,p) (This)->lpVtbl->get_layoutGridChar(This,p)
#define IHTMLCurrentStyle_get_layoutGridLine(This,p) (This)->lpVtbl->get_layoutGridLine(This,p)
#define IHTMLCurrentStyle_get_layoutGridMode(This,p) (This)->lpVtbl->get_layoutGridMode(This,p)
#define IHTMLCurrentStyle_get_layoutGridType(This,p) (This)->lpVtbl->get_layoutGridType(This,p)
#define IHTMLCurrentStyle_get_borderStyle(This,p) (This)->lpVtbl->get_borderStyle(This,p)
#define IHTMLCurrentStyle_get_borderColor(This,p) (This)->lpVtbl->get_borderColor(This,p)
#define IHTMLCurrentStyle_get_borderWidth(This,p) (This)->lpVtbl->get_borderWidth(This,p)
#define IHTMLCurrentStyle_get_padding(This,p) (This)->lpVtbl->get_padding(This,p)
#define IHTMLCurrentStyle_get_margin(This,p) (This)->lpVtbl->get_margin(This,p)
#define IHTMLCurrentStyle_get_accelerator(This,p) (This)->lpVtbl->get_accelerator(This,p)
#define IHTMLCurrentStyle_get_overflowX(This,p) (This)->lpVtbl->get_overflowX(This,p)
#define IHTMLCurrentStyle_get_overflowY(This,p) (This)->lpVtbl->get_overflowY(This,p)
#define IHTMLCurrentStyle_get_textTransform(This,p) (This)->lpVtbl->get_textTransform(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLCurrentStyle_QueryInterface(IHTMLCurrentStyle* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLCurrentStyle_AddRef(IHTMLCurrentStyle* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLCurrentStyle_Release(IHTMLCurrentStyle* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLCurrentStyle_GetTypeInfoCount(IHTMLCurrentStyle* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_GetTypeInfo(IHTMLCurrentStyle* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_GetIDsOfNames(IHTMLCurrentStyle* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_Invoke(IHTMLCurrentStyle* 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);
}
/*** IHTMLCurrentStyle methods ***/
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_position(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_position(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_styleFloat(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_styleFloat(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_color(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_color(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_backgroundColor(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_backgroundColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_fontFamily(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_fontFamily(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_fontStyle(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_fontStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_fontVariant(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_fontVariant(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_fontWeight(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_fontWeight(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_fontSize(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_fontSize(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_backgroundImage(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_backgroundImage(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_backgroundPositionX(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_backgroundPositionX(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_backgroundPositionY(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_backgroundPositionY(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_backgroundRepeat(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_backgroundRepeat(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_borderLeftColor(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderLeftColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_borderTopColor(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderTopColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_borderRightColor(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderRightColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_borderBottomColor(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderBottomColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_borderTopStyle(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderTopStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_borderRightStyle(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderRightStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_borderBottomStyle(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderBottomStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_borderLeftStyle(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderLeftStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_borderTopWidth(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderTopWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_borderRightWidth(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderRightWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_borderBottomWidth(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderBottomWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_borderLeftWidth(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderLeftWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_left(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_left(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_top(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_top(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_width(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_width(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_height(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_height(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_paddingLeft(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_paddingLeft(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_paddingTop(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_paddingTop(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_paddingRight(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_paddingRight(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_paddingBottom(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_paddingBottom(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_textAlign(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_textAlign(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_textDecoration(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_textDecoration(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_display(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_display(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_visibility(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_visibility(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_zIndex(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_zIndex(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_letterSpacing(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_letterSpacing(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_lineHeight(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_lineHeight(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_textIndent(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_textIndent(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_verticalAlign(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_verticalAlign(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_backgroundAttachment(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_backgroundAttachment(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_marginTop(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_marginTop(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_marginRight(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_marginRight(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_marginBottom(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_marginBottom(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_marginLeft(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_marginLeft(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_clear(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_clear(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_listStyleType(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_listStyleType(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_listStylePosition(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_listStylePosition(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_listStyleImage(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_listStyleImage(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_clipTop(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_clipTop(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_clipRight(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_clipRight(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_clipBottom(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_clipBottom(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_clipLeft(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_clipLeft(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_overflow(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_overflow(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_pageBreakBefore(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_pageBreakBefore(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_pageBreakAfter(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_pageBreakAfter(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_cursor(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_cursor(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_tableLayout(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_tableLayout(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_borderCollapse(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderCollapse(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_direction(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_direction(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_behavior(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_behavior(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_getAttribute(IHTMLCurrentStyle* This,BSTR strAttributeName,LONG lFlags,VARIANT *AttributeValue) {
    return This->lpVtbl->getAttribute(This,strAttributeName,lFlags,AttributeValue);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_unicodeBidi(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_unicodeBidi(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_right(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_right(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_bottom(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_bottom(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_imeMode(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_imeMode(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_rubyAlign(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_rubyAlign(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_rubyPosition(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_rubyPosition(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_rubyOverhang(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_rubyOverhang(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_textAutospace(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_textAutospace(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_lineBreak(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_lineBreak(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_wordBreak(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_wordBreak(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_textJustify(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_textJustify(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_textJustifyTrim(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_textJustifyTrim(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_textKashida(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_textKashida(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_blockDirection(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_blockDirection(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_layoutGridChar(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_layoutGridChar(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_layoutGridLine(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_layoutGridLine(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_layoutGridMode(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_layoutGridMode(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_layoutGridType(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_layoutGridType(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_borderStyle(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_borderColor(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_borderWidth(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_padding(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_padding(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_margin(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_margin(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_accelerator(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_accelerator(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_overflowX(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_overflowX(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_overflowY(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_overflowY(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle_get_textTransform(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_textTransform(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_position_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_position_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_styleFloat_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_styleFloat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_color_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_color_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_backgroundColor_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_backgroundColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_fontFamily_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_fontFamily_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_fontStyle_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_fontStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_fontVariant_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_fontVariant_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_fontWeight_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_fontWeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_fontSize_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_fontSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_backgroundImage_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_backgroundImage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_backgroundPositionX_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_backgroundPositionX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_backgroundPositionY_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_backgroundPositionY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_backgroundRepeat_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_backgroundRepeat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_borderLeftColor_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_borderLeftColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_borderTopColor_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_borderTopColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_borderRightColor_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_borderRightColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_borderBottomColor_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_borderBottomColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_borderTopStyle_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_borderTopStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_borderRightStyle_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_borderRightStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_borderBottomStyle_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_borderBottomStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_borderLeftStyle_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_borderLeftStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_borderTopWidth_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_borderTopWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_borderRightWidth_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_borderRightWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_borderBottomWidth_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_borderBottomWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_borderLeftWidth_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_borderLeftWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_left_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_left_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_top_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_top_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_width_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_height_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_paddingLeft_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_paddingLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_paddingTop_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_paddingTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_paddingRight_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_paddingRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_paddingBottom_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_paddingBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_textAlign_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_textAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_textDecoration_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_textDecoration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_display_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_display_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_visibility_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_visibility_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_zIndex_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_zIndex_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_letterSpacing_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_letterSpacing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_lineHeight_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_lineHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_textIndent_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_textIndent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_verticalAlign_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_verticalAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_backgroundAttachment_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_backgroundAttachment_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_marginTop_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_marginTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_marginRight_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_marginRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_marginBottom_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_marginBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_marginLeft_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_marginLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_clear_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_clear_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_listStyleType_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_listStyleType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_listStylePosition_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_listStylePosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_listStyleImage_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_listStyleImage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_clipTop_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_clipTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_clipRight_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_clipRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_clipBottom_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_clipBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_clipLeft_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_clipLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_overflow_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_overflow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_pageBreakBefore_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_pageBreakBefore_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_pageBreakAfter_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_pageBreakAfter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_cursor_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_cursor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_tableLayout_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_tableLayout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_borderCollapse_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_borderCollapse_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_direction_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_direction_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_behavior_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_behavior_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_getAttribute_Proxy(
    IHTMLCurrentStyle* This,
    BSTR strAttributeName,
    LONG lFlags,
    VARIANT *AttributeValue);
void __RPC_STUB IHTMLCurrentStyle_getAttribute_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_unicodeBidi_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_unicodeBidi_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_right_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_right_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_bottom_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_bottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_imeMode_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_imeMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_rubyAlign_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_rubyAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_rubyPosition_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_rubyPosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_rubyOverhang_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_rubyOverhang_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_textAutospace_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_textAutospace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_lineBreak_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_lineBreak_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_wordBreak_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_wordBreak_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_textJustify_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_textJustify_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_textJustifyTrim_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_textJustifyTrim_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_textKashida_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_textKashida_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_blockDirection_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_blockDirection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_layoutGridChar_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_layoutGridChar_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_layoutGridLine_Proxy(
    IHTMLCurrentStyle* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle_get_layoutGridLine_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_layoutGridMode_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_layoutGridMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_layoutGridType_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_layoutGridType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_borderStyle_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_borderStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_borderColor_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_borderColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_borderWidth_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_borderWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_padding_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_padding_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_margin_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_margin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_accelerator_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_accelerator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_overflowX_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_overflowX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_overflowY_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_overflowY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle_get_textTransform_Proxy(
    IHTMLCurrentStyle* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle_get_textTransform_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLCurrentStyle_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLCurrentStyle2 interface
 */
#ifndef __IHTMLCurrentStyle2_INTERFACE_DEFINED__
#define __IHTMLCurrentStyle2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLCurrentStyle2, 0x3050f658, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f658-98b5-11cf-bb82-00aa00bdce0b")
IHTMLCurrentStyle2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_layoutFlow(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_wordWrap(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textUnderlinePosition(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_hasLayout(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbarBaseColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbarFaceColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbar3dLightColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbarShadowColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbarHighlightColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbarDarkShadowColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbarArrowColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbarTrackColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_writingMode(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_zoom(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_filter(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textAlignLast(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textKashidaSpace(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_isBlock(
        VARIANT_BOOL *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLCurrentStyle2, 0x3050f658, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLCurrentStyle2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLCurrentStyle2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_layoutFlow)(
        IHTMLCurrentStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_wordWrap)(
        IHTMLCurrentStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_textUnderlinePosition)(
        IHTMLCurrentStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_hasLayout)(
        IHTMLCurrentStyle2* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_scrollbarBaseColor)(
        IHTMLCurrentStyle2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_scrollbarFaceColor)(
        IHTMLCurrentStyle2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_scrollbar3dLightColor)(
        IHTMLCurrentStyle2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_scrollbarShadowColor)(
        IHTMLCurrentStyle2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_scrollbarHighlightColor)(
        IHTMLCurrentStyle2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_scrollbarDarkShadowColor)(
        IHTMLCurrentStyle2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_scrollbarArrowColor)(
        IHTMLCurrentStyle2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_scrollbarTrackColor)(
        IHTMLCurrentStyle2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_writingMode)(
        IHTMLCurrentStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_zoom)(
        IHTMLCurrentStyle2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_filter)(
        IHTMLCurrentStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_textAlignLast)(
        IHTMLCurrentStyle2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_textKashidaSpace)(
        IHTMLCurrentStyle2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_isBlock)(
        IHTMLCurrentStyle2* This,
        VARIANT_BOOL *p);

    END_INTERFACE
} IHTMLCurrentStyle2Vtbl;
interface IHTMLCurrentStyle2 {
    CONST_VTBL IHTMLCurrentStyle2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLCurrentStyle2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLCurrentStyle2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLCurrentStyle2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLCurrentStyle2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLCurrentStyle2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLCurrentStyle2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLCurrentStyle2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLCurrentStyle2 methods ***/
#define IHTMLCurrentStyle2_get_layoutFlow(This,p) (This)->lpVtbl->get_layoutFlow(This,p)
#define IHTMLCurrentStyle2_get_wordWrap(This,p) (This)->lpVtbl->get_wordWrap(This,p)
#define IHTMLCurrentStyle2_get_textUnderlinePosition(This,p) (This)->lpVtbl->get_textUnderlinePosition(This,p)
#define IHTMLCurrentStyle2_get_hasLayout(This,p) (This)->lpVtbl->get_hasLayout(This,p)
#define IHTMLCurrentStyle2_get_scrollbarBaseColor(This,p) (This)->lpVtbl->get_scrollbarBaseColor(This,p)
#define IHTMLCurrentStyle2_get_scrollbarFaceColor(This,p) (This)->lpVtbl->get_scrollbarFaceColor(This,p)
#define IHTMLCurrentStyle2_get_scrollbar3dLightColor(This,p) (This)->lpVtbl->get_scrollbar3dLightColor(This,p)
#define IHTMLCurrentStyle2_get_scrollbarShadowColor(This,p) (This)->lpVtbl->get_scrollbarShadowColor(This,p)
#define IHTMLCurrentStyle2_get_scrollbarHighlightColor(This,p) (This)->lpVtbl->get_scrollbarHighlightColor(This,p)
#define IHTMLCurrentStyle2_get_scrollbarDarkShadowColor(This,p) (This)->lpVtbl->get_scrollbarDarkShadowColor(This,p)
#define IHTMLCurrentStyle2_get_scrollbarArrowColor(This,p) (This)->lpVtbl->get_scrollbarArrowColor(This,p)
#define IHTMLCurrentStyle2_get_scrollbarTrackColor(This,p) (This)->lpVtbl->get_scrollbarTrackColor(This,p)
#define IHTMLCurrentStyle2_get_writingMode(This,p) (This)->lpVtbl->get_writingMode(This,p)
#define IHTMLCurrentStyle2_get_zoom(This,p) (This)->lpVtbl->get_zoom(This,p)
#define IHTMLCurrentStyle2_get_filter(This,p) (This)->lpVtbl->get_filter(This,p)
#define IHTMLCurrentStyle2_get_textAlignLast(This,p) (This)->lpVtbl->get_textAlignLast(This,p)
#define IHTMLCurrentStyle2_get_textKashidaSpace(This,p) (This)->lpVtbl->get_textKashidaSpace(This,p)
#define IHTMLCurrentStyle2_get_isBlock(This,p) (This)->lpVtbl->get_isBlock(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLCurrentStyle2_QueryInterface(IHTMLCurrentStyle2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLCurrentStyle2_AddRef(IHTMLCurrentStyle2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLCurrentStyle2_Release(IHTMLCurrentStyle2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLCurrentStyle2_GetTypeInfoCount(IHTMLCurrentStyle2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle2_GetTypeInfo(IHTMLCurrentStyle2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle2_GetIDsOfNames(IHTMLCurrentStyle2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle2_Invoke(IHTMLCurrentStyle2* 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);
}
/*** IHTMLCurrentStyle2 methods ***/
static FORCEINLINE HRESULT IHTMLCurrentStyle2_get_layoutFlow(IHTMLCurrentStyle2* This,BSTR *p) {
    return This->lpVtbl->get_layoutFlow(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle2_get_wordWrap(IHTMLCurrentStyle2* This,BSTR *p) {
    return This->lpVtbl->get_wordWrap(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle2_get_textUnderlinePosition(IHTMLCurrentStyle2* This,BSTR *p) {
    return This->lpVtbl->get_textUnderlinePosition(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle2_get_hasLayout(IHTMLCurrentStyle2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_hasLayout(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle2_get_scrollbarBaseColor(IHTMLCurrentStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarBaseColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle2_get_scrollbarFaceColor(IHTMLCurrentStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarFaceColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle2_get_scrollbar3dLightColor(IHTMLCurrentStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbar3dLightColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle2_get_scrollbarShadowColor(IHTMLCurrentStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarShadowColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle2_get_scrollbarHighlightColor(IHTMLCurrentStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarHighlightColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle2_get_scrollbarDarkShadowColor(IHTMLCurrentStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarDarkShadowColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle2_get_scrollbarArrowColor(IHTMLCurrentStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarArrowColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle2_get_scrollbarTrackColor(IHTMLCurrentStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarTrackColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle2_get_writingMode(IHTMLCurrentStyle2* This,BSTR *p) {
    return This->lpVtbl->get_writingMode(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle2_get_zoom(IHTMLCurrentStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_zoom(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle2_get_filter(IHTMLCurrentStyle2* This,BSTR *p) {
    return This->lpVtbl->get_filter(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle2_get_textAlignLast(IHTMLCurrentStyle2* This,BSTR *p) {
    return This->lpVtbl->get_textAlignLast(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle2_get_textKashidaSpace(IHTMLCurrentStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_textKashidaSpace(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle2_get_isBlock(IHTMLCurrentStyle2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_isBlock(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle2_get_layoutFlow_Proxy(
    IHTMLCurrentStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle2_get_layoutFlow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle2_get_wordWrap_Proxy(
    IHTMLCurrentStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle2_get_wordWrap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle2_get_textUnderlinePosition_Proxy(
    IHTMLCurrentStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle2_get_textUnderlinePosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle2_get_hasLayout_Proxy(
    IHTMLCurrentStyle2* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLCurrentStyle2_get_hasLayout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle2_get_scrollbarBaseColor_Proxy(
    IHTMLCurrentStyle2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle2_get_scrollbarBaseColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle2_get_scrollbarFaceColor_Proxy(
    IHTMLCurrentStyle2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle2_get_scrollbarFaceColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle2_get_scrollbar3dLightColor_Proxy(
    IHTMLCurrentStyle2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle2_get_scrollbar3dLightColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle2_get_scrollbarShadowColor_Proxy(
    IHTMLCurrentStyle2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle2_get_scrollbarShadowColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle2_get_scrollbarHighlightColor_Proxy(
    IHTMLCurrentStyle2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle2_get_scrollbarHighlightColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle2_get_scrollbarDarkShadowColor_Proxy(
    IHTMLCurrentStyle2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle2_get_scrollbarDarkShadowColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle2_get_scrollbarArrowColor_Proxy(
    IHTMLCurrentStyle2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle2_get_scrollbarArrowColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle2_get_scrollbarTrackColor_Proxy(
    IHTMLCurrentStyle2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle2_get_scrollbarTrackColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle2_get_writingMode_Proxy(
    IHTMLCurrentStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle2_get_writingMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle2_get_zoom_Proxy(
    IHTMLCurrentStyle2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle2_get_zoom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle2_get_filter_Proxy(
    IHTMLCurrentStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle2_get_filter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle2_get_textAlignLast_Proxy(
    IHTMLCurrentStyle2* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle2_get_textAlignLast_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle2_get_textKashidaSpace_Proxy(
    IHTMLCurrentStyle2* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle2_get_textKashidaSpace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle2_get_isBlock_Proxy(
    IHTMLCurrentStyle2* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLCurrentStyle2_get_isBlock_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLCurrentStyle2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLCurrentStyle3 interface
 */
#ifndef __IHTMLCurrentStyle3_INTERFACE_DEFINED__
#define __IHTMLCurrentStyle3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLCurrentStyle3, 0x3050f818, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f818-98b5-11cf-bb82-00aa00bdce0b")
IHTMLCurrentStyle3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_textOverflow(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_minHeight(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_wordSpacing(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_whiteSpace(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLCurrentStyle3, 0x3050f818, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLCurrentStyle3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLCurrentStyle3 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_textOverflow)(
        IHTMLCurrentStyle3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_minHeight)(
        IHTMLCurrentStyle3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_wordSpacing)(
        IHTMLCurrentStyle3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_whiteSpace)(
        IHTMLCurrentStyle3* This,
        BSTR *p);

    END_INTERFACE
} IHTMLCurrentStyle3Vtbl;
interface IHTMLCurrentStyle3 {
    CONST_VTBL IHTMLCurrentStyle3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLCurrentStyle3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLCurrentStyle3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLCurrentStyle3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLCurrentStyle3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLCurrentStyle3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLCurrentStyle3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLCurrentStyle3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLCurrentStyle3 methods ***/
#define IHTMLCurrentStyle3_get_textOverflow(This,p) (This)->lpVtbl->get_textOverflow(This,p)
#define IHTMLCurrentStyle3_get_minHeight(This,p) (This)->lpVtbl->get_minHeight(This,p)
#define IHTMLCurrentStyle3_get_wordSpacing(This,p) (This)->lpVtbl->get_wordSpacing(This,p)
#define IHTMLCurrentStyle3_get_whiteSpace(This,p) (This)->lpVtbl->get_whiteSpace(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLCurrentStyle3_QueryInterface(IHTMLCurrentStyle3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLCurrentStyle3_AddRef(IHTMLCurrentStyle3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLCurrentStyle3_Release(IHTMLCurrentStyle3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLCurrentStyle3_GetTypeInfoCount(IHTMLCurrentStyle3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle3_GetTypeInfo(IHTMLCurrentStyle3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle3_GetIDsOfNames(IHTMLCurrentStyle3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle3_Invoke(IHTMLCurrentStyle3* 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);
}
/*** IHTMLCurrentStyle3 methods ***/
static FORCEINLINE HRESULT IHTMLCurrentStyle3_get_textOverflow(IHTMLCurrentStyle3* This,BSTR *p) {
    return This->lpVtbl->get_textOverflow(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle3_get_minHeight(IHTMLCurrentStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_minHeight(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle3_get_wordSpacing(IHTMLCurrentStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_wordSpacing(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle3_get_whiteSpace(IHTMLCurrentStyle3* This,BSTR *p) {
    return This->lpVtbl->get_whiteSpace(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle3_get_textOverflow_Proxy(
    IHTMLCurrentStyle3* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle3_get_textOverflow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle3_get_minHeight_Proxy(
    IHTMLCurrentStyle3* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle3_get_minHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle3_get_wordSpacing_Proxy(
    IHTMLCurrentStyle3* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle3_get_wordSpacing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle3_get_whiteSpace_Proxy(
    IHTMLCurrentStyle3* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle3_get_whiteSpace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLCurrentStyle3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLCurrentStyle4 interface
 */
#ifndef __IHTMLCurrentStyle4_INTERFACE_DEFINED__
#define __IHTMLCurrentStyle4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLCurrentStyle4, 0x3050f33b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f33b-98b5-11cf-bb82-00aa00bdce0b")
IHTMLCurrentStyle4 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_msInterpolationMode(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_maxHeight(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_minWidth(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_maxWidth(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLCurrentStyle4, 0x3050f33b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLCurrentStyle4Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLCurrentStyle4 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_msInterpolationMode)(
        IHTMLCurrentStyle4* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_maxHeight)(
        IHTMLCurrentStyle4* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_minWidth)(
        IHTMLCurrentStyle4* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_maxWidth)(
        IHTMLCurrentStyle4* This,
        VARIANT *p);

    END_INTERFACE
} IHTMLCurrentStyle4Vtbl;
interface IHTMLCurrentStyle4 {
    CONST_VTBL IHTMLCurrentStyle4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLCurrentStyle4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLCurrentStyle4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLCurrentStyle4_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLCurrentStyle4_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLCurrentStyle4_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLCurrentStyle4_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLCurrentStyle4_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLCurrentStyle4 methods ***/
#define IHTMLCurrentStyle4_get_msInterpolationMode(This,p) (This)->lpVtbl->get_msInterpolationMode(This,p)
#define IHTMLCurrentStyle4_get_maxHeight(This,p) (This)->lpVtbl->get_maxHeight(This,p)
#define IHTMLCurrentStyle4_get_minWidth(This,p) (This)->lpVtbl->get_minWidth(This,p)
#define IHTMLCurrentStyle4_get_maxWidth(This,p) (This)->lpVtbl->get_maxWidth(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLCurrentStyle4_QueryInterface(IHTMLCurrentStyle4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLCurrentStyle4_AddRef(IHTMLCurrentStyle4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLCurrentStyle4_Release(IHTMLCurrentStyle4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLCurrentStyle4_GetTypeInfoCount(IHTMLCurrentStyle4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle4_GetTypeInfo(IHTMLCurrentStyle4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle4_GetIDsOfNames(IHTMLCurrentStyle4* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle4_Invoke(IHTMLCurrentStyle4* 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);
}
/*** IHTMLCurrentStyle4 methods ***/
static FORCEINLINE HRESULT IHTMLCurrentStyle4_get_msInterpolationMode(IHTMLCurrentStyle4* This,BSTR *p) {
    return This->lpVtbl->get_msInterpolationMode(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle4_get_maxHeight(IHTMLCurrentStyle4* This,VARIANT *p) {
    return This->lpVtbl->get_maxHeight(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle4_get_minWidth(IHTMLCurrentStyle4* This,VARIANT *p) {
    return This->lpVtbl->get_minWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle4_get_maxWidth(IHTMLCurrentStyle4* This,VARIANT *p) {
    return This->lpVtbl->get_maxWidth(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle4_get_msInterpolationMode_Proxy(
    IHTMLCurrentStyle4* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle4_get_msInterpolationMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle4_get_maxHeight_Proxy(
    IHTMLCurrentStyle4* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle4_get_maxHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle4_get_minWidth_Proxy(
    IHTMLCurrentStyle4* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle4_get_minWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle4_get_maxWidth_Proxy(
    IHTMLCurrentStyle4* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle4_get_maxWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLCurrentStyle4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLCurrentStyle5 interface
 */
#ifndef __IHTMLCurrentStyle5_INTERFACE_DEFINED__
#define __IHTMLCurrentStyle5_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLCurrentStyle5, 0x30510481, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510481-98b5-11cf-bb82-00aa00bdce0b")
IHTMLCurrentStyle5 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_captionSide(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_outline(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_outlineWidth(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_outlineStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_outlineColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_boxSizing(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderSpacing(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_orphans(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_widows(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pageBreakInside(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_emptyCells(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msBlockProgression(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_quotes(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLCurrentStyle5, 0x30510481, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLCurrentStyle5Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLCurrentStyle5 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_captionSide)(
        IHTMLCurrentStyle5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_outline)(
        IHTMLCurrentStyle5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_outlineWidth)(
        IHTMLCurrentStyle5* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_outlineStyle)(
        IHTMLCurrentStyle5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_outlineColor)(
        IHTMLCurrentStyle5* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_boxSizing)(
        IHTMLCurrentStyle5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_borderSpacing)(
        IHTMLCurrentStyle5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_orphans)(
        IHTMLCurrentStyle5* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_widows)(
        IHTMLCurrentStyle5* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_pageBreakInside)(
        IHTMLCurrentStyle5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_emptyCells)(
        IHTMLCurrentStyle5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_msBlockProgression)(
        IHTMLCurrentStyle5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_quotes)(
        IHTMLCurrentStyle5* This,
        BSTR *p);

    END_INTERFACE
} IHTMLCurrentStyle5Vtbl;
interface IHTMLCurrentStyle5 {
    CONST_VTBL IHTMLCurrentStyle5Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLCurrentStyle5_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLCurrentStyle5_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLCurrentStyle5_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLCurrentStyle5_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLCurrentStyle5_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLCurrentStyle5_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLCurrentStyle5_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLCurrentStyle5 methods ***/
#define IHTMLCurrentStyle5_get_captionSide(This,p) (This)->lpVtbl->get_captionSide(This,p)
#define IHTMLCurrentStyle5_get_outline(This,p) (This)->lpVtbl->get_outline(This,p)
#define IHTMLCurrentStyle5_get_outlineWidth(This,p) (This)->lpVtbl->get_outlineWidth(This,p)
#define IHTMLCurrentStyle5_get_outlineStyle(This,p) (This)->lpVtbl->get_outlineStyle(This,p)
#define IHTMLCurrentStyle5_get_outlineColor(This,p) (This)->lpVtbl->get_outlineColor(This,p)
#define IHTMLCurrentStyle5_get_boxSizing(This,p) (This)->lpVtbl->get_boxSizing(This,p)
#define IHTMLCurrentStyle5_get_borderSpacing(This,p) (This)->lpVtbl->get_borderSpacing(This,p)
#define IHTMLCurrentStyle5_get_orphans(This,p) (This)->lpVtbl->get_orphans(This,p)
#define IHTMLCurrentStyle5_get_widows(This,p) (This)->lpVtbl->get_widows(This,p)
#define IHTMLCurrentStyle5_get_pageBreakInside(This,p) (This)->lpVtbl->get_pageBreakInside(This,p)
#define IHTMLCurrentStyle5_get_emptyCells(This,p) (This)->lpVtbl->get_emptyCells(This,p)
#define IHTMLCurrentStyle5_get_msBlockProgression(This,p) (This)->lpVtbl->get_msBlockProgression(This,p)
#define IHTMLCurrentStyle5_get_quotes(This,p) (This)->lpVtbl->get_quotes(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLCurrentStyle5_QueryInterface(IHTMLCurrentStyle5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLCurrentStyle5_AddRef(IHTMLCurrentStyle5* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLCurrentStyle5_Release(IHTMLCurrentStyle5* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLCurrentStyle5_GetTypeInfoCount(IHTMLCurrentStyle5* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle5_GetTypeInfo(IHTMLCurrentStyle5* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle5_GetIDsOfNames(IHTMLCurrentStyle5* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle5_Invoke(IHTMLCurrentStyle5* 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);
}
/*** IHTMLCurrentStyle5 methods ***/
static FORCEINLINE HRESULT IHTMLCurrentStyle5_get_captionSide(IHTMLCurrentStyle5* This,BSTR *p) {
    return This->lpVtbl->get_captionSide(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle5_get_outline(IHTMLCurrentStyle5* This,BSTR *p) {
    return This->lpVtbl->get_outline(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle5_get_outlineWidth(IHTMLCurrentStyle5* This,VARIANT *p) {
    return This->lpVtbl->get_outlineWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle5_get_outlineStyle(IHTMLCurrentStyle5* This,BSTR *p) {
    return This->lpVtbl->get_outlineStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle5_get_outlineColor(IHTMLCurrentStyle5* This,VARIANT *p) {
    return This->lpVtbl->get_outlineColor(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle5_get_boxSizing(IHTMLCurrentStyle5* This,BSTR *p) {
    return This->lpVtbl->get_boxSizing(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle5_get_borderSpacing(IHTMLCurrentStyle5* This,BSTR *p) {
    return This->lpVtbl->get_borderSpacing(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle5_get_orphans(IHTMLCurrentStyle5* This,VARIANT *p) {
    return This->lpVtbl->get_orphans(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle5_get_widows(IHTMLCurrentStyle5* This,VARIANT *p) {
    return This->lpVtbl->get_widows(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle5_get_pageBreakInside(IHTMLCurrentStyle5* This,BSTR *p) {
    return This->lpVtbl->get_pageBreakInside(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle5_get_emptyCells(IHTMLCurrentStyle5* This,BSTR *p) {
    return This->lpVtbl->get_emptyCells(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle5_get_msBlockProgression(IHTMLCurrentStyle5* This,BSTR *p) {
    return This->lpVtbl->get_msBlockProgression(This,p);
}
static FORCEINLINE HRESULT IHTMLCurrentStyle5_get_quotes(IHTMLCurrentStyle5* This,BSTR *p) {
    return This->lpVtbl->get_quotes(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle5_get_captionSide_Proxy(
    IHTMLCurrentStyle5* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle5_get_captionSide_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle5_get_outline_Proxy(
    IHTMLCurrentStyle5* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle5_get_outline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle5_get_outlineWidth_Proxy(
    IHTMLCurrentStyle5* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle5_get_outlineWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle5_get_outlineStyle_Proxy(
    IHTMLCurrentStyle5* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle5_get_outlineStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle5_get_outlineColor_Proxy(
    IHTMLCurrentStyle5* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle5_get_outlineColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle5_get_boxSizing_Proxy(
    IHTMLCurrentStyle5* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle5_get_boxSizing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle5_get_borderSpacing_Proxy(
    IHTMLCurrentStyle5* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle5_get_borderSpacing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle5_get_orphans_Proxy(
    IHTMLCurrentStyle5* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle5_get_orphans_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle5_get_widows_Proxy(
    IHTMLCurrentStyle5* This,
    VARIANT *p);
void __RPC_STUB IHTMLCurrentStyle5_get_widows_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle5_get_pageBreakInside_Proxy(
    IHTMLCurrentStyle5* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle5_get_pageBreakInside_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle5_get_emptyCells_Proxy(
    IHTMLCurrentStyle5* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle5_get_emptyCells_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle5_get_msBlockProgression_Proxy(
    IHTMLCurrentStyle5* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle5_get_msBlockProgression_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCurrentStyle5_get_quotes_Proxy(
    IHTMLCurrentStyle5* This,
    BSTR *p);
void __RPC_STUB IHTMLCurrentStyle5_get_quotes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLCurrentStyle5_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLCurrentStyle dispinterface
 */
#ifndef __DispHTMLCurrentStyle_DISPINTERFACE_DEFINED__
#define __DispHTMLCurrentStyle_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLCurrentStyle, 0x3050f557, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f557-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLCurrentStyle : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLCurrentStyle, 0x3050f557, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLCurrentStyleVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} DispHTMLCurrentStyleVtbl;
interface DispHTMLCurrentStyle {
    CONST_VTBL DispHTMLCurrentStyleVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLCurrentStyle_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLCurrentStyle_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLCurrentStyle_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLCurrentStyle_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLCurrentStyle_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLCurrentStyle_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLCurrentStyle_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 DispHTMLCurrentStyle_QueryInterface(DispHTMLCurrentStyle* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLCurrentStyle_AddRef(DispHTMLCurrentStyle* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLCurrentStyle_Release(DispHTMLCurrentStyle* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLCurrentStyle_GetTypeInfoCount(DispHTMLCurrentStyle* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLCurrentStyle_GetTypeInfo(DispHTMLCurrentStyle* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLCurrentStyle_GetIDsOfNames(DispHTMLCurrentStyle* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLCurrentStyle_Invoke(DispHTMLCurrentStyle* 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  /* __DispHTMLCurrentStyle_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLCurrentStyle coclass
 */

DEFINE_GUID(CLSID_HTMLCurrentStyle, 0x3050f3dc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f3dc-98b5-11cf-bb82-00aa00bdce0b") HTMLCurrentStyle;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLCurrentStyle, 0x3050f3dc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CCurrentStyle;
#ifndef __IHTMLElement_FWD_DEFINED__
#define __IHTMLElement_FWD_DEFINED__
typedef interface IHTMLElement IHTMLElement;
#endif

/*****************************************************************************
 * IHTMLRect interface
 */
#ifndef __IHTMLRect_INTERFACE_DEFINED__
#define __IHTMLRect_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLRect, 0x3050f4a3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f4a3-98b5-11cf-bb82-00aa00bdce0b")
IHTMLRect : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_left(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_left(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_top(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_top(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_right(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_right(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_bottom(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_bottom(
        LONG *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLRect, 0x3050f4a3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLRectVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLRect methods ***/
    HRESULT (STDMETHODCALLTYPE *put_left)(
        IHTMLRect* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_left)(
        IHTMLRect* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_top)(
        IHTMLRect* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_top)(
        IHTMLRect* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_right)(
        IHTMLRect* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_right)(
        IHTMLRect* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_bottom)(
        IHTMLRect* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_bottom)(
        IHTMLRect* This,
        LONG *p);

    END_INTERFACE
} IHTMLRectVtbl;
interface IHTMLRect {
    CONST_VTBL IHTMLRectVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLRect_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLRect_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLRect_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLRect_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLRect_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLRect_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLRect_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLRect methods ***/
#define IHTMLRect_put_left(This,v) (This)->lpVtbl->put_left(This,v)
#define IHTMLRect_get_left(This,p) (This)->lpVtbl->get_left(This,p)
#define IHTMLRect_put_top(This,v) (This)->lpVtbl->put_top(This,v)
#define IHTMLRect_get_top(This,p) (This)->lpVtbl->get_top(This,p)
#define IHTMLRect_put_right(This,v) (This)->lpVtbl->put_right(This,v)
#define IHTMLRect_get_right(This,p) (This)->lpVtbl->get_right(This,p)
#define IHTMLRect_put_bottom(This,v) (This)->lpVtbl->put_bottom(This,v)
#define IHTMLRect_get_bottom(This,p) (This)->lpVtbl->get_bottom(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLRect_QueryInterface(IHTMLRect* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLRect_AddRef(IHTMLRect* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLRect_Release(IHTMLRect* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLRect_GetTypeInfoCount(IHTMLRect* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLRect_GetTypeInfo(IHTMLRect* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLRect_GetIDsOfNames(IHTMLRect* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLRect_Invoke(IHTMLRect* 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);
}
/*** IHTMLRect methods ***/
static FORCEINLINE HRESULT IHTMLRect_put_left(IHTMLRect* This,LONG v) {
    return This->lpVtbl->put_left(This,v);
}
static FORCEINLINE HRESULT IHTMLRect_get_left(IHTMLRect* This,LONG *p) {
    return This->lpVtbl->get_left(This,p);
}
static FORCEINLINE HRESULT IHTMLRect_put_top(IHTMLRect* This,LONG v) {
    return This->lpVtbl->put_top(This,v);
}
static FORCEINLINE HRESULT IHTMLRect_get_top(IHTMLRect* This,LONG *p) {
    return This->lpVtbl->get_top(This,p);
}
static FORCEINLINE HRESULT IHTMLRect_put_right(IHTMLRect* This,LONG v) {
    return This->lpVtbl->put_right(This,v);
}
static FORCEINLINE HRESULT IHTMLRect_get_right(IHTMLRect* This,LONG *p) {
    return This->lpVtbl->get_right(This,p);
}
static FORCEINLINE HRESULT IHTMLRect_put_bottom(IHTMLRect* This,LONG v) {
    return This->lpVtbl->put_bottom(This,v);
}
static FORCEINLINE HRESULT IHTMLRect_get_bottom(IHTMLRect* This,LONG *p) {
    return This->lpVtbl->get_bottom(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLRect_put_left_Proxy(
    IHTMLRect* This,
    LONG v);
void __RPC_STUB IHTMLRect_put_left_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRect_get_left_Proxy(
    IHTMLRect* This,
    LONG *p);
void __RPC_STUB IHTMLRect_get_left_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRect_put_top_Proxy(
    IHTMLRect* This,
    LONG v);
void __RPC_STUB IHTMLRect_put_top_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRect_get_top_Proxy(
    IHTMLRect* This,
    LONG *p);
void __RPC_STUB IHTMLRect_get_top_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRect_put_right_Proxy(
    IHTMLRect* This,
    LONG v);
void __RPC_STUB IHTMLRect_put_right_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRect_get_right_Proxy(
    IHTMLRect* This,
    LONG *p);
void __RPC_STUB IHTMLRect_get_right_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRect_put_bottom_Proxy(
    IHTMLRect* This,
    LONG v);
void __RPC_STUB IHTMLRect_put_bottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRect_get_bottom_Proxy(
    IHTMLRect* This,
    LONG *p);
void __RPC_STUB IHTMLRect_get_bottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLRect_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLRect2 interface
 */
#ifndef __IHTMLRect2_INTERFACE_DEFINED__
#define __IHTMLRect2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLRect2, 0x3051076c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051076c-98b5-11cf-bb82-00aa00bdce0b")
IHTMLRect2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_width(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_height(
        float *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLRect2, 0x3051076c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLRect2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLRect2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_width)(
        IHTMLRect2* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *get_height)(
        IHTMLRect2* This,
        float *p);

    END_INTERFACE
} IHTMLRect2Vtbl;
interface IHTMLRect2 {
    CONST_VTBL IHTMLRect2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLRect2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLRect2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLRect2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLRect2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLRect2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLRect2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLRect2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLRect2 methods ***/
#define IHTMLRect2_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#define IHTMLRect2_get_height(This,p) (This)->lpVtbl->get_height(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLRect2_QueryInterface(IHTMLRect2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLRect2_AddRef(IHTMLRect2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLRect2_Release(IHTMLRect2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLRect2_GetTypeInfoCount(IHTMLRect2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLRect2_GetTypeInfo(IHTMLRect2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLRect2_GetIDsOfNames(IHTMLRect2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLRect2_Invoke(IHTMLRect2* 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);
}
/*** IHTMLRect2 methods ***/
static FORCEINLINE HRESULT IHTMLRect2_get_width(IHTMLRect2* This,float *p) {
    return This->lpVtbl->get_width(This,p);
}
static FORCEINLINE HRESULT IHTMLRect2_get_height(IHTMLRect2* This,float *p) {
    return This->lpVtbl->get_height(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLRect2_get_width_Proxy(
    IHTMLRect2* This,
    float *p);
void __RPC_STUB IHTMLRect2_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRect2_get_height_Proxy(
    IHTMLRect2* This,
    float *p);
void __RPC_STUB IHTMLRect2_get_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLRect2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLRectCollection interface
 */
#ifndef __IHTMLRectCollection_INTERFACE_DEFINED__
#define __IHTMLRectCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLRectCollection, 0x3050f4a4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f4a4-98b5-11cf-bb82-00aa00bdce0b")
IHTMLRectCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__newEnum(
        IUnknown **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE item(
        VARIANT *pvarIndex,
        VARIANT *pvarResult) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLRectCollection, 0x3050f4a4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLRectCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLRectCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLRectCollection* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get__newEnum)(
        IHTMLRectCollection* This,
        IUnknown **p);

    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLRectCollection* This,
        VARIANT *pvarIndex,
        VARIANT *pvarResult);

    END_INTERFACE
} IHTMLRectCollectionVtbl;
interface IHTMLRectCollection {
    CONST_VTBL IHTMLRectCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLRectCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLRectCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLRectCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLRectCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLRectCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLRectCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLRectCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLRectCollection methods ***/
#define IHTMLRectCollection_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLRectCollection_get__newEnum(This,p) (This)->lpVtbl->get__newEnum(This,p)
#define IHTMLRectCollection_item(This,pvarIndex,pvarResult) (This)->lpVtbl->item(This,pvarIndex,pvarResult)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLRectCollection_QueryInterface(IHTMLRectCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLRectCollection_AddRef(IHTMLRectCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLRectCollection_Release(IHTMLRectCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLRectCollection_GetTypeInfoCount(IHTMLRectCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLRectCollection_GetTypeInfo(IHTMLRectCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLRectCollection_GetIDsOfNames(IHTMLRectCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLRectCollection_Invoke(IHTMLRectCollection* 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);
}
/*** IHTMLRectCollection methods ***/
static FORCEINLINE HRESULT IHTMLRectCollection_get_length(IHTMLRectCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IHTMLRectCollection_get__newEnum(IHTMLRectCollection* This,IUnknown **p) {
    return This->lpVtbl->get__newEnum(This,p);
}
static FORCEINLINE HRESULT IHTMLRectCollection_item(IHTMLRectCollection* This,VARIANT *pvarIndex,VARIANT *pvarResult) {
    return This->lpVtbl->item(This,pvarIndex,pvarResult);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLRectCollection_get_length_Proxy(
    IHTMLRectCollection* This,
    LONG *p);
void __RPC_STUB IHTMLRectCollection_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRectCollection_get__newEnum_Proxy(
    IHTMLRectCollection* This,
    IUnknown **p);
void __RPC_STUB IHTMLRectCollection_get__newEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLRectCollection_item_Proxy(
    IHTMLRectCollection* This,
    VARIANT *pvarIndex,
    VARIANT *pvarResult);
void __RPC_STUB IHTMLRectCollection_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLRectCollection_INTERFACE_DEFINED__ */

#ifndef __IHTMLElementCollection_FWD_DEFINED__
#define __IHTMLElementCollection_FWD_DEFINED__
typedef interface IHTMLElementCollection IHTMLElementCollection;
#endif

#ifndef __IHTMLElement2_FWD_DEFINED__
#define __IHTMLElement2_FWD_DEFINED__
typedef interface IHTMLElement2 IHTMLElement2;
#endif

#ifndef __IHTMLAttributeCollection3_FWD_DEFINED__
#define __IHTMLAttributeCollection3_FWD_DEFINED__
typedef interface IHTMLAttributeCollection3 IHTMLAttributeCollection3;
#endif

#ifndef __IDOMDocumentType_FWD_DEFINED__
#define __IDOMDocumentType_FWD_DEFINED__
typedef interface IDOMDocumentType IDOMDocumentType;
#endif

#ifndef __IHTMLDocument7_FWD_DEFINED__
#define __IHTMLDocument7_FWD_DEFINED__
typedef interface IHTMLDocument7 IHTMLDocument7;
#endif

/*****************************************************************************
 * IHTMLDOMNode interface
 */
#ifndef __IHTMLDOMNode_INTERFACE_DEFINED__
#define __IHTMLDOMNode_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDOMNode, 0x3050f5da, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f5da-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDOMNode : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_nodeType(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_parentNode(
        IHTMLDOMNode **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE hasChildNodes(
        VARIANT_BOOL *fChildren) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_childNodes(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_attributes(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE insertBefore(
        IHTMLDOMNode *newChild,
        VARIANT refChild,
        IHTMLDOMNode **node) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeChild(
        IHTMLDOMNode *oldChild,
        IHTMLDOMNode **node) = 0;

    virtual HRESULT STDMETHODCALLTYPE replaceChild(
        IHTMLDOMNode *newChild,
        IHTMLDOMNode *oldChild,
        IHTMLDOMNode **node) = 0;

    virtual HRESULT STDMETHODCALLTYPE cloneNode(
        VARIANT_BOOL fDeep,
        IHTMLDOMNode **clonedNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeNode(
        VARIANT_BOOL fDeep = 0,
        IHTMLDOMNode **removed = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE swapNode(
        IHTMLDOMNode *otherNode,
        IHTMLDOMNode **swappedNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE replaceNode(
        IHTMLDOMNode *replacement,
        IHTMLDOMNode **replaced) = 0;

    virtual HRESULT STDMETHODCALLTYPE appendChild(
        IHTMLDOMNode *newChild,
        IHTMLDOMNode **node) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_nodeName(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_nodeValue(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_nodeValue(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_firstChild(
        IHTMLDOMNode **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_lastChild(
        IHTMLDOMNode **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_previousSibling(
        IHTMLDOMNode **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_nextSibling(
        IHTMLDOMNode **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDOMNode, 0x3050f5da, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDOMNodeVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLDOMNode methods ***/
    HRESULT (STDMETHODCALLTYPE *get_nodeType)(
        IHTMLDOMNode* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_parentNode)(
        IHTMLDOMNode* This,
        IHTMLDOMNode **p);

    HRESULT (STDMETHODCALLTYPE *hasChildNodes)(
        IHTMLDOMNode* This,
        VARIANT_BOOL *fChildren);

    HRESULT (STDMETHODCALLTYPE *get_childNodes)(
        IHTMLDOMNode* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_attributes)(
        IHTMLDOMNode* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *insertBefore)(
        IHTMLDOMNode* This,
        IHTMLDOMNode *newChild,
        VARIANT refChild,
        IHTMLDOMNode **node);

    HRESULT (STDMETHODCALLTYPE *removeChild)(
        IHTMLDOMNode* This,
        IHTMLDOMNode *oldChild,
        IHTMLDOMNode **node);

    HRESULT (STDMETHODCALLTYPE *replaceChild)(
        IHTMLDOMNode* This,
        IHTMLDOMNode *newChild,
        IHTMLDOMNode *oldChild,
        IHTMLDOMNode **node);

    HRESULT (STDMETHODCALLTYPE *cloneNode)(
        IHTMLDOMNode* This,
        VARIANT_BOOL fDeep,
        IHTMLDOMNode **clonedNode);

    HRESULT (STDMETHODCALLTYPE *removeNode)(
        IHTMLDOMNode* This,
        VARIANT_BOOL fDeep,
        IHTMLDOMNode **removed);

    HRESULT (STDMETHODCALLTYPE *swapNode)(
        IHTMLDOMNode* This,
        IHTMLDOMNode *otherNode,
        IHTMLDOMNode **swappedNode);

    HRESULT (STDMETHODCALLTYPE *replaceNode)(
        IHTMLDOMNode* This,
        IHTMLDOMNode *replacement,
        IHTMLDOMNode **replaced);

    HRESULT (STDMETHODCALLTYPE *appendChild)(
        IHTMLDOMNode* This,
        IHTMLDOMNode *newChild,
        IHTMLDOMNode **node);

    HRESULT (STDMETHODCALLTYPE *get_nodeName)(
        IHTMLDOMNode* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_nodeValue)(
        IHTMLDOMNode* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_nodeValue)(
        IHTMLDOMNode* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_firstChild)(
        IHTMLDOMNode* This,
        IHTMLDOMNode **p);

    HRESULT (STDMETHODCALLTYPE *get_lastChild)(
        IHTMLDOMNode* This,
        IHTMLDOMNode **p);

    HRESULT (STDMETHODCALLTYPE *get_previousSibling)(
        IHTMLDOMNode* This,
        IHTMLDOMNode **p);

    HRESULT (STDMETHODCALLTYPE *get_nextSibling)(
        IHTMLDOMNode* This,
        IHTMLDOMNode **p);

    END_INTERFACE
} IHTMLDOMNodeVtbl;
interface IHTMLDOMNode {
    CONST_VTBL IHTMLDOMNodeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDOMNode_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDOMNode_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDOMNode_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDOMNode_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDOMNode_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDOMNode_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDOMNode_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDOMNode methods ***/
#define IHTMLDOMNode_get_nodeType(This,p) (This)->lpVtbl->get_nodeType(This,p)
#define IHTMLDOMNode_get_parentNode(This,p) (This)->lpVtbl->get_parentNode(This,p)
#define IHTMLDOMNode_hasChildNodes(This,fChildren) (This)->lpVtbl->hasChildNodes(This,fChildren)
#define IHTMLDOMNode_get_childNodes(This,p) (This)->lpVtbl->get_childNodes(This,p)
#define IHTMLDOMNode_get_attributes(This,p) (This)->lpVtbl->get_attributes(This,p)
#define IHTMLDOMNode_insertBefore(This,newChild,refChild,node) (This)->lpVtbl->insertBefore(This,newChild,refChild,node)
#define IHTMLDOMNode_removeChild(This,oldChild,node) (This)->lpVtbl->removeChild(This,oldChild,node)
#define IHTMLDOMNode_replaceChild(This,newChild,oldChild,node) (This)->lpVtbl->replaceChild(This,newChild,oldChild,node)
#define IHTMLDOMNode_cloneNode(This,fDeep,clonedNode) (This)->lpVtbl->cloneNode(This,fDeep,clonedNode)
#define IHTMLDOMNode_removeNode(This,fDeep,removed) (This)->lpVtbl->removeNode(This,fDeep,removed)
#define IHTMLDOMNode_swapNode(This,otherNode,swappedNode) (This)->lpVtbl->swapNode(This,otherNode,swappedNode)
#define IHTMLDOMNode_replaceNode(This,replacement,replaced) (This)->lpVtbl->replaceNode(This,replacement,replaced)
#define IHTMLDOMNode_appendChild(This,newChild,node) (This)->lpVtbl->appendChild(This,newChild,node)
#define IHTMLDOMNode_get_nodeName(This,p) (This)->lpVtbl->get_nodeName(This,p)
#define IHTMLDOMNode_put_nodeValue(This,v) (This)->lpVtbl->put_nodeValue(This,v)
#define IHTMLDOMNode_get_nodeValue(This,p) (This)->lpVtbl->get_nodeValue(This,p)
#define IHTMLDOMNode_get_firstChild(This,p) (This)->lpVtbl->get_firstChild(This,p)
#define IHTMLDOMNode_get_lastChild(This,p) (This)->lpVtbl->get_lastChild(This,p)
#define IHTMLDOMNode_get_previousSibling(This,p) (This)->lpVtbl->get_previousSibling(This,p)
#define IHTMLDOMNode_get_nextSibling(This,p) (This)->lpVtbl->get_nextSibling(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDOMNode_QueryInterface(IHTMLDOMNode* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDOMNode_AddRef(IHTMLDOMNode* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDOMNode_Release(IHTMLDOMNode* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDOMNode_GetTypeInfoCount(IHTMLDOMNode* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDOMNode_GetTypeInfo(IHTMLDOMNode* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDOMNode_GetIDsOfNames(IHTMLDOMNode* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDOMNode_Invoke(IHTMLDOMNode* 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);
}
/*** IHTMLDOMNode methods ***/
static FORCEINLINE HRESULT IHTMLDOMNode_get_nodeType(IHTMLDOMNode* This,LONG *p) {
    return This->lpVtbl->get_nodeType(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMNode_get_parentNode(IHTMLDOMNode* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_parentNode(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMNode_hasChildNodes(IHTMLDOMNode* This,VARIANT_BOOL *fChildren) {
    return This->lpVtbl->hasChildNodes(This,fChildren);
}
static FORCEINLINE HRESULT IHTMLDOMNode_get_childNodes(IHTMLDOMNode* This,IDispatch **p) {
    return This->lpVtbl->get_childNodes(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMNode_get_attributes(IHTMLDOMNode* This,IDispatch **p) {
    return This->lpVtbl->get_attributes(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMNode_insertBefore(IHTMLDOMNode* This,IHTMLDOMNode *newChild,VARIANT refChild,IHTMLDOMNode **node) {
    return This->lpVtbl->insertBefore(This,newChild,refChild,node);
}
static FORCEINLINE HRESULT IHTMLDOMNode_removeChild(IHTMLDOMNode* This,IHTMLDOMNode *oldChild,IHTMLDOMNode **node) {
    return This->lpVtbl->removeChild(This,oldChild,node);
}
static FORCEINLINE HRESULT IHTMLDOMNode_replaceChild(IHTMLDOMNode* This,IHTMLDOMNode *newChild,IHTMLDOMNode *oldChild,IHTMLDOMNode **node) {
    return This->lpVtbl->replaceChild(This,newChild,oldChild,node);
}
static FORCEINLINE HRESULT IHTMLDOMNode_cloneNode(IHTMLDOMNode* This,VARIANT_BOOL fDeep,IHTMLDOMNode **clonedNode) {
    return This->lpVtbl->cloneNode(This,fDeep,clonedNode);
}
static FORCEINLINE HRESULT IHTMLDOMNode_removeNode(IHTMLDOMNode* This,VARIANT_BOOL fDeep,IHTMLDOMNode **removed) {
    return This->lpVtbl->removeNode(This,fDeep,removed);
}
static FORCEINLINE HRESULT IHTMLDOMNode_swapNode(IHTMLDOMNode* This,IHTMLDOMNode *otherNode,IHTMLDOMNode **swappedNode) {
    return This->lpVtbl->swapNode(This,otherNode,swappedNode);
}
static FORCEINLINE HRESULT IHTMLDOMNode_replaceNode(IHTMLDOMNode* This,IHTMLDOMNode *replacement,IHTMLDOMNode **replaced) {
    return This->lpVtbl->replaceNode(This,replacement,replaced);
}
static FORCEINLINE HRESULT IHTMLDOMNode_appendChild(IHTMLDOMNode* This,IHTMLDOMNode *newChild,IHTMLDOMNode **node) {
    return This->lpVtbl->appendChild(This,newChild,node);
}
static FORCEINLINE HRESULT IHTMLDOMNode_get_nodeName(IHTMLDOMNode* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMNode_put_nodeValue(IHTMLDOMNode* This,VARIANT v) {
    return This->lpVtbl->put_nodeValue(This,v);
}
static FORCEINLINE HRESULT IHTMLDOMNode_get_nodeValue(IHTMLDOMNode* This,VARIANT *p) {
    return This->lpVtbl->get_nodeValue(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMNode_get_firstChild(IHTMLDOMNode* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_firstChild(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMNode_get_lastChild(IHTMLDOMNode* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_lastChild(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMNode_get_previousSibling(IHTMLDOMNode* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_previousSibling(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMNode_get_nextSibling(IHTMLDOMNode* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_nextSibling(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDOMNode_get_nodeType_Proxy(
    IHTMLDOMNode* This,
    LONG *p);
void __RPC_STUB IHTMLDOMNode_get_nodeType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode_get_parentNode_Proxy(
    IHTMLDOMNode* This,
    IHTMLDOMNode **p);
void __RPC_STUB IHTMLDOMNode_get_parentNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode_hasChildNodes_Proxy(
    IHTMLDOMNode* This,
    VARIANT_BOOL *fChildren);
void __RPC_STUB IHTMLDOMNode_hasChildNodes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode_get_childNodes_Proxy(
    IHTMLDOMNode* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMNode_get_childNodes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode_get_attributes_Proxy(
    IHTMLDOMNode* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMNode_get_attributes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode_insertBefore_Proxy(
    IHTMLDOMNode* This,
    IHTMLDOMNode *newChild,
    VARIANT refChild,
    IHTMLDOMNode **node);
void __RPC_STUB IHTMLDOMNode_insertBefore_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode_removeChild_Proxy(
    IHTMLDOMNode* This,
    IHTMLDOMNode *oldChild,
    IHTMLDOMNode **node);
void __RPC_STUB IHTMLDOMNode_removeChild_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode_replaceChild_Proxy(
    IHTMLDOMNode* This,
    IHTMLDOMNode *newChild,
    IHTMLDOMNode *oldChild,
    IHTMLDOMNode **node);
void __RPC_STUB IHTMLDOMNode_replaceChild_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode_cloneNode_Proxy(
    IHTMLDOMNode* This,
    VARIANT_BOOL fDeep,
    IHTMLDOMNode **clonedNode);
void __RPC_STUB IHTMLDOMNode_cloneNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode_removeNode_Proxy(
    IHTMLDOMNode* This,
    VARIANT_BOOL fDeep,
    IHTMLDOMNode **removed);
void __RPC_STUB IHTMLDOMNode_removeNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode_swapNode_Proxy(
    IHTMLDOMNode* This,
    IHTMLDOMNode *otherNode,
    IHTMLDOMNode **swappedNode);
void __RPC_STUB IHTMLDOMNode_swapNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode_replaceNode_Proxy(
    IHTMLDOMNode* This,
    IHTMLDOMNode *replacement,
    IHTMLDOMNode **replaced);
void __RPC_STUB IHTMLDOMNode_replaceNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode_appendChild_Proxy(
    IHTMLDOMNode* This,
    IHTMLDOMNode *newChild,
    IHTMLDOMNode **node);
void __RPC_STUB IHTMLDOMNode_appendChild_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode_get_nodeName_Proxy(
    IHTMLDOMNode* This,
    BSTR *p);
void __RPC_STUB IHTMLDOMNode_get_nodeName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode_put_nodeValue_Proxy(
    IHTMLDOMNode* This,
    VARIANT v);
void __RPC_STUB IHTMLDOMNode_put_nodeValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode_get_nodeValue_Proxy(
    IHTMLDOMNode* This,
    VARIANT *p);
void __RPC_STUB IHTMLDOMNode_get_nodeValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode_get_firstChild_Proxy(
    IHTMLDOMNode* This,
    IHTMLDOMNode **p);
void __RPC_STUB IHTMLDOMNode_get_firstChild_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode_get_lastChild_Proxy(
    IHTMLDOMNode* This,
    IHTMLDOMNode **p);
void __RPC_STUB IHTMLDOMNode_get_lastChild_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode_get_previousSibling_Proxy(
    IHTMLDOMNode* This,
    IHTMLDOMNode **p);
void __RPC_STUB IHTMLDOMNode_get_previousSibling_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode_get_nextSibling_Proxy(
    IHTMLDOMNode* This,
    IHTMLDOMNode **p);
void __RPC_STUB IHTMLDOMNode_get_nextSibling_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDOMNode_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLDOMNode2 interface
 */
#ifndef __IHTMLDOMNode2_INTERFACE_DEFINED__
#define __IHTMLDOMNode2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDOMNode2, 0x3050f80b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f80b-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDOMNode2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_ownerDocument(
        IDispatch **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDOMNode2, 0x3050f80b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDOMNode2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLDOMNode2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ownerDocument)(
        IHTMLDOMNode2* This,
        IDispatch **p);

    END_INTERFACE
} IHTMLDOMNode2Vtbl;
interface IHTMLDOMNode2 {
    CONST_VTBL IHTMLDOMNode2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDOMNode2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDOMNode2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDOMNode2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDOMNode2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDOMNode2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDOMNode2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDOMNode2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDOMNode2 methods ***/
#define IHTMLDOMNode2_get_ownerDocument(This,p) (This)->lpVtbl->get_ownerDocument(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDOMNode2_QueryInterface(IHTMLDOMNode2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDOMNode2_AddRef(IHTMLDOMNode2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDOMNode2_Release(IHTMLDOMNode2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDOMNode2_GetTypeInfoCount(IHTMLDOMNode2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDOMNode2_GetTypeInfo(IHTMLDOMNode2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDOMNode2_GetIDsOfNames(IHTMLDOMNode2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDOMNode2_Invoke(IHTMLDOMNode2* 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);
}
/*** IHTMLDOMNode2 methods ***/
static FORCEINLINE HRESULT IHTMLDOMNode2_get_ownerDocument(IHTMLDOMNode2* This,IDispatch **p) {
    return This->lpVtbl->get_ownerDocument(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDOMNode2_get_ownerDocument_Proxy(
    IHTMLDOMNode2* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMNode2_get_ownerDocument_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDOMNode2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLDOMNode3 interface
 */
#ifndef __IHTMLDOMNode3_INTERFACE_DEFINED__
#define __IHTMLDOMNode3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDOMNode3, 0x305106e0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106e0-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDOMNode3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_prefix(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_prefix(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_localName(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_namespaceURI(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textContent(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textContent(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE isEqualNode(
        IHTMLDOMNode3 *otherNode,
        VARIANT_BOOL *isEqual) = 0;

    virtual HRESULT STDMETHODCALLTYPE lookupNamespaceURI(
        VARIANT *pvarPrefix,
        VARIANT *pvarNamespaceURI) = 0;

    virtual HRESULT STDMETHODCALLTYPE lookupPrefix(
        VARIANT *pvarNamespaceURI,
        VARIANT *pvarPrefix) = 0;

    virtual HRESULT STDMETHODCALLTYPE isDefaultNamespace(
        VARIANT *pvarNamespace,
        VARIANT_BOOL *pfDefaultNamespace) = 0;

    virtual HRESULT STDMETHODCALLTYPE appendChild(
        IHTMLDOMNode *newChild,
        IHTMLDOMNode **node) = 0;

    virtual HRESULT STDMETHODCALLTYPE insertBefore(
        IHTMLDOMNode *newChild,
        VARIANT refChild,
        IHTMLDOMNode **node) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeChild(
        IHTMLDOMNode *oldChild,
        IHTMLDOMNode **node) = 0;

    virtual HRESULT STDMETHODCALLTYPE replaceChild(
        IHTMLDOMNode *newChild,
        IHTMLDOMNode *oldChild,
        IHTMLDOMNode **node) = 0;

    virtual HRESULT STDMETHODCALLTYPE isSameNode(
        IHTMLDOMNode3 *otherNode,
        VARIANT_BOOL *isSame) = 0;

    virtual HRESULT STDMETHODCALLTYPE compareDocumentPosition(
        IHTMLDOMNode *otherNode,
        USHORT *flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE isSupported(
        BSTR feature,
        VARIANT version,
        VARIANT_BOOL *pfisSupported) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDOMNode3, 0x305106e0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDOMNode3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLDOMNode3 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_prefix)(
        IHTMLDOMNode3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_prefix)(
        IHTMLDOMNode3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_localName)(
        IHTMLDOMNode3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        IHTMLDOMNode3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_textContent)(
        IHTMLDOMNode3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_textContent)(
        IHTMLDOMNode3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *isEqualNode)(
        IHTMLDOMNode3* This,
        IHTMLDOMNode3 *otherNode,
        VARIANT_BOOL *isEqual);

    HRESULT (STDMETHODCALLTYPE *lookupNamespaceURI)(
        IHTMLDOMNode3* This,
        VARIANT *pvarPrefix,
        VARIANT *pvarNamespaceURI);

    HRESULT (STDMETHODCALLTYPE *lookupPrefix)(
        IHTMLDOMNode3* This,
        VARIANT *pvarNamespaceURI,
        VARIANT *pvarPrefix);

    HRESULT (STDMETHODCALLTYPE *isDefaultNamespace)(
        IHTMLDOMNode3* This,
        VARIANT *pvarNamespace,
        VARIANT_BOOL *pfDefaultNamespace);

    HRESULT (STDMETHODCALLTYPE *appendChild)(
        IHTMLDOMNode3* This,
        IHTMLDOMNode *newChild,
        IHTMLDOMNode **node);

    HRESULT (STDMETHODCALLTYPE *insertBefore)(
        IHTMLDOMNode3* This,
        IHTMLDOMNode *newChild,
        VARIANT refChild,
        IHTMLDOMNode **node);

    HRESULT (STDMETHODCALLTYPE *removeChild)(
        IHTMLDOMNode3* This,
        IHTMLDOMNode *oldChild,
        IHTMLDOMNode **node);

    HRESULT (STDMETHODCALLTYPE *replaceChild)(
        IHTMLDOMNode3* This,
        IHTMLDOMNode *newChild,
        IHTMLDOMNode *oldChild,
        IHTMLDOMNode **node);

    HRESULT (STDMETHODCALLTYPE *isSameNode)(
        IHTMLDOMNode3* This,
        IHTMLDOMNode3 *otherNode,
        VARIANT_BOOL *isSame);

    HRESULT (STDMETHODCALLTYPE *compareDocumentPosition)(
        IHTMLDOMNode3* This,
        IHTMLDOMNode *otherNode,
        USHORT *flags);

    HRESULT (STDMETHODCALLTYPE *isSupported)(
        IHTMLDOMNode3* This,
        BSTR feature,
        VARIANT version,
        VARIANT_BOOL *pfisSupported);

    END_INTERFACE
} IHTMLDOMNode3Vtbl;
interface IHTMLDOMNode3 {
    CONST_VTBL IHTMLDOMNode3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDOMNode3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDOMNode3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDOMNode3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDOMNode3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDOMNode3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDOMNode3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDOMNode3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDOMNode3 methods ***/
#define IHTMLDOMNode3_put_prefix(This,v) (This)->lpVtbl->put_prefix(This,v)
#define IHTMLDOMNode3_get_prefix(This,p) (This)->lpVtbl->get_prefix(This,p)
#define IHTMLDOMNode3_get_localName(This,p) (This)->lpVtbl->get_localName(This,p)
#define IHTMLDOMNode3_get_namespaceURI(This,p) (This)->lpVtbl->get_namespaceURI(This,p)
#define IHTMLDOMNode3_put_textContent(This,v) (This)->lpVtbl->put_textContent(This,v)
#define IHTMLDOMNode3_get_textContent(This,p) (This)->lpVtbl->get_textContent(This,p)
#define IHTMLDOMNode3_isEqualNode(This,otherNode,isEqual) (This)->lpVtbl->isEqualNode(This,otherNode,isEqual)
#define IHTMLDOMNode3_lookupNamespaceURI(This,pvarPrefix,pvarNamespaceURI) (This)->lpVtbl->lookupNamespaceURI(This,pvarPrefix,pvarNamespaceURI)
#define IHTMLDOMNode3_lookupPrefix(This,pvarNamespaceURI,pvarPrefix) (This)->lpVtbl->lookupPrefix(This,pvarNamespaceURI,pvarPrefix)
#define IHTMLDOMNode3_isDefaultNamespace(This,pvarNamespace,pfDefaultNamespace) (This)->lpVtbl->isDefaultNamespace(This,pvarNamespace,pfDefaultNamespace)
#define IHTMLDOMNode3_appendChild(This,newChild,node) (This)->lpVtbl->appendChild(This,newChild,node)
#define IHTMLDOMNode3_insertBefore(This,newChild,refChild,node) (This)->lpVtbl->insertBefore(This,newChild,refChild,node)
#define IHTMLDOMNode3_removeChild(This,oldChild,node) (This)->lpVtbl->removeChild(This,oldChild,node)
#define IHTMLDOMNode3_replaceChild(This,newChild,oldChild,node) (This)->lpVtbl->replaceChild(This,newChild,oldChild,node)
#define IHTMLDOMNode3_isSameNode(This,otherNode,isSame) (This)->lpVtbl->isSameNode(This,otherNode,isSame)
#define IHTMLDOMNode3_compareDocumentPosition(This,otherNode,flags) (This)->lpVtbl->compareDocumentPosition(This,otherNode,flags)
#define IHTMLDOMNode3_isSupported(This,feature,version,pfisSupported) (This)->lpVtbl->isSupported(This,feature,version,pfisSupported)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDOMNode3_QueryInterface(IHTMLDOMNode3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDOMNode3_AddRef(IHTMLDOMNode3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDOMNode3_Release(IHTMLDOMNode3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDOMNode3_GetTypeInfoCount(IHTMLDOMNode3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDOMNode3_GetTypeInfo(IHTMLDOMNode3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDOMNode3_GetIDsOfNames(IHTMLDOMNode3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDOMNode3_Invoke(IHTMLDOMNode3* 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);
}
/*** IHTMLDOMNode3 methods ***/
static FORCEINLINE HRESULT IHTMLDOMNode3_put_prefix(IHTMLDOMNode3* This,VARIANT v) {
    return This->lpVtbl->put_prefix(This,v);
}
static FORCEINLINE HRESULT IHTMLDOMNode3_get_prefix(IHTMLDOMNode3* This,VARIANT *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMNode3_get_localName(IHTMLDOMNode3* This,VARIANT *p) {
    return This->lpVtbl->get_localName(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMNode3_get_namespaceURI(IHTMLDOMNode3* This,VARIANT *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMNode3_put_textContent(IHTMLDOMNode3* This,VARIANT v) {
    return This->lpVtbl->put_textContent(This,v);
}
static FORCEINLINE HRESULT IHTMLDOMNode3_get_textContent(IHTMLDOMNode3* This,VARIANT *p) {
    return This->lpVtbl->get_textContent(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMNode3_isEqualNode(IHTMLDOMNode3* This,IHTMLDOMNode3 *otherNode,VARIANT_BOOL *isEqual) {
    return This->lpVtbl->isEqualNode(This,otherNode,isEqual);
}
static FORCEINLINE HRESULT IHTMLDOMNode3_lookupNamespaceURI(IHTMLDOMNode3* This,VARIANT *pvarPrefix,VARIANT *pvarNamespaceURI) {
    return This->lpVtbl->lookupNamespaceURI(This,pvarPrefix,pvarNamespaceURI);
}
static FORCEINLINE HRESULT IHTMLDOMNode3_lookupPrefix(IHTMLDOMNode3* This,VARIANT *pvarNamespaceURI,VARIANT *pvarPrefix) {
    return This->lpVtbl->lookupPrefix(This,pvarNamespaceURI,pvarPrefix);
}
static FORCEINLINE HRESULT IHTMLDOMNode3_isDefaultNamespace(IHTMLDOMNode3* This,VARIANT *pvarNamespace,VARIANT_BOOL *pfDefaultNamespace) {
    return This->lpVtbl->isDefaultNamespace(This,pvarNamespace,pfDefaultNamespace);
}
static FORCEINLINE HRESULT IHTMLDOMNode3_appendChild(IHTMLDOMNode3* This,IHTMLDOMNode *newChild,IHTMLDOMNode **node) {
    return This->lpVtbl->appendChild(This,newChild,node);
}
static FORCEINLINE HRESULT IHTMLDOMNode3_insertBefore(IHTMLDOMNode3* This,IHTMLDOMNode *newChild,VARIANT refChild,IHTMLDOMNode **node) {
    return This->lpVtbl->insertBefore(This,newChild,refChild,node);
}
static FORCEINLINE HRESULT IHTMLDOMNode3_removeChild(IHTMLDOMNode3* This,IHTMLDOMNode *oldChild,IHTMLDOMNode **node) {
    return This->lpVtbl->removeChild(This,oldChild,node);
}
static FORCEINLINE HRESULT IHTMLDOMNode3_replaceChild(IHTMLDOMNode3* This,IHTMLDOMNode *newChild,IHTMLDOMNode *oldChild,IHTMLDOMNode **node) {
    return This->lpVtbl->replaceChild(This,newChild,oldChild,node);
}
static FORCEINLINE HRESULT IHTMLDOMNode3_isSameNode(IHTMLDOMNode3* This,IHTMLDOMNode3 *otherNode,VARIANT_BOOL *isSame) {
    return This->lpVtbl->isSameNode(This,otherNode,isSame);
}
static FORCEINLINE HRESULT IHTMLDOMNode3_compareDocumentPosition(IHTMLDOMNode3* This,IHTMLDOMNode *otherNode,USHORT *flags) {
    return This->lpVtbl->compareDocumentPosition(This,otherNode,flags);
}
static FORCEINLINE HRESULT IHTMLDOMNode3_isSupported(IHTMLDOMNode3* This,BSTR feature,VARIANT version,VARIANT_BOOL *pfisSupported) {
    return This->lpVtbl->isSupported(This,feature,version,pfisSupported);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDOMNode3_put_prefix_Proxy(
    IHTMLDOMNode3* This,
    VARIANT v);
void __RPC_STUB IHTMLDOMNode3_put_prefix_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode3_get_prefix_Proxy(
    IHTMLDOMNode3* This,
    VARIANT *p);
void __RPC_STUB IHTMLDOMNode3_get_prefix_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode3_get_localName_Proxy(
    IHTMLDOMNode3* This,
    VARIANT *p);
void __RPC_STUB IHTMLDOMNode3_get_localName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode3_get_namespaceURI_Proxy(
    IHTMLDOMNode3* This,
    VARIANT *p);
void __RPC_STUB IHTMLDOMNode3_get_namespaceURI_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode3_put_textContent_Proxy(
    IHTMLDOMNode3* This,
    VARIANT v);
void __RPC_STUB IHTMLDOMNode3_put_textContent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode3_get_textContent_Proxy(
    IHTMLDOMNode3* This,
    VARIANT *p);
void __RPC_STUB IHTMLDOMNode3_get_textContent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode3_isEqualNode_Proxy(
    IHTMLDOMNode3* This,
    IHTMLDOMNode3 *otherNode,
    VARIANT_BOOL *isEqual);
void __RPC_STUB IHTMLDOMNode3_isEqualNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode3_lookupNamespaceURI_Proxy(
    IHTMLDOMNode3* This,
    VARIANT *pvarPrefix,
    VARIANT *pvarNamespaceURI);
void __RPC_STUB IHTMLDOMNode3_lookupNamespaceURI_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode3_lookupPrefix_Proxy(
    IHTMLDOMNode3* This,
    VARIANT *pvarNamespaceURI,
    VARIANT *pvarPrefix);
void __RPC_STUB IHTMLDOMNode3_lookupPrefix_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode3_isDefaultNamespace_Proxy(
    IHTMLDOMNode3* This,
    VARIANT *pvarNamespace,
    VARIANT_BOOL *pfDefaultNamespace);
void __RPC_STUB IHTMLDOMNode3_isDefaultNamespace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode3_appendChild_Proxy(
    IHTMLDOMNode3* This,
    IHTMLDOMNode *newChild,
    IHTMLDOMNode **node);
void __RPC_STUB IHTMLDOMNode3_appendChild_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode3_insertBefore_Proxy(
    IHTMLDOMNode3* This,
    IHTMLDOMNode *newChild,
    VARIANT refChild,
    IHTMLDOMNode **node);
void __RPC_STUB IHTMLDOMNode3_insertBefore_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode3_removeChild_Proxy(
    IHTMLDOMNode3* This,
    IHTMLDOMNode *oldChild,
    IHTMLDOMNode **node);
void __RPC_STUB IHTMLDOMNode3_removeChild_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode3_replaceChild_Proxy(
    IHTMLDOMNode3* This,
    IHTMLDOMNode *newChild,
    IHTMLDOMNode *oldChild,
    IHTMLDOMNode **node);
void __RPC_STUB IHTMLDOMNode3_replaceChild_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode3_isSameNode_Proxy(
    IHTMLDOMNode3* This,
    IHTMLDOMNode3 *otherNode,
    VARIANT_BOOL *isSame);
void __RPC_STUB IHTMLDOMNode3_isSameNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode3_compareDocumentPosition_Proxy(
    IHTMLDOMNode3* This,
    IHTMLDOMNode *otherNode,
    USHORT *flags);
void __RPC_STUB IHTMLDOMNode3_compareDocumentPosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMNode3_isSupported_Proxy(
    IHTMLDOMNode3* This,
    BSTR feature,
    VARIANT version,
    VARIANT_BOOL *pfisSupported);
void __RPC_STUB IHTMLDOMNode3_isSupported_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDOMNode3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLDOMAttribute interface
 */
#ifndef __IHTMLDOMAttribute_INTERFACE_DEFINED__
#define __IHTMLDOMAttribute_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDOMAttribute, 0x3050f4b0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f4b0-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDOMAttribute : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_nodeName(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_nodeValue(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_nodeValue(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_specified(
        VARIANT_BOOL *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDOMAttribute, 0x3050f4b0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDOMAttributeVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLDOMAttribute methods ***/
    HRESULT (STDMETHODCALLTYPE *get_nodeName)(
        IHTMLDOMAttribute* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_nodeValue)(
        IHTMLDOMAttribute* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_nodeValue)(
        IHTMLDOMAttribute* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_specified)(
        IHTMLDOMAttribute* This,
        VARIANT_BOOL *p);

    END_INTERFACE
} IHTMLDOMAttributeVtbl;
interface IHTMLDOMAttribute {
    CONST_VTBL IHTMLDOMAttributeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDOMAttribute_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDOMAttribute_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDOMAttribute_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDOMAttribute_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDOMAttribute_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDOMAttribute_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDOMAttribute_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDOMAttribute methods ***/
#define IHTMLDOMAttribute_get_nodeName(This,p) (This)->lpVtbl->get_nodeName(This,p)
#define IHTMLDOMAttribute_put_nodeValue(This,v) (This)->lpVtbl->put_nodeValue(This,v)
#define IHTMLDOMAttribute_get_nodeValue(This,p) (This)->lpVtbl->get_nodeValue(This,p)
#define IHTMLDOMAttribute_get_specified(This,p) (This)->lpVtbl->get_specified(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDOMAttribute_QueryInterface(IHTMLDOMAttribute* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDOMAttribute_AddRef(IHTMLDOMAttribute* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDOMAttribute_Release(IHTMLDOMAttribute* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDOMAttribute_GetTypeInfoCount(IHTMLDOMAttribute* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute_GetTypeInfo(IHTMLDOMAttribute* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute_GetIDsOfNames(IHTMLDOMAttribute* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute_Invoke(IHTMLDOMAttribute* 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);
}
/*** IHTMLDOMAttribute methods ***/
static FORCEINLINE HRESULT IHTMLDOMAttribute_get_nodeName(IHTMLDOMAttribute* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute_put_nodeValue(IHTMLDOMAttribute* This,VARIANT v) {
    return This->lpVtbl->put_nodeValue(This,v);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute_get_nodeValue(IHTMLDOMAttribute* This,VARIANT *p) {
    return This->lpVtbl->get_nodeValue(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute_get_specified(IHTMLDOMAttribute* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_specified(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute_get_nodeName_Proxy(
    IHTMLDOMAttribute* This,
    BSTR *p);
void __RPC_STUB IHTMLDOMAttribute_get_nodeName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute_put_nodeValue_Proxy(
    IHTMLDOMAttribute* This,
    VARIANT v);
void __RPC_STUB IHTMLDOMAttribute_put_nodeValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute_get_nodeValue_Proxy(
    IHTMLDOMAttribute* This,
    VARIANT *p);
void __RPC_STUB IHTMLDOMAttribute_get_nodeValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute_get_specified_Proxy(
    IHTMLDOMAttribute* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLDOMAttribute_get_specified_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDOMAttribute_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLDOMAttribute2 interface
 */
#ifndef __IHTMLDOMAttribute2_INTERFACE_DEFINED__
#define __IHTMLDOMAttribute2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDOMAttribute2, 0x3050f810, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f810-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDOMAttribute2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_value(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_value(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_expando(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_nodeType(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_parentNode(
        IHTMLDOMNode **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_childNodes(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_firstChild(
        IHTMLDOMNode **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_lastChild(
        IHTMLDOMNode **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_previousSibling(
        IHTMLDOMNode **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_nextSibling(
        IHTMLDOMNode **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_attributes(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ownerDocument(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE insertBefore(
        IHTMLDOMNode *newChild,
        VARIANT refChild,
        IHTMLDOMNode **node) = 0;

    virtual HRESULT STDMETHODCALLTYPE replaceChild(
        IHTMLDOMNode *newChild,
        IHTMLDOMNode *oldChild,
        IHTMLDOMNode **node) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeChild(
        IHTMLDOMNode *oldChild,
        IHTMLDOMNode **node) = 0;

    virtual HRESULT STDMETHODCALLTYPE appendChild(
        IHTMLDOMNode *newChild,
        IHTMLDOMNode **node) = 0;

    virtual HRESULT STDMETHODCALLTYPE hasChildNodes(
        VARIANT_BOOL *fChildren) = 0;

    virtual HRESULT STDMETHODCALLTYPE cloneNode(
        VARIANT_BOOL fDeep,
        IHTMLDOMAttribute **clonedNode) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDOMAttribute2, 0x3050f810, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDOMAttribute2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLDOMAttribute2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_name)(
        IHTMLDOMAttribute2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_value)(
        IHTMLDOMAttribute2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_value)(
        IHTMLDOMAttribute2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_expando)(
        IHTMLDOMAttribute2* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_nodeType)(
        IHTMLDOMAttribute2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_parentNode)(
        IHTMLDOMAttribute2* This,
        IHTMLDOMNode **p);

    HRESULT (STDMETHODCALLTYPE *get_childNodes)(
        IHTMLDOMAttribute2* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_firstChild)(
        IHTMLDOMAttribute2* This,
        IHTMLDOMNode **p);

    HRESULT (STDMETHODCALLTYPE *get_lastChild)(
        IHTMLDOMAttribute2* This,
        IHTMLDOMNode **p);

    HRESULT (STDMETHODCALLTYPE *get_previousSibling)(
        IHTMLDOMAttribute2* This,
        IHTMLDOMNode **p);

    HRESULT (STDMETHODCALLTYPE *get_nextSibling)(
        IHTMLDOMAttribute2* This,
        IHTMLDOMNode **p);

    HRESULT (STDMETHODCALLTYPE *get_attributes)(
        IHTMLDOMAttribute2* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_ownerDocument)(
        IHTMLDOMAttribute2* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *insertBefore)(
        IHTMLDOMAttribute2* This,
        IHTMLDOMNode *newChild,
        VARIANT refChild,
        IHTMLDOMNode **node);

    HRESULT (STDMETHODCALLTYPE *replaceChild)(
        IHTMLDOMAttribute2* This,
        IHTMLDOMNode *newChild,
        IHTMLDOMNode *oldChild,
        IHTMLDOMNode **node);

    HRESULT (STDMETHODCALLTYPE *removeChild)(
        IHTMLDOMAttribute2* This,
        IHTMLDOMNode *oldChild,
        IHTMLDOMNode **node);

    HRESULT (STDMETHODCALLTYPE *appendChild)(
        IHTMLDOMAttribute2* This,
        IHTMLDOMNode *newChild,
        IHTMLDOMNode **node);

    HRESULT (STDMETHODCALLTYPE *hasChildNodes)(
        IHTMLDOMAttribute2* This,
        VARIANT_BOOL *fChildren);

    HRESULT (STDMETHODCALLTYPE *cloneNode)(
        IHTMLDOMAttribute2* This,
        VARIANT_BOOL fDeep,
        IHTMLDOMAttribute **clonedNode);

    END_INTERFACE
} IHTMLDOMAttribute2Vtbl;
interface IHTMLDOMAttribute2 {
    CONST_VTBL IHTMLDOMAttribute2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDOMAttribute2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDOMAttribute2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDOMAttribute2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDOMAttribute2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDOMAttribute2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDOMAttribute2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDOMAttribute2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDOMAttribute2 methods ***/
#define IHTMLDOMAttribute2_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#define IHTMLDOMAttribute2_put_value(This,v) (This)->lpVtbl->put_value(This,v)
#define IHTMLDOMAttribute2_get_value(This,p) (This)->lpVtbl->get_value(This,p)
#define IHTMLDOMAttribute2_get_expando(This,p) (This)->lpVtbl->get_expando(This,p)
#define IHTMLDOMAttribute2_get_nodeType(This,p) (This)->lpVtbl->get_nodeType(This,p)
#define IHTMLDOMAttribute2_get_parentNode(This,p) (This)->lpVtbl->get_parentNode(This,p)
#define IHTMLDOMAttribute2_get_childNodes(This,p) (This)->lpVtbl->get_childNodes(This,p)
#define IHTMLDOMAttribute2_get_firstChild(This,p) (This)->lpVtbl->get_firstChild(This,p)
#define IHTMLDOMAttribute2_get_lastChild(This,p) (This)->lpVtbl->get_lastChild(This,p)
#define IHTMLDOMAttribute2_get_previousSibling(This,p) (This)->lpVtbl->get_previousSibling(This,p)
#define IHTMLDOMAttribute2_get_nextSibling(This,p) (This)->lpVtbl->get_nextSibling(This,p)
#define IHTMLDOMAttribute2_get_attributes(This,p) (This)->lpVtbl->get_attributes(This,p)
#define IHTMLDOMAttribute2_get_ownerDocument(This,p) (This)->lpVtbl->get_ownerDocument(This,p)
#define IHTMLDOMAttribute2_insertBefore(This,newChild,refChild,node) (This)->lpVtbl->insertBefore(This,newChild,refChild,node)
#define IHTMLDOMAttribute2_replaceChild(This,newChild,oldChild,node) (This)->lpVtbl->replaceChild(This,newChild,oldChild,node)
#define IHTMLDOMAttribute2_removeChild(This,oldChild,node) (This)->lpVtbl->removeChild(This,oldChild,node)
#define IHTMLDOMAttribute2_appendChild(This,newChild,node) (This)->lpVtbl->appendChild(This,newChild,node)
#define IHTMLDOMAttribute2_hasChildNodes(This,fChildren) (This)->lpVtbl->hasChildNodes(This,fChildren)
#define IHTMLDOMAttribute2_cloneNode(This,fDeep,clonedNode) (This)->lpVtbl->cloneNode(This,fDeep,clonedNode)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDOMAttribute2_QueryInterface(IHTMLDOMAttribute2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDOMAttribute2_AddRef(IHTMLDOMAttribute2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDOMAttribute2_Release(IHTMLDOMAttribute2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDOMAttribute2_GetTypeInfoCount(IHTMLDOMAttribute2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute2_GetTypeInfo(IHTMLDOMAttribute2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute2_GetIDsOfNames(IHTMLDOMAttribute2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute2_Invoke(IHTMLDOMAttribute2* 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);
}
/*** IHTMLDOMAttribute2 methods ***/
static FORCEINLINE HRESULT IHTMLDOMAttribute2_get_name(IHTMLDOMAttribute2* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute2_put_value(IHTMLDOMAttribute2* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute2_get_value(IHTMLDOMAttribute2* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute2_get_expando(IHTMLDOMAttribute2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_expando(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute2_get_nodeType(IHTMLDOMAttribute2* This,LONG *p) {
    return This->lpVtbl->get_nodeType(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute2_get_parentNode(IHTMLDOMAttribute2* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_parentNode(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute2_get_childNodes(IHTMLDOMAttribute2* This,IDispatch **p) {
    return This->lpVtbl->get_childNodes(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute2_get_firstChild(IHTMLDOMAttribute2* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_firstChild(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute2_get_lastChild(IHTMLDOMAttribute2* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_lastChild(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute2_get_previousSibling(IHTMLDOMAttribute2* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_previousSibling(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute2_get_nextSibling(IHTMLDOMAttribute2* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_nextSibling(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute2_get_attributes(IHTMLDOMAttribute2* This,IDispatch **p) {
    return This->lpVtbl->get_attributes(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute2_get_ownerDocument(IHTMLDOMAttribute2* This,IDispatch **p) {
    return This->lpVtbl->get_ownerDocument(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute2_insertBefore(IHTMLDOMAttribute2* This,IHTMLDOMNode *newChild,VARIANT refChild,IHTMLDOMNode **node) {
    return This->lpVtbl->insertBefore(This,newChild,refChild,node);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute2_replaceChild(IHTMLDOMAttribute2* This,IHTMLDOMNode *newChild,IHTMLDOMNode *oldChild,IHTMLDOMNode **node) {
    return This->lpVtbl->replaceChild(This,newChild,oldChild,node);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute2_removeChild(IHTMLDOMAttribute2* This,IHTMLDOMNode *oldChild,IHTMLDOMNode **node) {
    return This->lpVtbl->removeChild(This,oldChild,node);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute2_appendChild(IHTMLDOMAttribute2* This,IHTMLDOMNode *newChild,IHTMLDOMNode **node) {
    return This->lpVtbl->appendChild(This,newChild,node);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute2_hasChildNodes(IHTMLDOMAttribute2* This,VARIANT_BOOL *fChildren) {
    return This->lpVtbl->hasChildNodes(This,fChildren);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute2_cloneNode(IHTMLDOMAttribute2* This,VARIANT_BOOL fDeep,IHTMLDOMAttribute **clonedNode) {
    return This->lpVtbl->cloneNode(This,fDeep,clonedNode);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute2_get_name_Proxy(
    IHTMLDOMAttribute2* This,
    BSTR *p);
void __RPC_STUB IHTMLDOMAttribute2_get_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute2_put_value_Proxy(
    IHTMLDOMAttribute2* This,
    BSTR v);
void __RPC_STUB IHTMLDOMAttribute2_put_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute2_get_value_Proxy(
    IHTMLDOMAttribute2* This,
    BSTR *p);
void __RPC_STUB IHTMLDOMAttribute2_get_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute2_get_expando_Proxy(
    IHTMLDOMAttribute2* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLDOMAttribute2_get_expando_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute2_get_nodeType_Proxy(
    IHTMLDOMAttribute2* This,
    LONG *p);
void __RPC_STUB IHTMLDOMAttribute2_get_nodeType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute2_get_parentNode_Proxy(
    IHTMLDOMAttribute2* This,
    IHTMLDOMNode **p);
void __RPC_STUB IHTMLDOMAttribute2_get_parentNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute2_get_childNodes_Proxy(
    IHTMLDOMAttribute2* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMAttribute2_get_childNodes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute2_get_firstChild_Proxy(
    IHTMLDOMAttribute2* This,
    IHTMLDOMNode **p);
void __RPC_STUB IHTMLDOMAttribute2_get_firstChild_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute2_get_lastChild_Proxy(
    IHTMLDOMAttribute2* This,
    IHTMLDOMNode **p);
void __RPC_STUB IHTMLDOMAttribute2_get_lastChild_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute2_get_previousSibling_Proxy(
    IHTMLDOMAttribute2* This,
    IHTMLDOMNode **p);
void __RPC_STUB IHTMLDOMAttribute2_get_previousSibling_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute2_get_nextSibling_Proxy(
    IHTMLDOMAttribute2* This,
    IHTMLDOMNode **p);
void __RPC_STUB IHTMLDOMAttribute2_get_nextSibling_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute2_get_attributes_Proxy(
    IHTMLDOMAttribute2* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMAttribute2_get_attributes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute2_get_ownerDocument_Proxy(
    IHTMLDOMAttribute2* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMAttribute2_get_ownerDocument_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute2_insertBefore_Proxy(
    IHTMLDOMAttribute2* This,
    IHTMLDOMNode *newChild,
    VARIANT refChild,
    IHTMLDOMNode **node);
void __RPC_STUB IHTMLDOMAttribute2_insertBefore_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute2_replaceChild_Proxy(
    IHTMLDOMAttribute2* This,
    IHTMLDOMNode *newChild,
    IHTMLDOMNode *oldChild,
    IHTMLDOMNode **node);
void __RPC_STUB IHTMLDOMAttribute2_replaceChild_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute2_removeChild_Proxy(
    IHTMLDOMAttribute2* This,
    IHTMLDOMNode *oldChild,
    IHTMLDOMNode **node);
void __RPC_STUB IHTMLDOMAttribute2_removeChild_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute2_appendChild_Proxy(
    IHTMLDOMAttribute2* This,
    IHTMLDOMNode *newChild,
    IHTMLDOMNode **node);
void __RPC_STUB IHTMLDOMAttribute2_appendChild_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute2_hasChildNodes_Proxy(
    IHTMLDOMAttribute2* This,
    VARIANT_BOOL *fChildren);
void __RPC_STUB IHTMLDOMAttribute2_hasChildNodes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute2_cloneNode_Proxy(
    IHTMLDOMAttribute2* This,
    VARIANT_BOOL fDeep,
    IHTMLDOMAttribute **clonedNode);
void __RPC_STUB IHTMLDOMAttribute2_cloneNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDOMAttribute2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLDOMAttribute3 interface
 */
#ifndef __IHTMLDOMAttribute3_INTERFACE_DEFINED__
#define __IHTMLDOMAttribute3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDOMAttribute3, 0x30510468, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510468-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDOMAttribute3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_nodeValue(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_nodeValue(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_value(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_value(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_specified(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ownerElement(
        IHTMLElement2 **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDOMAttribute3, 0x30510468, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDOMAttribute3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLDOMAttribute3 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_nodeValue)(
        IHTMLDOMAttribute3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_nodeValue)(
        IHTMLDOMAttribute3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_value)(
        IHTMLDOMAttribute3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_value)(
        IHTMLDOMAttribute3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_specified)(
        IHTMLDOMAttribute3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_ownerElement)(
        IHTMLDOMAttribute3* This,
        IHTMLElement2 **p);

    END_INTERFACE
} IHTMLDOMAttribute3Vtbl;
interface IHTMLDOMAttribute3 {
    CONST_VTBL IHTMLDOMAttribute3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDOMAttribute3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDOMAttribute3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDOMAttribute3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDOMAttribute3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDOMAttribute3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDOMAttribute3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDOMAttribute3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDOMAttribute3 methods ***/
#define IHTMLDOMAttribute3_put_nodeValue(This,v) (This)->lpVtbl->put_nodeValue(This,v)
#define IHTMLDOMAttribute3_get_nodeValue(This,p) (This)->lpVtbl->get_nodeValue(This,p)
#define IHTMLDOMAttribute3_put_value(This,v) (This)->lpVtbl->put_value(This,v)
#define IHTMLDOMAttribute3_get_value(This,p) (This)->lpVtbl->get_value(This,p)
#define IHTMLDOMAttribute3_get_specified(This,p) (This)->lpVtbl->get_specified(This,p)
#define IHTMLDOMAttribute3_get_ownerElement(This,p) (This)->lpVtbl->get_ownerElement(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDOMAttribute3_QueryInterface(IHTMLDOMAttribute3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDOMAttribute3_AddRef(IHTMLDOMAttribute3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDOMAttribute3_Release(IHTMLDOMAttribute3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDOMAttribute3_GetTypeInfoCount(IHTMLDOMAttribute3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute3_GetTypeInfo(IHTMLDOMAttribute3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute3_GetIDsOfNames(IHTMLDOMAttribute3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute3_Invoke(IHTMLDOMAttribute3* 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);
}
/*** IHTMLDOMAttribute3 methods ***/
static FORCEINLINE HRESULT IHTMLDOMAttribute3_put_nodeValue(IHTMLDOMAttribute3* This,VARIANT v) {
    return This->lpVtbl->put_nodeValue(This,v);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute3_get_nodeValue(IHTMLDOMAttribute3* This,VARIANT *p) {
    return This->lpVtbl->get_nodeValue(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute3_put_value(IHTMLDOMAttribute3* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute3_get_value(IHTMLDOMAttribute3* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute3_get_specified(IHTMLDOMAttribute3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_specified(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute3_get_ownerElement(IHTMLDOMAttribute3* This,IHTMLElement2 **p) {
    return This->lpVtbl->get_ownerElement(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute3_put_nodeValue_Proxy(
    IHTMLDOMAttribute3* This,
    VARIANT v);
void __RPC_STUB IHTMLDOMAttribute3_put_nodeValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute3_get_nodeValue_Proxy(
    IHTMLDOMAttribute3* This,
    VARIANT *p);
void __RPC_STUB IHTMLDOMAttribute3_get_nodeValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute3_put_value_Proxy(
    IHTMLDOMAttribute3* This,
    BSTR v);
void __RPC_STUB IHTMLDOMAttribute3_put_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute3_get_value_Proxy(
    IHTMLDOMAttribute3* This,
    BSTR *p);
void __RPC_STUB IHTMLDOMAttribute3_get_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute3_get_specified_Proxy(
    IHTMLDOMAttribute3* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLDOMAttribute3_get_specified_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute3_get_ownerElement_Proxy(
    IHTMLDOMAttribute3* This,
    IHTMLElement2 **p);
void __RPC_STUB IHTMLDOMAttribute3_get_ownerElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDOMAttribute3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLDOMAttribute4 interface
 */
#ifndef __IHTMLDOMAttribute4_INTERFACE_DEFINED__
#define __IHTMLDOMAttribute4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDOMAttribute4, 0x305106f9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106f9-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDOMAttribute4 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_nodeValue(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_nodeValue(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_nodeName(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_value(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_value(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_firstChild(
        IHTMLDOMNode **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_lastChild(
        IHTMLDOMNode **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_childNodes(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE hasAttributes(
        VARIANT_BOOL *pfHasAttributes) = 0;

    virtual HRESULT STDMETHODCALLTYPE hasChildNodes(
        VARIANT_BOOL *fChildren) = 0;

    virtual HRESULT STDMETHODCALLTYPE normalize(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_specified(
        VARIANT_BOOL *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDOMAttribute4, 0x305106f9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDOMAttribute4Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLDOMAttribute4 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_nodeValue)(
        IHTMLDOMAttribute4* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_nodeValue)(
        IHTMLDOMAttribute4* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_nodeName)(
        IHTMLDOMAttribute4* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_name)(
        IHTMLDOMAttribute4* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_value)(
        IHTMLDOMAttribute4* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_value)(
        IHTMLDOMAttribute4* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_firstChild)(
        IHTMLDOMAttribute4* This,
        IHTMLDOMNode **p);

    HRESULT (STDMETHODCALLTYPE *get_lastChild)(
        IHTMLDOMAttribute4* This,
        IHTMLDOMNode **p);

    HRESULT (STDMETHODCALLTYPE *get_childNodes)(
        IHTMLDOMAttribute4* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *hasAttributes)(
        IHTMLDOMAttribute4* This,
        VARIANT_BOOL *pfHasAttributes);

    HRESULT (STDMETHODCALLTYPE *hasChildNodes)(
        IHTMLDOMAttribute4* This,
        VARIANT_BOOL *fChildren);

    HRESULT (STDMETHODCALLTYPE *normalize)(
        IHTMLDOMAttribute4* This);

    HRESULT (STDMETHODCALLTYPE *get_specified)(
        IHTMLDOMAttribute4* This,
        VARIANT_BOOL *p);

    END_INTERFACE
} IHTMLDOMAttribute4Vtbl;
interface IHTMLDOMAttribute4 {
    CONST_VTBL IHTMLDOMAttribute4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDOMAttribute4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDOMAttribute4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDOMAttribute4_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDOMAttribute4_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDOMAttribute4_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDOMAttribute4_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDOMAttribute4_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDOMAttribute4 methods ***/
#define IHTMLDOMAttribute4_put_nodeValue(This,v) (This)->lpVtbl->put_nodeValue(This,v)
#define IHTMLDOMAttribute4_get_nodeValue(This,p) (This)->lpVtbl->get_nodeValue(This,p)
#define IHTMLDOMAttribute4_get_nodeName(This,p) (This)->lpVtbl->get_nodeName(This,p)
#define IHTMLDOMAttribute4_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#define IHTMLDOMAttribute4_put_value(This,v) (This)->lpVtbl->put_value(This,v)
#define IHTMLDOMAttribute4_get_value(This,p) (This)->lpVtbl->get_value(This,p)
#define IHTMLDOMAttribute4_get_firstChild(This,p) (This)->lpVtbl->get_firstChild(This,p)
#define IHTMLDOMAttribute4_get_lastChild(This,p) (This)->lpVtbl->get_lastChild(This,p)
#define IHTMLDOMAttribute4_get_childNodes(This,p) (This)->lpVtbl->get_childNodes(This,p)
#define IHTMLDOMAttribute4_hasAttributes(This,pfHasAttributes) (This)->lpVtbl->hasAttributes(This,pfHasAttributes)
#define IHTMLDOMAttribute4_hasChildNodes(This,fChildren) (This)->lpVtbl->hasChildNodes(This,fChildren)
#define IHTMLDOMAttribute4_normalize(This) (This)->lpVtbl->normalize(This)
#define IHTMLDOMAttribute4_get_specified(This,p) (This)->lpVtbl->get_specified(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDOMAttribute4_QueryInterface(IHTMLDOMAttribute4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDOMAttribute4_AddRef(IHTMLDOMAttribute4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDOMAttribute4_Release(IHTMLDOMAttribute4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDOMAttribute4_GetTypeInfoCount(IHTMLDOMAttribute4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute4_GetTypeInfo(IHTMLDOMAttribute4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute4_GetIDsOfNames(IHTMLDOMAttribute4* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute4_Invoke(IHTMLDOMAttribute4* 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);
}
/*** IHTMLDOMAttribute4 methods ***/
static FORCEINLINE HRESULT IHTMLDOMAttribute4_put_nodeValue(IHTMLDOMAttribute4* This,VARIANT v) {
    return This->lpVtbl->put_nodeValue(This,v);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute4_get_nodeValue(IHTMLDOMAttribute4* This,VARIANT *p) {
    return This->lpVtbl->get_nodeValue(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute4_get_nodeName(IHTMLDOMAttribute4* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute4_get_name(IHTMLDOMAttribute4* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute4_put_value(IHTMLDOMAttribute4* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute4_get_value(IHTMLDOMAttribute4* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute4_get_firstChild(IHTMLDOMAttribute4* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_firstChild(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute4_get_lastChild(IHTMLDOMAttribute4* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_lastChild(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute4_get_childNodes(IHTMLDOMAttribute4* This,IDispatch **p) {
    return This->lpVtbl->get_childNodes(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute4_hasAttributes(IHTMLDOMAttribute4* This,VARIANT_BOOL *pfHasAttributes) {
    return This->lpVtbl->hasAttributes(This,pfHasAttributes);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute4_hasChildNodes(IHTMLDOMAttribute4* This,VARIANT_BOOL *fChildren) {
    return This->lpVtbl->hasChildNodes(This,fChildren);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute4_normalize(IHTMLDOMAttribute4* This) {
    return This->lpVtbl->normalize(This);
}
static FORCEINLINE HRESULT IHTMLDOMAttribute4_get_specified(IHTMLDOMAttribute4* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_specified(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute4_put_nodeValue_Proxy(
    IHTMLDOMAttribute4* This,
    VARIANT v);
void __RPC_STUB IHTMLDOMAttribute4_put_nodeValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute4_get_nodeValue_Proxy(
    IHTMLDOMAttribute4* This,
    VARIANT *p);
void __RPC_STUB IHTMLDOMAttribute4_get_nodeValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute4_get_nodeName_Proxy(
    IHTMLDOMAttribute4* This,
    BSTR *p);
void __RPC_STUB IHTMLDOMAttribute4_get_nodeName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute4_get_name_Proxy(
    IHTMLDOMAttribute4* This,
    BSTR *p);
void __RPC_STUB IHTMLDOMAttribute4_get_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute4_put_value_Proxy(
    IHTMLDOMAttribute4* This,
    BSTR v);
void __RPC_STUB IHTMLDOMAttribute4_put_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute4_get_value_Proxy(
    IHTMLDOMAttribute4* This,
    BSTR *p);
void __RPC_STUB IHTMLDOMAttribute4_get_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute4_get_firstChild_Proxy(
    IHTMLDOMAttribute4* This,
    IHTMLDOMNode **p);
void __RPC_STUB IHTMLDOMAttribute4_get_firstChild_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute4_get_lastChild_Proxy(
    IHTMLDOMAttribute4* This,
    IHTMLDOMNode **p);
void __RPC_STUB IHTMLDOMAttribute4_get_lastChild_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute4_get_childNodes_Proxy(
    IHTMLDOMAttribute4* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMAttribute4_get_childNodes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute4_hasAttributes_Proxy(
    IHTMLDOMAttribute4* This,
    VARIANT_BOOL *pfHasAttributes);
void __RPC_STUB IHTMLDOMAttribute4_hasAttributes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute4_hasChildNodes_Proxy(
    IHTMLDOMAttribute4* This,
    VARIANT_BOOL *fChildren);
void __RPC_STUB IHTMLDOMAttribute4_hasChildNodes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute4_normalize_Proxy(
    IHTMLDOMAttribute4* This);
void __RPC_STUB IHTMLDOMAttribute4_normalize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMAttribute4_get_specified_Proxy(
    IHTMLDOMAttribute4* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLDOMAttribute4_get_specified_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDOMAttribute4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLDOMTextNode interface
 */
#ifndef __IHTMLDOMTextNode_INTERFACE_DEFINED__
#define __IHTMLDOMTextNode_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDOMTextNode, 0x3050f4b1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f4b1-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDOMTextNode : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_data(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_data(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE toString(
        BSTR *String) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE splitText(
        LONG offset,
        IHTMLDOMNode **pRetNode) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDOMTextNode, 0x3050f4b1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDOMTextNodeVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLDOMTextNode methods ***/
    HRESULT (STDMETHODCALLTYPE *put_data)(
        IHTMLDOMTextNode* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_data)(
        IHTMLDOMTextNode* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *toString)(
        IHTMLDOMTextNode* This,
        BSTR *String);

    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLDOMTextNode* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *splitText)(
        IHTMLDOMTextNode* This,
        LONG offset,
        IHTMLDOMNode **pRetNode);

    END_INTERFACE
} IHTMLDOMTextNodeVtbl;
interface IHTMLDOMTextNode {
    CONST_VTBL IHTMLDOMTextNodeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDOMTextNode_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDOMTextNode_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDOMTextNode_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDOMTextNode_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDOMTextNode_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDOMTextNode_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDOMTextNode_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDOMTextNode methods ***/
#define IHTMLDOMTextNode_put_data(This,v) (This)->lpVtbl->put_data(This,v)
#define IHTMLDOMTextNode_get_data(This,p) (This)->lpVtbl->get_data(This,p)
#define IHTMLDOMTextNode_toString(This,String) (This)->lpVtbl->toString(This,String)
#define IHTMLDOMTextNode_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLDOMTextNode_splitText(This,offset,pRetNode) (This)->lpVtbl->splitText(This,offset,pRetNode)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDOMTextNode_QueryInterface(IHTMLDOMTextNode* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDOMTextNode_AddRef(IHTMLDOMTextNode* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDOMTextNode_Release(IHTMLDOMTextNode* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDOMTextNode_GetTypeInfoCount(IHTMLDOMTextNode* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDOMTextNode_GetTypeInfo(IHTMLDOMTextNode* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDOMTextNode_GetIDsOfNames(IHTMLDOMTextNode* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDOMTextNode_Invoke(IHTMLDOMTextNode* 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);
}
/*** IHTMLDOMTextNode methods ***/
static FORCEINLINE HRESULT IHTMLDOMTextNode_put_data(IHTMLDOMTextNode* This,BSTR v) {
    return This->lpVtbl->put_data(This,v);
}
static FORCEINLINE HRESULT IHTMLDOMTextNode_get_data(IHTMLDOMTextNode* This,BSTR *p) {
    return This->lpVtbl->get_data(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMTextNode_toString(IHTMLDOMTextNode* This,BSTR *String) {
    return This->lpVtbl->toString(This,String);
}
static FORCEINLINE HRESULT IHTMLDOMTextNode_get_length(IHTMLDOMTextNode* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMTextNode_splitText(IHTMLDOMTextNode* This,LONG offset,IHTMLDOMNode **pRetNode) {
    return This->lpVtbl->splitText(This,offset,pRetNode);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDOMTextNode_put_data_Proxy(
    IHTMLDOMTextNode* This,
    BSTR v);
void __RPC_STUB IHTMLDOMTextNode_put_data_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMTextNode_get_data_Proxy(
    IHTMLDOMTextNode* This,
    BSTR *p);
void __RPC_STUB IHTMLDOMTextNode_get_data_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMTextNode_toString_Proxy(
    IHTMLDOMTextNode* This,
    BSTR *String);
void __RPC_STUB IHTMLDOMTextNode_toString_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMTextNode_get_length_Proxy(
    IHTMLDOMTextNode* This,
    LONG *p);
void __RPC_STUB IHTMLDOMTextNode_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMTextNode_splitText_Proxy(
    IHTMLDOMTextNode* This,
    LONG offset,
    IHTMLDOMNode **pRetNode);
void __RPC_STUB IHTMLDOMTextNode_splitText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDOMTextNode_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLDOMTextNode2 interface
 */
#ifndef __IHTMLDOMTextNode2_INTERFACE_DEFINED__
#define __IHTMLDOMTextNode2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDOMTextNode2, 0x3050f809, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f809-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDOMTextNode2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE substringData(
        LONG offset,
        LONG Count,
        BSTR *pbstrsubString) = 0;

    virtual HRESULT STDMETHODCALLTYPE appendData(
        BSTR bstrstring) = 0;

    virtual HRESULT STDMETHODCALLTYPE insertData(
        LONG offset,
        BSTR bstrstring) = 0;

    virtual HRESULT STDMETHODCALLTYPE deleteData(
        LONG offset,
        LONG Count) = 0;

    virtual HRESULT STDMETHODCALLTYPE replaceData(
        LONG offset,
        LONG Count,
        BSTR bstrstring) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDOMTextNode2, 0x3050f809, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDOMTextNode2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLDOMTextNode2 methods ***/
    HRESULT (STDMETHODCALLTYPE *substringData)(
        IHTMLDOMTextNode2* This,
        LONG offset,
        LONG Count,
        BSTR *pbstrsubString);

    HRESULT (STDMETHODCALLTYPE *appendData)(
        IHTMLDOMTextNode2* This,
        BSTR bstrstring);

    HRESULT (STDMETHODCALLTYPE *insertData)(
        IHTMLDOMTextNode2* This,
        LONG offset,
        BSTR bstrstring);

    HRESULT (STDMETHODCALLTYPE *deleteData)(
        IHTMLDOMTextNode2* This,
        LONG offset,
        LONG Count);

    HRESULT (STDMETHODCALLTYPE *replaceData)(
        IHTMLDOMTextNode2* This,
        LONG offset,
        LONG Count,
        BSTR bstrstring);

    END_INTERFACE
} IHTMLDOMTextNode2Vtbl;
interface IHTMLDOMTextNode2 {
    CONST_VTBL IHTMLDOMTextNode2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDOMTextNode2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDOMTextNode2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDOMTextNode2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDOMTextNode2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDOMTextNode2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDOMTextNode2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDOMTextNode2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDOMTextNode2 methods ***/
#define IHTMLDOMTextNode2_substringData(This,offset,Count,pbstrsubString) (This)->lpVtbl->substringData(This,offset,Count,pbstrsubString)
#define IHTMLDOMTextNode2_appendData(This,bstrstring) (This)->lpVtbl->appendData(This,bstrstring)
#define IHTMLDOMTextNode2_insertData(This,offset,bstrstring) (This)->lpVtbl->insertData(This,offset,bstrstring)
#define IHTMLDOMTextNode2_deleteData(This,offset,Count) (This)->lpVtbl->deleteData(This,offset,Count)
#define IHTMLDOMTextNode2_replaceData(This,offset,Count,bstrstring) (This)->lpVtbl->replaceData(This,offset,Count,bstrstring)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDOMTextNode2_QueryInterface(IHTMLDOMTextNode2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDOMTextNode2_AddRef(IHTMLDOMTextNode2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDOMTextNode2_Release(IHTMLDOMTextNode2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDOMTextNode2_GetTypeInfoCount(IHTMLDOMTextNode2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDOMTextNode2_GetTypeInfo(IHTMLDOMTextNode2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDOMTextNode2_GetIDsOfNames(IHTMLDOMTextNode2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDOMTextNode2_Invoke(IHTMLDOMTextNode2* 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);
}
/*** IHTMLDOMTextNode2 methods ***/
static FORCEINLINE HRESULT IHTMLDOMTextNode2_substringData(IHTMLDOMTextNode2* This,LONG offset,LONG Count,BSTR *pbstrsubString) {
    return This->lpVtbl->substringData(This,offset,Count,pbstrsubString);
}
static FORCEINLINE HRESULT IHTMLDOMTextNode2_appendData(IHTMLDOMTextNode2* This,BSTR bstrstring) {
    return This->lpVtbl->appendData(This,bstrstring);
}
static FORCEINLINE HRESULT IHTMLDOMTextNode2_insertData(IHTMLDOMTextNode2* This,LONG offset,BSTR bstrstring) {
    return This->lpVtbl->insertData(This,offset,bstrstring);
}
static FORCEINLINE HRESULT IHTMLDOMTextNode2_deleteData(IHTMLDOMTextNode2* This,LONG offset,LONG Count) {
    return This->lpVtbl->deleteData(This,offset,Count);
}
static FORCEINLINE HRESULT IHTMLDOMTextNode2_replaceData(IHTMLDOMTextNode2* This,LONG offset,LONG Count,BSTR bstrstring) {
    return This->lpVtbl->replaceData(This,offset,Count,bstrstring);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDOMTextNode2_substringData_Proxy(
    IHTMLDOMTextNode2* This,
    LONG offset,
    LONG Count,
    BSTR *pbstrsubString);
void __RPC_STUB IHTMLDOMTextNode2_substringData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMTextNode2_appendData_Proxy(
    IHTMLDOMTextNode2* This,
    BSTR bstrstring);
void __RPC_STUB IHTMLDOMTextNode2_appendData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMTextNode2_insertData_Proxy(
    IHTMLDOMTextNode2* This,
    LONG offset,
    BSTR bstrstring);
void __RPC_STUB IHTMLDOMTextNode2_insertData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMTextNode2_deleteData_Proxy(
    IHTMLDOMTextNode2* This,
    LONG offset,
    LONG Count);
void __RPC_STUB IHTMLDOMTextNode2_deleteData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMTextNode2_replaceData_Proxy(
    IHTMLDOMTextNode2* This,
    LONG offset,
    LONG Count,
    BSTR bstrstring);
void __RPC_STUB IHTMLDOMTextNode2_replaceData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDOMTextNode2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLDOMTextNode3 interface
 */
#ifndef __IHTMLDOMTextNode3_INTERFACE_DEFINED__
#define __IHTMLDOMTextNode3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDOMTextNode3, 0x3051073e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051073e-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDOMTextNode3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE substringData(
        LONG offset,
        LONG Count,
        BSTR *pbstrsubString) = 0;

    virtual HRESULT STDMETHODCALLTYPE insertData(
        LONG offset,
        BSTR bstrstring) = 0;

    virtual HRESULT STDMETHODCALLTYPE deleteData(
        LONG offset,
        LONG Count) = 0;

    virtual HRESULT STDMETHODCALLTYPE replaceData(
        LONG offset,
        LONG Count,
        BSTR bstrstring) = 0;

    virtual HRESULT STDMETHODCALLTYPE splitText(
        LONG offset,
        IHTMLDOMNode **pRetNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_wholeText(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE replaceWholeText(
        BSTR bstrText,
        IHTMLDOMNode **ppRetNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE hasAttributes(
        VARIANT_BOOL *pfHasAttributes) = 0;

    virtual HRESULT STDMETHODCALLTYPE normalize(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDOMTextNode3, 0x3051073e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDOMTextNode3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLDOMTextNode3 methods ***/
    HRESULT (STDMETHODCALLTYPE *substringData)(
        IHTMLDOMTextNode3* This,
        LONG offset,
        LONG Count,
        BSTR *pbstrsubString);

    HRESULT (STDMETHODCALLTYPE *insertData)(
        IHTMLDOMTextNode3* This,
        LONG offset,
        BSTR bstrstring);

    HRESULT (STDMETHODCALLTYPE *deleteData)(
        IHTMLDOMTextNode3* This,
        LONG offset,
        LONG Count);

    HRESULT (STDMETHODCALLTYPE *replaceData)(
        IHTMLDOMTextNode3* This,
        LONG offset,
        LONG Count,
        BSTR bstrstring);

    HRESULT (STDMETHODCALLTYPE *splitText)(
        IHTMLDOMTextNode3* This,
        LONG offset,
        IHTMLDOMNode **pRetNode);

    HRESULT (STDMETHODCALLTYPE *get_wholeText)(
        IHTMLDOMTextNode3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *replaceWholeText)(
        IHTMLDOMTextNode3* This,
        BSTR bstrText,
        IHTMLDOMNode **ppRetNode);

    HRESULT (STDMETHODCALLTYPE *hasAttributes)(
        IHTMLDOMTextNode3* This,
        VARIANT_BOOL *pfHasAttributes);

    HRESULT (STDMETHODCALLTYPE *normalize)(
        IHTMLDOMTextNode3* This);

    END_INTERFACE
} IHTMLDOMTextNode3Vtbl;
interface IHTMLDOMTextNode3 {
    CONST_VTBL IHTMLDOMTextNode3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDOMTextNode3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDOMTextNode3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDOMTextNode3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDOMTextNode3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDOMTextNode3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDOMTextNode3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDOMTextNode3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDOMTextNode3 methods ***/
#define IHTMLDOMTextNode3_substringData(This,offset,Count,pbstrsubString) (This)->lpVtbl->substringData(This,offset,Count,pbstrsubString)
#define IHTMLDOMTextNode3_insertData(This,offset,bstrstring) (This)->lpVtbl->insertData(This,offset,bstrstring)
#define IHTMLDOMTextNode3_deleteData(This,offset,Count) (This)->lpVtbl->deleteData(This,offset,Count)
#define IHTMLDOMTextNode3_replaceData(This,offset,Count,bstrstring) (This)->lpVtbl->replaceData(This,offset,Count,bstrstring)
#define IHTMLDOMTextNode3_splitText(This,offset,pRetNode) (This)->lpVtbl->splitText(This,offset,pRetNode)
#define IHTMLDOMTextNode3_get_wholeText(This,p) (This)->lpVtbl->get_wholeText(This,p)
#define IHTMLDOMTextNode3_replaceWholeText(This,bstrText,ppRetNode) (This)->lpVtbl->replaceWholeText(This,bstrText,ppRetNode)
#define IHTMLDOMTextNode3_hasAttributes(This,pfHasAttributes) (This)->lpVtbl->hasAttributes(This,pfHasAttributes)
#define IHTMLDOMTextNode3_normalize(This) (This)->lpVtbl->normalize(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDOMTextNode3_QueryInterface(IHTMLDOMTextNode3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDOMTextNode3_AddRef(IHTMLDOMTextNode3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDOMTextNode3_Release(IHTMLDOMTextNode3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDOMTextNode3_GetTypeInfoCount(IHTMLDOMTextNode3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDOMTextNode3_GetTypeInfo(IHTMLDOMTextNode3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDOMTextNode3_GetIDsOfNames(IHTMLDOMTextNode3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDOMTextNode3_Invoke(IHTMLDOMTextNode3* 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);
}
/*** IHTMLDOMTextNode3 methods ***/
static FORCEINLINE HRESULT IHTMLDOMTextNode3_substringData(IHTMLDOMTextNode3* This,LONG offset,LONG Count,BSTR *pbstrsubString) {
    return This->lpVtbl->substringData(This,offset,Count,pbstrsubString);
}
static FORCEINLINE HRESULT IHTMLDOMTextNode3_insertData(IHTMLDOMTextNode3* This,LONG offset,BSTR bstrstring) {
    return This->lpVtbl->insertData(This,offset,bstrstring);
}
static FORCEINLINE HRESULT IHTMLDOMTextNode3_deleteData(IHTMLDOMTextNode3* This,LONG offset,LONG Count) {
    return This->lpVtbl->deleteData(This,offset,Count);
}
static FORCEINLINE HRESULT IHTMLDOMTextNode3_replaceData(IHTMLDOMTextNode3* This,LONG offset,LONG Count,BSTR bstrstring) {
    return This->lpVtbl->replaceData(This,offset,Count,bstrstring);
}
static FORCEINLINE HRESULT IHTMLDOMTextNode3_splitText(IHTMLDOMTextNode3* This,LONG offset,IHTMLDOMNode **pRetNode) {
    return This->lpVtbl->splitText(This,offset,pRetNode);
}
static FORCEINLINE HRESULT IHTMLDOMTextNode3_get_wholeText(IHTMLDOMTextNode3* This,BSTR *p) {
    return This->lpVtbl->get_wholeText(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMTextNode3_replaceWholeText(IHTMLDOMTextNode3* This,BSTR bstrText,IHTMLDOMNode **ppRetNode) {
    return This->lpVtbl->replaceWholeText(This,bstrText,ppRetNode);
}
static FORCEINLINE HRESULT IHTMLDOMTextNode3_hasAttributes(IHTMLDOMTextNode3* This,VARIANT_BOOL *pfHasAttributes) {
    return This->lpVtbl->hasAttributes(This,pfHasAttributes);
}
static FORCEINLINE HRESULT IHTMLDOMTextNode3_normalize(IHTMLDOMTextNode3* This) {
    return This->lpVtbl->normalize(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDOMTextNode3_substringData_Proxy(
    IHTMLDOMTextNode3* This,
    LONG offset,
    LONG Count,
    BSTR *pbstrsubString);
void __RPC_STUB IHTMLDOMTextNode3_substringData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMTextNode3_insertData_Proxy(
    IHTMLDOMTextNode3* This,
    LONG offset,
    BSTR bstrstring);
void __RPC_STUB IHTMLDOMTextNode3_insertData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMTextNode3_deleteData_Proxy(
    IHTMLDOMTextNode3* This,
    LONG offset,
    LONG Count);
void __RPC_STUB IHTMLDOMTextNode3_deleteData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMTextNode3_replaceData_Proxy(
    IHTMLDOMTextNode3* This,
    LONG offset,
    LONG Count,
    BSTR bstrstring);
void __RPC_STUB IHTMLDOMTextNode3_replaceData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMTextNode3_splitText_Proxy(
    IHTMLDOMTextNode3* This,
    LONG offset,
    IHTMLDOMNode **pRetNode);
void __RPC_STUB IHTMLDOMTextNode3_splitText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMTextNode3_get_wholeText_Proxy(
    IHTMLDOMTextNode3* This,
    BSTR *p);
void __RPC_STUB IHTMLDOMTextNode3_get_wholeText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMTextNode3_replaceWholeText_Proxy(
    IHTMLDOMTextNode3* This,
    BSTR bstrText,
    IHTMLDOMNode **ppRetNode);
void __RPC_STUB IHTMLDOMTextNode3_replaceWholeText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMTextNode3_hasAttributes_Proxy(
    IHTMLDOMTextNode3* This,
    VARIANT_BOOL *pfHasAttributes);
void __RPC_STUB IHTMLDOMTextNode3_hasAttributes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMTextNode3_normalize_Proxy(
    IHTMLDOMTextNode3* This);
void __RPC_STUB IHTMLDOMTextNode3_normalize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDOMTextNode3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLDOMImplementation interface
 */
#ifndef __IHTMLDOMImplementation_INTERFACE_DEFINED__
#define __IHTMLDOMImplementation_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDOMImplementation, 0x3050f80d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f80d-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDOMImplementation : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE hasFeature(
        BSTR bstrfeature,
        VARIANT version,
        VARIANT_BOOL *pfHasFeature) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDOMImplementation, 0x3050f80d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDOMImplementationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLDOMImplementation methods ***/
    HRESULT (STDMETHODCALLTYPE *hasFeature)(
        IHTMLDOMImplementation* This,
        BSTR bstrfeature,
        VARIANT version,
        VARIANT_BOOL *pfHasFeature);

    END_INTERFACE
} IHTMLDOMImplementationVtbl;
interface IHTMLDOMImplementation {
    CONST_VTBL IHTMLDOMImplementationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDOMImplementation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDOMImplementation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDOMImplementation_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDOMImplementation_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDOMImplementation_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDOMImplementation_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDOMImplementation_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDOMImplementation methods ***/
#define IHTMLDOMImplementation_hasFeature(This,bstrfeature,version,pfHasFeature) (This)->lpVtbl->hasFeature(This,bstrfeature,version,pfHasFeature)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDOMImplementation_QueryInterface(IHTMLDOMImplementation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDOMImplementation_AddRef(IHTMLDOMImplementation* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDOMImplementation_Release(IHTMLDOMImplementation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDOMImplementation_GetTypeInfoCount(IHTMLDOMImplementation* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDOMImplementation_GetTypeInfo(IHTMLDOMImplementation* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDOMImplementation_GetIDsOfNames(IHTMLDOMImplementation* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDOMImplementation_Invoke(IHTMLDOMImplementation* 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);
}
/*** IHTMLDOMImplementation methods ***/
static FORCEINLINE HRESULT IHTMLDOMImplementation_hasFeature(IHTMLDOMImplementation* This,BSTR bstrfeature,VARIANT version,VARIANT_BOOL *pfHasFeature) {
    return This->lpVtbl->hasFeature(This,bstrfeature,version,pfHasFeature);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDOMImplementation_hasFeature_Proxy(
    IHTMLDOMImplementation* This,
    BSTR bstrfeature,
    VARIANT version,
    VARIANT_BOOL *pfHasFeature);
void __RPC_STUB IHTMLDOMImplementation_hasFeature_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDOMImplementation_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLDOMImplementation2 interface
 */
#ifndef __IHTMLDOMImplementation2_INTERFACE_DEFINED__
#define __IHTMLDOMImplementation2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDOMImplementation2, 0x3051073c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051073c-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDOMImplementation2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE createDocumentType(
        BSTR bstrQualifiedName,
        VARIANT *pvarPublicId,
        VARIANT *pvarSystemId,
        IDOMDocumentType **newDocumentType) = 0;

    virtual HRESULT STDMETHODCALLTYPE createDocument(
        VARIANT *pvarNS,
        VARIANT *pvarTagName,
        IDOMDocumentType *pDocumentType,
        IHTMLDocument7 **ppnewDocument) = 0;

    virtual HRESULT STDMETHODCALLTYPE createHTMLDocument(
        BSTR bstrTitle,
        IHTMLDocument7 **ppnewDocument) = 0;

    virtual HRESULT STDMETHODCALLTYPE hasFeature(
        BSTR bstrfeature,
        VARIANT version,
        VARIANT_BOOL *pfHasFeature) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDOMImplementation2, 0x3051073c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDOMImplementation2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLDOMImplementation2 methods ***/
    HRESULT (STDMETHODCALLTYPE *createDocumentType)(
        IHTMLDOMImplementation2* This,
        BSTR bstrQualifiedName,
        VARIANT *pvarPublicId,
        VARIANT *pvarSystemId,
        IDOMDocumentType **newDocumentType);

    HRESULT (STDMETHODCALLTYPE *createDocument)(
        IHTMLDOMImplementation2* This,
        VARIANT *pvarNS,
        VARIANT *pvarTagName,
        IDOMDocumentType *pDocumentType,
        IHTMLDocument7 **ppnewDocument);

    HRESULT (STDMETHODCALLTYPE *createHTMLDocument)(
        IHTMLDOMImplementation2* This,
        BSTR bstrTitle,
        IHTMLDocument7 **ppnewDocument);

    HRESULT (STDMETHODCALLTYPE *hasFeature)(
        IHTMLDOMImplementation2* This,
        BSTR bstrfeature,
        VARIANT version,
        VARIANT_BOOL *pfHasFeature);

    END_INTERFACE
} IHTMLDOMImplementation2Vtbl;
interface IHTMLDOMImplementation2 {
    CONST_VTBL IHTMLDOMImplementation2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDOMImplementation2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDOMImplementation2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDOMImplementation2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDOMImplementation2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDOMImplementation2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDOMImplementation2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDOMImplementation2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDOMImplementation2 methods ***/
#define IHTMLDOMImplementation2_createDocumentType(This,bstrQualifiedName,pvarPublicId,pvarSystemId,newDocumentType) (This)->lpVtbl->createDocumentType(This,bstrQualifiedName,pvarPublicId,pvarSystemId,newDocumentType)
#define IHTMLDOMImplementation2_createDocument(This,pvarNS,pvarTagName,pDocumentType,ppnewDocument) (This)->lpVtbl->createDocument(This,pvarNS,pvarTagName,pDocumentType,ppnewDocument)
#define IHTMLDOMImplementation2_createHTMLDocument(This,bstrTitle,ppnewDocument) (This)->lpVtbl->createHTMLDocument(This,bstrTitle,ppnewDocument)
#define IHTMLDOMImplementation2_hasFeature(This,bstrfeature,version,pfHasFeature) (This)->lpVtbl->hasFeature(This,bstrfeature,version,pfHasFeature)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDOMImplementation2_QueryInterface(IHTMLDOMImplementation2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDOMImplementation2_AddRef(IHTMLDOMImplementation2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDOMImplementation2_Release(IHTMLDOMImplementation2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDOMImplementation2_GetTypeInfoCount(IHTMLDOMImplementation2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDOMImplementation2_GetTypeInfo(IHTMLDOMImplementation2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDOMImplementation2_GetIDsOfNames(IHTMLDOMImplementation2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDOMImplementation2_Invoke(IHTMLDOMImplementation2* 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);
}
/*** IHTMLDOMImplementation2 methods ***/
static FORCEINLINE HRESULT IHTMLDOMImplementation2_createDocumentType(IHTMLDOMImplementation2* This,BSTR bstrQualifiedName,VARIANT *pvarPublicId,VARIANT *pvarSystemId,IDOMDocumentType **newDocumentType) {
    return This->lpVtbl->createDocumentType(This,bstrQualifiedName,pvarPublicId,pvarSystemId,newDocumentType);
}
static FORCEINLINE HRESULT IHTMLDOMImplementation2_createDocument(IHTMLDOMImplementation2* This,VARIANT *pvarNS,VARIANT *pvarTagName,IDOMDocumentType *pDocumentType,IHTMLDocument7 **ppnewDocument) {
    return This->lpVtbl->createDocument(This,pvarNS,pvarTagName,pDocumentType,ppnewDocument);
}
static FORCEINLINE HRESULT IHTMLDOMImplementation2_createHTMLDocument(IHTMLDOMImplementation2* This,BSTR bstrTitle,IHTMLDocument7 **ppnewDocument) {
    return This->lpVtbl->createHTMLDocument(This,bstrTitle,ppnewDocument);
}
static FORCEINLINE HRESULT IHTMLDOMImplementation2_hasFeature(IHTMLDOMImplementation2* This,BSTR bstrfeature,VARIANT version,VARIANT_BOOL *pfHasFeature) {
    return This->lpVtbl->hasFeature(This,bstrfeature,version,pfHasFeature);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDOMImplementation2_createDocumentType_Proxy(
    IHTMLDOMImplementation2* This,
    BSTR bstrQualifiedName,
    VARIANT *pvarPublicId,
    VARIANT *pvarSystemId,
    IDOMDocumentType **newDocumentType);
void __RPC_STUB IHTMLDOMImplementation2_createDocumentType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMImplementation2_createDocument_Proxy(
    IHTMLDOMImplementation2* This,
    VARIANT *pvarNS,
    VARIANT *pvarTagName,
    IDOMDocumentType *pDocumentType,
    IHTMLDocument7 **ppnewDocument);
void __RPC_STUB IHTMLDOMImplementation2_createDocument_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMImplementation2_createHTMLDocument_Proxy(
    IHTMLDOMImplementation2* This,
    BSTR bstrTitle,
    IHTMLDocument7 **ppnewDocument);
void __RPC_STUB IHTMLDOMImplementation2_createHTMLDocument_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMImplementation2_hasFeature_Proxy(
    IHTMLDOMImplementation2* This,
    BSTR bstrfeature,
    VARIANT version,
    VARIANT_BOOL *pfHasFeature);
void __RPC_STUB IHTMLDOMImplementation2_hasFeature_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDOMImplementation2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLDOMAttribute dispinterface
 */
#ifndef __DispHTMLDOMAttribute_DISPINTERFACE_DEFINED__
#define __DispHTMLDOMAttribute_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLDOMAttribute, 0x3050f564, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f564-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLDOMAttribute : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLDOMAttribute, 0x3050f564, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLDOMAttributeVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} DispHTMLDOMAttributeVtbl;
interface DispHTMLDOMAttribute {
    CONST_VTBL DispHTMLDOMAttributeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLDOMAttribute_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLDOMAttribute_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLDOMAttribute_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLDOMAttribute_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLDOMAttribute_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLDOMAttribute_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLDOMAttribute_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 DispHTMLDOMAttribute_QueryInterface(DispHTMLDOMAttribute* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLDOMAttribute_AddRef(DispHTMLDOMAttribute* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLDOMAttribute_Release(DispHTMLDOMAttribute* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLDOMAttribute_GetTypeInfoCount(DispHTMLDOMAttribute* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLDOMAttribute_GetTypeInfo(DispHTMLDOMAttribute* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLDOMAttribute_GetIDsOfNames(DispHTMLDOMAttribute* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLDOMAttribute_Invoke(DispHTMLDOMAttribute* 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  /* __DispHTMLDOMAttribute_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLDOMAttribute coclass
 */

DEFINE_GUID(CLSID_HTMLDOMAttribute, 0x3050f4b2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f4b2-98b5-11cf-bb82-00aa00bdce0b") HTMLDOMAttribute;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLDOMAttribute, 0x3050f4b2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CAttribute;
/*****************************************************************************
 * DispHTMLDOMTextNode dispinterface
 */
#ifndef __DispHTMLDOMTextNode_DISPINTERFACE_DEFINED__
#define __DispHTMLDOMTextNode_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLDOMTextNode, 0x3050f565, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f565-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLDOMTextNode : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLDOMTextNode, 0x3050f565, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLDOMTextNodeVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} DispHTMLDOMTextNodeVtbl;
interface DispHTMLDOMTextNode {
    CONST_VTBL DispHTMLDOMTextNodeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLDOMTextNode_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLDOMTextNode_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLDOMTextNode_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLDOMTextNode_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLDOMTextNode_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLDOMTextNode_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLDOMTextNode_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 DispHTMLDOMTextNode_QueryInterface(DispHTMLDOMTextNode* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLDOMTextNode_AddRef(DispHTMLDOMTextNode* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLDOMTextNode_Release(DispHTMLDOMTextNode* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLDOMTextNode_GetTypeInfoCount(DispHTMLDOMTextNode* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLDOMTextNode_GetTypeInfo(DispHTMLDOMTextNode* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLDOMTextNode_GetIDsOfNames(DispHTMLDOMTextNode* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLDOMTextNode_Invoke(DispHTMLDOMTextNode* 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  /* __DispHTMLDOMTextNode_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLDOMTextNode coclass
 */

DEFINE_GUID(CLSID_HTMLDOMTextNode, 0x3050f4ba, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f4ba-98b5-11cf-bb82-00aa00bdce0b") HTMLDOMTextNode;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLDOMTextNode, 0x3050f4ba, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDOMTextNode;
/*****************************************************************************
 * DispHTMLDOMImplementation dispinterface
 */
#ifndef __DispHTMLDOMImplementation_DISPINTERFACE_DEFINED__
#define __DispHTMLDOMImplementation_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLDOMImplementation, 0x3050f58f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f58f-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLDOMImplementation : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLDOMImplementation, 0x3050f58f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLDOMImplementationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} DispHTMLDOMImplementationVtbl;
interface DispHTMLDOMImplementation {
    CONST_VTBL DispHTMLDOMImplementationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLDOMImplementation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLDOMImplementation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLDOMImplementation_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLDOMImplementation_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLDOMImplementation_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLDOMImplementation_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLDOMImplementation_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 DispHTMLDOMImplementation_QueryInterface(DispHTMLDOMImplementation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLDOMImplementation_AddRef(DispHTMLDOMImplementation* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLDOMImplementation_Release(DispHTMLDOMImplementation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLDOMImplementation_GetTypeInfoCount(DispHTMLDOMImplementation* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLDOMImplementation_GetTypeInfo(DispHTMLDOMImplementation* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLDOMImplementation_GetIDsOfNames(DispHTMLDOMImplementation* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLDOMImplementation_Invoke(DispHTMLDOMImplementation* 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  /* __DispHTMLDOMImplementation_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLDOMImplementation coclass
 */

DEFINE_GUID(CLSID_HTMLDOMImplementation, 0x3050f80e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f80e-98b5-11cf-bb82-00aa00bdce0b") HTMLDOMImplementation;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLDOMImplementation, 0x3050f80e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDOMImplementation;
/*****************************************************************************
 * IHTMLAttributeCollection interface
 */
#ifndef __IHTMLAttributeCollection_INTERFACE_DEFINED__
#define __IHTMLAttributeCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLAttributeCollection, 0x3050f4c3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f4c3-98b5-11cf-bb82-00aa00bdce0b")
IHTMLAttributeCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__newEnum(
        IUnknown **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE item(
        VARIANT *name,
        IDispatch **pdisp) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLAttributeCollection, 0x3050f4c3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLAttributeCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLAttributeCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLAttributeCollection* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get__newEnum)(
        IHTMLAttributeCollection* This,
        IUnknown **p);

    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLAttributeCollection* This,
        VARIANT *name,
        IDispatch **pdisp);

    END_INTERFACE
} IHTMLAttributeCollectionVtbl;
interface IHTMLAttributeCollection {
    CONST_VTBL IHTMLAttributeCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLAttributeCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLAttributeCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLAttributeCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLAttributeCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLAttributeCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLAttributeCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLAttributeCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLAttributeCollection methods ***/
#define IHTMLAttributeCollection_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLAttributeCollection_get__newEnum(This,p) (This)->lpVtbl->get__newEnum(This,p)
#define IHTMLAttributeCollection_item(This,name,pdisp) (This)->lpVtbl->item(This,name,pdisp)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLAttributeCollection_QueryInterface(IHTMLAttributeCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLAttributeCollection_AddRef(IHTMLAttributeCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLAttributeCollection_Release(IHTMLAttributeCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLAttributeCollection_GetTypeInfoCount(IHTMLAttributeCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLAttributeCollection_GetTypeInfo(IHTMLAttributeCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLAttributeCollection_GetIDsOfNames(IHTMLAttributeCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLAttributeCollection_Invoke(IHTMLAttributeCollection* 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);
}
/*** IHTMLAttributeCollection methods ***/
static FORCEINLINE HRESULT IHTMLAttributeCollection_get_length(IHTMLAttributeCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IHTMLAttributeCollection_get__newEnum(IHTMLAttributeCollection* This,IUnknown **p) {
    return This->lpVtbl->get__newEnum(This,p);
}
static FORCEINLINE HRESULT IHTMLAttributeCollection_item(IHTMLAttributeCollection* This,VARIANT *name,IDispatch **pdisp) {
    return This->lpVtbl->item(This,name,pdisp);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLAttributeCollection_get_length_Proxy(
    IHTMLAttributeCollection* This,
    LONG *p);
void __RPC_STUB IHTMLAttributeCollection_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAttributeCollection_get__newEnum_Proxy(
    IHTMLAttributeCollection* This,
    IUnknown **p);
void __RPC_STUB IHTMLAttributeCollection_get__newEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAttributeCollection_item_Proxy(
    IHTMLAttributeCollection* This,
    VARIANT *name,
    IDispatch **pdisp);
void __RPC_STUB IHTMLAttributeCollection_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLAttributeCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLAttributeCollection2 interface
 */
#ifndef __IHTMLAttributeCollection2_INTERFACE_DEFINED__
#define __IHTMLAttributeCollection2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLAttributeCollection2, 0x3050f80a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f80a-98b5-11cf-bb82-00aa00bdce0b")
IHTMLAttributeCollection2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE getNamedItem(
        BSTR bstrName,
        IHTMLDOMAttribute **newretNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE setNamedItem(
        IHTMLDOMAttribute *ppNode,
        IHTMLDOMAttribute **newretNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeNamedItem(
        BSTR bstrName,
        IHTMLDOMAttribute **newretNode) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLAttributeCollection2, 0x3050f80a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLAttributeCollection2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLAttributeCollection2 methods ***/
    HRESULT (STDMETHODCALLTYPE *getNamedItem)(
        IHTMLAttributeCollection2* This,
        BSTR bstrName,
        IHTMLDOMAttribute **newretNode);

    HRESULT (STDMETHODCALLTYPE *setNamedItem)(
        IHTMLAttributeCollection2* This,
        IHTMLDOMAttribute *ppNode,
        IHTMLDOMAttribute **newretNode);

    HRESULT (STDMETHODCALLTYPE *removeNamedItem)(
        IHTMLAttributeCollection2* This,
        BSTR bstrName,
        IHTMLDOMAttribute **newretNode);

    END_INTERFACE
} IHTMLAttributeCollection2Vtbl;
interface IHTMLAttributeCollection2 {
    CONST_VTBL IHTMLAttributeCollection2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLAttributeCollection2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLAttributeCollection2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLAttributeCollection2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLAttributeCollection2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLAttributeCollection2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLAttributeCollection2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLAttributeCollection2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLAttributeCollection2 methods ***/
#define IHTMLAttributeCollection2_getNamedItem(This,bstrName,newretNode) (This)->lpVtbl->getNamedItem(This,bstrName,newretNode)
#define IHTMLAttributeCollection2_setNamedItem(This,ppNode,newretNode) (This)->lpVtbl->setNamedItem(This,ppNode,newretNode)
#define IHTMLAttributeCollection2_removeNamedItem(This,bstrName,newretNode) (This)->lpVtbl->removeNamedItem(This,bstrName,newretNode)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLAttributeCollection2_QueryInterface(IHTMLAttributeCollection2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLAttributeCollection2_AddRef(IHTMLAttributeCollection2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLAttributeCollection2_Release(IHTMLAttributeCollection2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLAttributeCollection2_GetTypeInfoCount(IHTMLAttributeCollection2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLAttributeCollection2_GetTypeInfo(IHTMLAttributeCollection2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLAttributeCollection2_GetIDsOfNames(IHTMLAttributeCollection2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLAttributeCollection2_Invoke(IHTMLAttributeCollection2* 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);
}
/*** IHTMLAttributeCollection2 methods ***/
static FORCEINLINE HRESULT IHTMLAttributeCollection2_getNamedItem(IHTMLAttributeCollection2* This,BSTR bstrName,IHTMLDOMAttribute **newretNode) {
    return This->lpVtbl->getNamedItem(This,bstrName,newretNode);
}
static FORCEINLINE HRESULT IHTMLAttributeCollection2_setNamedItem(IHTMLAttributeCollection2* This,IHTMLDOMAttribute *ppNode,IHTMLDOMAttribute **newretNode) {
    return This->lpVtbl->setNamedItem(This,ppNode,newretNode);
}
static FORCEINLINE HRESULT IHTMLAttributeCollection2_removeNamedItem(IHTMLAttributeCollection2* This,BSTR bstrName,IHTMLDOMAttribute **newretNode) {
    return This->lpVtbl->removeNamedItem(This,bstrName,newretNode);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLAttributeCollection2_getNamedItem_Proxy(
    IHTMLAttributeCollection2* This,
    BSTR bstrName,
    IHTMLDOMAttribute **newretNode);
void __RPC_STUB IHTMLAttributeCollection2_getNamedItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAttributeCollection2_setNamedItem_Proxy(
    IHTMLAttributeCollection2* This,
    IHTMLDOMAttribute *ppNode,
    IHTMLDOMAttribute **newretNode);
void __RPC_STUB IHTMLAttributeCollection2_setNamedItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAttributeCollection2_removeNamedItem_Proxy(
    IHTMLAttributeCollection2* This,
    BSTR bstrName,
    IHTMLDOMAttribute **newretNode);
void __RPC_STUB IHTMLAttributeCollection2_removeNamedItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLAttributeCollection2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLAttributeCollection3 interface
 */
#ifndef __IHTMLAttributeCollection3_INTERFACE_DEFINED__
#define __IHTMLAttributeCollection3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLAttributeCollection3, 0x30510469, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510469-98b5-11cf-bb82-00aa00bdce0b")
IHTMLAttributeCollection3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE getNamedItem(
        BSTR bstrName,
        IHTMLDOMAttribute **ppNodeOut) = 0;

    virtual HRESULT STDMETHODCALLTYPE setNamedItem(
        IHTMLDOMAttribute *pNodeIn,
        IHTMLDOMAttribute **ppNodeOut) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeNamedItem(
        BSTR bstrName,
        IHTMLDOMAttribute **ppNodeOut) = 0;

    virtual HRESULT STDMETHODCALLTYPE item(
        LONG index,
        IHTMLDOMAttribute **ppNodeOut) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLAttributeCollection3, 0x30510469, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLAttributeCollection3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLAttributeCollection3 methods ***/
    HRESULT (STDMETHODCALLTYPE *getNamedItem)(
        IHTMLAttributeCollection3* This,
        BSTR bstrName,
        IHTMLDOMAttribute **ppNodeOut);

    HRESULT (STDMETHODCALLTYPE *setNamedItem)(
        IHTMLAttributeCollection3* This,
        IHTMLDOMAttribute *pNodeIn,
        IHTMLDOMAttribute **ppNodeOut);

    HRESULT (STDMETHODCALLTYPE *removeNamedItem)(
        IHTMLAttributeCollection3* This,
        BSTR bstrName,
        IHTMLDOMAttribute **ppNodeOut);

    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLAttributeCollection3* This,
        LONG index,
        IHTMLDOMAttribute **ppNodeOut);

    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLAttributeCollection3* This,
        LONG *p);

    END_INTERFACE
} IHTMLAttributeCollection3Vtbl;
interface IHTMLAttributeCollection3 {
    CONST_VTBL IHTMLAttributeCollection3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLAttributeCollection3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLAttributeCollection3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLAttributeCollection3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLAttributeCollection3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLAttributeCollection3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLAttributeCollection3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLAttributeCollection3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLAttributeCollection3 methods ***/
#define IHTMLAttributeCollection3_getNamedItem(This,bstrName,ppNodeOut) (This)->lpVtbl->getNamedItem(This,bstrName,ppNodeOut)
#define IHTMLAttributeCollection3_setNamedItem(This,pNodeIn,ppNodeOut) (This)->lpVtbl->setNamedItem(This,pNodeIn,ppNodeOut)
#define IHTMLAttributeCollection3_removeNamedItem(This,bstrName,ppNodeOut) (This)->lpVtbl->removeNamedItem(This,bstrName,ppNodeOut)
#define IHTMLAttributeCollection3_item(This,index,ppNodeOut) (This)->lpVtbl->item(This,index,ppNodeOut)
#define IHTMLAttributeCollection3_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLAttributeCollection3_QueryInterface(IHTMLAttributeCollection3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLAttributeCollection3_AddRef(IHTMLAttributeCollection3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLAttributeCollection3_Release(IHTMLAttributeCollection3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLAttributeCollection3_GetTypeInfoCount(IHTMLAttributeCollection3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLAttributeCollection3_GetTypeInfo(IHTMLAttributeCollection3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLAttributeCollection3_GetIDsOfNames(IHTMLAttributeCollection3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLAttributeCollection3_Invoke(IHTMLAttributeCollection3* 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);
}
/*** IHTMLAttributeCollection3 methods ***/
static FORCEINLINE HRESULT IHTMLAttributeCollection3_getNamedItem(IHTMLAttributeCollection3* This,BSTR bstrName,IHTMLDOMAttribute **ppNodeOut) {
    return This->lpVtbl->getNamedItem(This,bstrName,ppNodeOut);
}
static FORCEINLINE HRESULT IHTMLAttributeCollection3_setNamedItem(IHTMLAttributeCollection3* This,IHTMLDOMAttribute *pNodeIn,IHTMLDOMAttribute **ppNodeOut) {
    return This->lpVtbl->setNamedItem(This,pNodeIn,ppNodeOut);
}
static FORCEINLINE HRESULT IHTMLAttributeCollection3_removeNamedItem(IHTMLAttributeCollection3* This,BSTR bstrName,IHTMLDOMAttribute **ppNodeOut) {
    return This->lpVtbl->removeNamedItem(This,bstrName,ppNodeOut);
}
static FORCEINLINE HRESULT IHTMLAttributeCollection3_item(IHTMLAttributeCollection3* This,LONG index,IHTMLDOMAttribute **ppNodeOut) {
    return This->lpVtbl->item(This,index,ppNodeOut);
}
static FORCEINLINE HRESULT IHTMLAttributeCollection3_get_length(IHTMLAttributeCollection3* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLAttributeCollection3_getNamedItem_Proxy(
    IHTMLAttributeCollection3* This,
    BSTR bstrName,
    IHTMLDOMAttribute **ppNodeOut);
void __RPC_STUB IHTMLAttributeCollection3_getNamedItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAttributeCollection3_setNamedItem_Proxy(
    IHTMLAttributeCollection3* This,
    IHTMLDOMAttribute *pNodeIn,
    IHTMLDOMAttribute **ppNodeOut);
void __RPC_STUB IHTMLAttributeCollection3_setNamedItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAttributeCollection3_removeNamedItem_Proxy(
    IHTMLAttributeCollection3* This,
    BSTR bstrName,
    IHTMLDOMAttribute **ppNodeOut);
void __RPC_STUB IHTMLAttributeCollection3_removeNamedItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAttributeCollection3_item_Proxy(
    IHTMLAttributeCollection3* This,
    LONG index,
    IHTMLDOMAttribute **ppNodeOut);
void __RPC_STUB IHTMLAttributeCollection3_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAttributeCollection3_get_length_Proxy(
    IHTMLAttributeCollection3* This,
    LONG *p);
void __RPC_STUB IHTMLAttributeCollection3_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLAttributeCollection3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLAttributeCollection4 interface
 */
#ifndef __IHTMLAttributeCollection4_INTERFACE_DEFINED__
#define __IHTMLAttributeCollection4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLAttributeCollection4, 0x305106fa, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106fa-98b5-11cf-bb82-00aa00bdce0b")
IHTMLAttributeCollection4 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE getNamedItemNS(
        VARIANT *pvarNS,
        BSTR bstrName,
        IHTMLDOMAttribute2 **ppNodeOut) = 0;

    virtual HRESULT STDMETHODCALLTYPE setNamedItemNS(
        IHTMLDOMAttribute2 *pNodeIn,
        IHTMLDOMAttribute2 **ppNodeOut) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeNamedItemNS(
        VARIANT *pvarNS,
        BSTR bstrName,
        IHTMLDOMAttribute2 **ppNodeOut) = 0;

    virtual HRESULT STDMETHODCALLTYPE getNamedItem(
        BSTR bstrName,
        IHTMLDOMAttribute2 **ppNodeOut) = 0;

    virtual HRESULT STDMETHODCALLTYPE setNamedItem(
        IHTMLDOMAttribute2 *pNodeIn,
        IHTMLDOMAttribute2 **ppNodeOut) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeNamedItem(
        BSTR bstrName,
        IHTMLDOMAttribute2 **ppNodeOut) = 0;

    virtual HRESULT STDMETHODCALLTYPE item(
        LONG index,
        IHTMLDOMAttribute2 **ppNodeOut) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLAttributeCollection4, 0x305106fa, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLAttributeCollection4Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLAttributeCollection4 methods ***/
    HRESULT (STDMETHODCALLTYPE *getNamedItemNS)(
        IHTMLAttributeCollection4* This,
        VARIANT *pvarNS,
        BSTR bstrName,
        IHTMLDOMAttribute2 **ppNodeOut);

    HRESULT (STDMETHODCALLTYPE *setNamedItemNS)(
        IHTMLAttributeCollection4* This,
        IHTMLDOMAttribute2 *pNodeIn,
        IHTMLDOMAttribute2 **ppNodeOut);

    HRESULT (STDMETHODCALLTYPE *removeNamedItemNS)(
        IHTMLAttributeCollection4* This,
        VARIANT *pvarNS,
        BSTR bstrName,
        IHTMLDOMAttribute2 **ppNodeOut);

    HRESULT (STDMETHODCALLTYPE *getNamedItem)(
        IHTMLAttributeCollection4* This,
        BSTR bstrName,
        IHTMLDOMAttribute2 **ppNodeOut);

    HRESULT (STDMETHODCALLTYPE *setNamedItem)(
        IHTMLAttributeCollection4* This,
        IHTMLDOMAttribute2 *pNodeIn,
        IHTMLDOMAttribute2 **ppNodeOut);

    HRESULT (STDMETHODCALLTYPE *removeNamedItem)(
        IHTMLAttributeCollection4* This,
        BSTR bstrName,
        IHTMLDOMAttribute2 **ppNodeOut);

    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLAttributeCollection4* This,
        LONG index,
        IHTMLDOMAttribute2 **ppNodeOut);

    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLAttributeCollection4* This,
        LONG *p);

    END_INTERFACE
} IHTMLAttributeCollection4Vtbl;
interface IHTMLAttributeCollection4 {
    CONST_VTBL IHTMLAttributeCollection4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLAttributeCollection4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLAttributeCollection4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLAttributeCollection4_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLAttributeCollection4_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLAttributeCollection4_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLAttributeCollection4_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLAttributeCollection4_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLAttributeCollection4 methods ***/
#define IHTMLAttributeCollection4_getNamedItemNS(This,pvarNS,bstrName,ppNodeOut) (This)->lpVtbl->getNamedItemNS(This,pvarNS,bstrName,ppNodeOut)
#define IHTMLAttributeCollection4_setNamedItemNS(This,pNodeIn,ppNodeOut) (This)->lpVtbl->setNamedItemNS(This,pNodeIn,ppNodeOut)
#define IHTMLAttributeCollection4_removeNamedItemNS(This,pvarNS,bstrName,ppNodeOut) (This)->lpVtbl->removeNamedItemNS(This,pvarNS,bstrName,ppNodeOut)
#define IHTMLAttributeCollection4_getNamedItem(This,bstrName,ppNodeOut) (This)->lpVtbl->getNamedItem(This,bstrName,ppNodeOut)
#define IHTMLAttributeCollection4_setNamedItem(This,pNodeIn,ppNodeOut) (This)->lpVtbl->setNamedItem(This,pNodeIn,ppNodeOut)
#define IHTMLAttributeCollection4_removeNamedItem(This,bstrName,ppNodeOut) (This)->lpVtbl->removeNamedItem(This,bstrName,ppNodeOut)
#define IHTMLAttributeCollection4_item(This,index,ppNodeOut) (This)->lpVtbl->item(This,index,ppNodeOut)
#define IHTMLAttributeCollection4_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLAttributeCollection4_QueryInterface(IHTMLAttributeCollection4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLAttributeCollection4_AddRef(IHTMLAttributeCollection4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLAttributeCollection4_Release(IHTMLAttributeCollection4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLAttributeCollection4_GetTypeInfoCount(IHTMLAttributeCollection4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLAttributeCollection4_GetTypeInfo(IHTMLAttributeCollection4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLAttributeCollection4_GetIDsOfNames(IHTMLAttributeCollection4* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLAttributeCollection4_Invoke(IHTMLAttributeCollection4* 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);
}
/*** IHTMLAttributeCollection4 methods ***/
static FORCEINLINE HRESULT IHTMLAttributeCollection4_getNamedItemNS(IHTMLAttributeCollection4* This,VARIANT *pvarNS,BSTR bstrName,IHTMLDOMAttribute2 **ppNodeOut) {
    return This->lpVtbl->getNamedItemNS(This,pvarNS,bstrName,ppNodeOut);
}
static FORCEINLINE HRESULT IHTMLAttributeCollection4_setNamedItemNS(IHTMLAttributeCollection4* This,IHTMLDOMAttribute2 *pNodeIn,IHTMLDOMAttribute2 **ppNodeOut) {
    return This->lpVtbl->setNamedItemNS(This,pNodeIn,ppNodeOut);
}
static FORCEINLINE HRESULT IHTMLAttributeCollection4_removeNamedItemNS(IHTMLAttributeCollection4* This,VARIANT *pvarNS,BSTR bstrName,IHTMLDOMAttribute2 **ppNodeOut) {
    return This->lpVtbl->removeNamedItemNS(This,pvarNS,bstrName,ppNodeOut);
}
static FORCEINLINE HRESULT IHTMLAttributeCollection4_getNamedItem(IHTMLAttributeCollection4* This,BSTR bstrName,IHTMLDOMAttribute2 **ppNodeOut) {
    return This->lpVtbl->getNamedItem(This,bstrName,ppNodeOut);
}
static FORCEINLINE HRESULT IHTMLAttributeCollection4_setNamedItem(IHTMLAttributeCollection4* This,IHTMLDOMAttribute2 *pNodeIn,IHTMLDOMAttribute2 **ppNodeOut) {
    return This->lpVtbl->setNamedItem(This,pNodeIn,ppNodeOut);
}
static FORCEINLINE HRESULT IHTMLAttributeCollection4_removeNamedItem(IHTMLAttributeCollection4* This,BSTR bstrName,IHTMLDOMAttribute2 **ppNodeOut) {
    return This->lpVtbl->removeNamedItem(This,bstrName,ppNodeOut);
}
static FORCEINLINE HRESULT IHTMLAttributeCollection4_item(IHTMLAttributeCollection4* This,LONG index,IHTMLDOMAttribute2 **ppNodeOut) {
    return This->lpVtbl->item(This,index,ppNodeOut);
}
static FORCEINLINE HRESULT IHTMLAttributeCollection4_get_length(IHTMLAttributeCollection4* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLAttributeCollection4_getNamedItemNS_Proxy(
    IHTMLAttributeCollection4* This,
    VARIANT *pvarNS,
    BSTR bstrName,
    IHTMLDOMAttribute2 **ppNodeOut);
void __RPC_STUB IHTMLAttributeCollection4_getNamedItemNS_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAttributeCollection4_setNamedItemNS_Proxy(
    IHTMLAttributeCollection4* This,
    IHTMLDOMAttribute2 *pNodeIn,
    IHTMLDOMAttribute2 **ppNodeOut);
void __RPC_STUB IHTMLAttributeCollection4_setNamedItemNS_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAttributeCollection4_removeNamedItemNS_Proxy(
    IHTMLAttributeCollection4* This,
    VARIANT *pvarNS,
    BSTR bstrName,
    IHTMLDOMAttribute2 **ppNodeOut);
void __RPC_STUB IHTMLAttributeCollection4_removeNamedItemNS_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAttributeCollection4_getNamedItem_Proxy(
    IHTMLAttributeCollection4* This,
    BSTR bstrName,
    IHTMLDOMAttribute2 **ppNodeOut);
void __RPC_STUB IHTMLAttributeCollection4_getNamedItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAttributeCollection4_setNamedItem_Proxy(
    IHTMLAttributeCollection4* This,
    IHTMLDOMAttribute2 *pNodeIn,
    IHTMLDOMAttribute2 **ppNodeOut);
void __RPC_STUB IHTMLAttributeCollection4_setNamedItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAttributeCollection4_removeNamedItem_Proxy(
    IHTMLAttributeCollection4* This,
    BSTR bstrName,
    IHTMLDOMAttribute2 **ppNodeOut);
void __RPC_STUB IHTMLAttributeCollection4_removeNamedItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAttributeCollection4_item_Proxy(
    IHTMLAttributeCollection4* This,
    LONG index,
    IHTMLDOMAttribute2 **ppNodeOut);
void __RPC_STUB IHTMLAttributeCollection4_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAttributeCollection4_get_length_Proxy(
    IHTMLAttributeCollection4* This,
    LONG *p);
void __RPC_STUB IHTMLAttributeCollection4_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLAttributeCollection4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLDOMChildrenCollection interface
 */
#ifndef __IHTMLDOMChildrenCollection_INTERFACE_DEFINED__
#define __IHTMLDOMChildrenCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDOMChildrenCollection, 0x3050f5ab, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f5ab-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDOMChildrenCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__newEnum(
        IUnknown **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE item(
        LONG index,
        IDispatch **ppItem) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDOMChildrenCollection, 0x3050f5ab, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDOMChildrenCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLDOMChildrenCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLDOMChildrenCollection* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get__newEnum)(
        IHTMLDOMChildrenCollection* This,
        IUnknown **p);

    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLDOMChildrenCollection* This,
        LONG index,
        IDispatch **ppItem);

    END_INTERFACE
} IHTMLDOMChildrenCollectionVtbl;
interface IHTMLDOMChildrenCollection {
    CONST_VTBL IHTMLDOMChildrenCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDOMChildrenCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDOMChildrenCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDOMChildrenCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDOMChildrenCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDOMChildrenCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDOMChildrenCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDOMChildrenCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDOMChildrenCollection methods ***/
#define IHTMLDOMChildrenCollection_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLDOMChildrenCollection_get__newEnum(This,p) (This)->lpVtbl->get__newEnum(This,p)
#define IHTMLDOMChildrenCollection_item(This,index,ppItem) (This)->lpVtbl->item(This,index,ppItem)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDOMChildrenCollection_QueryInterface(IHTMLDOMChildrenCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDOMChildrenCollection_AddRef(IHTMLDOMChildrenCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDOMChildrenCollection_Release(IHTMLDOMChildrenCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDOMChildrenCollection_GetTypeInfoCount(IHTMLDOMChildrenCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDOMChildrenCollection_GetTypeInfo(IHTMLDOMChildrenCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDOMChildrenCollection_GetIDsOfNames(IHTMLDOMChildrenCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDOMChildrenCollection_Invoke(IHTMLDOMChildrenCollection* 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);
}
/*** IHTMLDOMChildrenCollection methods ***/
static FORCEINLINE HRESULT IHTMLDOMChildrenCollection_get_length(IHTMLDOMChildrenCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMChildrenCollection_get__newEnum(IHTMLDOMChildrenCollection* This,IUnknown **p) {
    return This->lpVtbl->get__newEnum(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMChildrenCollection_item(IHTMLDOMChildrenCollection* This,LONG index,IDispatch **ppItem) {
    return This->lpVtbl->item(This,index,ppItem);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDOMChildrenCollection_get_length_Proxy(
    IHTMLDOMChildrenCollection* This,
    LONG *p);
void __RPC_STUB IHTMLDOMChildrenCollection_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMChildrenCollection_get__newEnum_Proxy(
    IHTMLDOMChildrenCollection* This,
    IUnknown **p);
void __RPC_STUB IHTMLDOMChildrenCollection_get__newEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMChildrenCollection_item_Proxy(
    IHTMLDOMChildrenCollection* This,
    LONG index,
    IDispatch **ppItem);
void __RPC_STUB IHTMLDOMChildrenCollection_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDOMChildrenCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLDOMChildrenCollection2 interface
 */
#ifndef __IHTMLDOMChildrenCollection2_INTERFACE_DEFINED__
#define __IHTMLDOMChildrenCollection2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDOMChildrenCollection2, 0x30510791, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510791-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDOMChildrenCollection2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE item(
        LONG index,
        IDispatch **ppItem) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDOMChildrenCollection2, 0x30510791, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDOMChildrenCollection2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLDOMChildrenCollection2 methods ***/
    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLDOMChildrenCollection2* This,
        LONG index,
        IDispatch **ppItem);

    END_INTERFACE
} IHTMLDOMChildrenCollection2Vtbl;
interface IHTMLDOMChildrenCollection2 {
    CONST_VTBL IHTMLDOMChildrenCollection2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDOMChildrenCollection2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDOMChildrenCollection2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDOMChildrenCollection2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDOMChildrenCollection2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDOMChildrenCollection2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDOMChildrenCollection2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDOMChildrenCollection2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDOMChildrenCollection2 methods ***/
#define IHTMLDOMChildrenCollection2_item(This,index,ppItem) (This)->lpVtbl->item(This,index,ppItem)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDOMChildrenCollection2_QueryInterface(IHTMLDOMChildrenCollection2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDOMChildrenCollection2_AddRef(IHTMLDOMChildrenCollection2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDOMChildrenCollection2_Release(IHTMLDOMChildrenCollection2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDOMChildrenCollection2_GetTypeInfoCount(IHTMLDOMChildrenCollection2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDOMChildrenCollection2_GetTypeInfo(IHTMLDOMChildrenCollection2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDOMChildrenCollection2_GetIDsOfNames(IHTMLDOMChildrenCollection2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDOMChildrenCollection2_Invoke(IHTMLDOMChildrenCollection2* 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);
}
/*** IHTMLDOMChildrenCollection2 methods ***/
static FORCEINLINE HRESULT IHTMLDOMChildrenCollection2_item(IHTMLDOMChildrenCollection2* This,LONG index,IDispatch **ppItem) {
    return This->lpVtbl->item(This,index,ppItem);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDOMChildrenCollection2_item_Proxy(
    IHTMLDOMChildrenCollection2* This,
    LONG index,
    IDispatch **ppItem);
void __RPC_STUB IHTMLDOMChildrenCollection2_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDOMChildrenCollection2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLAttributeCollection dispinterface
 */
#ifndef __DispHTMLAttributeCollection_DISPINTERFACE_DEFINED__
#define __DispHTMLAttributeCollection_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLAttributeCollection, 0x3050f56c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f56c-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLAttributeCollection : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLAttributeCollection, 0x3050f56c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLAttributeCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} DispHTMLAttributeCollectionVtbl;
interface DispHTMLAttributeCollection {
    CONST_VTBL DispHTMLAttributeCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLAttributeCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLAttributeCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLAttributeCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLAttributeCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLAttributeCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLAttributeCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLAttributeCollection_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 DispHTMLAttributeCollection_QueryInterface(DispHTMLAttributeCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLAttributeCollection_AddRef(DispHTMLAttributeCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLAttributeCollection_Release(DispHTMLAttributeCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLAttributeCollection_GetTypeInfoCount(DispHTMLAttributeCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLAttributeCollection_GetTypeInfo(DispHTMLAttributeCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLAttributeCollection_GetIDsOfNames(DispHTMLAttributeCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLAttributeCollection_Invoke(DispHTMLAttributeCollection* 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  /* __DispHTMLAttributeCollection_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLAttributeCollection coclass
 */

DEFINE_GUID(CLSID_HTMLAttributeCollection, 0x3050f4cc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f4cc-98b5-11cf-bb82-00aa00bdce0b") HTMLAttributeCollection;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLAttributeCollection, 0x3050f4cc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CAttrCollectionator;
/*****************************************************************************
 * DispStaticNodeList dispinterface
 */
#ifndef __DispStaticNodeList_DISPINTERFACE_DEFINED__
#define __DispStaticNodeList_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispStaticNodeList, 0x3050f59b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f59b-98b5-11cf-bb82-00aa00bdce0b")
DispStaticNodeList : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispStaticNodeList, 0x3050f59b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispStaticNodeListVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} DispStaticNodeListVtbl;
interface DispStaticNodeList {
    CONST_VTBL DispStaticNodeListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispStaticNodeList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispStaticNodeList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispStaticNodeList_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispStaticNodeList_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispStaticNodeList_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispStaticNodeList_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispStaticNodeList_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 DispStaticNodeList_QueryInterface(DispStaticNodeList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispStaticNodeList_AddRef(DispStaticNodeList* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispStaticNodeList_Release(DispStaticNodeList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispStaticNodeList_GetTypeInfoCount(DispStaticNodeList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispStaticNodeList_GetTypeInfo(DispStaticNodeList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispStaticNodeList_GetIDsOfNames(DispStaticNodeList* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispStaticNodeList_Invoke(DispStaticNodeList* 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  /* __DispStaticNodeList_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * StaticNodeList coclass
 */

DEFINE_GUID(CLSID_StaticNodeList, 0x30510467, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510467-98b5-11cf-bb82-00aa00bdce0b") StaticNodeList;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(StaticNodeList, 0x30510467, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CStaticNodeList;
/*****************************************************************************
 * DispDOMChildrenCollection dispinterface
 */
#ifndef __DispDOMChildrenCollection_DISPINTERFACE_DEFINED__
#define __DispDOMChildrenCollection_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispDOMChildrenCollection, 0x3050f577, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f577-98b5-11cf-bb82-00aa00bdce0b")
DispDOMChildrenCollection : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispDOMChildrenCollection, 0x3050f577, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispDOMChildrenCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} DispDOMChildrenCollectionVtbl;
interface DispDOMChildrenCollection {
    CONST_VTBL DispDOMChildrenCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispDOMChildrenCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispDOMChildrenCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispDOMChildrenCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispDOMChildrenCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispDOMChildrenCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispDOMChildrenCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispDOMChildrenCollection_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 DispDOMChildrenCollection_QueryInterface(DispDOMChildrenCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispDOMChildrenCollection_AddRef(DispDOMChildrenCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispDOMChildrenCollection_Release(DispDOMChildrenCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispDOMChildrenCollection_GetTypeInfoCount(DispDOMChildrenCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispDOMChildrenCollection_GetTypeInfo(DispDOMChildrenCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispDOMChildrenCollection_GetIDsOfNames(DispDOMChildrenCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispDOMChildrenCollection_Invoke(DispDOMChildrenCollection* 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  /* __DispDOMChildrenCollection_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * DOMChildrenCollection coclass
 */

DEFINE_GUID(CLSID_DOMChildrenCollection, 0x3050f5aa, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f5aa-98b5-11cf-bb82-00aa00bdce0b") DOMChildrenCollection;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMChildrenCollection, 0x3050f5aa, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDOMChildrenCollection;
/*****************************************************************************
 * HTMLElementEvents4 dispinterface
 */
#ifndef __HTMLElementEvents4_DISPINTERFACE_DEFINED__
#define __HTMLElementEvents4_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLElementEvents4, 0x3051075e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051075e-98b5-11cf-bb82-00aa00bdce0b")
HTMLElementEvents4 : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLElementEvents4, 0x3051075e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLElementEvents4Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} HTMLElementEvents4Vtbl;
interface HTMLElementEvents4 {
    CONST_VTBL HTMLElementEvents4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLElementEvents4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLElementEvents4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLElementEvents4_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLElementEvents4_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLElementEvents4_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLElementEvents4_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLElementEvents4_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 HTMLElementEvents4_QueryInterface(HTMLElementEvents4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLElementEvents4_AddRef(HTMLElementEvents4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLElementEvents4_Release(HTMLElementEvents4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLElementEvents4_GetTypeInfoCount(HTMLElementEvents4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLElementEvents4_GetTypeInfo(HTMLElementEvents4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLElementEvents4_GetIDsOfNames(HTMLElementEvents4* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLElementEvents4_Invoke(HTMLElementEvents4* 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  /* __HTMLElementEvents4_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLElementEvents3 dispinterface
 */
#ifndef __HTMLElementEvents3_DISPINTERFACE_DEFINED__
#define __HTMLElementEvents3_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLElementEvents3, 0x3050f59f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f59f-98b5-11cf-bb82-00aa00bdce0b")
HTMLElementEvents3 : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLElementEvents3, 0x3050f59f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLElementEvents3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} HTMLElementEvents3Vtbl;
interface HTMLElementEvents3 {
    CONST_VTBL HTMLElementEvents3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLElementEvents3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLElementEvents3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLElementEvents3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLElementEvents3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLElementEvents3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLElementEvents3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLElementEvents3_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 HTMLElementEvents3_QueryInterface(HTMLElementEvents3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLElementEvents3_AddRef(HTMLElementEvents3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLElementEvents3_Release(HTMLElementEvents3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLElementEvents3_GetTypeInfoCount(HTMLElementEvents3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLElementEvents3_GetTypeInfo(HTMLElementEvents3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLElementEvents3_GetIDsOfNames(HTMLElementEvents3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLElementEvents3_Invoke(HTMLElementEvents3* 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  /* __HTMLElementEvents3_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLElementEvents2 dispinterface
 */
#ifndef __HTMLElementEvents2_DISPINTERFACE_DEFINED__
#define __HTMLElementEvents2_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLElementEvents2, 0x3050f60f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f60f-98b5-11cf-bb82-00aa00bdce0b")
HTMLElementEvents2 : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLElementEvents2, 0x3050f60f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLElementEvents2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} HTMLElementEvents2Vtbl;
interface HTMLElementEvents2 {
    CONST_VTBL HTMLElementEvents2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLElementEvents2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLElementEvents2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLElementEvents2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLElementEvents2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLElementEvents2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLElementEvents2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLElementEvents2_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 HTMLElementEvents2_QueryInterface(HTMLElementEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLElementEvents2_AddRef(HTMLElementEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLElementEvents2_Release(HTMLElementEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLElementEvents2_GetTypeInfoCount(HTMLElementEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLElementEvents2_GetTypeInfo(HTMLElementEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLElementEvents2_GetIDsOfNames(HTMLElementEvents2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLElementEvents2_Invoke(HTMLElementEvents2* 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  /* __HTMLElementEvents2_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLElementEvents dispinterface
 */
#ifndef __HTMLElementEvents_DISPINTERFACE_DEFINED__
#define __HTMLElementEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLElementEvents, 0x3050f33c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f33c-98b5-11cf-bb82-00aa00bdce0b")
HTMLElementEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLElementEvents, 0x3050f33c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLElementEventsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} HTMLElementEventsVtbl;
interface HTMLElementEvents {
    CONST_VTBL HTMLElementEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLElementEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLElementEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLElementEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLElementEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLElementEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLElementEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLElementEvents_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 HTMLElementEvents_QueryInterface(HTMLElementEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLElementEvents_AddRef(HTMLElementEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLElementEvents_Release(HTMLElementEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLElementEvents_GetTypeInfoCount(HTMLElementEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLElementEvents_GetTypeInfo(HTMLElementEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLElementEvents_GetIDsOfNames(HTMLElementEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLElementEvents_Invoke(HTMLElementEvents* 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  /* __HTMLElementEvents_DISPINTERFACE_DEFINED__ */

typedef enum _htmlListType {
    htmlListTypeNotSet = 0,
    htmlListTypeLargeAlpha = 1,
    htmlListTypeSmallAlpha = 2,
    htmlListTypeLargeRoman = 3,
    htmlListTypeSmallRoman = 4,
    htmlListTypeNumbers = 5,
    htmlListTypeDisc = 6,
    htmlListTypeCircle = 7,
    htmlListTypeSquare = 8,
    htmlListType_Max = 0x7fffffff
} htmlListType;
typedef enum _htmlMethod {
    htmlMethodNotSet = 0,
    htmlMethodGet = 1,
    htmlMethodPost = 2,
    htmlMethod_Max = 0x7fffffff
} htmlMethod;
typedef enum _htmlWrap {
    htmlWrapOff = 1,
    htmlWrapSoft = 2,
    htmlWrapHard = 3,
    htmlWrap_Max = 0x7fffffff
} htmlWrap;
typedef enum _htmlDir {
    htmlDirNotSet = 0,
    htmlDirLeftToRight = 1,
    htmlDirRightToLeft = 2,
    htmlDir_Max = 0x7fffffff
} htmlDir;
typedef enum _htmlEditable {
    htmlEditableInherit = 0,
    htmlEditableTrue = 1,
    htmlEditableFalse = 2,
    htmlEditable_Max = 0x7fffffff
} htmlEditable;
typedef enum _htmlInput {
    htmlInputNotSet = 0,
    htmlInputButton = 1,
    htmlInputCheckbox = 2,
    htmlInputFile = 3,
    htmlInputHidden = 4,
    htmlInputImage = 5,
    htmlInputPassword = 6,
    htmlInputRadio = 7,
    htmlInputReset = 8,
    htmlInputSelectOne = 9,
    htmlInputSelectMultiple = 10,
    htmlInputSubmit = 11,
    htmlInputText = 12,
    htmlInputTextarea = 13,
    htmlInputRichtext = 14,
    htmlInputRange = 15,
    htmlInputUrl = 16,
    htmlInputEmail = 17,
    htmlInputNumber = 18,
    htmlInputTel = 19,
    htmlInputSearch = 20,
    htmlInput_Max = 0x7fffffff
} htmlInput;
typedef enum _htmlSpellCheck {
    htmlSpellCheckNotSet = 0,
    htmlSpellCheckTrue = 1,
    htmlSpellCheckFalse = 2,
    htmlSpellCheckDefault = 3,
    htmlSpellCheck_Max = 0x7fffffff
} htmlSpellCheck;
typedef enum _htmlEncoding {
    htmlEncodingURL = 0,
    htmlEncodingMultipart = 1,
    htmlEncodingText = 2,
    htmlEncoding_Max = 0x7fffffff
} htmlEncoding;
typedef enum _htmlAdjacency {
    htmlAdjacencyBeforeBegin = 1,
    htmlAdjacencyAfterBegin = 2,
    htmlAdjacencyBeforeEnd = 3,
    htmlAdjacencyAfterEnd = 4,
    htmlAdjacency_Max = 0x7fffffff
} htmlAdjacency;
typedef enum _htmlTabIndex {
    htmlTabIndexNotSet = -32768,
    htmlTabIndex_Max = 0x7fffffff
} htmlTabIndex;
typedef enum _htmlComponent {
    htmlComponentClient = 0,
    htmlComponentSbLeft = 1,
    htmlComponentSbPageLeft = 2,
    htmlComponentSbHThumb = 3,
    htmlComponentSbPageRight = 4,
    htmlComponentSbRight = 5,
    htmlComponentSbUp = 6,
    htmlComponentSbPageUp = 7,
    htmlComponentSbVThumb = 8,
    htmlComponentSbPageDown = 9,
    htmlComponentSbDown = 10,
    htmlComponentSbLeft2 = 11,
    htmlComponentSbPageLeft2 = 12,
    htmlComponentSbRight2 = 13,
    htmlComponentSbPageRight2 = 14,
    htmlComponentSbUp2 = 15,
    htmlComponentSbPageUp2 = 16,
    htmlComponentSbDown2 = 17,
    htmlComponentSbPageDown2 = 18,
    htmlComponentSbTop = 19,
    htmlComponentSbBottom = 20,
    htmlComponentOutside = 21,
    htmlComponentGHTopLeft = 22,
    htmlComponentGHLeft = 23,
    htmlComponentGHTop = 24,
    htmlComponentGHBottomLeft = 25,
    htmlComponentGHTopRight = 26,
    htmlComponentGHBottom = 27,
    htmlComponentGHRight = 28,
    htmlComponentGHBottomRight = 29,
    htmlComponent_Max = 0x7fffffff
} htmlComponent;
typedef enum _htmlApplyLocation {
    htmlApplyLocationInside = 0,
    htmlApplyLocationOutside = 1,
    htmlApplyLocation_Max = 0x7fffffff
} htmlApplyLocation;
typedef enum _htmlGlyphMode {
    htmlGlyphModeNone = 0,
    htmlGlyphModeBegin = 1,
    htmlGlyphModeEnd = 2,
    htmlGlyphModeBoth = 3,
    htmlGlyphMode_Max = 0x7fffffff
} htmlGlyphMode;
typedef enum _htmlDraggable {
    htmlDraggableAuto = 0,
    htmlDraggableTrue = 1,
    htmlDraggableFalse = 2,
    htmlDraggable_Max = 0x7fffffff
} htmlDraggable;
#ifndef __IHTMLEventObj_FWD_DEFINED__
#define __IHTMLEventObj_FWD_DEFINED__
typedef interface IHTMLEventObj IHTMLEventObj;
#endif

#ifndef __IHTMLElementCollection_FWD_DEFINED__
#define __IHTMLElementCollection_FWD_DEFINED__
typedef interface IHTMLElementCollection IHTMLElementCollection;
#endif

#ifndef __IHTMLFiltersCollection_FWD_DEFINED__
#define __IHTMLFiltersCollection_FWD_DEFINED__
typedef interface IHTMLFiltersCollection IHTMLFiltersCollection;
#endif

#ifndef __IRulesAppliedCollection_FWD_DEFINED__
#define __IRulesAppliedCollection_FWD_DEFINED__
typedef interface IRulesAppliedCollection IRulesAppliedCollection;
#endif

/*****************************************************************************
 * IHTMLElement interface
 */
#ifndef __IHTMLElement_INTERFACE_DEFINED__
#define __IHTMLElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLElement, 0x3050f1ff, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f1ff-98b5-11cf-bb82-00aa00bdce0b")
IHTMLElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE setAttribute(
        BSTR strAttributeName,
        VARIANT AttributeValue,
        LONG lFlags = 1) = 0;

    virtual HRESULT STDMETHODCALLTYPE getAttribute(
        BSTR strAttributeName,
        LONG lFlags = 0,
        VARIANT *AttributeValue = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeAttribute(
        BSTR strAttributeName,
        LONG lFlags = 1,
        VARIANT_BOOL *pfSuccess = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_className(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_className(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_id(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_id(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_tagName(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_parentElement(
        IHTMLElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_style(
        IHTMLStyle **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onhelp(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onhelp(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onclick(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onclick(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondblclick(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondblclick(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onkeydown(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onkeydown(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onkeyup(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onkeyup(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onkeypress(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onkeypress(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmouseout(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmouseout(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmouseover(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmouseover(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmousemove(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmousemove(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmousedown(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmousedown(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmouseup(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmouseup(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_document(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_title(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_title(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_language(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_language(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onselectstart(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onselectstart(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE scrollIntoView(
        VARIANT varargStart) = 0;

    virtual HRESULT STDMETHODCALLTYPE contains(
        IHTMLElement *pChild,
        VARIANT_BOOL *pfResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_sourceIndex(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_recordNumber(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_lang(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_lang(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_offsetLeft(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_offsetTop(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_offsetWidth(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_offsetHeight(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_offsetParent(
        IHTMLElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_innerHTML(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_innerHTML(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_innerText(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_innerText(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_outerHTML(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_outerHTML(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_outerText(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_outerText(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE insertAdjacentHTML(
        BSTR where,
        BSTR html) = 0;

    virtual HRESULT STDMETHODCALLTYPE insertAdjacentText(
        BSTR where,
        BSTR text) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_parentTextEdit(
        IHTMLElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_isTextEdit(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE click(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_filters(
        IHTMLFiltersCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondragstart(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondragstart(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE toString(
        BSTR *String) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onbeforeupdate(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onbeforeupdate(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onafterupdate(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onafterupdate(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onerrorupdate(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onerrorupdate(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onrowexit(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onrowexit(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onrowenter(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onrowenter(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondatasetchanged(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondatasetchanged(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondataavailable(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondataavailable(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondatasetcomplete(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondatasetcomplete(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onfilterchange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onfilterchange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_children(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_all(
        IDispatch **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLElement, 0x3050f1ff, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLElementVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLElement methods ***/
    HRESULT (STDMETHODCALLTYPE *setAttribute)(
        IHTMLElement* This,
        BSTR strAttributeName,
        VARIANT AttributeValue,
        LONG lFlags);

    HRESULT (STDMETHODCALLTYPE *getAttribute)(
        IHTMLElement* This,
        BSTR strAttributeName,
        LONG lFlags,
        VARIANT *AttributeValue);

    HRESULT (STDMETHODCALLTYPE *removeAttribute)(
        IHTMLElement* This,
        BSTR strAttributeName,
        LONG lFlags,
        VARIANT_BOOL *pfSuccess);

    HRESULT (STDMETHODCALLTYPE *put_className)(
        IHTMLElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_className)(
        IHTMLElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_id)(
        IHTMLElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_id)(
        IHTMLElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_tagName)(
        IHTMLElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_parentElement)(
        IHTMLElement* This,
        IHTMLElement **p);

    HRESULT (STDMETHODCALLTYPE *get_style)(
        IHTMLElement* This,
        IHTMLStyle **p);

    HRESULT (STDMETHODCALLTYPE *put_onhelp)(
        IHTMLElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onhelp)(
        IHTMLElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onclick)(
        IHTMLElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onclick)(
        IHTMLElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondblclick)(
        IHTMLElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondblclick)(
        IHTMLElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onkeydown)(
        IHTMLElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onkeydown)(
        IHTMLElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onkeyup)(
        IHTMLElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onkeyup)(
        IHTMLElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onkeypress)(
        IHTMLElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onkeypress)(
        IHTMLElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmouseout)(
        IHTMLElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmouseout)(
        IHTMLElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmouseover)(
        IHTMLElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmouseover)(
        IHTMLElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmousemove)(
        IHTMLElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmousemove)(
        IHTMLElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmousedown)(
        IHTMLElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmousedown)(
        IHTMLElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmouseup)(
        IHTMLElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmouseup)(
        IHTMLElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_document)(
        IHTMLElement* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *put_title)(
        IHTMLElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_title)(
        IHTMLElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_language)(
        IHTMLElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_language)(
        IHTMLElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_onselectstart)(
        IHTMLElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onselectstart)(
        IHTMLElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *scrollIntoView)(
        IHTMLElement* This,
        VARIANT varargStart);

    HRESULT (STDMETHODCALLTYPE *contains)(
        IHTMLElement* This,
        IHTMLElement *pChild,
        VARIANT_BOOL *pfResult);

    HRESULT (STDMETHODCALLTYPE *get_sourceIndex)(
        IHTMLElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_recordNumber)(
        IHTMLElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_lang)(
        IHTMLElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_lang)(
        IHTMLElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_offsetLeft)(
        IHTMLElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_offsetTop)(
        IHTMLElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_offsetWidth)(
        IHTMLElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_offsetHeight)(
        IHTMLElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_offsetParent)(
        IHTMLElement* This,
        IHTMLElement **p);

    HRESULT (STDMETHODCALLTYPE *put_innerHTML)(
        IHTMLElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_innerHTML)(
        IHTMLElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_innerText)(
        IHTMLElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_innerText)(
        IHTMLElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_outerHTML)(
        IHTMLElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_outerHTML)(
        IHTMLElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_outerText)(
        IHTMLElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_outerText)(
        IHTMLElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *insertAdjacentHTML)(
        IHTMLElement* This,
        BSTR where,
        BSTR html);

    HRESULT (STDMETHODCALLTYPE *insertAdjacentText)(
        IHTMLElement* This,
        BSTR where,
        BSTR text);

    HRESULT (STDMETHODCALLTYPE *get_parentTextEdit)(
        IHTMLElement* This,
        IHTMLElement **p);

    HRESULT (STDMETHODCALLTYPE *get_isTextEdit)(
        IHTMLElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *click)(
        IHTMLElement* This);

    HRESULT (STDMETHODCALLTYPE *get_filters)(
        IHTMLElement* This,
        IHTMLFiltersCollection **p);

    HRESULT (STDMETHODCALLTYPE *put_ondragstart)(
        IHTMLElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondragstart)(
        IHTMLElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *toString)(
        IHTMLElement* This,
        BSTR *String);

    HRESULT (STDMETHODCALLTYPE *put_onbeforeupdate)(
        IHTMLElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onbeforeupdate)(
        IHTMLElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onafterupdate)(
        IHTMLElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onafterupdate)(
        IHTMLElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onerrorupdate)(
        IHTMLElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onerrorupdate)(
        IHTMLElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onrowexit)(
        IHTMLElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onrowexit)(
        IHTMLElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onrowenter)(
        IHTMLElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onrowenter)(
        IHTMLElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondatasetchanged)(
        IHTMLElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondatasetchanged)(
        IHTMLElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondataavailable)(
        IHTMLElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondataavailable)(
        IHTMLElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondatasetcomplete)(
        IHTMLElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondatasetcomplete)(
        IHTMLElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onfilterchange)(
        IHTMLElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onfilterchange)(
        IHTMLElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_children)(
        IHTMLElement* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_all)(
        IHTMLElement* This,
        IDispatch **p);

    END_INTERFACE
} IHTMLElementVtbl;
interface IHTMLElement {
    CONST_VTBL IHTMLElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLElement methods ***/
#define IHTMLElement_setAttribute(This,strAttributeName,AttributeValue,lFlags) (This)->lpVtbl->setAttribute(This,strAttributeName,AttributeValue,lFlags)
#define IHTMLElement_getAttribute(This,strAttributeName,lFlags,AttributeValue) (This)->lpVtbl->getAttribute(This,strAttributeName,lFlags,AttributeValue)
#define IHTMLElement_removeAttribute(This,strAttributeName,lFlags,pfSuccess) (This)->lpVtbl->removeAttribute(This,strAttributeName,lFlags,pfSuccess)
#define IHTMLElement_put_className(This,v) (This)->lpVtbl->put_className(This,v)
#define IHTMLElement_get_className(This,p) (This)->lpVtbl->get_className(This,p)
#define IHTMLElement_put_id(This,v) (This)->lpVtbl->put_id(This,v)
#define IHTMLElement_get_id(This,p) (This)->lpVtbl->get_id(This,p)
#define IHTMLElement_get_tagName(This,p) (This)->lpVtbl->get_tagName(This,p)
#define IHTMLElement_get_parentElement(This,p) (This)->lpVtbl->get_parentElement(This,p)
#define IHTMLElement_get_style(This,p) (This)->lpVtbl->get_style(This,p)
#define IHTMLElement_put_onhelp(This,v) (This)->lpVtbl->put_onhelp(This,v)
#define IHTMLElement_get_onhelp(This,p) (This)->lpVtbl->get_onhelp(This,p)
#define IHTMLElement_put_onclick(This,v) (This)->lpVtbl->put_onclick(This,v)
#define IHTMLElement_get_onclick(This,p) (This)->lpVtbl->get_onclick(This,p)
#define IHTMLElement_put_ondblclick(This,v) (This)->lpVtbl->put_ondblclick(This,v)
#define IHTMLElement_get_ondblclick(This,p) (This)->lpVtbl->get_ondblclick(This,p)
#define IHTMLElement_put_onkeydown(This,v) (This)->lpVtbl->put_onkeydown(This,v)
#define IHTMLElement_get_onkeydown(This,p) (This)->lpVtbl->get_onkeydown(This,p)
#define IHTMLElement_put_onkeyup(This,v) (This)->lpVtbl->put_onkeyup(This,v)
#define IHTMLElement_get_onkeyup(This,p) (This)->lpVtbl->get_onkeyup(This,p)
#define IHTMLElement_put_onkeypress(This,v) (This)->lpVtbl->put_onkeypress(This,v)
#define IHTMLElement_get_onkeypress(This,p) (This)->lpVtbl->get_onkeypress(This,p)
#define IHTMLElement_put_onmouseout(This,v) (This)->lpVtbl->put_onmouseout(This,v)
#define IHTMLElement_get_onmouseout(This,p) (This)->lpVtbl->get_onmouseout(This,p)
#define IHTMLElement_put_onmouseover(This,v) (This)->lpVtbl->put_onmouseover(This,v)
#define IHTMLElement_get_onmouseover(This,p) (This)->lpVtbl->get_onmouseover(This,p)
#define IHTMLElement_put_onmousemove(This,v) (This)->lpVtbl->put_onmousemove(This,v)
#define IHTMLElement_get_onmousemove(This,p) (This)->lpVtbl->get_onmousemove(This,p)
#define IHTMLElement_put_onmousedown(This,v) (This)->lpVtbl->put_onmousedown(This,v)
#define IHTMLElement_get_onmousedown(This,p) (This)->lpVtbl->get_onmousedown(This,p)
#define IHTMLElement_put_onmouseup(This,v) (This)->lpVtbl->put_onmouseup(This,v)
#define IHTMLElement_get_onmouseup(This,p) (This)->lpVtbl->get_onmouseup(This,p)
#define IHTMLElement_get_document(This,p) (This)->lpVtbl->get_document(This,p)
#define IHTMLElement_put_title(This,v) (This)->lpVtbl->put_title(This,v)
#define IHTMLElement_get_title(This,p) (This)->lpVtbl->get_title(This,p)
#define IHTMLElement_put_language(This,v) (This)->lpVtbl->put_language(This,v)
#define IHTMLElement_get_language(This,p) (This)->lpVtbl->get_language(This,p)
#define IHTMLElement_put_onselectstart(This,v) (This)->lpVtbl->put_onselectstart(This,v)
#define IHTMLElement_get_onselectstart(This,p) (This)->lpVtbl->get_onselectstart(This,p)
#define IHTMLElement_scrollIntoView(This,varargStart) (This)->lpVtbl->scrollIntoView(This,varargStart)
#define IHTMLElement_contains(This,pChild,pfResult) (This)->lpVtbl->contains(This,pChild,pfResult)
#define IHTMLElement_get_sourceIndex(This,p) (This)->lpVtbl->get_sourceIndex(This,p)
#define IHTMLElement_get_recordNumber(This,p) (This)->lpVtbl->get_recordNumber(This,p)
#define IHTMLElement_put_lang(This,v) (This)->lpVtbl->put_lang(This,v)
#define IHTMLElement_get_lang(This,p) (This)->lpVtbl->get_lang(This,p)
#define IHTMLElement_get_offsetLeft(This,p) (This)->lpVtbl->get_offsetLeft(This,p)
#define IHTMLElement_get_offsetTop(This,p) (This)->lpVtbl->get_offsetTop(This,p)
#define IHTMLElement_get_offsetWidth(This,p) (This)->lpVtbl->get_offsetWidth(This,p)
#define IHTMLElement_get_offsetHeight(This,p) (This)->lpVtbl->get_offsetHeight(This,p)
#define IHTMLElement_get_offsetParent(This,p) (This)->lpVtbl->get_offsetParent(This,p)
#define IHTMLElement_put_innerHTML(This,v) (This)->lpVtbl->put_innerHTML(This,v)
#define IHTMLElement_get_innerHTML(This,p) (This)->lpVtbl->get_innerHTML(This,p)
#define IHTMLElement_put_innerText(This,v) (This)->lpVtbl->put_innerText(This,v)
#define IHTMLElement_get_innerText(This,p) (This)->lpVtbl->get_innerText(This,p)
#define IHTMLElement_put_outerHTML(This,v) (This)->lpVtbl->put_outerHTML(This,v)
#define IHTMLElement_get_outerHTML(This,p) (This)->lpVtbl->get_outerHTML(This,p)
#define IHTMLElement_put_outerText(This,v) (This)->lpVtbl->put_outerText(This,v)
#define IHTMLElement_get_outerText(This,p) (This)->lpVtbl->get_outerText(This,p)
#define IHTMLElement_insertAdjacentHTML(This,where,html) (This)->lpVtbl->insertAdjacentHTML(This,where,html)
#define IHTMLElement_insertAdjacentText(This,where,text) (This)->lpVtbl->insertAdjacentText(This,where,text)
#define IHTMLElement_get_parentTextEdit(This,p) (This)->lpVtbl->get_parentTextEdit(This,p)
#define IHTMLElement_get_isTextEdit(This,p) (This)->lpVtbl->get_isTextEdit(This,p)
#define IHTMLElement_click(This) (This)->lpVtbl->click(This)
#define IHTMLElement_get_filters(This,p) (This)->lpVtbl->get_filters(This,p)
#define IHTMLElement_put_ondragstart(This,v) (This)->lpVtbl->put_ondragstart(This,v)
#define IHTMLElement_get_ondragstart(This,p) (This)->lpVtbl->get_ondragstart(This,p)
#define IHTMLElement_toString(This,String) (This)->lpVtbl->toString(This,String)
#define IHTMLElement_put_onbeforeupdate(This,v) (This)->lpVtbl->put_onbeforeupdate(This,v)
#define IHTMLElement_get_onbeforeupdate(This,p) (This)->lpVtbl->get_onbeforeupdate(This,p)
#define IHTMLElement_put_onafterupdate(This,v) (This)->lpVtbl->put_onafterupdate(This,v)
#define IHTMLElement_get_onafterupdate(This,p) (This)->lpVtbl->get_onafterupdate(This,p)
#define IHTMLElement_put_onerrorupdate(This,v) (This)->lpVtbl->put_onerrorupdate(This,v)
#define IHTMLElement_get_onerrorupdate(This,p) (This)->lpVtbl->get_onerrorupdate(This,p)
#define IHTMLElement_put_onrowexit(This,v) (This)->lpVtbl->put_onrowexit(This,v)
#define IHTMLElement_get_onrowexit(This,p) (This)->lpVtbl->get_onrowexit(This,p)
#define IHTMLElement_put_onrowenter(This,v) (This)->lpVtbl->put_onrowenter(This,v)
#define IHTMLElement_get_onrowenter(This,p) (This)->lpVtbl->get_onrowenter(This,p)
#define IHTMLElement_put_ondatasetchanged(This,v) (This)->lpVtbl->put_ondatasetchanged(This,v)
#define IHTMLElement_get_ondatasetchanged(This,p) (This)->lpVtbl->get_ondatasetchanged(This,p)
#define IHTMLElement_put_ondataavailable(This,v) (This)->lpVtbl->put_ondataavailable(This,v)
#define IHTMLElement_get_ondataavailable(This,p) (This)->lpVtbl->get_ondataavailable(This,p)
#define IHTMLElement_put_ondatasetcomplete(This,v) (This)->lpVtbl->put_ondatasetcomplete(This,v)
#define IHTMLElement_get_ondatasetcomplete(This,p) (This)->lpVtbl->get_ondatasetcomplete(This,p)
#define IHTMLElement_put_onfilterchange(This,v) (This)->lpVtbl->put_onfilterchange(This,v)
#define IHTMLElement_get_onfilterchange(This,p) (This)->lpVtbl->get_onfilterchange(This,p)
#define IHTMLElement_get_children(This,p) (This)->lpVtbl->get_children(This,p)
#define IHTMLElement_get_all(This,p) (This)->lpVtbl->get_all(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLElement_QueryInterface(IHTMLElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLElement_AddRef(IHTMLElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLElement_Release(IHTMLElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLElement_GetTypeInfoCount(IHTMLElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLElement_GetTypeInfo(IHTMLElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLElement_GetIDsOfNames(IHTMLElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLElement_Invoke(IHTMLElement* 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);
}
/*** IHTMLElement methods ***/
static FORCEINLINE HRESULT IHTMLElement_setAttribute(IHTMLElement* This,BSTR strAttributeName,VARIANT AttributeValue,LONG lFlags) {
    return This->lpVtbl->setAttribute(This,strAttributeName,AttributeValue,lFlags);
}
static FORCEINLINE HRESULT IHTMLElement_getAttribute(IHTMLElement* This,BSTR strAttributeName,LONG lFlags,VARIANT *AttributeValue) {
    return This->lpVtbl->getAttribute(This,strAttributeName,lFlags,AttributeValue);
}
static FORCEINLINE HRESULT IHTMLElement_removeAttribute(IHTMLElement* This,BSTR strAttributeName,LONG lFlags,VARIANT_BOOL *pfSuccess) {
    return This->lpVtbl->removeAttribute(This,strAttributeName,lFlags,pfSuccess);
}
static FORCEINLINE HRESULT IHTMLElement_put_className(IHTMLElement* This,BSTR v) {
    return This->lpVtbl->put_className(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_className(IHTMLElement* This,BSTR *p) {
    return This->lpVtbl->get_className(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_put_id(IHTMLElement* This,BSTR v) {
    return This->lpVtbl->put_id(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_id(IHTMLElement* This,BSTR *p) {
    return This->lpVtbl->get_id(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_get_tagName(IHTMLElement* This,BSTR *p) {
    return This->lpVtbl->get_tagName(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_get_parentElement(IHTMLElement* This,IHTMLElement **p) {
    return This->lpVtbl->get_parentElement(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_get_style(IHTMLElement* This,IHTMLStyle **p) {
    return This->lpVtbl->get_style(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_put_onhelp(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onhelp(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_onhelp(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onhelp(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_put_onclick(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onclick(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_onclick(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onclick(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_put_ondblclick(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_ondblclick(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_ondblclick(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_ondblclick(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_put_onkeydown(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onkeydown(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_onkeydown(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onkeydown(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_put_onkeyup(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onkeyup(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_onkeyup(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onkeyup(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_put_onkeypress(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onkeypress(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_onkeypress(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onkeypress(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_put_onmouseout(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onmouseout(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_onmouseout(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onmouseout(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_put_onmouseover(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onmouseover(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_onmouseover(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onmouseover(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_put_onmousemove(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onmousemove(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_onmousemove(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onmousemove(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_put_onmousedown(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onmousedown(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_onmousedown(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onmousedown(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_put_onmouseup(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onmouseup(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_onmouseup(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onmouseup(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_get_document(IHTMLElement* This,IDispatch **p) {
    return This->lpVtbl->get_document(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_put_title(IHTMLElement* This,BSTR v) {
    return This->lpVtbl->put_title(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_title(IHTMLElement* This,BSTR *p) {
    return This->lpVtbl->get_title(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_put_language(IHTMLElement* This,BSTR v) {
    return This->lpVtbl->put_language(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_language(IHTMLElement* This,BSTR *p) {
    return This->lpVtbl->get_language(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_put_onselectstart(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onselectstart(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_onselectstart(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onselectstart(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_scrollIntoView(IHTMLElement* This,VARIANT varargStart) {
    return This->lpVtbl->scrollIntoView(This,varargStart);
}
static FORCEINLINE HRESULT IHTMLElement_contains(IHTMLElement* This,IHTMLElement *pChild,VARIANT_BOOL *pfResult) {
    return This->lpVtbl->contains(This,pChild,pfResult);
}
static FORCEINLINE HRESULT IHTMLElement_get_sourceIndex(IHTMLElement* This,LONG *p) {
    return This->lpVtbl->get_sourceIndex(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_get_recordNumber(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_recordNumber(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_put_lang(IHTMLElement* This,BSTR v) {
    return This->lpVtbl->put_lang(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_lang(IHTMLElement* This,BSTR *p) {
    return This->lpVtbl->get_lang(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_get_offsetLeft(IHTMLElement* This,LONG *p) {
    return This->lpVtbl->get_offsetLeft(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_get_offsetTop(IHTMLElement* This,LONG *p) {
    return This->lpVtbl->get_offsetTop(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_get_offsetWidth(IHTMLElement* This,LONG *p) {
    return This->lpVtbl->get_offsetWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_get_offsetHeight(IHTMLElement* This,LONG *p) {
    return This->lpVtbl->get_offsetHeight(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_get_offsetParent(IHTMLElement* This,IHTMLElement **p) {
    return This->lpVtbl->get_offsetParent(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_put_innerHTML(IHTMLElement* This,BSTR v) {
    return This->lpVtbl->put_innerHTML(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_innerHTML(IHTMLElement* This,BSTR *p) {
    return This->lpVtbl->get_innerHTML(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_put_innerText(IHTMLElement* This,BSTR v) {
    return This->lpVtbl->put_innerText(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_innerText(IHTMLElement* This,BSTR *p) {
    return This->lpVtbl->get_innerText(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_put_outerHTML(IHTMLElement* This,BSTR v) {
    return This->lpVtbl->put_outerHTML(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_outerHTML(IHTMLElement* This,BSTR *p) {
    return This->lpVtbl->get_outerHTML(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_put_outerText(IHTMLElement* This,BSTR v) {
    return This->lpVtbl->put_outerText(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_outerText(IHTMLElement* This,BSTR *p) {
    return This->lpVtbl->get_outerText(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_insertAdjacentHTML(IHTMLElement* This,BSTR where,BSTR html) {
    return This->lpVtbl->insertAdjacentHTML(This,where,html);
}
static FORCEINLINE HRESULT IHTMLElement_insertAdjacentText(IHTMLElement* This,BSTR where,BSTR text) {
    return This->lpVtbl->insertAdjacentText(This,where,text);
}
static FORCEINLINE HRESULT IHTMLElement_get_parentTextEdit(IHTMLElement* This,IHTMLElement **p) {
    return This->lpVtbl->get_parentTextEdit(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_get_isTextEdit(IHTMLElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_isTextEdit(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_click(IHTMLElement* This) {
    return This->lpVtbl->click(This);
}
static FORCEINLINE HRESULT IHTMLElement_get_filters(IHTMLElement* This,IHTMLFiltersCollection **p) {
    return This->lpVtbl->get_filters(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_put_ondragstart(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_ondragstart(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_ondragstart(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_ondragstart(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_toString(IHTMLElement* This,BSTR *String) {
    return This->lpVtbl->toString(This,String);
}
static FORCEINLINE HRESULT IHTMLElement_put_onbeforeupdate(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onbeforeupdate(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_onbeforeupdate(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforeupdate(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_put_onafterupdate(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onafterupdate(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_onafterupdate(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onafterupdate(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_put_onerrorupdate(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onerrorupdate(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_onerrorupdate(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onerrorupdate(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_put_onrowexit(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onrowexit(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_onrowexit(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onrowexit(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_put_onrowenter(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onrowenter(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_onrowenter(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onrowenter(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_put_ondatasetchanged(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_ondatasetchanged(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_ondatasetchanged(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_ondatasetchanged(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_put_ondataavailable(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_ondataavailable(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_ondataavailable(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_ondataavailable(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_put_ondatasetcomplete(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_ondatasetcomplete(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_ondatasetcomplete(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_ondatasetcomplete(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_put_onfilterchange(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onfilterchange(This,v);
}
static FORCEINLINE HRESULT IHTMLElement_get_onfilterchange(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onfilterchange(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_get_children(IHTMLElement* This,IDispatch **p) {
    return This->lpVtbl->get_children(This,p);
}
static FORCEINLINE HRESULT IHTMLElement_get_all(IHTMLElement* This,IDispatch **p) {
    return This->lpVtbl->get_all(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLElement_setAttribute_Proxy(
    IHTMLElement* This,
    BSTR strAttributeName,
    VARIANT AttributeValue,
    LONG lFlags);
void __RPC_STUB IHTMLElement_setAttribute_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_getAttribute_Proxy(
    IHTMLElement* This,
    BSTR strAttributeName,
    LONG lFlags,
    VARIANT *AttributeValue);
void __RPC_STUB IHTMLElement_getAttribute_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_removeAttribute_Proxy(
    IHTMLElement* This,
    BSTR strAttributeName,
    LONG lFlags,
    VARIANT_BOOL *pfSuccess);
void __RPC_STUB IHTMLElement_removeAttribute_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_className_Proxy(
    IHTMLElement* This,
    BSTR v);
void __RPC_STUB IHTMLElement_put_className_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_className_Proxy(
    IHTMLElement* This,
    BSTR *p);
void __RPC_STUB IHTMLElement_get_className_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_id_Proxy(
    IHTMLElement* This,
    BSTR v);
void __RPC_STUB IHTMLElement_put_id_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_id_Proxy(
    IHTMLElement* This,
    BSTR *p);
void __RPC_STUB IHTMLElement_get_id_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_tagName_Proxy(
    IHTMLElement* This,
    BSTR *p);
void __RPC_STUB IHTMLElement_get_tagName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_parentElement_Proxy(
    IHTMLElement* This,
    IHTMLElement **p);
void __RPC_STUB IHTMLElement_get_parentElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_style_Proxy(
    IHTMLElement* This,
    IHTMLStyle **p);
void __RPC_STUB IHTMLElement_get_style_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_onhelp_Proxy(
    IHTMLElement* This,
    VARIANT v);
void __RPC_STUB IHTMLElement_put_onhelp_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_onhelp_Proxy(
    IHTMLElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement_get_onhelp_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_onclick_Proxy(
    IHTMLElement* This,
    VARIANT v);
void __RPC_STUB IHTMLElement_put_onclick_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_onclick_Proxy(
    IHTMLElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement_get_onclick_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_ondblclick_Proxy(
    IHTMLElement* This,
    VARIANT v);
void __RPC_STUB IHTMLElement_put_ondblclick_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_ondblclick_Proxy(
    IHTMLElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement_get_ondblclick_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_onkeydown_Proxy(
    IHTMLElement* This,
    VARIANT v);
void __RPC_STUB IHTMLElement_put_onkeydown_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_onkeydown_Proxy(
    IHTMLElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement_get_onkeydown_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_onkeyup_Proxy(
    IHTMLElement* This,
    VARIANT v);
void __RPC_STUB IHTMLElement_put_onkeyup_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_onkeyup_Proxy(
    IHTMLElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement_get_onkeyup_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_onkeypress_Proxy(
    IHTMLElement* This,
    VARIANT v);
void __RPC_STUB IHTMLElement_put_onkeypress_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_onkeypress_Proxy(
    IHTMLElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement_get_onkeypress_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_onmouseout_Proxy(
    IHTMLElement* This,
    VARIANT v);
void __RPC_STUB IHTMLElement_put_onmouseout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_onmouseout_Proxy(
    IHTMLElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement_get_onmouseout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_onmouseover_Proxy(
    IHTMLElement* This,
    VARIANT v);
void __RPC_STUB IHTMLElement_put_onmouseover_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_onmouseover_Proxy(
    IHTMLElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement_get_onmouseover_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_onmousemove_Proxy(
    IHTMLElement* This,
    VARIANT v);
void __RPC_STUB IHTMLElement_put_onmousemove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_onmousemove_Proxy(
    IHTMLElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement_get_onmousemove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_onmousedown_Proxy(
    IHTMLElement* This,
    VARIANT v);
void __RPC_STUB IHTMLElement_put_onmousedown_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_onmousedown_Proxy(
    IHTMLElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement_get_onmousedown_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_onmouseup_Proxy(
    IHTMLElement* This,
    VARIANT v);
void __RPC_STUB IHTMLElement_put_onmouseup_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_onmouseup_Proxy(
    IHTMLElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement_get_onmouseup_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_document_Proxy(
    IHTMLElement* This,
    IDispatch **p);
void __RPC_STUB IHTMLElement_get_document_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_title_Proxy(
    IHTMLElement* This,
    BSTR v);
void __RPC_STUB IHTMLElement_put_title_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_title_Proxy(
    IHTMLElement* This,
    BSTR *p);
void __RPC_STUB IHTMLElement_get_title_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_language_Proxy(
    IHTMLElement* This,
    BSTR v);
void __RPC_STUB IHTMLElement_put_language_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_language_Proxy(
    IHTMLElement* This,
    BSTR *p);
void __RPC_STUB IHTMLElement_get_language_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_onselectstart_Proxy(
    IHTMLElement* This,
    VARIANT v);
void __RPC_STUB IHTMLElement_put_onselectstart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_onselectstart_Proxy(
    IHTMLElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement_get_onselectstart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_scrollIntoView_Proxy(
    IHTMLElement* This,
    VARIANT varargStart);
void __RPC_STUB IHTMLElement_scrollIntoView_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_contains_Proxy(
    IHTMLElement* This,
    IHTMLElement *pChild,
    VARIANT_BOOL *pfResult);
void __RPC_STUB IHTMLElement_contains_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_sourceIndex_Proxy(
    IHTMLElement* This,
    LONG *p);
void __RPC_STUB IHTMLElement_get_sourceIndex_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_recordNumber_Proxy(
    IHTMLElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement_get_recordNumber_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_lang_Proxy(
    IHTMLElement* This,
    BSTR v);
void __RPC_STUB IHTMLElement_put_lang_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_lang_Proxy(
    IHTMLElement* This,
    BSTR *p);
void __RPC_STUB IHTMLElement_get_lang_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_offsetLeft_Proxy(
    IHTMLElement* This,
    LONG *p);
void __RPC_STUB IHTMLElement_get_offsetLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_offsetTop_Proxy(
    IHTMLElement* This,
    LONG *p);
void __RPC_STUB IHTMLElement_get_offsetTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_offsetWidth_Proxy(
    IHTMLElement* This,
    LONG *p);
void __RPC_STUB IHTMLElement_get_offsetWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_offsetHeight_Proxy(
    IHTMLElement* This,
    LONG *p);
void __RPC_STUB IHTMLElement_get_offsetHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_offsetParent_Proxy(
    IHTMLElement* This,
    IHTMLElement **p);
void __RPC_STUB IHTMLElement_get_offsetParent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_innerHTML_Proxy(
    IHTMLElement* This,
    BSTR v);
void __RPC_STUB IHTMLElement_put_innerHTML_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_innerHTML_Proxy(
    IHTMLElement* This,
    BSTR *p);
void __RPC_STUB IHTMLElement_get_innerHTML_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_innerText_Proxy(
    IHTMLElement* This,
    BSTR v);
void __RPC_STUB IHTMLElement_put_innerText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_innerText_Proxy(
    IHTMLElement* This,
    BSTR *p);
void __RPC_STUB IHTMLElement_get_innerText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_outerHTML_Proxy(
    IHTMLElement* This,
    BSTR v);
void __RPC_STUB IHTMLElement_put_outerHTML_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_outerHTML_Proxy(
    IHTMLElement* This,
    BSTR *p);
void __RPC_STUB IHTMLElement_get_outerHTML_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_outerText_Proxy(
    IHTMLElement* This,
    BSTR v);
void __RPC_STUB IHTMLElement_put_outerText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_outerText_Proxy(
    IHTMLElement* This,
    BSTR *p);
void __RPC_STUB IHTMLElement_get_outerText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_insertAdjacentHTML_Proxy(
    IHTMLElement* This,
    BSTR where,
    BSTR html);
void __RPC_STUB IHTMLElement_insertAdjacentHTML_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_insertAdjacentText_Proxy(
    IHTMLElement* This,
    BSTR where,
    BSTR text);
void __RPC_STUB IHTMLElement_insertAdjacentText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_parentTextEdit_Proxy(
    IHTMLElement* This,
    IHTMLElement **p);
void __RPC_STUB IHTMLElement_get_parentTextEdit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_isTextEdit_Proxy(
    IHTMLElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLElement_get_isTextEdit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_click_Proxy(
    IHTMLElement* This);
void __RPC_STUB IHTMLElement_click_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_filters_Proxy(
    IHTMLElement* This,
    IHTMLFiltersCollection **p);
void __RPC_STUB IHTMLElement_get_filters_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_ondragstart_Proxy(
    IHTMLElement* This,
    VARIANT v);
void __RPC_STUB IHTMLElement_put_ondragstart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_ondragstart_Proxy(
    IHTMLElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement_get_ondragstart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_toString_Proxy(
    IHTMLElement* This,
    BSTR *String);
void __RPC_STUB IHTMLElement_toString_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_onbeforeupdate_Proxy(
    IHTMLElement* This,
    VARIANT v);
void __RPC_STUB IHTMLElement_put_onbeforeupdate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_onbeforeupdate_Proxy(
    IHTMLElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement_get_onbeforeupdate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_onafterupdate_Proxy(
    IHTMLElement* This,
    VARIANT v);
void __RPC_STUB IHTMLElement_put_onafterupdate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_onafterupdate_Proxy(
    IHTMLElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement_get_onafterupdate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_onerrorupdate_Proxy(
    IHTMLElement* This,
    VARIANT v);
void __RPC_STUB IHTMLElement_put_onerrorupdate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_onerrorupdate_Proxy(
    IHTMLElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement_get_onerrorupdate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_onrowexit_Proxy(
    IHTMLElement* This,
    VARIANT v);
void __RPC_STUB IHTMLElement_put_onrowexit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_onrowexit_Proxy(
    IHTMLElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement_get_onrowexit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_onrowenter_Proxy(
    IHTMLElement* This,
    VARIANT v);
void __RPC_STUB IHTMLElement_put_onrowenter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_onrowenter_Proxy(
    IHTMLElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement_get_onrowenter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_ondatasetchanged_Proxy(
    IHTMLElement* This,
    VARIANT v);
void __RPC_STUB IHTMLElement_put_ondatasetchanged_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_ondatasetchanged_Proxy(
    IHTMLElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement_get_ondatasetchanged_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_ondataavailable_Proxy(
    IHTMLElement* This,
    VARIANT v);
void __RPC_STUB IHTMLElement_put_ondataavailable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_ondataavailable_Proxy(
    IHTMLElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement_get_ondataavailable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_ondatasetcomplete_Proxy(
    IHTMLElement* This,
    VARIANT v);
void __RPC_STUB IHTMLElement_put_ondatasetcomplete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_ondatasetcomplete_Proxy(
    IHTMLElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement_get_ondatasetcomplete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_put_onfilterchange_Proxy(
    IHTMLElement* This,
    VARIANT v);
void __RPC_STUB IHTMLElement_put_onfilterchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_onfilterchange_Proxy(
    IHTMLElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement_get_onfilterchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_children_Proxy(
    IHTMLElement* This,
    IDispatch **p);
void __RPC_STUB IHTMLElement_get_children_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement_get_all_Proxy(
    IHTMLElement* This,
    IDispatch **p);
void __RPC_STUB IHTMLElement_get_all_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLElement2 interface
 */
#ifndef __IHTMLElement2_INTERFACE_DEFINED__
#define __IHTMLElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLElement2, 0x3050f434, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f434-98b5-11cf-bb82-00aa00bdce0b")
IHTMLElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_scopeName(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE setCapture(
        VARIANT_BOOL containerCapture = -1) = 0;

    virtual HRESULT STDMETHODCALLTYPE releaseCapture(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onlosecapture(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onlosecapture(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE componentFromPoint(
        LONG x,
        LONG y,
        BSTR *component) = 0;

    virtual HRESULT STDMETHODCALLTYPE doScroll(
        VARIANT component) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onscroll(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onscroll(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondrag(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondrag(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondragend(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondragend(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondragenter(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondragenter(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondragover(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondragover(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondragleave(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondragleave(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondrop(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondrop(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onbeforecut(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onbeforecut(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_oncut(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_oncut(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onbeforecopy(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onbeforecopy(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_oncopy(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_oncopy(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onbeforepaste(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onbeforepaste(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onpaste(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onpaste(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_currentStyle(
        IHTMLCurrentStyle **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onpropertychange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onpropertychange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE getClientRects(
        IHTMLRectCollection **pRectCol) = 0;

    virtual HRESULT STDMETHODCALLTYPE getBoundingClientRect(
        IHTMLRect **pRect) = 0;

    virtual HRESULT STDMETHODCALLTYPE setExpression(
        BSTR propname,
        BSTR expression,
        BSTR language = L"") = 0;

    virtual HRESULT STDMETHODCALLTYPE getExpression(
        BSTR propname,
        VARIANT *expression) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeExpression(
        BSTR propname,
        VARIANT_BOOL *pfSuccess) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_tabIndex(
        short v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_tabIndex(
        short *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE focus(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_accessKey(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_accessKey(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onblur(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onblur(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onfocus(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onfocus(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onresize(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onresize(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE blur(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE addFilter(
        IUnknown *pUnk) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeFilter(
        IUnknown *pUnk) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clientHeight(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clientWidth(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clientTop(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clientLeft(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE attachEvent(
        BSTR event,
        IDispatch *pDisp,
        VARIANT_BOOL *pfResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE detachEvent(
        BSTR event,
        IDispatch *pDisp) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_readyState(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onreadystatechange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onreadystatechange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onrowsdelete(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onrowsdelete(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onrowsinserted(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onrowsinserted(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_oncellchange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_oncellchange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_dir(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_dir(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE createControlRange(
        IDispatch **range) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollHeight(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollWidth(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollTop(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollTop(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollLeft(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollLeft(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE clearAttributes(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE mergeAttributes(
        IHTMLElement *mergeThis) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_oncontextmenu(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_oncontextmenu(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE insertAdjacentElement(
        BSTR where,
        IHTMLElement *insertedElement,
        IHTMLElement **inserted) = 0;

    virtual HRESULT STDMETHODCALLTYPE applyElement(
        IHTMLElement *apply,
        BSTR where,
        IHTMLElement **applied) = 0;

    virtual HRESULT STDMETHODCALLTYPE getAdjacentText(
        BSTR where,
        BSTR *text) = 0;

    virtual HRESULT STDMETHODCALLTYPE replaceAdjacentText(
        BSTR where,
        BSTR newText,
        BSTR *oldText) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_canHaveChildren(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE addBehavior(
        BSTR bstrUrl,
        VARIANT *pvarFactory,
        LONG *pCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeBehavior(
        LONG cookie,
        VARIANT_BOOL *pfResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_runtimeStyle(
        IHTMLStyle **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_behaviorUrns(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_tagUrn(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_tagUrn(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onbeforeeditfocus(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onbeforeeditfocus(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_readyStateValue(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE getElementsByTagName(
        BSTR v,
        IHTMLElementCollection **pelColl) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLElement2, 0x3050f434, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLElement2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_scopeName)(
        IHTMLElement2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *setCapture)(
        IHTMLElement2* This,
        VARIANT_BOOL containerCapture);

    HRESULT (STDMETHODCALLTYPE *releaseCapture)(
        IHTMLElement2* This);

    HRESULT (STDMETHODCALLTYPE *put_onlosecapture)(
        IHTMLElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onlosecapture)(
        IHTMLElement2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *componentFromPoint)(
        IHTMLElement2* This,
        LONG x,
        LONG y,
        BSTR *component);

    HRESULT (STDMETHODCALLTYPE *doScroll)(
        IHTMLElement2* This,
        VARIANT component);

    HRESULT (STDMETHODCALLTYPE *put_onscroll)(
        IHTMLElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onscroll)(
        IHTMLElement2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondrag)(
        IHTMLElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondrag)(
        IHTMLElement2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondragend)(
        IHTMLElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondragend)(
        IHTMLElement2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondragenter)(
        IHTMLElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondragenter)(
        IHTMLElement2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondragover)(
        IHTMLElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondragover)(
        IHTMLElement2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondragleave)(
        IHTMLElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondragleave)(
        IHTMLElement2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondrop)(
        IHTMLElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondrop)(
        IHTMLElement2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onbeforecut)(
        IHTMLElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onbeforecut)(
        IHTMLElement2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_oncut)(
        IHTMLElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_oncut)(
        IHTMLElement2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onbeforecopy)(
        IHTMLElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onbeforecopy)(
        IHTMLElement2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_oncopy)(
        IHTMLElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_oncopy)(
        IHTMLElement2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onbeforepaste)(
        IHTMLElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onbeforepaste)(
        IHTMLElement2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onpaste)(
        IHTMLElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onpaste)(
        IHTMLElement2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_currentStyle)(
        IHTMLElement2* This,
        IHTMLCurrentStyle **p);

    HRESULT (STDMETHODCALLTYPE *put_onpropertychange)(
        IHTMLElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onpropertychange)(
        IHTMLElement2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *getClientRects)(
        IHTMLElement2* This,
        IHTMLRectCollection **pRectCol);

    HRESULT (STDMETHODCALLTYPE *getBoundingClientRect)(
        IHTMLElement2* This,
        IHTMLRect **pRect);

    HRESULT (STDMETHODCALLTYPE *setExpression)(
        IHTMLElement2* This,
        BSTR propname,
        BSTR expression,
        BSTR language);

    HRESULT (STDMETHODCALLTYPE *getExpression)(
        IHTMLElement2* This,
        BSTR propname,
        VARIANT *expression);

    HRESULT (STDMETHODCALLTYPE *removeExpression)(
        IHTMLElement2* This,
        BSTR propname,
        VARIANT_BOOL *pfSuccess);

    HRESULT (STDMETHODCALLTYPE *put_tabIndex)(
        IHTMLElement2* This,
        short v);

    HRESULT (STDMETHODCALLTYPE *get_tabIndex)(
        IHTMLElement2* This,
        short *p);

    HRESULT (STDMETHODCALLTYPE *focus)(
        IHTMLElement2* This);

    HRESULT (STDMETHODCALLTYPE *put_accessKey)(
        IHTMLElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_accessKey)(
        IHTMLElement2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_onblur)(
        IHTMLElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onblur)(
        IHTMLElement2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onfocus)(
        IHTMLElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onfocus)(
        IHTMLElement2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onresize)(
        IHTMLElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onresize)(
        IHTMLElement2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *blur)(
        IHTMLElement2* This);

    HRESULT (STDMETHODCALLTYPE *addFilter)(
        IHTMLElement2* This,
        IUnknown *pUnk);

    HRESULT (STDMETHODCALLTYPE *removeFilter)(
        IHTMLElement2* This,
        IUnknown *pUnk);

    HRESULT (STDMETHODCALLTYPE *get_clientHeight)(
        IHTMLElement2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_clientWidth)(
        IHTMLElement2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_clientTop)(
        IHTMLElement2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_clientLeft)(
        IHTMLElement2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *attachEvent)(
        IHTMLElement2* This,
        BSTR event,
        IDispatch *pDisp,
        VARIANT_BOOL *pfResult);

    HRESULT (STDMETHODCALLTYPE *detachEvent)(
        IHTMLElement2* This,
        BSTR event,
        IDispatch *pDisp);

    HRESULT (STDMETHODCALLTYPE *get_readyState)(
        IHTMLElement2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onreadystatechange)(
        IHTMLElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onreadystatechange)(
        IHTMLElement2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onrowsdelete)(
        IHTMLElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onrowsdelete)(
        IHTMLElement2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onrowsinserted)(
        IHTMLElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onrowsinserted)(
        IHTMLElement2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_oncellchange)(
        IHTMLElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_oncellchange)(
        IHTMLElement2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_dir)(
        IHTMLElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_dir)(
        IHTMLElement2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *createControlRange)(
        IHTMLElement2* This,
        IDispatch **range);

    HRESULT (STDMETHODCALLTYPE *get_scrollHeight)(
        IHTMLElement2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_scrollWidth)(
        IHTMLElement2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollTop)(
        IHTMLElement2* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_scrollTop)(
        IHTMLElement2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollLeft)(
        IHTMLElement2* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_scrollLeft)(
        IHTMLElement2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *clearAttributes)(
        IHTMLElement2* This);

    HRESULT (STDMETHODCALLTYPE *mergeAttributes)(
        IHTMLElement2* This,
        IHTMLElement *mergeThis);

    HRESULT (STDMETHODCALLTYPE *put_oncontextmenu)(
        IHTMLElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_oncontextmenu)(
        IHTMLElement2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *insertAdjacentElement)(
        IHTMLElement2* This,
        BSTR where,
        IHTMLElement *insertedElement,
        IHTMLElement **inserted);

    HRESULT (STDMETHODCALLTYPE *applyElement)(
        IHTMLElement2* This,
        IHTMLElement *apply,
        BSTR where,
        IHTMLElement **applied);

    HRESULT (STDMETHODCALLTYPE *getAdjacentText)(
        IHTMLElement2* This,
        BSTR where,
        BSTR *text);

    HRESULT (STDMETHODCALLTYPE *replaceAdjacentText)(
        IHTMLElement2* This,
        BSTR where,
        BSTR newText,
        BSTR *oldText);

    HRESULT (STDMETHODCALLTYPE *get_canHaveChildren)(
        IHTMLElement2* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *addBehavior)(
        IHTMLElement2* This,
        BSTR bstrUrl,
        VARIANT *pvarFactory,
        LONG *pCookie);

    HRESULT (STDMETHODCALLTYPE *removeBehavior)(
        IHTMLElement2* This,
        LONG cookie,
        VARIANT_BOOL *pfResult);

    HRESULT (STDMETHODCALLTYPE *get_runtimeStyle)(
        IHTMLElement2* This,
        IHTMLStyle **p);

    HRESULT (STDMETHODCALLTYPE *get_behaviorUrns)(
        IHTMLElement2* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *put_tagUrn)(
        IHTMLElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_tagUrn)(
        IHTMLElement2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_onbeforeeditfocus)(
        IHTMLElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onbeforeeditfocus)(
        IHTMLElement2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_readyStateValue)(
        IHTMLElement2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *getElementsByTagName)(
        IHTMLElement2* This,
        BSTR v,
        IHTMLElementCollection **pelColl);

    END_INTERFACE
} IHTMLElement2Vtbl;
interface IHTMLElement2 {
    CONST_VTBL IHTMLElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLElement2 methods ***/
#define IHTMLElement2_get_scopeName(This,p) (This)->lpVtbl->get_scopeName(This,p)
#define IHTMLElement2_setCapture(This,containerCapture) (This)->lpVtbl->setCapture(This,containerCapture)
#define IHTMLElement2_releaseCapture(This) (This)->lpVtbl->releaseCapture(This)
#define IHTMLElement2_put_onlosecapture(This,v) (This)->lpVtbl->put_onlosecapture(This,v)
#define IHTMLElement2_get_onlosecapture(This,p) (This)->lpVtbl->get_onlosecapture(This,p)
#define IHTMLElement2_componentFromPoint(This,x,y,component) (This)->lpVtbl->componentFromPoint(This,x,y,component)
#define IHTMLElement2_doScroll(This,component) (This)->lpVtbl->doScroll(This,component)
#define IHTMLElement2_put_onscroll(This,v) (This)->lpVtbl->put_onscroll(This,v)
#define IHTMLElement2_get_onscroll(This,p) (This)->lpVtbl->get_onscroll(This,p)
#define IHTMLElement2_put_ondrag(This,v) (This)->lpVtbl->put_ondrag(This,v)
#define IHTMLElement2_get_ondrag(This,p) (This)->lpVtbl->get_ondrag(This,p)
#define IHTMLElement2_put_ondragend(This,v) (This)->lpVtbl->put_ondragend(This,v)
#define IHTMLElement2_get_ondragend(This,p) (This)->lpVtbl->get_ondragend(This,p)
#define IHTMLElement2_put_ondragenter(This,v) (This)->lpVtbl->put_ondragenter(This,v)
#define IHTMLElement2_get_ondragenter(This,p) (This)->lpVtbl->get_ondragenter(This,p)
#define IHTMLElement2_put_ondragover(This,v) (This)->lpVtbl->put_ondragover(This,v)
#define IHTMLElement2_get_ondragover(This,p) (This)->lpVtbl->get_ondragover(This,p)
#define IHTMLElement2_put_ondragleave(This,v) (This)->lpVtbl->put_ondragleave(This,v)
#define IHTMLElement2_get_ondragleave(This,p) (This)->lpVtbl->get_ondragleave(This,p)
#define IHTMLElement2_put_ondrop(This,v) (This)->lpVtbl->put_ondrop(This,v)
#define IHTMLElement2_get_ondrop(This,p) (This)->lpVtbl->get_ondrop(This,p)
#define IHTMLElement2_put_onbeforecut(This,v) (This)->lpVtbl->put_onbeforecut(This,v)
#define IHTMLElement2_get_onbeforecut(This,p) (This)->lpVtbl->get_onbeforecut(This,p)
#define IHTMLElement2_put_oncut(This,v) (This)->lpVtbl->put_oncut(This,v)
#define IHTMLElement2_get_oncut(This,p) (This)->lpVtbl->get_oncut(This,p)
#define IHTMLElement2_put_onbeforecopy(This,v) (This)->lpVtbl->put_onbeforecopy(This,v)
#define IHTMLElement2_get_onbeforecopy(This,p) (This)->lpVtbl->get_onbeforecopy(This,p)
#define IHTMLElement2_put_oncopy(This,v) (This)->lpVtbl->put_oncopy(This,v)
#define IHTMLElement2_get_oncopy(This,p) (This)->lpVtbl->get_oncopy(This,p)
#define IHTMLElement2_put_onbeforepaste(This,v) (This)->lpVtbl->put_onbeforepaste(This,v)
#define IHTMLElement2_get_onbeforepaste(This,p) (This)->lpVtbl->get_onbeforepaste(This,p)
#define IHTMLElement2_put_onpaste(This,v) (This)->lpVtbl->put_onpaste(This,v)
#define IHTMLElement2_get_onpaste(This,p) (This)->lpVtbl->get_onpaste(This,p)
#define IHTMLElement2_get_currentStyle(This,p) (This)->lpVtbl->get_currentStyle(This,p)
#define IHTMLElement2_put_onpropertychange(This,v) (This)->lpVtbl->put_onpropertychange(This,v)
#define IHTMLElement2_get_onpropertychange(This,p) (This)->lpVtbl->get_onpropertychange(This,p)
#define IHTMLElement2_getClientRects(This,pRectCol) (This)->lpVtbl->getClientRects(This,pRectCol)
#define IHTMLElement2_getBoundingClientRect(This,pRect) (This)->lpVtbl->getBoundingClientRect(This,pRect)
#define IHTMLElement2_setExpression(This,propname,expression,language) (This)->lpVtbl->setExpression(This,propname,expression,language)
#define IHTMLElement2_getExpression(This,propname,expression) (This)->lpVtbl->getExpression(This,propname,expression)
#define IHTMLElement2_removeExpression(This,propname,pfSuccess) (This)->lpVtbl->removeExpression(This,propname,pfSuccess)
#define IHTMLElement2_put_tabIndex(This,v) (This)->lpVtbl->put_tabIndex(This,v)
#define IHTMLElement2_get_tabIndex(This,p) (This)->lpVtbl->get_tabIndex(This,p)
#define IHTMLElement2_focus(This) (This)->lpVtbl->focus(This)
#define IHTMLElement2_put_accessKey(This,v) (This)->lpVtbl->put_accessKey(This,v)
#define IHTMLElement2_get_accessKey(This,p) (This)->lpVtbl->get_accessKey(This,p)
#define IHTMLElement2_put_onblur(This,v) (This)->lpVtbl->put_onblur(This,v)
#define IHTMLElement2_get_onblur(This,p) (This)->lpVtbl->get_onblur(This,p)
#define IHTMLElement2_put_onfocus(This,v) (This)->lpVtbl->put_onfocus(This,v)
#define IHTMLElement2_get_onfocus(This,p) (This)->lpVtbl->get_onfocus(This,p)
#define IHTMLElement2_put_onresize(This,v) (This)->lpVtbl->put_onresize(This,v)
#define IHTMLElement2_get_onresize(This,p) (This)->lpVtbl->get_onresize(This,p)
#define IHTMLElement2_blur(This) (This)->lpVtbl->blur(This)
#define IHTMLElement2_addFilter(This,pUnk) (This)->lpVtbl->addFilter(This,pUnk)
#define IHTMLElement2_removeFilter(This,pUnk) (This)->lpVtbl->removeFilter(This,pUnk)
#define IHTMLElement2_get_clientHeight(This,p) (This)->lpVtbl->get_clientHeight(This,p)
#define IHTMLElement2_get_clientWidth(This,p) (This)->lpVtbl->get_clientWidth(This,p)
#define IHTMLElement2_get_clientTop(This,p) (This)->lpVtbl->get_clientTop(This,p)
#define IHTMLElement2_get_clientLeft(This,p) (This)->lpVtbl->get_clientLeft(This,p)
#define IHTMLElement2_attachEvent(This,event,pDisp,pfResult) (This)->lpVtbl->attachEvent(This,event,pDisp,pfResult)
#define IHTMLElement2_detachEvent(This,event,pDisp) (This)->lpVtbl->detachEvent(This,event,pDisp)
#define IHTMLElement2_get_readyState(This,p) (This)->lpVtbl->get_readyState(This,p)
#define IHTMLElement2_put_onreadystatechange(This,v) (This)->lpVtbl->put_onreadystatechange(This,v)
#define IHTMLElement2_get_onreadystatechange(This,p) (This)->lpVtbl->get_onreadystatechange(This,p)
#define IHTMLElement2_put_onrowsdelete(This,v) (This)->lpVtbl->put_onrowsdelete(This,v)
#define IHTMLElement2_get_onrowsdelete(This,p) (This)->lpVtbl->get_onrowsdelete(This,p)
#define IHTMLElement2_put_onrowsinserted(This,v) (This)->lpVtbl->put_onrowsinserted(This,v)
#define IHTMLElement2_get_onrowsinserted(This,p) (This)->lpVtbl->get_onrowsinserted(This,p)
#define IHTMLElement2_put_oncellchange(This,v) (This)->lpVtbl->put_oncellchange(This,v)
#define IHTMLElement2_get_oncellchange(This,p) (This)->lpVtbl->get_oncellchange(This,p)
#define IHTMLElement2_put_dir(This,v) (This)->lpVtbl->put_dir(This,v)
#define IHTMLElement2_get_dir(This,p) (This)->lpVtbl->get_dir(This,p)
#define IHTMLElement2_createControlRange(This,range) (This)->lpVtbl->createControlRange(This,range)
#define IHTMLElement2_get_scrollHeight(This,p) (This)->lpVtbl->get_scrollHeight(This,p)
#define IHTMLElement2_get_scrollWidth(This,p) (This)->lpVtbl->get_scrollWidth(This,p)
#define IHTMLElement2_put_scrollTop(This,v) (This)->lpVtbl->put_scrollTop(This,v)
#define IHTMLElement2_get_scrollTop(This,p) (This)->lpVtbl->get_scrollTop(This,p)
#define IHTMLElement2_put_scrollLeft(This,v) (This)->lpVtbl->put_scrollLeft(This,v)
#define IHTMLElement2_get_scrollLeft(This,p) (This)->lpVtbl->get_scrollLeft(This,p)
#define IHTMLElement2_clearAttributes(This) (This)->lpVtbl->clearAttributes(This)
#define IHTMLElement2_mergeAttributes(This,mergeThis) (This)->lpVtbl->mergeAttributes(This,mergeThis)
#define IHTMLElement2_put_oncontextmenu(This,v) (This)->lpVtbl->put_oncontextmenu(This,v)
#define IHTMLElement2_get_oncontextmenu(This,p) (This)->lpVtbl->get_oncontextmenu(This,p)
#define IHTMLElement2_insertAdjacentElement(This,where,insertedElement,inserted) (This)->lpVtbl->insertAdjacentElement(This,where,insertedElement,inserted)
#define IHTMLElement2_applyElement(This,apply,where,applied) (This)->lpVtbl->applyElement(This,apply,where,applied)
#define IHTMLElement2_getAdjacentText(This,where,text) (This)->lpVtbl->getAdjacentText(This,where,text)
#define IHTMLElement2_replaceAdjacentText(This,where,newText,oldText) (This)->lpVtbl->replaceAdjacentText(This,where,newText,oldText)
#define IHTMLElement2_get_canHaveChildren(This,p) (This)->lpVtbl->get_canHaveChildren(This,p)
#define IHTMLElement2_addBehavior(This,bstrUrl,pvarFactory,pCookie) (This)->lpVtbl->addBehavior(This,bstrUrl,pvarFactory,pCookie)
#define IHTMLElement2_removeBehavior(This,cookie,pfResult) (This)->lpVtbl->removeBehavior(This,cookie,pfResult)
#define IHTMLElement2_get_runtimeStyle(This,p) (This)->lpVtbl->get_runtimeStyle(This,p)
#define IHTMLElement2_get_behaviorUrns(This,p) (This)->lpVtbl->get_behaviorUrns(This,p)
#define IHTMLElement2_put_tagUrn(This,v) (This)->lpVtbl->put_tagUrn(This,v)
#define IHTMLElement2_get_tagUrn(This,p) (This)->lpVtbl->get_tagUrn(This,p)
#define IHTMLElement2_put_onbeforeeditfocus(This,v) (This)->lpVtbl->put_onbeforeeditfocus(This,v)
#define IHTMLElement2_get_onbeforeeditfocus(This,p) (This)->lpVtbl->get_onbeforeeditfocus(This,p)
#define IHTMLElement2_get_readyStateValue(This,p) (This)->lpVtbl->get_readyStateValue(This,p)
#define IHTMLElement2_getElementsByTagName(This,v,pelColl) (This)->lpVtbl->getElementsByTagName(This,v,pelColl)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLElement2_QueryInterface(IHTMLElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLElement2_AddRef(IHTMLElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLElement2_Release(IHTMLElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLElement2_GetTypeInfoCount(IHTMLElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLElement2_GetTypeInfo(IHTMLElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLElement2_GetIDsOfNames(IHTMLElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLElement2_Invoke(IHTMLElement2* 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);
}
/*** IHTMLElement2 methods ***/
static FORCEINLINE HRESULT IHTMLElement2_get_scopeName(IHTMLElement2* This,BSTR *p) {
    return This->lpVtbl->get_scopeName(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_setCapture(IHTMLElement2* This,VARIANT_BOOL containerCapture) {
    return This->lpVtbl->setCapture(This,containerCapture);
}
static FORCEINLINE HRESULT IHTMLElement2_releaseCapture(IHTMLElement2* This) {
    return This->lpVtbl->releaseCapture(This);
}
static FORCEINLINE HRESULT IHTMLElement2_put_onlosecapture(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_onlosecapture(This,v);
}
static FORCEINLINE HRESULT IHTMLElement2_get_onlosecapture(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onlosecapture(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_componentFromPoint(IHTMLElement2* This,LONG x,LONG y,BSTR *component) {
    return This->lpVtbl->componentFromPoint(This,x,y,component);
}
static FORCEINLINE HRESULT IHTMLElement2_doScroll(IHTMLElement2* This,VARIANT component) {
    return This->lpVtbl->doScroll(This,component);
}
static FORCEINLINE HRESULT IHTMLElement2_put_onscroll(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_onscroll(This,v);
}
static FORCEINLINE HRESULT IHTMLElement2_get_onscroll(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onscroll(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_put_ondrag(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_ondrag(This,v);
}
static FORCEINLINE HRESULT IHTMLElement2_get_ondrag(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_ondrag(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_put_ondragend(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_ondragend(This,v);
}
static FORCEINLINE HRESULT IHTMLElement2_get_ondragend(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_ondragend(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_put_ondragenter(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_ondragenter(This,v);
}
static FORCEINLINE HRESULT IHTMLElement2_get_ondragenter(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_ondragenter(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_put_ondragover(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_ondragover(This,v);
}
static FORCEINLINE HRESULT IHTMLElement2_get_ondragover(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_ondragover(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_put_ondragleave(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_ondragleave(This,v);
}
static FORCEINLINE HRESULT IHTMLElement2_get_ondragleave(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_ondragleave(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_put_ondrop(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_ondrop(This,v);
}
static FORCEINLINE HRESULT IHTMLElement2_get_ondrop(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_ondrop(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_put_onbeforecut(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_onbeforecut(This,v);
}
static FORCEINLINE HRESULT IHTMLElement2_get_onbeforecut(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforecut(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_put_oncut(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_oncut(This,v);
}
static FORCEINLINE HRESULT IHTMLElement2_get_oncut(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_oncut(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_put_onbeforecopy(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_onbeforecopy(This,v);
}
static FORCEINLINE HRESULT IHTMLElement2_get_onbeforecopy(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforecopy(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_put_oncopy(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_oncopy(This,v);
}
static FORCEINLINE HRESULT IHTMLElement2_get_oncopy(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_oncopy(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_put_onbeforepaste(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_onbeforepaste(This,v);
}
static FORCEINLINE HRESULT IHTMLElement2_get_onbeforepaste(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforepaste(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_put_onpaste(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_onpaste(This,v);
}
static FORCEINLINE HRESULT IHTMLElement2_get_onpaste(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onpaste(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_get_currentStyle(IHTMLElement2* This,IHTMLCurrentStyle **p) {
    return This->lpVtbl->get_currentStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_put_onpropertychange(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_onpropertychange(This,v);
}
static FORCEINLINE HRESULT IHTMLElement2_get_onpropertychange(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onpropertychange(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_getClientRects(IHTMLElement2* This,IHTMLRectCollection **pRectCol) {
    return This->lpVtbl->getClientRects(This,pRectCol);
}
static FORCEINLINE HRESULT IHTMLElement2_getBoundingClientRect(IHTMLElement2* This,IHTMLRect **pRect) {
    return This->lpVtbl->getBoundingClientRect(This,pRect);
}
static FORCEINLINE HRESULT IHTMLElement2_setExpression(IHTMLElement2* This,BSTR propname,BSTR expression,BSTR language) {
    return This->lpVtbl->setExpression(This,propname,expression,language);
}
static FORCEINLINE HRESULT IHTMLElement2_getExpression(IHTMLElement2* This,BSTR propname,VARIANT *expression) {
    return This->lpVtbl->getExpression(This,propname,expression);
}
static FORCEINLINE HRESULT IHTMLElement2_removeExpression(IHTMLElement2* This,BSTR propname,VARIANT_BOOL *pfSuccess) {
    return This->lpVtbl->removeExpression(This,propname,pfSuccess);
}
static FORCEINLINE HRESULT IHTMLElement2_put_tabIndex(IHTMLElement2* This,short v) {
    return This->lpVtbl->put_tabIndex(This,v);
}
static FORCEINLINE HRESULT IHTMLElement2_get_tabIndex(IHTMLElement2* This,short *p) {
    return This->lpVtbl->get_tabIndex(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_focus(IHTMLElement2* This) {
    return This->lpVtbl->focus(This);
}
static FORCEINLINE HRESULT IHTMLElement2_put_accessKey(IHTMLElement2* This,BSTR v) {
    return This->lpVtbl->put_accessKey(This,v);
}
static FORCEINLINE HRESULT IHTMLElement2_get_accessKey(IHTMLElement2* This,BSTR *p) {
    return This->lpVtbl->get_accessKey(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_put_onblur(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_onblur(This,v);
}
static FORCEINLINE HRESULT IHTMLElement2_get_onblur(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onblur(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_put_onfocus(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_onfocus(This,v);
}
static FORCEINLINE HRESULT IHTMLElement2_get_onfocus(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onfocus(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_put_onresize(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_onresize(This,v);
}
static FORCEINLINE HRESULT IHTMLElement2_get_onresize(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onresize(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_blur(IHTMLElement2* This) {
    return This->lpVtbl->blur(This);
}
static FORCEINLINE HRESULT IHTMLElement2_addFilter(IHTMLElement2* This,IUnknown *pUnk) {
    return This->lpVtbl->addFilter(This,pUnk);
}
static FORCEINLINE HRESULT IHTMLElement2_removeFilter(IHTMLElement2* This,IUnknown *pUnk) {
    return This->lpVtbl->removeFilter(This,pUnk);
}
static FORCEINLINE HRESULT IHTMLElement2_get_clientHeight(IHTMLElement2* This,LONG *p) {
    return This->lpVtbl->get_clientHeight(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_get_clientWidth(IHTMLElement2* This,LONG *p) {
    return This->lpVtbl->get_clientWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_get_clientTop(IHTMLElement2* This,LONG *p) {
    return This->lpVtbl->get_clientTop(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_get_clientLeft(IHTMLElement2* This,LONG *p) {
    return This->lpVtbl->get_clientLeft(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_attachEvent(IHTMLElement2* This,BSTR event,IDispatch *pDisp,VARIANT_BOOL *pfResult) {
    return This->lpVtbl->attachEvent(This,event,pDisp,pfResult);
}
static FORCEINLINE HRESULT IHTMLElement2_detachEvent(IHTMLElement2* This,BSTR event,IDispatch *pDisp) {
    return This->lpVtbl->detachEvent(This,event,pDisp);
}
static FORCEINLINE HRESULT IHTMLElement2_get_readyState(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_readyState(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_put_onreadystatechange(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_onreadystatechange(This,v);
}
static FORCEINLINE HRESULT IHTMLElement2_get_onreadystatechange(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onreadystatechange(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_put_onrowsdelete(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_onrowsdelete(This,v);
}
static FORCEINLINE HRESULT IHTMLElement2_get_onrowsdelete(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onrowsdelete(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_put_onrowsinserted(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_onrowsinserted(This,v);
}
static FORCEINLINE HRESULT IHTMLElement2_get_onrowsinserted(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onrowsinserted(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_put_oncellchange(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_oncellchange(This,v);
}
static FORCEINLINE HRESULT IHTMLElement2_get_oncellchange(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_oncellchange(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_put_dir(IHTMLElement2* This,BSTR v) {
    return This->lpVtbl->put_dir(This,v);
}
static FORCEINLINE HRESULT IHTMLElement2_get_dir(IHTMLElement2* This,BSTR *p) {
    return This->lpVtbl->get_dir(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_createControlRange(IHTMLElement2* This,IDispatch **range) {
    return This->lpVtbl->createControlRange(This,range);
}
static FORCEINLINE HRESULT IHTMLElement2_get_scrollHeight(IHTMLElement2* This,LONG *p) {
    return This->lpVtbl->get_scrollHeight(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_get_scrollWidth(IHTMLElement2* This,LONG *p) {
    return This->lpVtbl->get_scrollWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_put_scrollTop(IHTMLElement2* This,LONG v) {
    return This->lpVtbl->put_scrollTop(This,v);
}
static FORCEINLINE HRESULT IHTMLElement2_get_scrollTop(IHTMLElement2* This,LONG *p) {
    return This->lpVtbl->get_scrollTop(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_put_scrollLeft(IHTMLElement2* This,LONG v) {
    return This->lpVtbl->put_scrollLeft(This,v);
}
static FORCEINLINE HRESULT IHTMLElement2_get_scrollLeft(IHTMLElement2* This,LONG *p) {
    return This->lpVtbl->get_scrollLeft(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_clearAttributes(IHTMLElement2* This) {
    return This->lpVtbl->clearAttributes(This);
}
static FORCEINLINE HRESULT IHTMLElement2_mergeAttributes(IHTMLElement2* This,IHTMLElement *mergeThis) {
    return This->lpVtbl->mergeAttributes(This,mergeThis);
}
static FORCEINLINE HRESULT IHTMLElement2_put_oncontextmenu(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_oncontextmenu(This,v);
}
static FORCEINLINE HRESULT IHTMLElement2_get_oncontextmenu(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_oncontextmenu(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_insertAdjacentElement(IHTMLElement2* This,BSTR where,IHTMLElement *insertedElement,IHTMLElement **inserted) {
    return This->lpVtbl->insertAdjacentElement(This,where,insertedElement,inserted);
}
static FORCEINLINE HRESULT IHTMLElement2_applyElement(IHTMLElement2* This,IHTMLElement *apply,BSTR where,IHTMLElement **applied) {
    return This->lpVtbl->applyElement(This,apply,where,applied);
}
static FORCEINLINE HRESULT IHTMLElement2_getAdjacentText(IHTMLElement2* This,BSTR where,BSTR *text) {
    return This->lpVtbl->getAdjacentText(This,where,text);
}
static FORCEINLINE HRESULT IHTMLElement2_replaceAdjacentText(IHTMLElement2* This,BSTR where,BSTR newText,BSTR *oldText) {
    return This->lpVtbl->replaceAdjacentText(This,where,newText,oldText);
}
static FORCEINLINE HRESULT IHTMLElement2_get_canHaveChildren(IHTMLElement2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_canHaveChildren(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_addBehavior(IHTMLElement2* This,BSTR bstrUrl,VARIANT *pvarFactory,LONG *pCookie) {
    return This->lpVtbl->addBehavior(This,bstrUrl,pvarFactory,pCookie);
}
static FORCEINLINE HRESULT IHTMLElement2_removeBehavior(IHTMLElement2* This,LONG cookie,VARIANT_BOOL *pfResult) {
    return This->lpVtbl->removeBehavior(This,cookie,pfResult);
}
static FORCEINLINE HRESULT IHTMLElement2_get_runtimeStyle(IHTMLElement2* This,IHTMLStyle **p) {
    return This->lpVtbl->get_runtimeStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_get_behaviorUrns(IHTMLElement2* This,IDispatch **p) {
    return This->lpVtbl->get_behaviorUrns(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_put_tagUrn(IHTMLElement2* This,BSTR v) {
    return This->lpVtbl->put_tagUrn(This,v);
}
static FORCEINLINE HRESULT IHTMLElement2_get_tagUrn(IHTMLElement2* This,BSTR *p) {
    return This->lpVtbl->get_tagUrn(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_put_onbeforeeditfocus(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_onbeforeeditfocus(This,v);
}
static FORCEINLINE HRESULT IHTMLElement2_get_onbeforeeditfocus(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforeeditfocus(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_get_readyStateValue(IHTMLElement2* This,LONG *p) {
    return This->lpVtbl->get_readyStateValue(This,p);
}
static FORCEINLINE HRESULT IHTMLElement2_getElementsByTagName(IHTMLElement2* This,BSTR v,IHTMLElementCollection **pelColl) {
    return This->lpVtbl->getElementsByTagName(This,v,pelColl);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLElement2_get_scopeName_Proxy(
    IHTMLElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLElement2_get_scopeName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_setCapture_Proxy(
    IHTMLElement2* This,
    VARIANT_BOOL containerCapture);
void __RPC_STUB IHTMLElement2_setCapture_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_releaseCapture_Proxy(
    IHTMLElement2* This);
void __RPC_STUB IHTMLElement2_releaseCapture_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_put_onlosecapture_Proxy(
    IHTMLElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLElement2_put_onlosecapture_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_onlosecapture_Proxy(
    IHTMLElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement2_get_onlosecapture_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_componentFromPoint_Proxy(
    IHTMLElement2* This,
    LONG x,
    LONG y,
    BSTR *component);
void __RPC_STUB IHTMLElement2_componentFromPoint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_doScroll_Proxy(
    IHTMLElement2* This,
    VARIANT component);
void __RPC_STUB IHTMLElement2_doScroll_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_put_onscroll_Proxy(
    IHTMLElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLElement2_put_onscroll_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_onscroll_Proxy(
    IHTMLElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement2_get_onscroll_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_put_ondrag_Proxy(
    IHTMLElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLElement2_put_ondrag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_ondrag_Proxy(
    IHTMLElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement2_get_ondrag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_put_ondragend_Proxy(
    IHTMLElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLElement2_put_ondragend_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_ondragend_Proxy(
    IHTMLElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement2_get_ondragend_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_put_ondragenter_Proxy(
    IHTMLElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLElement2_put_ondragenter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_ondragenter_Proxy(
    IHTMLElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement2_get_ondragenter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_put_ondragover_Proxy(
    IHTMLElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLElement2_put_ondragover_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_ondragover_Proxy(
    IHTMLElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement2_get_ondragover_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_put_ondragleave_Proxy(
    IHTMLElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLElement2_put_ondragleave_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_ondragleave_Proxy(
    IHTMLElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement2_get_ondragleave_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_put_ondrop_Proxy(
    IHTMLElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLElement2_put_ondrop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_ondrop_Proxy(
    IHTMLElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement2_get_ondrop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_put_onbeforecut_Proxy(
    IHTMLElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLElement2_put_onbeforecut_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_onbeforecut_Proxy(
    IHTMLElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement2_get_onbeforecut_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_put_oncut_Proxy(
    IHTMLElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLElement2_put_oncut_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_oncut_Proxy(
    IHTMLElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement2_get_oncut_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_put_onbeforecopy_Proxy(
    IHTMLElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLElement2_put_onbeforecopy_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_onbeforecopy_Proxy(
    IHTMLElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement2_get_onbeforecopy_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_put_oncopy_Proxy(
    IHTMLElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLElement2_put_oncopy_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_oncopy_Proxy(
    IHTMLElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement2_get_oncopy_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_put_onbeforepaste_Proxy(
    IHTMLElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLElement2_put_onbeforepaste_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_onbeforepaste_Proxy(
    IHTMLElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement2_get_onbeforepaste_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_put_onpaste_Proxy(
    IHTMLElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLElement2_put_onpaste_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_onpaste_Proxy(
    IHTMLElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement2_get_onpaste_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_currentStyle_Proxy(
    IHTMLElement2* This,
    IHTMLCurrentStyle **p);
void __RPC_STUB IHTMLElement2_get_currentStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_put_onpropertychange_Proxy(
    IHTMLElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLElement2_put_onpropertychange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_onpropertychange_Proxy(
    IHTMLElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement2_get_onpropertychange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_getClientRects_Proxy(
    IHTMLElement2* This,
    IHTMLRectCollection **pRectCol);
void __RPC_STUB IHTMLElement2_getClientRects_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_getBoundingClientRect_Proxy(
    IHTMLElement2* This,
    IHTMLRect **pRect);
void __RPC_STUB IHTMLElement2_getBoundingClientRect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_setExpression_Proxy(
    IHTMLElement2* This,
    BSTR propname,
    BSTR expression,
    BSTR language);
void __RPC_STUB IHTMLElement2_setExpression_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_getExpression_Proxy(
    IHTMLElement2* This,
    BSTR propname,
    VARIANT *expression);
void __RPC_STUB IHTMLElement2_getExpression_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_removeExpression_Proxy(
    IHTMLElement2* This,
    BSTR propname,
    VARIANT_BOOL *pfSuccess);
void __RPC_STUB IHTMLElement2_removeExpression_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_put_tabIndex_Proxy(
    IHTMLElement2* This,
    short v);
void __RPC_STUB IHTMLElement2_put_tabIndex_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_tabIndex_Proxy(
    IHTMLElement2* This,
    short *p);
void __RPC_STUB IHTMLElement2_get_tabIndex_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_focus_Proxy(
    IHTMLElement2* This);
void __RPC_STUB IHTMLElement2_focus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_put_accessKey_Proxy(
    IHTMLElement2* This,
    BSTR v);
void __RPC_STUB IHTMLElement2_put_accessKey_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_accessKey_Proxy(
    IHTMLElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLElement2_get_accessKey_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_put_onblur_Proxy(
    IHTMLElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLElement2_put_onblur_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_onblur_Proxy(
    IHTMLElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement2_get_onblur_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_put_onfocus_Proxy(
    IHTMLElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLElement2_put_onfocus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_onfocus_Proxy(
    IHTMLElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement2_get_onfocus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_put_onresize_Proxy(
    IHTMLElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLElement2_put_onresize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_onresize_Proxy(
    IHTMLElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement2_get_onresize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_blur_Proxy(
    IHTMLElement2* This);
void __RPC_STUB IHTMLElement2_blur_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_addFilter_Proxy(
    IHTMLElement2* This,
    IUnknown *pUnk);
void __RPC_STUB IHTMLElement2_addFilter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_removeFilter_Proxy(
    IHTMLElement2* This,
    IUnknown *pUnk);
void __RPC_STUB IHTMLElement2_removeFilter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_clientHeight_Proxy(
    IHTMLElement2* This,
    LONG *p);
void __RPC_STUB IHTMLElement2_get_clientHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_clientWidth_Proxy(
    IHTMLElement2* This,
    LONG *p);
void __RPC_STUB IHTMLElement2_get_clientWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_clientTop_Proxy(
    IHTMLElement2* This,
    LONG *p);
void __RPC_STUB IHTMLElement2_get_clientTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_clientLeft_Proxy(
    IHTMLElement2* This,
    LONG *p);
void __RPC_STUB IHTMLElement2_get_clientLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_attachEvent_Proxy(
    IHTMLElement2* This,
    BSTR event,
    IDispatch *pDisp,
    VARIANT_BOOL *pfResult);
void __RPC_STUB IHTMLElement2_attachEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_detachEvent_Proxy(
    IHTMLElement2* This,
    BSTR event,
    IDispatch *pDisp);
void __RPC_STUB IHTMLElement2_detachEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_readyState_Proxy(
    IHTMLElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement2_get_readyState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_put_onreadystatechange_Proxy(
    IHTMLElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLElement2_put_onreadystatechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_onreadystatechange_Proxy(
    IHTMLElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement2_get_onreadystatechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_put_onrowsdelete_Proxy(
    IHTMLElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLElement2_put_onrowsdelete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_onrowsdelete_Proxy(
    IHTMLElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement2_get_onrowsdelete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_put_onrowsinserted_Proxy(
    IHTMLElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLElement2_put_onrowsinserted_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_onrowsinserted_Proxy(
    IHTMLElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement2_get_onrowsinserted_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_put_oncellchange_Proxy(
    IHTMLElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLElement2_put_oncellchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_oncellchange_Proxy(
    IHTMLElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement2_get_oncellchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_put_dir_Proxy(
    IHTMLElement2* This,
    BSTR v);
void __RPC_STUB IHTMLElement2_put_dir_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_dir_Proxy(
    IHTMLElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLElement2_get_dir_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_createControlRange_Proxy(
    IHTMLElement2* This,
    IDispatch **range);
void __RPC_STUB IHTMLElement2_createControlRange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_scrollHeight_Proxy(
    IHTMLElement2* This,
    LONG *p);
void __RPC_STUB IHTMLElement2_get_scrollHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_scrollWidth_Proxy(
    IHTMLElement2* This,
    LONG *p);
void __RPC_STUB IHTMLElement2_get_scrollWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_put_scrollTop_Proxy(
    IHTMLElement2* This,
    LONG v);
void __RPC_STUB IHTMLElement2_put_scrollTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_scrollTop_Proxy(
    IHTMLElement2* This,
    LONG *p);
void __RPC_STUB IHTMLElement2_get_scrollTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_put_scrollLeft_Proxy(
    IHTMLElement2* This,
    LONG v);
void __RPC_STUB IHTMLElement2_put_scrollLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_scrollLeft_Proxy(
    IHTMLElement2* This,
    LONG *p);
void __RPC_STUB IHTMLElement2_get_scrollLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_clearAttributes_Proxy(
    IHTMLElement2* This);
void __RPC_STUB IHTMLElement2_clearAttributes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_mergeAttributes_Proxy(
    IHTMLElement2* This,
    IHTMLElement *mergeThis);
void __RPC_STUB IHTMLElement2_mergeAttributes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_put_oncontextmenu_Proxy(
    IHTMLElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLElement2_put_oncontextmenu_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_oncontextmenu_Proxy(
    IHTMLElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement2_get_oncontextmenu_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_insertAdjacentElement_Proxy(
    IHTMLElement2* This,
    BSTR where,
    IHTMLElement *insertedElement,
    IHTMLElement **inserted);
void __RPC_STUB IHTMLElement2_insertAdjacentElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_applyElement_Proxy(
    IHTMLElement2* This,
    IHTMLElement *apply,
    BSTR where,
    IHTMLElement **applied);
void __RPC_STUB IHTMLElement2_applyElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_getAdjacentText_Proxy(
    IHTMLElement2* This,
    BSTR where,
    BSTR *text);
void __RPC_STUB IHTMLElement2_getAdjacentText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_replaceAdjacentText_Proxy(
    IHTMLElement2* This,
    BSTR where,
    BSTR newText,
    BSTR *oldText);
void __RPC_STUB IHTMLElement2_replaceAdjacentText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_canHaveChildren_Proxy(
    IHTMLElement2* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLElement2_get_canHaveChildren_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_addBehavior_Proxy(
    IHTMLElement2* This,
    BSTR bstrUrl,
    VARIANT *pvarFactory,
    LONG *pCookie);
void __RPC_STUB IHTMLElement2_addBehavior_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_removeBehavior_Proxy(
    IHTMLElement2* This,
    LONG cookie,
    VARIANT_BOOL *pfResult);
void __RPC_STUB IHTMLElement2_removeBehavior_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_runtimeStyle_Proxy(
    IHTMLElement2* This,
    IHTMLStyle **p);
void __RPC_STUB IHTMLElement2_get_runtimeStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_behaviorUrns_Proxy(
    IHTMLElement2* This,
    IDispatch **p);
void __RPC_STUB IHTMLElement2_get_behaviorUrns_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_put_tagUrn_Proxy(
    IHTMLElement2* This,
    BSTR v);
void __RPC_STUB IHTMLElement2_put_tagUrn_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_tagUrn_Proxy(
    IHTMLElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLElement2_get_tagUrn_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_put_onbeforeeditfocus_Proxy(
    IHTMLElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLElement2_put_onbeforeeditfocus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_onbeforeeditfocus_Proxy(
    IHTMLElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement2_get_onbeforeeditfocus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_get_readyStateValue_Proxy(
    IHTMLElement2* This,
    LONG *p);
void __RPC_STUB IHTMLElement2_get_readyStateValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement2_getElementsByTagName_Proxy(
    IHTMLElement2* This,
    BSTR v,
    IHTMLElementCollection **pelColl);
void __RPC_STUB IHTMLElement2_getElementsByTagName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLElement3 interface
 */
#ifndef __IHTMLElement3_INTERFACE_DEFINED__
#define __IHTMLElement3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLElement3, 0x3050f673, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f673-98b5-11cf-bb82-00aa00bdce0b")
IHTMLElement3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE mergeAttributes(
        IHTMLElement *mergeThis,
        VARIANT *pvarFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_isMultiLine(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_canHaveHTML(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onlayoutcomplete(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onlayoutcomplete(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onpage(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onpage(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_inflateBlock(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_inflateBlock(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onbeforedeactivate(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onbeforedeactivate(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE setActive(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_contentEditable(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_contentEditable(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_isContentEditable(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_hideFocus(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_hideFocus(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_disabled(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_disabled(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_isDisabled(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmove(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmove(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_oncontrolselect(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_oncontrolselect(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE fireEvent(
        BSTR bstrEventName,
        VARIANT *pvarEventObject,
        VARIANT_BOOL *pfCancelled) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onresizestart(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onresizestart(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onresizeend(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onresizeend(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmovestart(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmovestart(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmoveend(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmoveend(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmouseenter(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmouseenter(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmouseleave(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmouseleave(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onactivate(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onactivate(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondeactivate(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondeactivate(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE dragDrop(
        VARIANT_BOOL *pfRet) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_glyphMode(
        LONG *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLElement3, 0x3050f673, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLElement3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLElement3 methods ***/
    HRESULT (STDMETHODCALLTYPE *mergeAttributes)(
        IHTMLElement3* This,
        IHTMLElement *mergeThis,
        VARIANT *pvarFlags);

    HRESULT (STDMETHODCALLTYPE *get_isMultiLine)(
        IHTMLElement3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_canHaveHTML)(
        IHTMLElement3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_onlayoutcomplete)(
        IHTMLElement3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onlayoutcomplete)(
        IHTMLElement3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onpage)(
        IHTMLElement3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onpage)(
        IHTMLElement3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_inflateBlock)(
        IHTMLElement3* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_inflateBlock)(
        IHTMLElement3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_onbeforedeactivate)(
        IHTMLElement3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onbeforedeactivate)(
        IHTMLElement3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *setActive)(
        IHTMLElement3* This);

    HRESULT (STDMETHODCALLTYPE *put_contentEditable)(
        IHTMLElement3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_contentEditable)(
        IHTMLElement3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_isContentEditable)(
        IHTMLElement3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_hideFocus)(
        IHTMLElement3* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_hideFocus)(
        IHTMLElement3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_disabled)(
        IHTMLElement3* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_disabled)(
        IHTMLElement3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_isDisabled)(
        IHTMLElement3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_onmove)(
        IHTMLElement3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmove)(
        IHTMLElement3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_oncontrolselect)(
        IHTMLElement3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_oncontrolselect)(
        IHTMLElement3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *fireEvent)(
        IHTMLElement3* This,
        BSTR bstrEventName,
        VARIANT *pvarEventObject,
        VARIANT_BOOL *pfCancelled);

    HRESULT (STDMETHODCALLTYPE *put_onresizestart)(
        IHTMLElement3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onresizestart)(
        IHTMLElement3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onresizeend)(
        IHTMLElement3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onresizeend)(
        IHTMLElement3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmovestart)(
        IHTMLElement3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmovestart)(
        IHTMLElement3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmoveend)(
        IHTMLElement3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmoveend)(
        IHTMLElement3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmouseenter)(
        IHTMLElement3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmouseenter)(
        IHTMLElement3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmouseleave)(
        IHTMLElement3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmouseleave)(
        IHTMLElement3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onactivate)(
        IHTMLElement3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onactivate)(
        IHTMLElement3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondeactivate)(
        IHTMLElement3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondeactivate)(
        IHTMLElement3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *dragDrop)(
        IHTMLElement3* This,
        VARIANT_BOOL *pfRet);

    HRESULT (STDMETHODCALLTYPE *get_glyphMode)(
        IHTMLElement3* This,
        LONG *p);

    END_INTERFACE
} IHTMLElement3Vtbl;
interface IHTMLElement3 {
    CONST_VTBL IHTMLElement3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLElement3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLElement3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLElement3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLElement3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLElement3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLElement3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLElement3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLElement3 methods ***/
#define IHTMLElement3_mergeAttributes(This,mergeThis,pvarFlags) (This)->lpVtbl->mergeAttributes(This,mergeThis,pvarFlags)
#define IHTMLElement3_get_isMultiLine(This,p) (This)->lpVtbl->get_isMultiLine(This,p)
#define IHTMLElement3_get_canHaveHTML(This,p) (This)->lpVtbl->get_canHaveHTML(This,p)
#define IHTMLElement3_put_onlayoutcomplete(This,v) (This)->lpVtbl->put_onlayoutcomplete(This,v)
#define IHTMLElement3_get_onlayoutcomplete(This,p) (This)->lpVtbl->get_onlayoutcomplete(This,p)
#define IHTMLElement3_put_onpage(This,v) (This)->lpVtbl->put_onpage(This,v)
#define IHTMLElement3_get_onpage(This,p) (This)->lpVtbl->get_onpage(This,p)
#define IHTMLElement3_put_inflateBlock(This,v) (This)->lpVtbl->put_inflateBlock(This,v)
#define IHTMLElement3_get_inflateBlock(This,p) (This)->lpVtbl->get_inflateBlock(This,p)
#define IHTMLElement3_put_onbeforedeactivate(This,v) (This)->lpVtbl->put_onbeforedeactivate(This,v)
#define IHTMLElement3_get_onbeforedeactivate(This,p) (This)->lpVtbl->get_onbeforedeactivate(This,p)
#define IHTMLElement3_setActive(This) (This)->lpVtbl->setActive(This)
#define IHTMLElement3_put_contentEditable(This,v) (This)->lpVtbl->put_contentEditable(This,v)
#define IHTMLElement3_get_contentEditable(This,p) (This)->lpVtbl->get_contentEditable(This,p)
#define IHTMLElement3_get_isContentEditable(This,p) (This)->lpVtbl->get_isContentEditable(This,p)
#define IHTMLElement3_put_hideFocus(This,v) (This)->lpVtbl->put_hideFocus(This,v)
#define IHTMLElement3_get_hideFocus(This,p) (This)->lpVtbl->get_hideFocus(This,p)
#define IHTMLElement3_put_disabled(This,v) (This)->lpVtbl->put_disabled(This,v)
#define IHTMLElement3_get_disabled(This,p) (This)->lpVtbl->get_disabled(This,p)
#define IHTMLElement3_get_isDisabled(This,p) (This)->lpVtbl->get_isDisabled(This,p)
#define IHTMLElement3_put_onmove(This,v) (This)->lpVtbl->put_onmove(This,v)
#define IHTMLElement3_get_onmove(This,p) (This)->lpVtbl->get_onmove(This,p)
#define IHTMLElement3_put_oncontrolselect(This,v) (This)->lpVtbl->put_oncontrolselect(This,v)
#define IHTMLElement3_get_oncontrolselect(This,p) (This)->lpVtbl->get_oncontrolselect(This,p)
#define IHTMLElement3_fireEvent(This,bstrEventName,pvarEventObject,pfCancelled) (This)->lpVtbl->fireEvent(This,bstrEventName,pvarEventObject,pfCancelled)
#define IHTMLElement3_put_onresizestart(This,v) (This)->lpVtbl->put_onresizestart(This,v)
#define IHTMLElement3_get_onresizestart(This,p) (This)->lpVtbl->get_onresizestart(This,p)
#define IHTMLElement3_put_onresizeend(This,v) (This)->lpVtbl->put_onresizeend(This,v)
#define IHTMLElement3_get_onresizeend(This,p) (This)->lpVtbl->get_onresizeend(This,p)
#define IHTMLElement3_put_onmovestart(This,v) (This)->lpVtbl->put_onmovestart(This,v)
#define IHTMLElement3_get_onmovestart(This,p) (This)->lpVtbl->get_onmovestart(This,p)
#define IHTMLElement3_put_onmoveend(This,v) (This)->lpVtbl->put_onmoveend(This,v)
#define IHTMLElement3_get_onmoveend(This,p) (This)->lpVtbl->get_onmoveend(This,p)
#define IHTMLElement3_put_onmouseenter(This,v) (This)->lpVtbl->put_onmouseenter(This,v)
#define IHTMLElement3_get_onmouseenter(This,p) (This)->lpVtbl->get_onmouseenter(This,p)
#define IHTMLElement3_put_onmouseleave(This,v) (This)->lpVtbl->put_onmouseleave(This,v)
#define IHTMLElement3_get_onmouseleave(This,p) (This)->lpVtbl->get_onmouseleave(This,p)
#define IHTMLElement3_put_onactivate(This,v) (This)->lpVtbl->put_onactivate(This,v)
#define IHTMLElement3_get_onactivate(This,p) (This)->lpVtbl->get_onactivate(This,p)
#define IHTMLElement3_put_ondeactivate(This,v) (This)->lpVtbl->put_ondeactivate(This,v)
#define IHTMLElement3_get_ondeactivate(This,p) (This)->lpVtbl->get_ondeactivate(This,p)
#define IHTMLElement3_dragDrop(This,pfRet) (This)->lpVtbl->dragDrop(This,pfRet)
#define IHTMLElement3_get_glyphMode(This,p) (This)->lpVtbl->get_glyphMode(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLElement3_QueryInterface(IHTMLElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLElement3_AddRef(IHTMLElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLElement3_Release(IHTMLElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLElement3_GetTypeInfoCount(IHTMLElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLElement3_GetTypeInfo(IHTMLElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLElement3_GetIDsOfNames(IHTMLElement3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLElement3_Invoke(IHTMLElement3* 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);
}
/*** IHTMLElement3 methods ***/
static FORCEINLINE HRESULT IHTMLElement3_mergeAttributes(IHTMLElement3* This,IHTMLElement *mergeThis,VARIANT *pvarFlags) {
    return This->lpVtbl->mergeAttributes(This,mergeThis,pvarFlags);
}
static FORCEINLINE HRESULT IHTMLElement3_get_isMultiLine(IHTMLElement3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_isMultiLine(This,p);
}
static FORCEINLINE HRESULT IHTMLElement3_get_canHaveHTML(IHTMLElement3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_canHaveHTML(This,p);
}
static FORCEINLINE HRESULT IHTMLElement3_put_onlayoutcomplete(IHTMLElement3* This,VARIANT v) {
    return This->lpVtbl->put_onlayoutcomplete(This,v);
}
static FORCEINLINE HRESULT IHTMLElement3_get_onlayoutcomplete(IHTMLElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onlayoutcomplete(This,p);
}
static FORCEINLINE HRESULT IHTMLElement3_put_onpage(IHTMLElement3* This,VARIANT v) {
    return This->lpVtbl->put_onpage(This,v);
}
static FORCEINLINE HRESULT IHTMLElement3_get_onpage(IHTMLElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onpage(This,p);
}
static FORCEINLINE HRESULT IHTMLElement3_put_inflateBlock(IHTMLElement3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_inflateBlock(This,v);
}
static FORCEINLINE HRESULT IHTMLElement3_get_inflateBlock(IHTMLElement3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_inflateBlock(This,p);
}
static FORCEINLINE HRESULT IHTMLElement3_put_onbeforedeactivate(IHTMLElement3* This,VARIANT v) {
    return This->lpVtbl->put_onbeforedeactivate(This,v);
}
static FORCEINLINE HRESULT IHTMLElement3_get_onbeforedeactivate(IHTMLElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforedeactivate(This,p);
}
static FORCEINLINE HRESULT IHTMLElement3_setActive(IHTMLElement3* This) {
    return This->lpVtbl->setActive(This);
}
static FORCEINLINE HRESULT IHTMLElement3_put_contentEditable(IHTMLElement3* This,BSTR v) {
    return This->lpVtbl->put_contentEditable(This,v);
}
static FORCEINLINE HRESULT IHTMLElement3_get_contentEditable(IHTMLElement3* This,BSTR *p) {
    return This->lpVtbl->get_contentEditable(This,p);
}
static FORCEINLINE HRESULT IHTMLElement3_get_isContentEditable(IHTMLElement3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_isContentEditable(This,p);
}
static FORCEINLINE HRESULT IHTMLElement3_put_hideFocus(IHTMLElement3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_hideFocus(This,v);
}
static FORCEINLINE HRESULT IHTMLElement3_get_hideFocus(IHTMLElement3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_hideFocus(This,p);
}
static FORCEINLINE HRESULT IHTMLElement3_put_disabled(IHTMLElement3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_disabled(This,v);
}
static FORCEINLINE HRESULT IHTMLElement3_get_disabled(IHTMLElement3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_disabled(This,p);
}
static FORCEINLINE HRESULT IHTMLElement3_get_isDisabled(IHTMLElement3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_isDisabled(This,p);
}
static FORCEINLINE HRESULT IHTMLElement3_put_onmove(IHTMLElement3* This,VARIANT v) {
    return This->lpVtbl->put_onmove(This,v);
}
static FORCEINLINE HRESULT IHTMLElement3_get_onmove(IHTMLElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onmove(This,p);
}
static FORCEINLINE HRESULT IHTMLElement3_put_oncontrolselect(IHTMLElement3* This,VARIANT v) {
    return This->lpVtbl->put_oncontrolselect(This,v);
}
static FORCEINLINE HRESULT IHTMLElement3_get_oncontrolselect(IHTMLElement3* This,VARIANT *p) {
    return This->lpVtbl->get_oncontrolselect(This,p);
}
static FORCEINLINE HRESULT IHTMLElement3_fireEvent(IHTMLElement3* This,BSTR bstrEventName,VARIANT *pvarEventObject,VARIANT_BOOL *pfCancelled) {
    return This->lpVtbl->fireEvent(This,bstrEventName,pvarEventObject,pfCancelled);
}
static FORCEINLINE HRESULT IHTMLElement3_put_onresizestart(IHTMLElement3* This,VARIANT v) {
    return This->lpVtbl->put_onresizestart(This,v);
}
static FORCEINLINE HRESULT IHTMLElement3_get_onresizestart(IHTMLElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onresizestart(This,p);
}
static FORCEINLINE HRESULT IHTMLElement3_put_onresizeend(IHTMLElement3* This,VARIANT v) {
    return This->lpVtbl->put_onresizeend(This,v);
}
static FORCEINLINE HRESULT IHTMLElement3_get_onresizeend(IHTMLElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onresizeend(This,p);
}
static FORCEINLINE HRESULT IHTMLElement3_put_onmovestart(IHTMLElement3* This,VARIANT v) {
    return This->lpVtbl->put_onmovestart(This,v);
}
static FORCEINLINE HRESULT IHTMLElement3_get_onmovestart(IHTMLElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onmovestart(This,p);
}
static FORCEINLINE HRESULT IHTMLElement3_put_onmoveend(IHTMLElement3* This,VARIANT v) {
    return This->lpVtbl->put_onmoveend(This,v);
}
static FORCEINLINE HRESULT IHTMLElement3_get_onmoveend(IHTMLElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onmoveend(This,p);
}
static FORCEINLINE HRESULT IHTMLElement3_put_onmouseenter(IHTMLElement3* This,VARIANT v) {
    return This->lpVtbl->put_onmouseenter(This,v);
}
static FORCEINLINE HRESULT IHTMLElement3_get_onmouseenter(IHTMLElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onmouseenter(This,p);
}
static FORCEINLINE HRESULT IHTMLElement3_put_onmouseleave(IHTMLElement3* This,VARIANT v) {
    return This->lpVtbl->put_onmouseleave(This,v);
}
static FORCEINLINE HRESULT IHTMLElement3_get_onmouseleave(IHTMLElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onmouseleave(This,p);
}
static FORCEINLINE HRESULT IHTMLElement3_put_onactivate(IHTMLElement3* This,VARIANT v) {
    return This->lpVtbl->put_onactivate(This,v);
}
static FORCEINLINE HRESULT IHTMLElement3_get_onactivate(IHTMLElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onactivate(This,p);
}
static FORCEINLINE HRESULT IHTMLElement3_put_ondeactivate(IHTMLElement3* This,VARIANT v) {
    return This->lpVtbl->put_ondeactivate(This,v);
}
static FORCEINLINE HRESULT IHTMLElement3_get_ondeactivate(IHTMLElement3* This,VARIANT *p) {
    return This->lpVtbl->get_ondeactivate(This,p);
}
static FORCEINLINE HRESULT IHTMLElement3_dragDrop(IHTMLElement3* This,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->dragDrop(This,pfRet);
}
static FORCEINLINE HRESULT IHTMLElement3_get_glyphMode(IHTMLElement3* This,LONG *p) {
    return This->lpVtbl->get_glyphMode(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLElement3_mergeAttributes_Proxy(
    IHTMLElement3* This,
    IHTMLElement *mergeThis,
    VARIANT *pvarFlags);
void __RPC_STUB IHTMLElement3_mergeAttributes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_get_isMultiLine_Proxy(
    IHTMLElement3* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLElement3_get_isMultiLine_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_get_canHaveHTML_Proxy(
    IHTMLElement3* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLElement3_get_canHaveHTML_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_put_onlayoutcomplete_Proxy(
    IHTMLElement3* This,
    VARIANT v);
void __RPC_STUB IHTMLElement3_put_onlayoutcomplete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_get_onlayoutcomplete_Proxy(
    IHTMLElement3* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement3_get_onlayoutcomplete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_put_onpage_Proxy(
    IHTMLElement3* This,
    VARIANT v);
void __RPC_STUB IHTMLElement3_put_onpage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_get_onpage_Proxy(
    IHTMLElement3* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement3_get_onpage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_put_inflateBlock_Proxy(
    IHTMLElement3* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLElement3_put_inflateBlock_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_get_inflateBlock_Proxy(
    IHTMLElement3* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLElement3_get_inflateBlock_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_put_onbeforedeactivate_Proxy(
    IHTMLElement3* This,
    VARIANT v);
void __RPC_STUB IHTMLElement3_put_onbeforedeactivate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_get_onbeforedeactivate_Proxy(
    IHTMLElement3* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement3_get_onbeforedeactivate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_setActive_Proxy(
    IHTMLElement3* This);
void __RPC_STUB IHTMLElement3_setActive_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_put_contentEditable_Proxy(
    IHTMLElement3* This,
    BSTR v);
void __RPC_STUB IHTMLElement3_put_contentEditable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_get_contentEditable_Proxy(
    IHTMLElement3* This,
    BSTR *p);
void __RPC_STUB IHTMLElement3_get_contentEditable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_get_isContentEditable_Proxy(
    IHTMLElement3* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLElement3_get_isContentEditable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_put_hideFocus_Proxy(
    IHTMLElement3* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLElement3_put_hideFocus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_get_hideFocus_Proxy(
    IHTMLElement3* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLElement3_get_hideFocus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_put_disabled_Proxy(
    IHTMLElement3* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLElement3_put_disabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_get_disabled_Proxy(
    IHTMLElement3* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLElement3_get_disabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_get_isDisabled_Proxy(
    IHTMLElement3* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLElement3_get_isDisabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_put_onmove_Proxy(
    IHTMLElement3* This,
    VARIANT v);
void __RPC_STUB IHTMLElement3_put_onmove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_get_onmove_Proxy(
    IHTMLElement3* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement3_get_onmove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_put_oncontrolselect_Proxy(
    IHTMLElement3* This,
    VARIANT v);
void __RPC_STUB IHTMLElement3_put_oncontrolselect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_get_oncontrolselect_Proxy(
    IHTMLElement3* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement3_get_oncontrolselect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_fireEvent_Proxy(
    IHTMLElement3* This,
    BSTR bstrEventName,
    VARIANT *pvarEventObject,
    VARIANT_BOOL *pfCancelled);
void __RPC_STUB IHTMLElement3_fireEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_put_onresizestart_Proxy(
    IHTMLElement3* This,
    VARIANT v);
void __RPC_STUB IHTMLElement3_put_onresizestart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_get_onresizestart_Proxy(
    IHTMLElement3* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement3_get_onresizestart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_put_onresizeend_Proxy(
    IHTMLElement3* This,
    VARIANT v);
void __RPC_STUB IHTMLElement3_put_onresizeend_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_get_onresizeend_Proxy(
    IHTMLElement3* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement3_get_onresizeend_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_put_onmovestart_Proxy(
    IHTMLElement3* This,
    VARIANT v);
void __RPC_STUB IHTMLElement3_put_onmovestart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_get_onmovestart_Proxy(
    IHTMLElement3* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement3_get_onmovestart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_put_onmoveend_Proxy(
    IHTMLElement3* This,
    VARIANT v);
void __RPC_STUB IHTMLElement3_put_onmoveend_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_get_onmoveend_Proxy(
    IHTMLElement3* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement3_get_onmoveend_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_put_onmouseenter_Proxy(
    IHTMLElement3* This,
    VARIANT v);
void __RPC_STUB IHTMLElement3_put_onmouseenter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_get_onmouseenter_Proxy(
    IHTMLElement3* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement3_get_onmouseenter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_put_onmouseleave_Proxy(
    IHTMLElement3* This,
    VARIANT v);
void __RPC_STUB IHTMLElement3_put_onmouseleave_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_get_onmouseleave_Proxy(
    IHTMLElement3* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement3_get_onmouseleave_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_put_onactivate_Proxy(
    IHTMLElement3* This,
    VARIANT v);
void __RPC_STUB IHTMLElement3_put_onactivate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_get_onactivate_Proxy(
    IHTMLElement3* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement3_get_onactivate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_put_ondeactivate_Proxy(
    IHTMLElement3* This,
    VARIANT v);
void __RPC_STUB IHTMLElement3_put_ondeactivate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_get_ondeactivate_Proxy(
    IHTMLElement3* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement3_get_ondeactivate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_dragDrop_Proxy(
    IHTMLElement3* This,
    VARIANT_BOOL *pfRet);
void __RPC_STUB IHTMLElement3_dragDrop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement3_get_glyphMode_Proxy(
    IHTMLElement3* This,
    LONG *p);
void __RPC_STUB IHTMLElement3_get_glyphMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLElement3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLElement4 interface
 */
#ifndef __IHTMLElement4_INTERFACE_DEFINED__
#define __IHTMLElement4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLElement4, 0x3050f80f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f80f-98b5-11cf-bb82-00aa00bdce0b")
IHTMLElement4 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_onmousewheel(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmousewheel(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE normalize(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE getAttributeNode(
        BSTR bstrname,
        IHTMLDOMAttribute **ppAttribute) = 0;

    virtual HRESULT STDMETHODCALLTYPE setAttributeNode(
        IHTMLDOMAttribute *pattr,
        IHTMLDOMAttribute **ppretAttribute) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeAttributeNode(
        IHTMLDOMAttribute *pattr,
        IHTMLDOMAttribute **ppretAttribute) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onbeforeactivate(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onbeforeactivate(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onfocusin(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onfocusin(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onfocusout(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onfocusout(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLElement4, 0x3050f80f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLElement4Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLElement4 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_onmousewheel)(
        IHTMLElement4* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmousewheel)(
        IHTMLElement4* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *normalize)(
        IHTMLElement4* This);

    HRESULT (STDMETHODCALLTYPE *getAttributeNode)(
        IHTMLElement4* This,
        BSTR bstrname,
        IHTMLDOMAttribute **ppAttribute);

    HRESULT (STDMETHODCALLTYPE *setAttributeNode)(
        IHTMLElement4* This,
        IHTMLDOMAttribute *pattr,
        IHTMLDOMAttribute **ppretAttribute);

    HRESULT (STDMETHODCALLTYPE *removeAttributeNode)(
        IHTMLElement4* This,
        IHTMLDOMAttribute *pattr,
        IHTMLDOMAttribute **ppretAttribute);

    HRESULT (STDMETHODCALLTYPE *put_onbeforeactivate)(
        IHTMLElement4* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onbeforeactivate)(
        IHTMLElement4* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onfocusin)(
        IHTMLElement4* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onfocusin)(
        IHTMLElement4* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onfocusout)(
        IHTMLElement4* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onfocusout)(
        IHTMLElement4* This,
        VARIANT *p);

    END_INTERFACE
} IHTMLElement4Vtbl;
interface IHTMLElement4 {
    CONST_VTBL IHTMLElement4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLElement4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLElement4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLElement4_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLElement4_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLElement4_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLElement4_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLElement4_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLElement4 methods ***/
#define IHTMLElement4_put_onmousewheel(This,v) (This)->lpVtbl->put_onmousewheel(This,v)
#define IHTMLElement4_get_onmousewheel(This,p) (This)->lpVtbl->get_onmousewheel(This,p)
#define IHTMLElement4_normalize(This) (This)->lpVtbl->normalize(This)
#define IHTMLElement4_getAttributeNode(This,bstrname,ppAttribute) (This)->lpVtbl->getAttributeNode(This,bstrname,ppAttribute)
#define IHTMLElement4_setAttributeNode(This,pattr,ppretAttribute) (This)->lpVtbl->setAttributeNode(This,pattr,ppretAttribute)
#define IHTMLElement4_removeAttributeNode(This,pattr,ppretAttribute) (This)->lpVtbl->removeAttributeNode(This,pattr,ppretAttribute)
#define IHTMLElement4_put_onbeforeactivate(This,v) (This)->lpVtbl->put_onbeforeactivate(This,v)
#define IHTMLElement4_get_onbeforeactivate(This,p) (This)->lpVtbl->get_onbeforeactivate(This,p)
#define IHTMLElement4_put_onfocusin(This,v) (This)->lpVtbl->put_onfocusin(This,v)
#define IHTMLElement4_get_onfocusin(This,p) (This)->lpVtbl->get_onfocusin(This,p)
#define IHTMLElement4_put_onfocusout(This,v) (This)->lpVtbl->put_onfocusout(This,v)
#define IHTMLElement4_get_onfocusout(This,p) (This)->lpVtbl->get_onfocusout(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLElement4_QueryInterface(IHTMLElement4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLElement4_AddRef(IHTMLElement4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLElement4_Release(IHTMLElement4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLElement4_GetTypeInfoCount(IHTMLElement4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLElement4_GetTypeInfo(IHTMLElement4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLElement4_GetIDsOfNames(IHTMLElement4* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLElement4_Invoke(IHTMLElement4* 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);
}
/*** IHTMLElement4 methods ***/
static FORCEINLINE HRESULT IHTMLElement4_put_onmousewheel(IHTMLElement4* This,VARIANT v) {
    return This->lpVtbl->put_onmousewheel(This,v);
}
static FORCEINLINE HRESULT IHTMLElement4_get_onmousewheel(IHTMLElement4* This,VARIANT *p) {
    return This->lpVtbl->get_onmousewheel(This,p);
}
static FORCEINLINE HRESULT IHTMLElement4_normalize(IHTMLElement4* This) {
    return This->lpVtbl->normalize(This);
}
static FORCEINLINE HRESULT IHTMLElement4_getAttributeNode(IHTMLElement4* This,BSTR bstrname,IHTMLDOMAttribute **ppAttribute) {
    return This->lpVtbl->getAttributeNode(This,bstrname,ppAttribute);
}
static FORCEINLINE HRESULT IHTMLElement4_setAttributeNode(IHTMLElement4* This,IHTMLDOMAttribute *pattr,IHTMLDOMAttribute **ppretAttribute) {
    return This->lpVtbl->setAttributeNode(This,pattr,ppretAttribute);
}
static FORCEINLINE HRESULT IHTMLElement4_removeAttributeNode(IHTMLElement4* This,IHTMLDOMAttribute *pattr,IHTMLDOMAttribute **ppretAttribute) {
    return This->lpVtbl->removeAttributeNode(This,pattr,ppretAttribute);
}
static FORCEINLINE HRESULT IHTMLElement4_put_onbeforeactivate(IHTMLElement4* This,VARIANT v) {
    return This->lpVtbl->put_onbeforeactivate(This,v);
}
static FORCEINLINE HRESULT IHTMLElement4_get_onbeforeactivate(IHTMLElement4* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforeactivate(This,p);
}
static FORCEINLINE HRESULT IHTMLElement4_put_onfocusin(IHTMLElement4* This,VARIANT v) {
    return This->lpVtbl->put_onfocusin(This,v);
}
static FORCEINLINE HRESULT IHTMLElement4_get_onfocusin(IHTMLElement4* This,VARIANT *p) {
    return This->lpVtbl->get_onfocusin(This,p);
}
static FORCEINLINE HRESULT IHTMLElement4_put_onfocusout(IHTMLElement4* This,VARIANT v) {
    return This->lpVtbl->put_onfocusout(This,v);
}
static FORCEINLINE HRESULT IHTMLElement4_get_onfocusout(IHTMLElement4* This,VARIANT *p) {
    return This->lpVtbl->get_onfocusout(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLElement4_put_onmousewheel_Proxy(
    IHTMLElement4* This,
    VARIANT v);
void __RPC_STUB IHTMLElement4_put_onmousewheel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement4_get_onmousewheel_Proxy(
    IHTMLElement4* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement4_get_onmousewheel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement4_normalize_Proxy(
    IHTMLElement4* This);
void __RPC_STUB IHTMLElement4_normalize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement4_getAttributeNode_Proxy(
    IHTMLElement4* This,
    BSTR bstrname,
    IHTMLDOMAttribute **ppAttribute);
void __RPC_STUB IHTMLElement4_getAttributeNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement4_setAttributeNode_Proxy(
    IHTMLElement4* This,
    IHTMLDOMAttribute *pattr,
    IHTMLDOMAttribute **ppretAttribute);
void __RPC_STUB IHTMLElement4_setAttributeNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement4_removeAttributeNode_Proxy(
    IHTMLElement4* This,
    IHTMLDOMAttribute *pattr,
    IHTMLDOMAttribute **ppretAttribute);
void __RPC_STUB IHTMLElement4_removeAttributeNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement4_put_onbeforeactivate_Proxy(
    IHTMLElement4* This,
    VARIANT v);
void __RPC_STUB IHTMLElement4_put_onbeforeactivate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement4_get_onbeforeactivate_Proxy(
    IHTMLElement4* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement4_get_onbeforeactivate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement4_put_onfocusin_Proxy(
    IHTMLElement4* This,
    VARIANT v);
void __RPC_STUB IHTMLElement4_put_onfocusin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement4_get_onfocusin_Proxy(
    IHTMLElement4* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement4_get_onfocusin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement4_put_onfocusout_Proxy(
    IHTMLElement4* This,
    VARIANT v);
void __RPC_STUB IHTMLElement4_put_onfocusout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement4_get_onfocusout_Proxy(
    IHTMLElement4* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement4_get_onfocusout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLElement4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IElementSelector interface
 */
#ifndef __IElementSelector_INTERFACE_DEFINED__
#define __IElementSelector_INTERFACE_DEFINED__

DEFINE_GUID(IID_IElementSelector, 0x30510463, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510463-98b5-11cf-bb82-00aa00bdce0b")
IElementSelector : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE querySelector(
        BSTR v,
        IHTMLElement **pel) = 0;

    virtual HRESULT STDMETHODCALLTYPE querySelectorAll(
        BSTR v,
        IHTMLDOMChildrenCollection **pel) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IElementSelector, 0x30510463, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IElementSelectorVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IElementSelector methods ***/
    HRESULT (STDMETHODCALLTYPE *querySelector)(
        IElementSelector* This,
        BSTR v,
        IHTMLElement **pel);

    HRESULT (STDMETHODCALLTYPE *querySelectorAll)(
        IElementSelector* This,
        BSTR v,
        IHTMLDOMChildrenCollection **pel);

    END_INTERFACE
} IElementSelectorVtbl;
interface IElementSelector {
    CONST_VTBL IElementSelectorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IElementSelector_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IElementSelector_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IElementSelector_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IElementSelector_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IElementSelector_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IElementSelector_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IElementSelector_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IElementSelector methods ***/
#define IElementSelector_querySelector(This,v,pel) (This)->lpVtbl->querySelector(This,v,pel)
#define IElementSelector_querySelectorAll(This,v,pel) (This)->lpVtbl->querySelectorAll(This,v,pel)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IElementSelector_QueryInterface(IElementSelector* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IElementSelector_AddRef(IElementSelector* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IElementSelector_Release(IElementSelector* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IElementSelector_GetTypeInfoCount(IElementSelector* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IElementSelector_GetTypeInfo(IElementSelector* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IElementSelector_GetIDsOfNames(IElementSelector* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IElementSelector_Invoke(IElementSelector* 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);
}
/*** IElementSelector methods ***/
static FORCEINLINE HRESULT IElementSelector_querySelector(IElementSelector* This,BSTR v,IHTMLElement **pel) {
    return This->lpVtbl->querySelector(This,v,pel);
}
static FORCEINLINE HRESULT IElementSelector_querySelectorAll(IElementSelector* This,BSTR v,IHTMLDOMChildrenCollection **pel) {
    return This->lpVtbl->querySelectorAll(This,v,pel);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IElementSelector_querySelector_Proxy(
    IElementSelector* This,
    BSTR v,
    IHTMLElement **pel);
void __RPC_STUB IElementSelector_querySelector_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IElementSelector_querySelectorAll_Proxy(
    IElementSelector* This,
    BSTR v,
    IHTMLDOMChildrenCollection **pel);
void __RPC_STUB IElementSelector_querySelectorAll_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IElementSelector_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLElementRender interface
 */
#ifndef __IHTMLElementRender_INTERFACE_DEFINED__
#define __IHTMLElementRender_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLElementRender, 0x3050f669, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f669-98b5-11cf-bb82-00aa00bdce0b")
IHTMLElementRender : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE DrawToDC(
        HDC hDC) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDocumentPrinter(
        BSTR bstrPrinterName,
        HDC hDC) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLElementRender, 0x3050f669, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLElementRenderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IHTMLElementRender methods ***/
    HRESULT (STDMETHODCALLTYPE *DrawToDC)(
        IHTMLElementRender* This,
        HDC hDC);

    HRESULT (STDMETHODCALLTYPE *SetDocumentPrinter)(
        IHTMLElementRender* This,
        BSTR bstrPrinterName,
        HDC hDC);

    END_INTERFACE
} IHTMLElementRenderVtbl;
interface IHTMLElementRender {
    CONST_VTBL IHTMLElementRenderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLElementRender_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLElementRender_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLElementRender_Release(This) (This)->lpVtbl->Release(This)
/*** IHTMLElementRender methods ***/
#define IHTMLElementRender_DrawToDC(This,hDC) (This)->lpVtbl->DrawToDC(This,hDC)
#define IHTMLElementRender_SetDocumentPrinter(This,bstrPrinterName,hDC) (This)->lpVtbl->SetDocumentPrinter(This,bstrPrinterName,hDC)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLElementRender_QueryInterface(IHTMLElementRender* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLElementRender_AddRef(IHTMLElementRender* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLElementRender_Release(IHTMLElementRender* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLElementRender methods ***/
static FORCEINLINE HRESULT IHTMLElementRender_DrawToDC(IHTMLElementRender* This,HDC hDC) {
    return This->lpVtbl->DrawToDC(This,hDC);
}
static FORCEINLINE HRESULT IHTMLElementRender_SetDocumentPrinter(IHTMLElementRender* This,BSTR bstrPrinterName,HDC hDC) {
    return This->lpVtbl->SetDocumentPrinter(This,bstrPrinterName,hDC);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLElementRender_DrawToDC_Proxy(
    IHTMLElementRender* This,
    HDC hDC);
void __RPC_STUB IHTMLElementRender_DrawToDC_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElementRender_SetDocumentPrinter_Proxy(
    IHTMLElementRender* This,
    BSTR bstrPrinterName,
    HDC hDC);
void __RPC_STUB IHTMLElementRender_SetDocumentPrinter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLElementRender_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLUniqueName interface
 */
#ifndef __IHTMLUniqueName_INTERFACE_DEFINED__
#define __IHTMLUniqueName_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLUniqueName, 0x3050f4d0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f4d0-98b5-11cf-bb82-00aa00bdce0b")
IHTMLUniqueName : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_uniqueNumber(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_uniqueID(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLUniqueName, 0x3050f4d0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLUniqueNameVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLUniqueName methods ***/
    HRESULT (STDMETHODCALLTYPE *get_uniqueNumber)(
        IHTMLUniqueName* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_uniqueID)(
        IHTMLUniqueName* This,
        BSTR *p);

    END_INTERFACE
} IHTMLUniqueNameVtbl;
interface IHTMLUniqueName {
    CONST_VTBL IHTMLUniqueNameVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLUniqueName_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLUniqueName_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLUniqueName_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLUniqueName_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLUniqueName_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLUniqueName_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLUniqueName_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLUniqueName methods ***/
#define IHTMLUniqueName_get_uniqueNumber(This,p) (This)->lpVtbl->get_uniqueNumber(This,p)
#define IHTMLUniqueName_get_uniqueID(This,p) (This)->lpVtbl->get_uniqueID(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLUniqueName_QueryInterface(IHTMLUniqueName* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLUniqueName_AddRef(IHTMLUniqueName* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLUniqueName_Release(IHTMLUniqueName* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLUniqueName_GetTypeInfoCount(IHTMLUniqueName* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLUniqueName_GetTypeInfo(IHTMLUniqueName* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLUniqueName_GetIDsOfNames(IHTMLUniqueName* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLUniqueName_Invoke(IHTMLUniqueName* 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);
}
/*** IHTMLUniqueName methods ***/
static FORCEINLINE HRESULT IHTMLUniqueName_get_uniqueNumber(IHTMLUniqueName* This,LONG *p) {
    return This->lpVtbl->get_uniqueNumber(This,p);
}
static FORCEINLINE HRESULT IHTMLUniqueName_get_uniqueID(IHTMLUniqueName* This,BSTR *p) {
    return This->lpVtbl->get_uniqueID(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLUniqueName_get_uniqueNumber_Proxy(
    IHTMLUniqueName* This,
    LONG *p);
void __RPC_STUB IHTMLUniqueName_get_uniqueNumber_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLUniqueName_get_uniqueID_Proxy(
    IHTMLUniqueName* This,
    BSTR *p);
void __RPC_STUB IHTMLUniqueName_get_uniqueID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLUniqueName_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLElement5 interface
 */
#ifndef __IHTMLElement5_INTERFACE_DEFINED__
#define __IHTMLElement5_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLElement5, 0x3051045d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051045d-98b5-11cf-bb82-00aa00bdce0b")
IHTMLElement5 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE getAttributeNode(
        BSTR bstrname,
        IHTMLDOMAttribute2 **ppretAttribute) = 0;

    virtual HRESULT STDMETHODCALLTYPE setAttributeNode(
        IHTMLDOMAttribute2 *pattr,
        IHTMLDOMAttribute2 **ppretAttribute) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeAttributeNode(
        IHTMLDOMAttribute2 *pattr,
        IHTMLDOMAttribute2 **ppretAttribute) = 0;

    virtual HRESULT STDMETHODCALLTYPE hasAttribute(
        BSTR name,
        VARIANT_BOOL *pfHasAttribute) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_role(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_role(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ariaBusy(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ariaBusy(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ariaChecked(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ariaChecked(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ariaDisabled(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ariaDisabled(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ariaExpanded(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ariaExpanded(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ariaHaspopup(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ariaHaspopup(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ariaHidden(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ariaHidden(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ariaInvalid(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ariaInvalid(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ariaMultiselectable(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ariaMultiselectable(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ariaPressed(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ariaPressed(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ariaReadonly(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ariaReadonly(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ariaRequired(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ariaRequired(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ariaSecret(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ariaSecret(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ariaSelected(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ariaSelected(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE getAttribute(
        BSTR strAttributeName,
        VARIANT *AttributeValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE setAttribute(
        BSTR strAttributeName,
        VARIANT AttributeValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeAttribute(
        BSTR strAttributeName,
        VARIANT_BOOL *pfSuccess) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_attributes(
        IHTMLAttributeCollection3 **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ariaValuenow(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ariaValuenow(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ariaPosinset(
        short v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ariaPosinset(
        short *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ariaSetsize(
        short v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ariaSetsize(
        short *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ariaLevel(
        short v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ariaLevel(
        short *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ariaValuemin(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ariaValuemin(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ariaValuemax(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ariaValuemax(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ariaControls(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ariaControls(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ariaDescribedby(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ariaDescribedby(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ariaFlowto(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ariaFlowto(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ariaLabelledby(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ariaLabelledby(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ariaActivedescendant(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ariaActivedescendant(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ariaOwns(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ariaOwns(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE hasAttributes(
        VARIANT_BOOL *pfHasAttributes) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ariaLive(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ariaLive(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ariaRelevant(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ariaRelevant(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLElement5, 0x3051045d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLElement5Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLElement5 methods ***/
    HRESULT (STDMETHODCALLTYPE *getAttributeNode)(
        IHTMLElement5* This,
        BSTR bstrname,
        IHTMLDOMAttribute2 **ppretAttribute);

    HRESULT (STDMETHODCALLTYPE *setAttributeNode)(
        IHTMLElement5* This,
        IHTMLDOMAttribute2 *pattr,
        IHTMLDOMAttribute2 **ppretAttribute);

    HRESULT (STDMETHODCALLTYPE *removeAttributeNode)(
        IHTMLElement5* This,
        IHTMLDOMAttribute2 *pattr,
        IHTMLDOMAttribute2 **ppretAttribute);

    HRESULT (STDMETHODCALLTYPE *hasAttribute)(
        IHTMLElement5* This,
        BSTR name,
        VARIANT_BOOL *pfHasAttribute);

    HRESULT (STDMETHODCALLTYPE *put_role)(
        IHTMLElement5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_role)(
        IHTMLElement5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_ariaBusy)(
        IHTMLElement5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ariaBusy)(
        IHTMLElement5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_ariaChecked)(
        IHTMLElement5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ariaChecked)(
        IHTMLElement5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_ariaDisabled)(
        IHTMLElement5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ariaDisabled)(
        IHTMLElement5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_ariaExpanded)(
        IHTMLElement5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ariaExpanded)(
        IHTMLElement5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_ariaHaspopup)(
        IHTMLElement5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ariaHaspopup)(
        IHTMLElement5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_ariaHidden)(
        IHTMLElement5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ariaHidden)(
        IHTMLElement5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_ariaInvalid)(
        IHTMLElement5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ariaInvalid)(
        IHTMLElement5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_ariaMultiselectable)(
        IHTMLElement5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ariaMultiselectable)(
        IHTMLElement5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_ariaPressed)(
        IHTMLElement5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ariaPressed)(
        IHTMLElement5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_ariaReadonly)(
        IHTMLElement5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ariaReadonly)(
        IHTMLElement5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_ariaRequired)(
        IHTMLElement5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ariaRequired)(
        IHTMLElement5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_ariaSecret)(
        IHTMLElement5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ariaSecret)(
        IHTMLElement5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_ariaSelected)(
        IHTMLElement5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ariaSelected)(
        IHTMLElement5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *getAttribute)(
        IHTMLElement5* This,
        BSTR strAttributeName,
        VARIANT *AttributeValue);

    HRESULT (STDMETHODCALLTYPE *setAttribute)(
        IHTMLElement5* This,
        BSTR strAttributeName,
        VARIANT AttributeValue);

    HRESULT (STDMETHODCALLTYPE *removeAttribute)(
        IHTMLElement5* This,
        BSTR strAttributeName,
        VARIANT_BOOL *pfSuccess);

    HRESULT (STDMETHODCALLTYPE *get_attributes)(
        IHTMLElement5* This,
        IHTMLAttributeCollection3 **p);

    HRESULT (STDMETHODCALLTYPE *put_ariaValuenow)(
        IHTMLElement5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ariaValuenow)(
        IHTMLElement5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_ariaPosinset)(
        IHTMLElement5* This,
        short v);

    HRESULT (STDMETHODCALLTYPE *get_ariaPosinset)(
        IHTMLElement5* This,
        short *p);

    HRESULT (STDMETHODCALLTYPE *put_ariaSetsize)(
        IHTMLElement5* This,
        short v);

    HRESULT (STDMETHODCALLTYPE *get_ariaSetsize)(
        IHTMLElement5* This,
        short *p);

    HRESULT (STDMETHODCALLTYPE *put_ariaLevel)(
        IHTMLElement5* This,
        short v);

    HRESULT (STDMETHODCALLTYPE *get_ariaLevel)(
        IHTMLElement5* This,
        short *p);

    HRESULT (STDMETHODCALLTYPE *put_ariaValuemin)(
        IHTMLElement5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ariaValuemin)(
        IHTMLElement5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_ariaValuemax)(
        IHTMLElement5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ariaValuemax)(
        IHTMLElement5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_ariaControls)(
        IHTMLElement5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ariaControls)(
        IHTMLElement5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_ariaDescribedby)(
        IHTMLElement5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ariaDescribedby)(
        IHTMLElement5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_ariaFlowto)(
        IHTMLElement5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ariaFlowto)(
        IHTMLElement5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_ariaLabelledby)(
        IHTMLElement5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ariaLabelledby)(
        IHTMLElement5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_ariaActivedescendant)(
        IHTMLElement5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ariaActivedescendant)(
        IHTMLElement5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_ariaOwns)(
        IHTMLElement5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ariaOwns)(
        IHTMLElement5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *hasAttributes)(
        IHTMLElement5* This,
        VARIANT_BOOL *pfHasAttributes);

    HRESULT (STDMETHODCALLTYPE *put_ariaLive)(
        IHTMLElement5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ariaLive)(
        IHTMLElement5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_ariaRelevant)(
        IHTMLElement5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ariaRelevant)(
        IHTMLElement5* This,
        BSTR *p);

    END_INTERFACE
} IHTMLElement5Vtbl;
interface IHTMLElement5 {
    CONST_VTBL IHTMLElement5Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLElement5_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLElement5_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLElement5_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLElement5_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLElement5_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLElement5_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLElement5_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLElement5 methods ***/
#define IHTMLElement5_getAttributeNode(This,bstrname,ppretAttribute) (This)->lpVtbl->getAttributeNode(This,bstrname,ppretAttribute)
#define IHTMLElement5_setAttributeNode(This,pattr,ppretAttribute) (This)->lpVtbl->setAttributeNode(This,pattr,ppretAttribute)
#define IHTMLElement5_removeAttributeNode(This,pattr,ppretAttribute) (This)->lpVtbl->removeAttributeNode(This,pattr,ppretAttribute)
#define IHTMLElement5_hasAttribute(This,name,pfHasAttribute) (This)->lpVtbl->hasAttribute(This,name,pfHasAttribute)
#define IHTMLElement5_put_role(This,v) (This)->lpVtbl->put_role(This,v)
#define IHTMLElement5_get_role(This,p) (This)->lpVtbl->get_role(This,p)
#define IHTMLElement5_put_ariaBusy(This,v) (This)->lpVtbl->put_ariaBusy(This,v)
#define IHTMLElement5_get_ariaBusy(This,p) (This)->lpVtbl->get_ariaBusy(This,p)
#define IHTMLElement5_put_ariaChecked(This,v) (This)->lpVtbl->put_ariaChecked(This,v)
#define IHTMLElement5_get_ariaChecked(This,p) (This)->lpVtbl->get_ariaChecked(This,p)
#define IHTMLElement5_put_ariaDisabled(This,v) (This)->lpVtbl->put_ariaDisabled(This,v)
#define IHTMLElement5_get_ariaDisabled(This,p) (This)->lpVtbl->get_ariaDisabled(This,p)
#define IHTMLElement5_put_ariaExpanded(This,v) (This)->lpVtbl->put_ariaExpanded(This,v)
#define IHTMLElement5_get_ariaExpanded(This,p) (This)->lpVtbl->get_ariaExpanded(This,p)
#define IHTMLElement5_put_ariaHaspopup(This,v) (This)->lpVtbl->put_ariaHaspopup(This,v)
#define IHTMLElement5_get_ariaHaspopup(This,p) (This)->lpVtbl->get_ariaHaspopup(This,p)
#define IHTMLElement5_put_ariaHidden(This,v) (This)->lpVtbl->put_ariaHidden(This,v)
#define IHTMLElement5_get_ariaHidden(This,p) (This)->lpVtbl->get_ariaHidden(This,p)
#define IHTMLElement5_put_ariaInvalid(This,v) (This)->lpVtbl->put_ariaInvalid(This,v)
#define IHTMLElement5_get_ariaInvalid(This,p) (This)->lpVtbl->get_ariaInvalid(This,p)
#define IHTMLElement5_put_ariaMultiselectable(This,v) (This)->lpVtbl->put_ariaMultiselectable(This,v)
#define IHTMLElement5_get_ariaMultiselectable(This,p) (This)->lpVtbl->get_ariaMultiselectable(This,p)
#define IHTMLElement5_put_ariaPressed(This,v) (This)->lpVtbl->put_ariaPressed(This,v)
#define IHTMLElement5_get_ariaPressed(This,p) (This)->lpVtbl->get_ariaPressed(This,p)
#define IHTMLElement5_put_ariaReadonly(This,v) (This)->lpVtbl->put_ariaReadonly(This,v)
#define IHTMLElement5_get_ariaReadonly(This,p) (This)->lpVtbl->get_ariaReadonly(This,p)
#define IHTMLElement5_put_ariaRequired(This,v) (This)->lpVtbl->put_ariaRequired(This,v)
#define IHTMLElement5_get_ariaRequired(This,p) (This)->lpVtbl->get_ariaRequired(This,p)
#define IHTMLElement5_put_ariaSecret(This,v) (This)->lpVtbl->put_ariaSecret(This,v)
#define IHTMLElement5_get_ariaSecret(This,p) (This)->lpVtbl->get_ariaSecret(This,p)
#define IHTMLElement5_put_ariaSelected(This,v) (This)->lpVtbl->put_ariaSelected(This,v)
#define IHTMLElement5_get_ariaSelected(This,p) (This)->lpVtbl->get_ariaSelected(This,p)
#define IHTMLElement5_getAttribute(This,strAttributeName,AttributeValue) (This)->lpVtbl->getAttribute(This,strAttributeName,AttributeValue)
#define IHTMLElement5_setAttribute(This,strAttributeName,AttributeValue) (This)->lpVtbl->setAttribute(This,strAttributeName,AttributeValue)
#define IHTMLElement5_removeAttribute(This,strAttributeName,pfSuccess) (This)->lpVtbl->removeAttribute(This,strAttributeName,pfSuccess)
#define IHTMLElement5_get_attributes(This,p) (This)->lpVtbl->get_attributes(This,p)
#define IHTMLElement5_put_ariaValuenow(This,v) (This)->lpVtbl->put_ariaValuenow(This,v)
#define IHTMLElement5_get_ariaValuenow(This,p) (This)->lpVtbl->get_ariaValuenow(This,p)
#define IHTMLElement5_put_ariaPosinset(This,v) (This)->lpVtbl->put_ariaPosinset(This,v)
#define IHTMLElement5_get_ariaPosinset(This,p) (This)->lpVtbl->get_ariaPosinset(This,p)
#define IHTMLElement5_put_ariaSetsize(This,v) (This)->lpVtbl->put_ariaSetsize(This,v)
#define IHTMLElement5_get_ariaSetsize(This,p) (This)->lpVtbl->get_ariaSetsize(This,p)
#define IHTMLElement5_put_ariaLevel(This,v) (This)->lpVtbl->put_ariaLevel(This,v)
#define IHTMLElement5_get_ariaLevel(This,p) (This)->lpVtbl->get_ariaLevel(This,p)
#define IHTMLElement5_put_ariaValuemin(This,v) (This)->lpVtbl->put_ariaValuemin(This,v)
#define IHTMLElement5_get_ariaValuemin(This,p) (This)->lpVtbl->get_ariaValuemin(This,p)
#define IHTMLElement5_put_ariaValuemax(This,v) (This)->lpVtbl->put_ariaValuemax(This,v)
#define IHTMLElement5_get_ariaValuemax(This,p) (This)->lpVtbl->get_ariaValuemax(This,p)
#define IHTMLElement5_put_ariaControls(This,v) (This)->lpVtbl->put_ariaControls(This,v)
#define IHTMLElement5_get_ariaControls(This,p) (This)->lpVtbl->get_ariaControls(This,p)
#define IHTMLElement5_put_ariaDescribedby(This,v) (This)->lpVtbl->put_ariaDescribedby(This,v)
#define IHTMLElement5_get_ariaDescribedby(This,p) (This)->lpVtbl->get_ariaDescribedby(This,p)
#define IHTMLElement5_put_ariaFlowto(This,v) (This)->lpVtbl->put_ariaFlowto(This,v)
#define IHTMLElement5_get_ariaFlowto(This,p) (This)->lpVtbl->get_ariaFlowto(This,p)
#define IHTMLElement5_put_ariaLabelledby(This,v) (This)->lpVtbl->put_ariaLabelledby(This,v)
#define IHTMLElement5_get_ariaLabelledby(This,p) (This)->lpVtbl->get_ariaLabelledby(This,p)
#define IHTMLElement5_put_ariaActivedescendant(This,v) (This)->lpVtbl->put_ariaActivedescendant(This,v)
#define IHTMLElement5_get_ariaActivedescendant(This,p) (This)->lpVtbl->get_ariaActivedescendant(This,p)
#define IHTMLElement5_put_ariaOwns(This,v) (This)->lpVtbl->put_ariaOwns(This,v)
#define IHTMLElement5_get_ariaOwns(This,p) (This)->lpVtbl->get_ariaOwns(This,p)
#define IHTMLElement5_hasAttributes(This,pfHasAttributes) (This)->lpVtbl->hasAttributes(This,pfHasAttributes)
#define IHTMLElement5_put_ariaLive(This,v) (This)->lpVtbl->put_ariaLive(This,v)
#define IHTMLElement5_get_ariaLive(This,p) (This)->lpVtbl->get_ariaLive(This,p)
#define IHTMLElement5_put_ariaRelevant(This,v) (This)->lpVtbl->put_ariaRelevant(This,v)
#define IHTMLElement5_get_ariaRelevant(This,p) (This)->lpVtbl->get_ariaRelevant(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLElement5_QueryInterface(IHTMLElement5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLElement5_AddRef(IHTMLElement5* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLElement5_Release(IHTMLElement5* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLElement5_GetTypeInfoCount(IHTMLElement5* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLElement5_GetTypeInfo(IHTMLElement5* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLElement5_GetIDsOfNames(IHTMLElement5* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLElement5_Invoke(IHTMLElement5* 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);
}
/*** IHTMLElement5 methods ***/
static FORCEINLINE HRESULT IHTMLElement5_getAttributeNode(IHTMLElement5* This,BSTR bstrname,IHTMLDOMAttribute2 **ppretAttribute) {
    return This->lpVtbl->getAttributeNode(This,bstrname,ppretAttribute);
}
static FORCEINLINE HRESULT IHTMLElement5_setAttributeNode(IHTMLElement5* This,IHTMLDOMAttribute2 *pattr,IHTMLDOMAttribute2 **ppretAttribute) {
    return This->lpVtbl->setAttributeNode(This,pattr,ppretAttribute);
}
static FORCEINLINE HRESULT IHTMLElement5_removeAttributeNode(IHTMLElement5* This,IHTMLDOMAttribute2 *pattr,IHTMLDOMAttribute2 **ppretAttribute) {
    return This->lpVtbl->removeAttributeNode(This,pattr,ppretAttribute);
}
static FORCEINLINE HRESULT IHTMLElement5_hasAttribute(IHTMLElement5* This,BSTR name,VARIANT_BOOL *pfHasAttribute) {
    return This->lpVtbl->hasAttribute(This,name,pfHasAttribute);
}
static FORCEINLINE HRESULT IHTMLElement5_put_role(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_role(This,v);
}
static FORCEINLINE HRESULT IHTMLElement5_get_role(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_role(This,p);
}
static FORCEINLINE HRESULT IHTMLElement5_put_ariaBusy(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaBusy(This,v);
}
static FORCEINLINE HRESULT IHTMLElement5_get_ariaBusy(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaBusy(This,p);
}
static FORCEINLINE HRESULT IHTMLElement5_put_ariaChecked(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaChecked(This,v);
}
static FORCEINLINE HRESULT IHTMLElement5_get_ariaChecked(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaChecked(This,p);
}
static FORCEINLINE HRESULT IHTMLElement5_put_ariaDisabled(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaDisabled(This,v);
}
static FORCEINLINE HRESULT IHTMLElement5_get_ariaDisabled(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaDisabled(This,p);
}
static FORCEINLINE HRESULT IHTMLElement5_put_ariaExpanded(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaExpanded(This,v);
}
static FORCEINLINE HRESULT IHTMLElement5_get_ariaExpanded(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaExpanded(This,p);
}
static FORCEINLINE HRESULT IHTMLElement5_put_ariaHaspopup(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaHaspopup(This,v);
}
static FORCEINLINE HRESULT IHTMLElement5_get_ariaHaspopup(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaHaspopup(This,p);
}
static FORCEINLINE HRESULT IHTMLElement5_put_ariaHidden(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaHidden(This,v);
}
static FORCEINLINE HRESULT IHTMLElement5_get_ariaHidden(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaHidden(This,p);
}
static FORCEINLINE HRESULT IHTMLElement5_put_ariaInvalid(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaInvalid(This,v);
}
static FORCEINLINE HRESULT IHTMLElement5_get_ariaInvalid(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaInvalid(This,p);
}
static FORCEINLINE HRESULT IHTMLElement5_put_ariaMultiselectable(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaMultiselectable(This,v);
}
static FORCEINLINE HRESULT IHTMLElement5_get_ariaMultiselectable(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaMultiselectable(This,p);
}
static FORCEINLINE HRESULT IHTMLElement5_put_ariaPressed(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaPressed(This,v);
}
static FORCEINLINE HRESULT IHTMLElement5_get_ariaPressed(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaPressed(This,p);
}
static FORCEINLINE HRESULT IHTMLElement5_put_ariaReadonly(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaReadonly(This,v);
}
static FORCEINLINE HRESULT IHTMLElement5_get_ariaReadonly(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaReadonly(This,p);
}
static FORCEINLINE HRESULT IHTMLElement5_put_ariaRequired(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaRequired(This,v);
}
static FORCEINLINE HRESULT IHTMLElement5_get_ariaRequired(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaRequired(This,p);
}
static FORCEINLINE HRESULT IHTMLElement5_put_ariaSecret(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaSecret(This,v);
}
static FORCEINLINE HRESULT IHTMLElement5_get_ariaSecret(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaSecret(This,p);
}
static FORCEINLINE HRESULT IHTMLElement5_put_ariaSelected(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaSelected(This,v);
}
static FORCEINLINE HRESULT IHTMLElement5_get_ariaSelected(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaSelected(This,p);
}
static FORCEINLINE HRESULT IHTMLElement5_getAttribute(IHTMLElement5* This,BSTR strAttributeName,VARIANT *AttributeValue) {
    return This->lpVtbl->getAttribute(This,strAttributeName,AttributeValue);
}
static FORCEINLINE HRESULT IHTMLElement5_setAttribute(IHTMLElement5* This,BSTR strAttributeName,VARIANT AttributeValue) {
    return This->lpVtbl->setAttribute(This,strAttributeName,AttributeValue);
}
static FORCEINLINE HRESULT IHTMLElement5_removeAttribute(IHTMLElement5* This,BSTR strAttributeName,VARIANT_BOOL *pfSuccess) {
    return This->lpVtbl->removeAttribute(This,strAttributeName,pfSuccess);
}
static FORCEINLINE HRESULT IHTMLElement5_get_attributes(IHTMLElement5* This,IHTMLAttributeCollection3 **p) {
    return This->lpVtbl->get_attributes(This,p);
}
static FORCEINLINE HRESULT IHTMLElement5_put_ariaValuenow(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaValuenow(This,v);
}
static FORCEINLINE HRESULT IHTMLElement5_get_ariaValuenow(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaValuenow(This,p);
}
static FORCEINLINE HRESULT IHTMLElement5_put_ariaPosinset(IHTMLElement5* This,short v) {
    return This->lpVtbl->put_ariaPosinset(This,v);
}
static FORCEINLINE HRESULT IHTMLElement5_get_ariaPosinset(IHTMLElement5* This,short *p) {
    return This->lpVtbl->get_ariaPosinset(This,p);
}
static FORCEINLINE HRESULT IHTMLElement5_put_ariaSetsize(IHTMLElement5* This,short v) {
    return This->lpVtbl->put_ariaSetsize(This,v);
}
static FORCEINLINE HRESULT IHTMLElement5_get_ariaSetsize(IHTMLElement5* This,short *p) {
    return This->lpVtbl->get_ariaSetsize(This,p);
}
static FORCEINLINE HRESULT IHTMLElement5_put_ariaLevel(IHTMLElement5* This,short v) {
    return This->lpVtbl->put_ariaLevel(This,v);
}
static FORCEINLINE HRESULT IHTMLElement5_get_ariaLevel(IHTMLElement5* This,short *p) {
    return This->lpVtbl->get_ariaLevel(This,p);
}
static FORCEINLINE HRESULT IHTMLElement5_put_ariaValuemin(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaValuemin(This,v);
}
static FORCEINLINE HRESULT IHTMLElement5_get_ariaValuemin(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaValuemin(This,p);
}
static FORCEINLINE HRESULT IHTMLElement5_put_ariaValuemax(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaValuemax(This,v);
}
static FORCEINLINE HRESULT IHTMLElement5_get_ariaValuemax(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaValuemax(This,p);
}
static FORCEINLINE HRESULT IHTMLElement5_put_ariaControls(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaControls(This,v);
}
static FORCEINLINE HRESULT IHTMLElement5_get_ariaControls(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaControls(This,p);
}
static FORCEINLINE HRESULT IHTMLElement5_put_ariaDescribedby(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaDescribedby(This,v);
}
static FORCEINLINE HRESULT IHTMLElement5_get_ariaDescribedby(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaDescribedby(This,p);
}
static FORCEINLINE HRESULT IHTMLElement5_put_ariaFlowto(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaFlowto(This,v);
}
static FORCEINLINE HRESULT IHTMLElement5_get_ariaFlowto(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaFlowto(This,p);
}
static FORCEINLINE HRESULT IHTMLElement5_put_ariaLabelledby(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaLabelledby(This,v);
}
static FORCEINLINE HRESULT IHTMLElement5_get_ariaLabelledby(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaLabelledby(This,p);
}
static FORCEINLINE HRESULT IHTMLElement5_put_ariaActivedescendant(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaActivedescendant(This,v);
}
static FORCEINLINE HRESULT IHTMLElement5_get_ariaActivedescendant(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaActivedescendant(This,p);
}
static FORCEINLINE HRESULT IHTMLElement5_put_ariaOwns(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaOwns(This,v);
}
static FORCEINLINE HRESULT IHTMLElement5_get_ariaOwns(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaOwns(This,p);
}
static FORCEINLINE HRESULT IHTMLElement5_hasAttributes(IHTMLElement5* This,VARIANT_BOOL *pfHasAttributes) {
    return This->lpVtbl->hasAttributes(This,pfHasAttributes);
}
static FORCEINLINE HRESULT IHTMLElement5_put_ariaLive(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaLive(This,v);
}
static FORCEINLINE HRESULT IHTMLElement5_get_ariaLive(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaLive(This,p);
}
static FORCEINLINE HRESULT IHTMLElement5_put_ariaRelevant(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaRelevant(This,v);
}
static FORCEINLINE HRESULT IHTMLElement5_get_ariaRelevant(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaRelevant(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLElement5_getAttributeNode_Proxy(
    IHTMLElement5* This,
    BSTR bstrname,
    IHTMLDOMAttribute2 **ppretAttribute);
void __RPC_STUB IHTMLElement5_getAttributeNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_setAttributeNode_Proxy(
    IHTMLElement5* This,
    IHTMLDOMAttribute2 *pattr,
    IHTMLDOMAttribute2 **ppretAttribute);
void __RPC_STUB IHTMLElement5_setAttributeNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_removeAttributeNode_Proxy(
    IHTMLElement5* This,
    IHTMLDOMAttribute2 *pattr,
    IHTMLDOMAttribute2 **ppretAttribute);
void __RPC_STUB IHTMLElement5_removeAttributeNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_hasAttribute_Proxy(
    IHTMLElement5* This,
    BSTR name,
    VARIANT_BOOL *pfHasAttribute);
void __RPC_STUB IHTMLElement5_hasAttribute_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_put_role_Proxy(
    IHTMLElement5* This,
    BSTR v);
void __RPC_STUB IHTMLElement5_put_role_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_get_role_Proxy(
    IHTMLElement5* This,
    BSTR *p);
void __RPC_STUB IHTMLElement5_get_role_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_put_ariaBusy_Proxy(
    IHTMLElement5* This,
    BSTR v);
void __RPC_STUB IHTMLElement5_put_ariaBusy_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_get_ariaBusy_Proxy(
    IHTMLElement5* This,
    BSTR *p);
void __RPC_STUB IHTMLElement5_get_ariaBusy_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_put_ariaChecked_Proxy(
    IHTMLElement5* This,
    BSTR v);
void __RPC_STUB IHTMLElement5_put_ariaChecked_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_get_ariaChecked_Proxy(
    IHTMLElement5* This,
    BSTR *p);
void __RPC_STUB IHTMLElement5_get_ariaChecked_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_put_ariaDisabled_Proxy(
    IHTMLElement5* This,
    BSTR v);
void __RPC_STUB IHTMLElement5_put_ariaDisabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_get_ariaDisabled_Proxy(
    IHTMLElement5* This,
    BSTR *p);
void __RPC_STUB IHTMLElement5_get_ariaDisabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_put_ariaExpanded_Proxy(
    IHTMLElement5* This,
    BSTR v);
void __RPC_STUB IHTMLElement5_put_ariaExpanded_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_get_ariaExpanded_Proxy(
    IHTMLElement5* This,
    BSTR *p);
void __RPC_STUB IHTMLElement5_get_ariaExpanded_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_put_ariaHaspopup_Proxy(
    IHTMLElement5* This,
    BSTR v);
void __RPC_STUB IHTMLElement5_put_ariaHaspopup_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_get_ariaHaspopup_Proxy(
    IHTMLElement5* This,
    BSTR *p);
void __RPC_STUB IHTMLElement5_get_ariaHaspopup_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_put_ariaHidden_Proxy(
    IHTMLElement5* This,
    BSTR v);
void __RPC_STUB IHTMLElement5_put_ariaHidden_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_get_ariaHidden_Proxy(
    IHTMLElement5* This,
    BSTR *p);
void __RPC_STUB IHTMLElement5_get_ariaHidden_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_put_ariaInvalid_Proxy(
    IHTMLElement5* This,
    BSTR v);
void __RPC_STUB IHTMLElement5_put_ariaInvalid_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_get_ariaInvalid_Proxy(
    IHTMLElement5* This,
    BSTR *p);
void __RPC_STUB IHTMLElement5_get_ariaInvalid_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_put_ariaMultiselectable_Proxy(
    IHTMLElement5* This,
    BSTR v);
void __RPC_STUB IHTMLElement5_put_ariaMultiselectable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_get_ariaMultiselectable_Proxy(
    IHTMLElement5* This,
    BSTR *p);
void __RPC_STUB IHTMLElement5_get_ariaMultiselectable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_put_ariaPressed_Proxy(
    IHTMLElement5* This,
    BSTR v);
void __RPC_STUB IHTMLElement5_put_ariaPressed_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_get_ariaPressed_Proxy(
    IHTMLElement5* This,
    BSTR *p);
void __RPC_STUB IHTMLElement5_get_ariaPressed_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_put_ariaReadonly_Proxy(
    IHTMLElement5* This,
    BSTR v);
void __RPC_STUB IHTMLElement5_put_ariaReadonly_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_get_ariaReadonly_Proxy(
    IHTMLElement5* This,
    BSTR *p);
void __RPC_STUB IHTMLElement5_get_ariaReadonly_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_put_ariaRequired_Proxy(
    IHTMLElement5* This,
    BSTR v);
void __RPC_STUB IHTMLElement5_put_ariaRequired_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_get_ariaRequired_Proxy(
    IHTMLElement5* This,
    BSTR *p);
void __RPC_STUB IHTMLElement5_get_ariaRequired_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_put_ariaSecret_Proxy(
    IHTMLElement5* This,
    BSTR v);
void __RPC_STUB IHTMLElement5_put_ariaSecret_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_get_ariaSecret_Proxy(
    IHTMLElement5* This,
    BSTR *p);
void __RPC_STUB IHTMLElement5_get_ariaSecret_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_put_ariaSelected_Proxy(
    IHTMLElement5* This,
    BSTR v);
void __RPC_STUB IHTMLElement5_put_ariaSelected_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_get_ariaSelected_Proxy(
    IHTMLElement5* This,
    BSTR *p);
void __RPC_STUB IHTMLElement5_get_ariaSelected_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_getAttribute_Proxy(
    IHTMLElement5* This,
    BSTR strAttributeName,
    VARIANT *AttributeValue);
void __RPC_STUB IHTMLElement5_getAttribute_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_setAttribute_Proxy(
    IHTMLElement5* This,
    BSTR strAttributeName,
    VARIANT AttributeValue);
void __RPC_STUB IHTMLElement5_setAttribute_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_removeAttribute_Proxy(
    IHTMLElement5* This,
    BSTR strAttributeName,
    VARIANT_BOOL *pfSuccess);
void __RPC_STUB IHTMLElement5_removeAttribute_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_get_attributes_Proxy(
    IHTMLElement5* This,
    IHTMLAttributeCollection3 **p);
void __RPC_STUB IHTMLElement5_get_attributes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_put_ariaValuenow_Proxy(
    IHTMLElement5* This,
    BSTR v);
void __RPC_STUB IHTMLElement5_put_ariaValuenow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_get_ariaValuenow_Proxy(
    IHTMLElement5* This,
    BSTR *p);
void __RPC_STUB IHTMLElement5_get_ariaValuenow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_put_ariaPosinset_Proxy(
    IHTMLElement5* This,
    short v);
void __RPC_STUB IHTMLElement5_put_ariaPosinset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_get_ariaPosinset_Proxy(
    IHTMLElement5* This,
    short *p);
void __RPC_STUB IHTMLElement5_get_ariaPosinset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_put_ariaSetsize_Proxy(
    IHTMLElement5* This,
    short v);
void __RPC_STUB IHTMLElement5_put_ariaSetsize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_get_ariaSetsize_Proxy(
    IHTMLElement5* This,
    short *p);
void __RPC_STUB IHTMLElement5_get_ariaSetsize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_put_ariaLevel_Proxy(
    IHTMLElement5* This,
    short v);
void __RPC_STUB IHTMLElement5_put_ariaLevel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_get_ariaLevel_Proxy(
    IHTMLElement5* This,
    short *p);
void __RPC_STUB IHTMLElement5_get_ariaLevel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_put_ariaValuemin_Proxy(
    IHTMLElement5* This,
    BSTR v);
void __RPC_STUB IHTMLElement5_put_ariaValuemin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_get_ariaValuemin_Proxy(
    IHTMLElement5* This,
    BSTR *p);
void __RPC_STUB IHTMLElement5_get_ariaValuemin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_put_ariaValuemax_Proxy(
    IHTMLElement5* This,
    BSTR v);
void __RPC_STUB IHTMLElement5_put_ariaValuemax_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_get_ariaValuemax_Proxy(
    IHTMLElement5* This,
    BSTR *p);
void __RPC_STUB IHTMLElement5_get_ariaValuemax_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_put_ariaControls_Proxy(
    IHTMLElement5* This,
    BSTR v);
void __RPC_STUB IHTMLElement5_put_ariaControls_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_get_ariaControls_Proxy(
    IHTMLElement5* This,
    BSTR *p);
void __RPC_STUB IHTMLElement5_get_ariaControls_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_put_ariaDescribedby_Proxy(
    IHTMLElement5* This,
    BSTR v);
void __RPC_STUB IHTMLElement5_put_ariaDescribedby_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_get_ariaDescribedby_Proxy(
    IHTMLElement5* This,
    BSTR *p);
void __RPC_STUB IHTMLElement5_get_ariaDescribedby_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_put_ariaFlowto_Proxy(
    IHTMLElement5* This,
    BSTR v);
void __RPC_STUB IHTMLElement5_put_ariaFlowto_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_get_ariaFlowto_Proxy(
    IHTMLElement5* This,
    BSTR *p);
void __RPC_STUB IHTMLElement5_get_ariaFlowto_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_put_ariaLabelledby_Proxy(
    IHTMLElement5* This,
    BSTR v);
void __RPC_STUB IHTMLElement5_put_ariaLabelledby_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_get_ariaLabelledby_Proxy(
    IHTMLElement5* This,
    BSTR *p);
void __RPC_STUB IHTMLElement5_get_ariaLabelledby_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_put_ariaActivedescendant_Proxy(
    IHTMLElement5* This,
    BSTR v);
void __RPC_STUB IHTMLElement5_put_ariaActivedescendant_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_get_ariaActivedescendant_Proxy(
    IHTMLElement5* This,
    BSTR *p);
void __RPC_STUB IHTMLElement5_get_ariaActivedescendant_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_put_ariaOwns_Proxy(
    IHTMLElement5* This,
    BSTR v);
void __RPC_STUB IHTMLElement5_put_ariaOwns_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_get_ariaOwns_Proxy(
    IHTMLElement5* This,
    BSTR *p);
void __RPC_STUB IHTMLElement5_get_ariaOwns_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_hasAttributes_Proxy(
    IHTMLElement5* This,
    VARIANT_BOOL *pfHasAttributes);
void __RPC_STUB IHTMLElement5_hasAttributes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_put_ariaLive_Proxy(
    IHTMLElement5* This,
    BSTR v);
void __RPC_STUB IHTMLElement5_put_ariaLive_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_get_ariaLive_Proxy(
    IHTMLElement5* This,
    BSTR *p);
void __RPC_STUB IHTMLElement5_get_ariaLive_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_put_ariaRelevant_Proxy(
    IHTMLElement5* This,
    BSTR v);
void __RPC_STUB IHTMLElement5_put_ariaRelevant_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement5_get_ariaRelevant_Proxy(
    IHTMLElement5* This,
    BSTR *p);
void __RPC_STUB IHTMLElement5_get_ariaRelevant_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLElement5_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLElement6 interface
 */
#ifndef __IHTMLElement6_INTERFACE_DEFINED__
#define __IHTMLElement6_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLElement6, 0x305106f8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106f8-98b5-11cf-bb82-00aa00bdce0b")
IHTMLElement6 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE getAttributeNS(
        VARIANT *pvarNS,
        BSTR strAttributeName,
        VARIANT *AttributeValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE setAttributeNS(
        VARIANT *pvarNS,
        BSTR strAttributeName,
        VARIANT *pvarAttributeValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeAttributeNS(
        VARIANT *pvarNS,
        BSTR strAttributeName) = 0;

    virtual HRESULT STDMETHODCALLTYPE getAttributeNodeNS(
        VARIANT *pvarNS,
        BSTR bstrname,
        IHTMLDOMAttribute2 **ppretAttribute) = 0;

    virtual HRESULT STDMETHODCALLTYPE setAttributeNodeNS(
        IHTMLDOMAttribute2 *pattr,
        IHTMLDOMAttribute2 **ppretAttribute) = 0;

    virtual HRESULT STDMETHODCALLTYPE hasAttributeNS(
        VARIANT *pvarNS,
        BSTR name,
        VARIANT_BOOL *pfHasAttribute) = 0;

    virtual HRESULT STDMETHODCALLTYPE getAttribute(
        BSTR strAttributeName,
        VARIANT *AttributeValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE setAttribute(
        BSTR strAttributeName,
        VARIANT *pvarAttributeValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeAttribute(
        BSTR strAttributeName) = 0;

    virtual HRESULT STDMETHODCALLTYPE getAttributeNode(
        BSTR strAttributeName,
        IHTMLDOMAttribute2 **ppretAttribute) = 0;

    virtual HRESULT STDMETHODCALLTYPE setAttributeNode(
        IHTMLDOMAttribute2 *pattr,
        IHTMLDOMAttribute2 **ppretAttribute) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeAttributeNode(
        IHTMLDOMAttribute2 *pattr,
        IHTMLDOMAttribute2 **ppretAttribute) = 0;

    virtual HRESULT STDMETHODCALLTYPE hasAttribute(
        BSTR name,
        VARIANT_BOOL *pfHasAttribute) = 0;

    virtual HRESULT STDMETHODCALLTYPE getElementsByTagNameNS(
        VARIANT *varNS,
        BSTR bstrLocalName,
        IHTMLElementCollection **pelColl) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_tagName(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_nodeName(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE getElementsByClassName(
        BSTR v,
        IHTMLElementCollection **pel) = 0;

    virtual HRESULT STDMETHODCALLTYPE msMatchesSelector(
        BSTR v,
        VARIANT_BOOL *pfMatches) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onabort(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onabort(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_oncanplay(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_oncanplay(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_oncanplaythrough(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_oncanplaythrough(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onchange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onchange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondurationchange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondurationchange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onemptied(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onemptied(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onended(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onended(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onerror(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onerror(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_oninput(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_oninput(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onload(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onload(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onloadeddata(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onloadeddata(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onloadedmetadata(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onloadedmetadata(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onloadstart(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onloadstart(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onpause(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onpause(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onplay(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onplay(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onplaying(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onplaying(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onprogress(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onprogress(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onratechange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onratechange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onreset(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onreset(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onseeked(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onseeked(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onseeking(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onseeking(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onselect(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onselect(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onstalled(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onstalled(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onsubmit(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onsubmit(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onsuspend(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onsuspend(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ontimeupdate(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ontimeupdate(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onvolumechange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onvolumechange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onwaiting(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onwaiting(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE hasAttributes(
        VARIANT_BOOL *pfHasAttributes) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLElement6, 0x305106f8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLElement6Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLElement6 methods ***/
    HRESULT (STDMETHODCALLTYPE *getAttributeNS)(
        IHTMLElement6* This,
        VARIANT *pvarNS,
        BSTR strAttributeName,
        VARIANT *AttributeValue);

    HRESULT (STDMETHODCALLTYPE *setAttributeNS)(
        IHTMLElement6* This,
        VARIANT *pvarNS,
        BSTR strAttributeName,
        VARIANT *pvarAttributeValue);

    HRESULT (STDMETHODCALLTYPE *removeAttributeNS)(
        IHTMLElement6* This,
        VARIANT *pvarNS,
        BSTR strAttributeName);

    HRESULT (STDMETHODCALLTYPE *getAttributeNodeNS)(
        IHTMLElement6* This,
        VARIANT *pvarNS,
        BSTR bstrname,
        IHTMLDOMAttribute2 **ppretAttribute);

    HRESULT (STDMETHODCALLTYPE *setAttributeNodeNS)(
        IHTMLElement6* This,
        IHTMLDOMAttribute2 *pattr,
        IHTMLDOMAttribute2 **ppretAttribute);

    HRESULT (STDMETHODCALLTYPE *hasAttributeNS)(
        IHTMLElement6* This,
        VARIANT *pvarNS,
        BSTR name,
        VARIANT_BOOL *pfHasAttribute);

    HRESULT (STDMETHODCALLTYPE *getAttribute)(
        IHTMLElement6* This,
        BSTR strAttributeName,
        VARIANT *AttributeValue);

    HRESULT (STDMETHODCALLTYPE *setAttribute)(
        IHTMLElement6* This,
        BSTR strAttributeName,
        VARIANT *pvarAttributeValue);

    HRESULT (STDMETHODCALLTYPE *removeAttribute)(
        IHTMLElement6* This,
        BSTR strAttributeName);

    HRESULT (STDMETHODCALLTYPE *getAttributeNode)(
        IHTMLElement6* This,
        BSTR strAttributeName,
        IHTMLDOMAttribute2 **ppretAttribute);

    HRESULT (STDMETHODCALLTYPE *setAttributeNode)(
        IHTMLElement6* This,
        IHTMLDOMAttribute2 *pattr,
        IHTMLDOMAttribute2 **ppretAttribute);

    HRESULT (STDMETHODCALLTYPE *removeAttributeNode)(
        IHTMLElement6* This,
        IHTMLDOMAttribute2 *pattr,
        IHTMLDOMAttribute2 **ppretAttribute);

    HRESULT (STDMETHODCALLTYPE *hasAttribute)(
        IHTMLElement6* This,
        BSTR name,
        VARIANT_BOOL *pfHasAttribute);

    HRESULT (STDMETHODCALLTYPE *getElementsByTagNameNS)(
        IHTMLElement6* This,
        VARIANT *varNS,
        BSTR bstrLocalName,
        IHTMLElementCollection **pelColl);

    HRESULT (STDMETHODCALLTYPE *get_tagName)(
        IHTMLElement6* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_nodeName)(
        IHTMLElement6* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *getElementsByClassName)(
        IHTMLElement6* This,
        BSTR v,
        IHTMLElementCollection **pel);

    HRESULT (STDMETHODCALLTYPE *msMatchesSelector)(
        IHTMLElement6* This,
        BSTR v,
        VARIANT_BOOL *pfMatches);

    HRESULT (STDMETHODCALLTYPE *put_onabort)(
        IHTMLElement6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onabort)(
        IHTMLElement6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_oncanplay)(
        IHTMLElement6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_oncanplay)(
        IHTMLElement6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_oncanplaythrough)(
        IHTMLElement6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_oncanplaythrough)(
        IHTMLElement6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onchange)(
        IHTMLElement6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onchange)(
        IHTMLElement6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondurationchange)(
        IHTMLElement6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondurationchange)(
        IHTMLElement6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onemptied)(
        IHTMLElement6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onemptied)(
        IHTMLElement6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onended)(
        IHTMLElement6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onended)(
        IHTMLElement6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onerror)(
        IHTMLElement6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onerror)(
        IHTMLElement6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_oninput)(
        IHTMLElement6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_oninput)(
        IHTMLElement6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onload)(
        IHTMLElement6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onload)(
        IHTMLElement6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onloadeddata)(
        IHTMLElement6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onloadeddata)(
        IHTMLElement6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onloadedmetadata)(
        IHTMLElement6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onloadedmetadata)(
        IHTMLElement6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onloadstart)(
        IHTMLElement6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onloadstart)(
        IHTMLElement6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onpause)(
        IHTMLElement6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onpause)(
        IHTMLElement6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onplay)(
        IHTMLElement6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onplay)(
        IHTMLElement6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onplaying)(
        IHTMLElement6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onplaying)(
        IHTMLElement6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onprogress)(
        IHTMLElement6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onprogress)(
        IHTMLElement6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onratechange)(
        IHTMLElement6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onratechange)(
        IHTMLElement6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onreset)(
        IHTMLElement6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onreset)(
        IHTMLElement6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onseeked)(
        IHTMLElement6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onseeked)(
        IHTMLElement6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onseeking)(
        IHTMLElement6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onseeking)(
        IHTMLElement6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onselect)(
        IHTMLElement6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onselect)(
        IHTMLElement6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onstalled)(
        IHTMLElement6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onstalled)(
        IHTMLElement6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onsubmit)(
        IHTMLElement6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onsubmit)(
        IHTMLElement6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onsuspend)(
        IHTMLElement6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onsuspend)(
        IHTMLElement6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ontimeupdate)(
        IHTMLElement6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ontimeupdate)(
        IHTMLElement6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onvolumechange)(
        IHTMLElement6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onvolumechange)(
        IHTMLElement6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onwaiting)(
        IHTMLElement6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onwaiting)(
        IHTMLElement6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *hasAttributes)(
        IHTMLElement6* This,
        VARIANT_BOOL *pfHasAttributes);

    END_INTERFACE
} IHTMLElement6Vtbl;
interface IHTMLElement6 {
    CONST_VTBL IHTMLElement6Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLElement6_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLElement6_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLElement6_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLElement6_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLElement6_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLElement6_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLElement6_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLElement6 methods ***/
#define IHTMLElement6_getAttributeNS(This,pvarNS,strAttributeName,AttributeValue) (This)->lpVtbl->getAttributeNS(This,pvarNS,strAttributeName,AttributeValue)
#define IHTMLElement6_setAttributeNS(This,pvarNS,strAttributeName,pvarAttributeValue) (This)->lpVtbl->setAttributeNS(This,pvarNS,strAttributeName,pvarAttributeValue)
#define IHTMLElement6_removeAttributeNS(This,pvarNS,strAttributeName) (This)->lpVtbl->removeAttributeNS(This,pvarNS,strAttributeName)
#define IHTMLElement6_getAttributeNodeNS(This,pvarNS,bstrname,ppretAttribute) (This)->lpVtbl->getAttributeNodeNS(This,pvarNS,bstrname,ppretAttribute)
#define IHTMLElement6_setAttributeNodeNS(This,pattr,ppretAttribute) (This)->lpVtbl->setAttributeNodeNS(This,pattr,ppretAttribute)
#define IHTMLElement6_hasAttributeNS(This,pvarNS,name,pfHasAttribute) (This)->lpVtbl->hasAttributeNS(This,pvarNS,name,pfHasAttribute)
#define IHTMLElement6_getAttribute(This,strAttributeName,AttributeValue) (This)->lpVtbl->getAttribute(This,strAttributeName,AttributeValue)
#define IHTMLElement6_setAttribute(This,strAttributeName,pvarAttributeValue) (This)->lpVtbl->setAttribute(This,strAttributeName,pvarAttributeValue)
#define IHTMLElement6_removeAttribute(This,strAttributeName) (This)->lpVtbl->removeAttribute(This,strAttributeName)
#define IHTMLElement6_getAttributeNode(This,strAttributeName,ppretAttribute) (This)->lpVtbl->getAttributeNode(This,strAttributeName,ppretAttribute)
#define IHTMLElement6_setAttributeNode(This,pattr,ppretAttribute) (This)->lpVtbl->setAttributeNode(This,pattr,ppretAttribute)
#define IHTMLElement6_removeAttributeNode(This,pattr,ppretAttribute) (This)->lpVtbl->removeAttributeNode(This,pattr,ppretAttribute)
#define IHTMLElement6_hasAttribute(This,name,pfHasAttribute) (This)->lpVtbl->hasAttribute(This,name,pfHasAttribute)
#define IHTMLElement6_getElementsByTagNameNS(This,varNS,bstrLocalName,pelColl) (This)->lpVtbl->getElementsByTagNameNS(This,varNS,bstrLocalName,pelColl)
#define IHTMLElement6_get_tagName(This,p) (This)->lpVtbl->get_tagName(This,p)
#define IHTMLElement6_get_nodeName(This,p) (This)->lpVtbl->get_nodeName(This,p)
#define IHTMLElement6_getElementsByClassName(This,v,pel) (This)->lpVtbl->getElementsByClassName(This,v,pel)
#define IHTMLElement6_msMatchesSelector(This,v,pfMatches) (This)->lpVtbl->msMatchesSelector(This,v,pfMatches)
#define IHTMLElement6_put_onabort(This,v) (This)->lpVtbl->put_onabort(This,v)
#define IHTMLElement6_get_onabort(This,p) (This)->lpVtbl->get_onabort(This,p)
#define IHTMLElement6_put_oncanplay(This,v) (This)->lpVtbl->put_oncanplay(This,v)
#define IHTMLElement6_get_oncanplay(This,p) (This)->lpVtbl->get_oncanplay(This,p)
#define IHTMLElement6_put_oncanplaythrough(This,v) (This)->lpVtbl->put_oncanplaythrough(This,v)
#define IHTMLElement6_get_oncanplaythrough(This,p) (This)->lpVtbl->get_oncanplaythrough(This,p)
#define IHTMLElement6_put_onchange(This,v) (This)->lpVtbl->put_onchange(This,v)
#define IHTMLElement6_get_onchange(This,p) (This)->lpVtbl->get_onchange(This,p)
#define IHTMLElement6_put_ondurationchange(This,v) (This)->lpVtbl->put_ondurationchange(This,v)
#define IHTMLElement6_get_ondurationchange(This,p) (This)->lpVtbl->get_ondurationchange(This,p)
#define IHTMLElement6_put_onemptied(This,v) (This)->lpVtbl->put_onemptied(This,v)
#define IHTMLElement6_get_onemptied(This,p) (This)->lpVtbl->get_onemptied(This,p)
#define IHTMLElement6_put_onended(This,v) (This)->lpVtbl->put_onended(This,v)
#define IHTMLElement6_get_onended(This,p) (This)->lpVtbl->get_onended(This,p)
#define IHTMLElement6_put_onerror(This,v) (This)->lpVtbl->put_onerror(This,v)
#define IHTMLElement6_get_onerror(This,p) (This)->lpVtbl->get_onerror(This,p)
#define IHTMLElement6_put_oninput(This,v) (This)->lpVtbl->put_oninput(This,v)
#define IHTMLElement6_get_oninput(This,p) (This)->lpVtbl->get_oninput(This,p)
#define IHTMLElement6_put_onload(This,v) (This)->lpVtbl->put_onload(This,v)
#define IHTMLElement6_get_onload(This,p) (This)->lpVtbl->get_onload(This,p)
#define IHTMLElement6_put_onloadeddata(This,v) (This)->lpVtbl->put_onloadeddata(This,v)
#define IHTMLElement6_get_onloadeddata(This,p) (This)->lpVtbl->get_onloadeddata(This,p)
#define IHTMLElement6_put_onloadedmetadata(This,v) (This)->lpVtbl->put_onloadedmetadata(This,v)
#define IHTMLElement6_get_onloadedmetadata(This,p) (This)->lpVtbl->get_onloadedmetadata(This,p)
#define IHTMLElement6_put_onloadstart(This,v) (This)->lpVtbl->put_onloadstart(This,v)
#define IHTMLElement6_get_onloadstart(This,p) (This)->lpVtbl->get_onloadstart(This,p)
#define IHTMLElement6_put_onpause(This,v) (This)->lpVtbl->put_onpause(This,v)
#define IHTMLElement6_get_onpause(This,p) (This)->lpVtbl->get_onpause(This,p)
#define IHTMLElement6_put_onplay(This,v) (This)->lpVtbl->put_onplay(This,v)
#define IHTMLElement6_get_onplay(This,p) (This)->lpVtbl->get_onplay(This,p)
#define IHTMLElement6_put_onplaying(This,v) (This)->lpVtbl->put_onplaying(This,v)
#define IHTMLElement6_get_onplaying(This,p) (This)->lpVtbl->get_onplaying(This,p)
#define IHTMLElement6_put_onprogress(This,v) (This)->lpVtbl->put_onprogress(This,v)
#define IHTMLElement6_get_onprogress(This,p) (This)->lpVtbl->get_onprogress(This,p)
#define IHTMLElement6_put_onratechange(This,v) (This)->lpVtbl->put_onratechange(This,v)
#define IHTMLElement6_get_onratechange(This,p) (This)->lpVtbl->get_onratechange(This,p)
#define IHTMLElement6_put_onreset(This,v) (This)->lpVtbl->put_onreset(This,v)
#define IHTMLElement6_get_onreset(This,p) (This)->lpVtbl->get_onreset(This,p)
#define IHTMLElement6_put_onseeked(This,v) (This)->lpVtbl->put_onseeked(This,v)
#define IHTMLElement6_get_onseeked(This,p) (This)->lpVtbl->get_onseeked(This,p)
#define IHTMLElement6_put_onseeking(This,v) (This)->lpVtbl->put_onseeking(This,v)
#define IHTMLElement6_get_onseeking(This,p) (This)->lpVtbl->get_onseeking(This,p)
#define IHTMLElement6_put_onselect(This,v) (This)->lpVtbl->put_onselect(This,v)
#define IHTMLElement6_get_onselect(This,p) (This)->lpVtbl->get_onselect(This,p)
#define IHTMLElement6_put_onstalled(This,v) (This)->lpVtbl->put_onstalled(This,v)
#define IHTMLElement6_get_onstalled(This,p) (This)->lpVtbl->get_onstalled(This,p)
#define IHTMLElement6_put_onsubmit(This,v) (This)->lpVtbl->put_onsubmit(This,v)
#define IHTMLElement6_get_onsubmit(This,p) (This)->lpVtbl->get_onsubmit(This,p)
#define IHTMLElement6_put_onsuspend(This,v) (This)->lpVtbl->put_onsuspend(This,v)
#define IHTMLElement6_get_onsuspend(This,p) (This)->lpVtbl->get_onsuspend(This,p)
#define IHTMLElement6_put_ontimeupdate(This,v) (This)->lpVtbl->put_ontimeupdate(This,v)
#define IHTMLElement6_get_ontimeupdate(This,p) (This)->lpVtbl->get_ontimeupdate(This,p)
#define IHTMLElement6_put_onvolumechange(This,v) (This)->lpVtbl->put_onvolumechange(This,v)
#define IHTMLElement6_get_onvolumechange(This,p) (This)->lpVtbl->get_onvolumechange(This,p)
#define IHTMLElement6_put_onwaiting(This,v) (This)->lpVtbl->put_onwaiting(This,v)
#define IHTMLElement6_get_onwaiting(This,p) (This)->lpVtbl->get_onwaiting(This,p)
#define IHTMLElement6_hasAttributes(This,pfHasAttributes) (This)->lpVtbl->hasAttributes(This,pfHasAttributes)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLElement6_QueryInterface(IHTMLElement6* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLElement6_AddRef(IHTMLElement6* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLElement6_Release(IHTMLElement6* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLElement6_GetTypeInfoCount(IHTMLElement6* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLElement6_GetTypeInfo(IHTMLElement6* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLElement6_GetIDsOfNames(IHTMLElement6* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLElement6_Invoke(IHTMLElement6* 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);
}
/*** IHTMLElement6 methods ***/
static FORCEINLINE HRESULT IHTMLElement6_getAttributeNS(IHTMLElement6* This,VARIANT *pvarNS,BSTR strAttributeName,VARIANT *AttributeValue) {
    return This->lpVtbl->getAttributeNS(This,pvarNS,strAttributeName,AttributeValue);
}
static FORCEINLINE HRESULT IHTMLElement6_setAttributeNS(IHTMLElement6* This,VARIANT *pvarNS,BSTR strAttributeName,VARIANT *pvarAttributeValue) {
    return This->lpVtbl->setAttributeNS(This,pvarNS,strAttributeName,pvarAttributeValue);
}
static FORCEINLINE HRESULT IHTMLElement6_removeAttributeNS(IHTMLElement6* This,VARIANT *pvarNS,BSTR strAttributeName) {
    return This->lpVtbl->removeAttributeNS(This,pvarNS,strAttributeName);
}
static FORCEINLINE HRESULT IHTMLElement6_getAttributeNodeNS(IHTMLElement6* This,VARIANT *pvarNS,BSTR bstrname,IHTMLDOMAttribute2 **ppretAttribute) {
    return This->lpVtbl->getAttributeNodeNS(This,pvarNS,bstrname,ppretAttribute);
}
static FORCEINLINE HRESULT IHTMLElement6_setAttributeNodeNS(IHTMLElement6* This,IHTMLDOMAttribute2 *pattr,IHTMLDOMAttribute2 **ppretAttribute) {
    return This->lpVtbl->setAttributeNodeNS(This,pattr,ppretAttribute);
}
static FORCEINLINE HRESULT IHTMLElement6_hasAttributeNS(IHTMLElement6* This,VARIANT *pvarNS,BSTR name,VARIANT_BOOL *pfHasAttribute) {
    return This->lpVtbl->hasAttributeNS(This,pvarNS,name,pfHasAttribute);
}
static FORCEINLINE HRESULT IHTMLElement6_getAttribute(IHTMLElement6* This,BSTR strAttributeName,VARIANT *AttributeValue) {
    return This->lpVtbl->getAttribute(This,strAttributeName,AttributeValue);
}
static FORCEINLINE HRESULT IHTMLElement6_setAttribute(IHTMLElement6* This,BSTR strAttributeName,VARIANT *pvarAttributeValue) {
    return This->lpVtbl->setAttribute(This,strAttributeName,pvarAttributeValue);
}
static FORCEINLINE HRESULT IHTMLElement6_removeAttribute(IHTMLElement6* This,BSTR strAttributeName) {
    return This->lpVtbl->removeAttribute(This,strAttributeName);
}
static FORCEINLINE HRESULT IHTMLElement6_getAttributeNode(IHTMLElement6* This,BSTR strAttributeName,IHTMLDOMAttribute2 **ppretAttribute) {
    return This->lpVtbl->getAttributeNode(This,strAttributeName,ppretAttribute);
}
static FORCEINLINE HRESULT IHTMLElement6_setAttributeNode(IHTMLElement6* This,IHTMLDOMAttribute2 *pattr,IHTMLDOMAttribute2 **ppretAttribute) {
    return This->lpVtbl->setAttributeNode(This,pattr,ppretAttribute);
}
static FORCEINLINE HRESULT IHTMLElement6_removeAttributeNode(IHTMLElement6* This,IHTMLDOMAttribute2 *pattr,IHTMLDOMAttribute2 **ppretAttribute) {
    return This->lpVtbl->removeAttributeNode(This,pattr,ppretAttribute);
}
static FORCEINLINE HRESULT IHTMLElement6_hasAttribute(IHTMLElement6* This,BSTR name,VARIANT_BOOL *pfHasAttribute) {
    return This->lpVtbl->hasAttribute(This,name,pfHasAttribute);
}
static FORCEINLINE HRESULT IHTMLElement6_getElementsByTagNameNS(IHTMLElement6* This,VARIANT *varNS,BSTR bstrLocalName,IHTMLElementCollection **pelColl) {
    return This->lpVtbl->getElementsByTagNameNS(This,varNS,bstrLocalName,pelColl);
}
static FORCEINLINE HRESULT IHTMLElement6_get_tagName(IHTMLElement6* This,BSTR *p) {
    return This->lpVtbl->get_tagName(This,p);
}
static FORCEINLINE HRESULT IHTMLElement6_get_nodeName(IHTMLElement6* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static FORCEINLINE HRESULT IHTMLElement6_getElementsByClassName(IHTMLElement6* This,BSTR v,IHTMLElementCollection **pel) {
    return This->lpVtbl->getElementsByClassName(This,v,pel);
}
static FORCEINLINE HRESULT IHTMLElement6_msMatchesSelector(IHTMLElement6* This,BSTR v,VARIANT_BOOL *pfMatches) {
    return This->lpVtbl->msMatchesSelector(This,v,pfMatches);
}
static FORCEINLINE HRESULT IHTMLElement6_put_onabort(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onabort(This,v);
}
static FORCEINLINE HRESULT IHTMLElement6_get_onabort(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onabort(This,p);
}
static FORCEINLINE HRESULT IHTMLElement6_put_oncanplay(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_oncanplay(This,v);
}
static FORCEINLINE HRESULT IHTMLElement6_get_oncanplay(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_oncanplay(This,p);
}
static FORCEINLINE HRESULT IHTMLElement6_put_oncanplaythrough(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_oncanplaythrough(This,v);
}
static FORCEINLINE HRESULT IHTMLElement6_get_oncanplaythrough(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_oncanplaythrough(This,p);
}
static FORCEINLINE HRESULT IHTMLElement6_put_onchange(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onchange(This,v);
}
static FORCEINLINE HRESULT IHTMLElement6_get_onchange(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onchange(This,p);
}
static FORCEINLINE HRESULT IHTMLElement6_put_ondurationchange(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_ondurationchange(This,v);
}
static FORCEINLINE HRESULT IHTMLElement6_get_ondurationchange(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_ondurationchange(This,p);
}
static FORCEINLINE HRESULT IHTMLElement6_put_onemptied(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onemptied(This,v);
}
static FORCEINLINE HRESULT IHTMLElement6_get_onemptied(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onemptied(This,p);
}
static FORCEINLINE HRESULT IHTMLElement6_put_onended(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onended(This,v);
}
static FORCEINLINE HRESULT IHTMLElement6_get_onended(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onended(This,p);
}
static FORCEINLINE HRESULT IHTMLElement6_put_onerror(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onerror(This,v);
}
static FORCEINLINE HRESULT IHTMLElement6_get_onerror(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onerror(This,p);
}
static FORCEINLINE HRESULT IHTMLElement6_put_oninput(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_oninput(This,v);
}
static FORCEINLINE HRESULT IHTMLElement6_get_oninput(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_oninput(This,p);
}
static FORCEINLINE HRESULT IHTMLElement6_put_onload(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onload(This,v);
}
static FORCEINLINE HRESULT IHTMLElement6_get_onload(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onload(This,p);
}
static FORCEINLINE HRESULT IHTMLElement6_put_onloadeddata(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onloadeddata(This,v);
}
static FORCEINLINE HRESULT IHTMLElement6_get_onloadeddata(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onloadeddata(This,p);
}
static FORCEINLINE HRESULT IHTMLElement6_put_onloadedmetadata(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onloadedmetadata(This,v);
}
static FORCEINLINE HRESULT IHTMLElement6_get_onloadedmetadata(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onloadedmetadata(This,p);
}
static FORCEINLINE HRESULT IHTMLElement6_put_onloadstart(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onloadstart(This,v);
}
static FORCEINLINE HRESULT IHTMLElement6_get_onloadstart(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onloadstart(This,p);
}
static FORCEINLINE HRESULT IHTMLElement6_put_onpause(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onpause(This,v);
}
static FORCEINLINE HRESULT IHTMLElement6_get_onpause(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onpause(This,p);
}
static FORCEINLINE HRESULT IHTMLElement6_put_onplay(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onplay(This,v);
}
static FORCEINLINE HRESULT IHTMLElement6_get_onplay(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onplay(This,p);
}
static FORCEINLINE HRESULT IHTMLElement6_put_onplaying(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onplaying(This,v);
}
static FORCEINLINE HRESULT IHTMLElement6_get_onplaying(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onplaying(This,p);
}
static FORCEINLINE HRESULT IHTMLElement6_put_onprogress(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onprogress(This,v);
}
static FORCEINLINE HRESULT IHTMLElement6_get_onprogress(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onprogress(This,p);
}
static FORCEINLINE HRESULT IHTMLElement6_put_onratechange(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onratechange(This,v);
}
static FORCEINLINE HRESULT IHTMLElement6_get_onratechange(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onratechange(This,p);
}
static FORCEINLINE HRESULT IHTMLElement6_put_onreset(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onreset(This,v);
}
static FORCEINLINE HRESULT IHTMLElement6_get_onreset(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onreset(This,p);
}
static FORCEINLINE HRESULT IHTMLElement6_put_onseeked(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onseeked(This,v);
}
static FORCEINLINE HRESULT IHTMLElement6_get_onseeked(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onseeked(This,p);
}
static FORCEINLINE HRESULT IHTMLElement6_put_onseeking(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onseeking(This,v);
}
static FORCEINLINE HRESULT IHTMLElement6_get_onseeking(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onseeking(This,p);
}
static FORCEINLINE HRESULT IHTMLElement6_put_onselect(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onselect(This,v);
}
static FORCEINLINE HRESULT IHTMLElement6_get_onselect(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onselect(This,p);
}
static FORCEINLINE HRESULT IHTMLElement6_put_onstalled(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onstalled(This,v);
}
static FORCEINLINE HRESULT IHTMLElement6_get_onstalled(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onstalled(This,p);
}
static FORCEINLINE HRESULT IHTMLElement6_put_onsubmit(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onsubmit(This,v);
}
static FORCEINLINE HRESULT IHTMLElement6_get_onsubmit(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onsubmit(This,p);
}
static FORCEINLINE HRESULT IHTMLElement6_put_onsuspend(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onsuspend(This,v);
}
static FORCEINLINE HRESULT IHTMLElement6_get_onsuspend(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onsuspend(This,p);
}
static FORCEINLINE HRESULT IHTMLElement6_put_ontimeupdate(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_ontimeupdate(This,v);
}
static FORCEINLINE HRESULT IHTMLElement6_get_ontimeupdate(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_ontimeupdate(This,p);
}
static FORCEINLINE HRESULT IHTMLElement6_put_onvolumechange(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onvolumechange(This,v);
}
static FORCEINLINE HRESULT IHTMLElement6_get_onvolumechange(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onvolumechange(This,p);
}
static FORCEINLINE HRESULT IHTMLElement6_put_onwaiting(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onwaiting(This,v);
}
static FORCEINLINE HRESULT IHTMLElement6_get_onwaiting(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onwaiting(This,p);
}
static FORCEINLINE HRESULT IHTMLElement6_hasAttributes(IHTMLElement6* This,VARIANT_BOOL *pfHasAttributes) {
    return This->lpVtbl->hasAttributes(This,pfHasAttributes);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLElement6_getAttributeNS_Proxy(
    IHTMLElement6* This,
    VARIANT *pvarNS,
    BSTR strAttributeName,
    VARIANT *AttributeValue);
void __RPC_STUB IHTMLElement6_getAttributeNS_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_setAttributeNS_Proxy(
    IHTMLElement6* This,
    VARIANT *pvarNS,
    BSTR strAttributeName,
    VARIANT *pvarAttributeValue);
void __RPC_STUB IHTMLElement6_setAttributeNS_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_removeAttributeNS_Proxy(
    IHTMLElement6* This,
    VARIANT *pvarNS,
    BSTR strAttributeName);
void __RPC_STUB IHTMLElement6_removeAttributeNS_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_getAttributeNodeNS_Proxy(
    IHTMLElement6* This,
    VARIANT *pvarNS,
    BSTR bstrname,
    IHTMLDOMAttribute2 **ppretAttribute);
void __RPC_STUB IHTMLElement6_getAttributeNodeNS_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_setAttributeNodeNS_Proxy(
    IHTMLElement6* This,
    IHTMLDOMAttribute2 *pattr,
    IHTMLDOMAttribute2 **ppretAttribute);
void __RPC_STUB IHTMLElement6_setAttributeNodeNS_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_hasAttributeNS_Proxy(
    IHTMLElement6* This,
    VARIANT *pvarNS,
    BSTR name,
    VARIANT_BOOL *pfHasAttribute);
void __RPC_STUB IHTMLElement6_hasAttributeNS_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_getAttribute_Proxy(
    IHTMLElement6* This,
    BSTR strAttributeName,
    VARIANT *AttributeValue);
void __RPC_STUB IHTMLElement6_getAttribute_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_setAttribute_Proxy(
    IHTMLElement6* This,
    BSTR strAttributeName,
    VARIANT *pvarAttributeValue);
void __RPC_STUB IHTMLElement6_setAttribute_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_removeAttribute_Proxy(
    IHTMLElement6* This,
    BSTR strAttributeName);
void __RPC_STUB IHTMLElement6_removeAttribute_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_getAttributeNode_Proxy(
    IHTMLElement6* This,
    BSTR strAttributeName,
    IHTMLDOMAttribute2 **ppretAttribute);
void __RPC_STUB IHTMLElement6_getAttributeNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_setAttributeNode_Proxy(
    IHTMLElement6* This,
    IHTMLDOMAttribute2 *pattr,
    IHTMLDOMAttribute2 **ppretAttribute);
void __RPC_STUB IHTMLElement6_setAttributeNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_removeAttributeNode_Proxy(
    IHTMLElement6* This,
    IHTMLDOMAttribute2 *pattr,
    IHTMLDOMAttribute2 **ppretAttribute);
void __RPC_STUB IHTMLElement6_removeAttributeNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_hasAttribute_Proxy(
    IHTMLElement6* This,
    BSTR name,
    VARIANT_BOOL *pfHasAttribute);
void __RPC_STUB IHTMLElement6_hasAttribute_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_getElementsByTagNameNS_Proxy(
    IHTMLElement6* This,
    VARIANT *varNS,
    BSTR bstrLocalName,
    IHTMLElementCollection **pelColl);
void __RPC_STUB IHTMLElement6_getElementsByTagNameNS_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_get_tagName_Proxy(
    IHTMLElement6* This,
    BSTR *p);
void __RPC_STUB IHTMLElement6_get_tagName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_get_nodeName_Proxy(
    IHTMLElement6* This,
    BSTR *p);
void __RPC_STUB IHTMLElement6_get_nodeName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_getElementsByClassName_Proxy(
    IHTMLElement6* This,
    BSTR v,
    IHTMLElementCollection **pel);
void __RPC_STUB IHTMLElement6_getElementsByClassName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_msMatchesSelector_Proxy(
    IHTMLElement6* This,
    BSTR v,
    VARIANT_BOOL *pfMatches);
void __RPC_STUB IHTMLElement6_msMatchesSelector_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_put_onabort_Proxy(
    IHTMLElement6* This,
    VARIANT v);
void __RPC_STUB IHTMLElement6_put_onabort_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_get_onabort_Proxy(
    IHTMLElement6* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement6_get_onabort_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_put_oncanplay_Proxy(
    IHTMLElement6* This,
    VARIANT v);
void __RPC_STUB IHTMLElement6_put_oncanplay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_get_oncanplay_Proxy(
    IHTMLElement6* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement6_get_oncanplay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_put_oncanplaythrough_Proxy(
    IHTMLElement6* This,
    VARIANT v);
void __RPC_STUB IHTMLElement6_put_oncanplaythrough_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_get_oncanplaythrough_Proxy(
    IHTMLElement6* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement6_get_oncanplaythrough_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_put_onchange_Proxy(
    IHTMLElement6* This,
    VARIANT v);
void __RPC_STUB IHTMLElement6_put_onchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_get_onchange_Proxy(
    IHTMLElement6* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement6_get_onchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_put_ondurationchange_Proxy(
    IHTMLElement6* This,
    VARIANT v);
void __RPC_STUB IHTMLElement6_put_ondurationchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_get_ondurationchange_Proxy(
    IHTMLElement6* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement6_get_ondurationchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_put_onemptied_Proxy(
    IHTMLElement6* This,
    VARIANT v);
void __RPC_STUB IHTMLElement6_put_onemptied_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_get_onemptied_Proxy(
    IHTMLElement6* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement6_get_onemptied_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_put_onended_Proxy(
    IHTMLElement6* This,
    VARIANT v);
void __RPC_STUB IHTMLElement6_put_onended_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_get_onended_Proxy(
    IHTMLElement6* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement6_get_onended_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_put_onerror_Proxy(
    IHTMLElement6* This,
    VARIANT v);
void __RPC_STUB IHTMLElement6_put_onerror_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_get_onerror_Proxy(
    IHTMLElement6* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement6_get_onerror_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_put_oninput_Proxy(
    IHTMLElement6* This,
    VARIANT v);
void __RPC_STUB IHTMLElement6_put_oninput_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_get_oninput_Proxy(
    IHTMLElement6* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement6_get_oninput_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_put_onload_Proxy(
    IHTMLElement6* This,
    VARIANT v);
void __RPC_STUB IHTMLElement6_put_onload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_get_onload_Proxy(
    IHTMLElement6* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement6_get_onload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_put_onloadeddata_Proxy(
    IHTMLElement6* This,
    VARIANT v);
void __RPC_STUB IHTMLElement6_put_onloadeddata_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_get_onloadeddata_Proxy(
    IHTMLElement6* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement6_get_onloadeddata_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_put_onloadedmetadata_Proxy(
    IHTMLElement6* This,
    VARIANT v);
void __RPC_STUB IHTMLElement6_put_onloadedmetadata_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_get_onloadedmetadata_Proxy(
    IHTMLElement6* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement6_get_onloadedmetadata_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_put_onloadstart_Proxy(
    IHTMLElement6* This,
    VARIANT v);
void __RPC_STUB IHTMLElement6_put_onloadstart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_get_onloadstart_Proxy(
    IHTMLElement6* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement6_get_onloadstart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_put_onpause_Proxy(
    IHTMLElement6* This,
    VARIANT v);
void __RPC_STUB IHTMLElement6_put_onpause_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_get_onpause_Proxy(
    IHTMLElement6* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement6_get_onpause_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_put_onplay_Proxy(
    IHTMLElement6* This,
    VARIANT v);
void __RPC_STUB IHTMLElement6_put_onplay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_get_onplay_Proxy(
    IHTMLElement6* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement6_get_onplay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_put_onplaying_Proxy(
    IHTMLElement6* This,
    VARIANT v);
void __RPC_STUB IHTMLElement6_put_onplaying_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_get_onplaying_Proxy(
    IHTMLElement6* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement6_get_onplaying_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_put_onprogress_Proxy(
    IHTMLElement6* This,
    VARIANT v);
void __RPC_STUB IHTMLElement6_put_onprogress_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_get_onprogress_Proxy(
    IHTMLElement6* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement6_get_onprogress_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_put_onratechange_Proxy(
    IHTMLElement6* This,
    VARIANT v);
void __RPC_STUB IHTMLElement6_put_onratechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_get_onratechange_Proxy(
    IHTMLElement6* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement6_get_onratechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_put_onreset_Proxy(
    IHTMLElement6* This,
    VARIANT v);
void __RPC_STUB IHTMLElement6_put_onreset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_get_onreset_Proxy(
    IHTMLElement6* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement6_get_onreset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_put_onseeked_Proxy(
    IHTMLElement6* This,
    VARIANT v);
void __RPC_STUB IHTMLElement6_put_onseeked_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_get_onseeked_Proxy(
    IHTMLElement6* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement6_get_onseeked_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_put_onseeking_Proxy(
    IHTMLElement6* This,
    VARIANT v);
void __RPC_STUB IHTMLElement6_put_onseeking_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_get_onseeking_Proxy(
    IHTMLElement6* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement6_get_onseeking_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_put_onselect_Proxy(
    IHTMLElement6* This,
    VARIANT v);
void __RPC_STUB IHTMLElement6_put_onselect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_get_onselect_Proxy(
    IHTMLElement6* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement6_get_onselect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_put_onstalled_Proxy(
    IHTMLElement6* This,
    VARIANT v);
void __RPC_STUB IHTMLElement6_put_onstalled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_get_onstalled_Proxy(
    IHTMLElement6* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement6_get_onstalled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_put_onsubmit_Proxy(
    IHTMLElement6* This,
    VARIANT v);
void __RPC_STUB IHTMLElement6_put_onsubmit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_get_onsubmit_Proxy(
    IHTMLElement6* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement6_get_onsubmit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_put_onsuspend_Proxy(
    IHTMLElement6* This,
    VARIANT v);
void __RPC_STUB IHTMLElement6_put_onsuspend_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_get_onsuspend_Proxy(
    IHTMLElement6* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement6_get_onsuspend_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_put_ontimeupdate_Proxy(
    IHTMLElement6* This,
    VARIANT v);
void __RPC_STUB IHTMLElement6_put_ontimeupdate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_get_ontimeupdate_Proxy(
    IHTMLElement6* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement6_get_ontimeupdate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_put_onvolumechange_Proxy(
    IHTMLElement6* This,
    VARIANT v);
void __RPC_STUB IHTMLElement6_put_onvolumechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_get_onvolumechange_Proxy(
    IHTMLElement6* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement6_get_onvolumechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_put_onwaiting_Proxy(
    IHTMLElement6* This,
    VARIANT v);
void __RPC_STUB IHTMLElement6_put_onwaiting_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_get_onwaiting_Proxy(
    IHTMLElement6* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement6_get_onwaiting_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement6_hasAttributes_Proxy(
    IHTMLElement6* This,
    VARIANT_BOOL *pfHasAttributes);
void __RPC_STUB IHTMLElement6_hasAttributes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLElement6_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLElement7 interface
 */
#ifndef __IHTMLElement7_INTERFACE_DEFINED__
#define __IHTMLElement7_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLElement7, 0x305107aa, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305107aa-98b5-11cf-bb82-00aa00bdce0b")
IHTMLElement7 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_onmspointerdown(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmspointerdown(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmspointermove(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmspointermove(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmspointerup(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmspointerup(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmspointerover(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmspointerover(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmspointerout(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmspointerout(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmspointercancel(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmspointercancel(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmspointerhover(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmspointerhover(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmslostpointercapture(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmslostpointercapture(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmsgotpointercapture(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmsgotpointercapture(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmsgesturestart(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmsgesturestart(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmsgesturechange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmsgesturechange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmsgestureend(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmsgestureend(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmsgesturehold(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmsgesturehold(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmsgesturetap(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmsgesturetap(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmsgesturedoubletap(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmsgesturedoubletap(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmsinertiastart(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmsinertiastart(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE msSetPointerCapture(
        LONG pointerId) = 0;

    virtual HRESULT STDMETHODCALLTYPE msReleasePointerCapture(
        LONG pointerId) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmstransitionstart(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmstransitionstart(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmstransitionend(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmstransitionend(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmsanimationstart(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmsanimationstart(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmsanimationend(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmsanimationend(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmsanimationiteration(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmsanimationiteration(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_oninvalid(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_oninvalid(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_xmsAcceleratorKey(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_xmsAcceleratorKey(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_spellcheck(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_spellcheck(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmsmanipulationstatechanged(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmsmanipulationstatechanged(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_oncuechange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_oncuechange(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLElement7, 0x305107aa, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLElement7Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLElement7 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_onmspointerdown)(
        IHTMLElement7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmspointerdown)(
        IHTMLElement7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmspointermove)(
        IHTMLElement7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmspointermove)(
        IHTMLElement7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmspointerup)(
        IHTMLElement7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmspointerup)(
        IHTMLElement7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmspointerover)(
        IHTMLElement7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmspointerover)(
        IHTMLElement7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmspointerout)(
        IHTMLElement7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmspointerout)(
        IHTMLElement7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmspointercancel)(
        IHTMLElement7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmspointercancel)(
        IHTMLElement7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmspointerhover)(
        IHTMLElement7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmspointerhover)(
        IHTMLElement7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmslostpointercapture)(
        IHTMLElement7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmslostpointercapture)(
        IHTMLElement7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmsgotpointercapture)(
        IHTMLElement7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmsgotpointercapture)(
        IHTMLElement7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmsgesturestart)(
        IHTMLElement7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmsgesturestart)(
        IHTMLElement7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmsgesturechange)(
        IHTMLElement7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmsgesturechange)(
        IHTMLElement7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmsgestureend)(
        IHTMLElement7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmsgestureend)(
        IHTMLElement7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmsgesturehold)(
        IHTMLElement7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmsgesturehold)(
        IHTMLElement7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmsgesturetap)(
        IHTMLElement7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmsgesturetap)(
        IHTMLElement7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmsgesturedoubletap)(
        IHTMLElement7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmsgesturedoubletap)(
        IHTMLElement7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmsinertiastart)(
        IHTMLElement7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmsinertiastart)(
        IHTMLElement7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *msSetPointerCapture)(
        IHTMLElement7* This,
        LONG pointerId);

    HRESULT (STDMETHODCALLTYPE *msReleasePointerCapture)(
        IHTMLElement7* This,
        LONG pointerId);

    HRESULT (STDMETHODCALLTYPE *put_onmstransitionstart)(
        IHTMLElement7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmstransitionstart)(
        IHTMLElement7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmstransitionend)(
        IHTMLElement7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmstransitionend)(
        IHTMLElement7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmsanimationstart)(
        IHTMLElement7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmsanimationstart)(
        IHTMLElement7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmsanimationend)(
        IHTMLElement7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmsanimationend)(
        IHTMLElement7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmsanimationiteration)(
        IHTMLElement7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmsanimationiteration)(
        IHTMLElement7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_oninvalid)(
        IHTMLElement7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_oninvalid)(
        IHTMLElement7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_xmsAcceleratorKey)(
        IHTMLElement7* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_xmsAcceleratorKey)(
        IHTMLElement7* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_spellcheck)(
        IHTMLElement7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_spellcheck)(
        IHTMLElement7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmsmanipulationstatechanged)(
        IHTMLElement7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmsmanipulationstatechanged)(
        IHTMLElement7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_oncuechange)(
        IHTMLElement7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_oncuechange)(
        IHTMLElement7* This,
        VARIANT *p);

    END_INTERFACE
} IHTMLElement7Vtbl;
interface IHTMLElement7 {
    CONST_VTBL IHTMLElement7Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLElement7_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLElement7_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLElement7_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLElement7_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLElement7_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLElement7_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLElement7_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLElement7 methods ***/
#define IHTMLElement7_put_onmspointerdown(This,v) (This)->lpVtbl->put_onmspointerdown(This,v)
#define IHTMLElement7_get_onmspointerdown(This,p) (This)->lpVtbl->get_onmspointerdown(This,p)
#define IHTMLElement7_put_onmspointermove(This,v) (This)->lpVtbl->put_onmspointermove(This,v)
#define IHTMLElement7_get_onmspointermove(This,p) (This)->lpVtbl->get_onmspointermove(This,p)
#define IHTMLElement7_put_onmspointerup(This,v) (This)->lpVtbl->put_onmspointerup(This,v)
#define IHTMLElement7_get_onmspointerup(This,p) (This)->lpVtbl->get_onmspointerup(This,p)
#define IHTMLElement7_put_onmspointerover(This,v) (This)->lpVtbl->put_onmspointerover(This,v)
#define IHTMLElement7_get_onmspointerover(This,p) (This)->lpVtbl->get_onmspointerover(This,p)
#define IHTMLElement7_put_onmspointerout(This,v) (This)->lpVtbl->put_onmspointerout(This,v)
#define IHTMLElement7_get_onmspointerout(This,p) (This)->lpVtbl->get_onmspointerout(This,p)
#define IHTMLElement7_put_onmspointercancel(This,v) (This)->lpVtbl->put_onmspointercancel(This,v)
#define IHTMLElement7_get_onmspointercancel(This,p) (This)->lpVtbl->get_onmspointercancel(This,p)
#define IHTMLElement7_put_onmspointerhover(This,v) (This)->lpVtbl->put_onmspointerhover(This,v)
#define IHTMLElement7_get_onmspointerhover(This,p) (This)->lpVtbl->get_onmspointerhover(This,p)
#define IHTMLElement7_put_onmslostpointercapture(This,v) (This)->lpVtbl->put_onmslostpointercapture(This,v)
#define IHTMLElement7_get_onmslostpointercapture(This,p) (This)->lpVtbl->get_onmslostpointercapture(This,p)
#define IHTMLElement7_put_onmsgotpointercapture(This,v) (This)->lpVtbl->put_onmsgotpointercapture(This,v)
#define IHTMLElement7_get_onmsgotpointercapture(This,p) (This)->lpVtbl->get_onmsgotpointercapture(This,p)
#define IHTMLElement7_put_onmsgesturestart(This,v) (This)->lpVtbl->put_onmsgesturestart(This,v)
#define IHTMLElement7_get_onmsgesturestart(This,p) (This)->lpVtbl->get_onmsgesturestart(This,p)
#define IHTMLElement7_put_onmsgesturechange(This,v) (This)->lpVtbl->put_onmsgesturechange(This,v)
#define IHTMLElement7_get_onmsgesturechange(This,p) (This)->lpVtbl->get_onmsgesturechange(This,p)
#define IHTMLElement7_put_onmsgestureend(This,v) (This)->lpVtbl->put_onmsgestureend(This,v)
#define IHTMLElement7_get_onmsgestureend(This,p) (This)->lpVtbl->get_onmsgestureend(This,p)
#define IHTMLElement7_put_onmsgesturehold(This,v) (This)->lpVtbl->put_onmsgesturehold(This,v)
#define IHTMLElement7_get_onmsgesturehold(This,p) (This)->lpVtbl->get_onmsgesturehold(This,p)
#define IHTMLElement7_put_onmsgesturetap(This,v) (This)->lpVtbl->put_onmsgesturetap(This,v)
#define IHTMLElement7_get_onmsgesturetap(This,p) (This)->lpVtbl->get_onmsgesturetap(This,p)
#define IHTMLElement7_put_onmsgesturedoubletap(This,v) (This)->lpVtbl->put_onmsgesturedoubletap(This,v)
#define IHTMLElement7_get_onmsgesturedoubletap(This,p) (This)->lpVtbl->get_onmsgesturedoubletap(This,p)
#define IHTMLElement7_put_onmsinertiastart(This,v) (This)->lpVtbl->put_onmsinertiastart(This,v)
#define IHTMLElement7_get_onmsinertiastart(This,p) (This)->lpVtbl->get_onmsinertiastart(This,p)
#define IHTMLElement7_msSetPointerCapture(This,pointerId) (This)->lpVtbl->msSetPointerCapture(This,pointerId)
#define IHTMLElement7_msReleasePointerCapture(This,pointerId) (This)->lpVtbl->msReleasePointerCapture(This,pointerId)
#define IHTMLElement7_put_onmstransitionstart(This,v) (This)->lpVtbl->put_onmstransitionstart(This,v)
#define IHTMLElement7_get_onmstransitionstart(This,p) (This)->lpVtbl->get_onmstransitionstart(This,p)
#define IHTMLElement7_put_onmstransitionend(This,v) (This)->lpVtbl->put_onmstransitionend(This,v)
#define IHTMLElement7_get_onmstransitionend(This,p) (This)->lpVtbl->get_onmstransitionend(This,p)
#define IHTMLElement7_put_onmsanimationstart(This,v) (This)->lpVtbl->put_onmsanimationstart(This,v)
#define IHTMLElement7_get_onmsanimationstart(This,p) (This)->lpVtbl->get_onmsanimationstart(This,p)
#define IHTMLElement7_put_onmsanimationend(This,v) (This)->lpVtbl->put_onmsanimationend(This,v)
#define IHTMLElement7_get_onmsanimationend(This,p) (This)->lpVtbl->get_onmsanimationend(This,p)
#define IHTMLElement7_put_onmsanimationiteration(This,v) (This)->lpVtbl->put_onmsanimationiteration(This,v)
#define IHTMLElement7_get_onmsanimationiteration(This,p) (This)->lpVtbl->get_onmsanimationiteration(This,p)
#define IHTMLElement7_put_oninvalid(This,v) (This)->lpVtbl->put_oninvalid(This,v)
#define IHTMLElement7_get_oninvalid(This,p) (This)->lpVtbl->get_oninvalid(This,p)
#define IHTMLElement7_put_xmsAcceleratorKey(This,v) (This)->lpVtbl->put_xmsAcceleratorKey(This,v)
#define IHTMLElement7_get_xmsAcceleratorKey(This,p) (This)->lpVtbl->get_xmsAcceleratorKey(This,p)
#define IHTMLElement7_put_spellcheck(This,v) (This)->lpVtbl->put_spellcheck(This,v)
#define IHTMLElement7_get_spellcheck(This,p) (This)->lpVtbl->get_spellcheck(This,p)
#define IHTMLElement7_put_onmsmanipulationstatechanged(This,v) (This)->lpVtbl->put_onmsmanipulationstatechanged(This,v)
#define IHTMLElement7_get_onmsmanipulationstatechanged(This,p) (This)->lpVtbl->get_onmsmanipulationstatechanged(This,p)
#define IHTMLElement7_put_oncuechange(This,v) (This)->lpVtbl->put_oncuechange(This,v)
#define IHTMLElement7_get_oncuechange(This,p) (This)->lpVtbl->get_oncuechange(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLElement7_QueryInterface(IHTMLElement7* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLElement7_AddRef(IHTMLElement7* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLElement7_Release(IHTMLElement7* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLElement7_GetTypeInfoCount(IHTMLElement7* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLElement7_GetTypeInfo(IHTMLElement7* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLElement7_GetIDsOfNames(IHTMLElement7* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLElement7_Invoke(IHTMLElement7* 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);
}
/*** IHTMLElement7 methods ***/
static FORCEINLINE HRESULT IHTMLElement7_put_onmspointerdown(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmspointerdown(This,v);
}
static FORCEINLINE HRESULT IHTMLElement7_get_onmspointerdown(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointerdown(This,p);
}
static FORCEINLINE HRESULT IHTMLElement7_put_onmspointermove(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmspointermove(This,v);
}
static FORCEINLINE HRESULT IHTMLElement7_get_onmspointermove(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointermove(This,p);
}
static FORCEINLINE HRESULT IHTMLElement7_put_onmspointerup(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmspointerup(This,v);
}
static FORCEINLINE HRESULT IHTMLElement7_get_onmspointerup(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointerup(This,p);
}
static FORCEINLINE HRESULT IHTMLElement7_put_onmspointerover(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmspointerover(This,v);
}
static FORCEINLINE HRESULT IHTMLElement7_get_onmspointerover(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointerover(This,p);
}
static FORCEINLINE HRESULT IHTMLElement7_put_onmspointerout(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmspointerout(This,v);
}
static FORCEINLINE HRESULT IHTMLElement7_get_onmspointerout(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointerout(This,p);
}
static FORCEINLINE HRESULT IHTMLElement7_put_onmspointercancel(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmspointercancel(This,v);
}
static FORCEINLINE HRESULT IHTMLElement7_get_onmspointercancel(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointercancel(This,p);
}
static FORCEINLINE HRESULT IHTMLElement7_put_onmspointerhover(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmspointerhover(This,v);
}
static FORCEINLINE HRESULT IHTMLElement7_get_onmspointerhover(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointerhover(This,p);
}
static FORCEINLINE HRESULT IHTMLElement7_put_onmslostpointercapture(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmslostpointercapture(This,v);
}
static FORCEINLINE HRESULT IHTMLElement7_get_onmslostpointercapture(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmslostpointercapture(This,p);
}
static FORCEINLINE HRESULT IHTMLElement7_put_onmsgotpointercapture(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmsgotpointercapture(This,v);
}
static FORCEINLINE HRESULT IHTMLElement7_get_onmsgotpointercapture(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgotpointercapture(This,p);
}
static FORCEINLINE HRESULT IHTMLElement7_put_onmsgesturestart(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmsgesturestart(This,v);
}
static FORCEINLINE HRESULT IHTMLElement7_get_onmsgesturestart(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgesturestart(This,p);
}
static FORCEINLINE HRESULT IHTMLElement7_put_onmsgesturechange(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmsgesturechange(This,v);
}
static FORCEINLINE HRESULT IHTMLElement7_get_onmsgesturechange(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgesturechange(This,p);
}
static FORCEINLINE HRESULT IHTMLElement7_put_onmsgestureend(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmsgestureend(This,v);
}
static FORCEINLINE HRESULT IHTMLElement7_get_onmsgestureend(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgestureend(This,p);
}
static FORCEINLINE HRESULT IHTMLElement7_put_onmsgesturehold(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmsgesturehold(This,v);
}
static FORCEINLINE HRESULT IHTMLElement7_get_onmsgesturehold(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgesturehold(This,p);
}
static FORCEINLINE HRESULT IHTMLElement7_put_onmsgesturetap(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmsgesturetap(This,v);
}
static FORCEINLINE HRESULT IHTMLElement7_get_onmsgesturetap(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgesturetap(This,p);
}
static FORCEINLINE HRESULT IHTMLElement7_put_onmsgesturedoubletap(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmsgesturedoubletap(This,v);
}
static FORCEINLINE HRESULT IHTMLElement7_get_onmsgesturedoubletap(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgesturedoubletap(This,p);
}
static FORCEINLINE HRESULT IHTMLElement7_put_onmsinertiastart(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmsinertiastart(This,v);
}
static FORCEINLINE HRESULT IHTMLElement7_get_onmsinertiastart(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmsinertiastart(This,p);
}
static FORCEINLINE HRESULT IHTMLElement7_msSetPointerCapture(IHTMLElement7* This,LONG pointerId) {
    return This->lpVtbl->msSetPointerCapture(This,pointerId);
}
static FORCEINLINE HRESULT IHTMLElement7_msReleasePointerCapture(IHTMLElement7* This,LONG pointerId) {
    return This->lpVtbl->msReleasePointerCapture(This,pointerId);
}
static FORCEINLINE HRESULT IHTMLElement7_put_onmstransitionstart(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmstransitionstart(This,v);
}
static FORCEINLINE HRESULT IHTMLElement7_get_onmstransitionstart(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmstransitionstart(This,p);
}
static FORCEINLINE HRESULT IHTMLElement7_put_onmstransitionend(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmstransitionend(This,v);
}
static FORCEINLINE HRESULT IHTMLElement7_get_onmstransitionend(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmstransitionend(This,p);
}
static FORCEINLINE HRESULT IHTMLElement7_put_onmsanimationstart(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmsanimationstart(This,v);
}
static FORCEINLINE HRESULT IHTMLElement7_get_onmsanimationstart(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmsanimationstart(This,p);
}
static FORCEINLINE HRESULT IHTMLElement7_put_onmsanimationend(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmsanimationend(This,v);
}
static FORCEINLINE HRESULT IHTMLElement7_get_onmsanimationend(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmsanimationend(This,p);
}
static FORCEINLINE HRESULT IHTMLElement7_put_onmsanimationiteration(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmsanimationiteration(This,v);
}
static FORCEINLINE HRESULT IHTMLElement7_get_onmsanimationiteration(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmsanimationiteration(This,p);
}
static FORCEINLINE HRESULT IHTMLElement7_put_oninvalid(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_oninvalid(This,v);
}
static FORCEINLINE HRESULT IHTMLElement7_get_oninvalid(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_oninvalid(This,p);
}
static FORCEINLINE HRESULT IHTMLElement7_put_xmsAcceleratorKey(IHTMLElement7* This,BSTR v) {
    return This->lpVtbl->put_xmsAcceleratorKey(This,v);
}
static FORCEINLINE HRESULT IHTMLElement7_get_xmsAcceleratorKey(IHTMLElement7* This,BSTR *p) {
    return This->lpVtbl->get_xmsAcceleratorKey(This,p);
}
static FORCEINLINE HRESULT IHTMLElement7_put_spellcheck(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_spellcheck(This,v);
}
static FORCEINLINE HRESULT IHTMLElement7_get_spellcheck(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_spellcheck(This,p);
}
static FORCEINLINE HRESULT IHTMLElement7_put_onmsmanipulationstatechanged(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmsmanipulationstatechanged(This,v);
}
static FORCEINLINE HRESULT IHTMLElement7_get_onmsmanipulationstatechanged(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmsmanipulationstatechanged(This,p);
}
static FORCEINLINE HRESULT IHTMLElement7_put_oncuechange(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_oncuechange(This,v);
}
static FORCEINLINE HRESULT IHTMLElement7_get_oncuechange(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_oncuechange(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLElement7_put_onmspointerdown_Proxy(
    IHTMLElement7* This,
    VARIANT v);
void __RPC_STUB IHTMLElement7_put_onmspointerdown_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_get_onmspointerdown_Proxy(
    IHTMLElement7* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement7_get_onmspointerdown_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_put_onmspointermove_Proxy(
    IHTMLElement7* This,
    VARIANT v);
void __RPC_STUB IHTMLElement7_put_onmspointermove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_get_onmspointermove_Proxy(
    IHTMLElement7* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement7_get_onmspointermove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_put_onmspointerup_Proxy(
    IHTMLElement7* This,
    VARIANT v);
void __RPC_STUB IHTMLElement7_put_onmspointerup_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_get_onmspointerup_Proxy(
    IHTMLElement7* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement7_get_onmspointerup_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_put_onmspointerover_Proxy(
    IHTMLElement7* This,
    VARIANT v);
void __RPC_STUB IHTMLElement7_put_onmspointerover_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_get_onmspointerover_Proxy(
    IHTMLElement7* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement7_get_onmspointerover_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_put_onmspointerout_Proxy(
    IHTMLElement7* This,
    VARIANT v);
void __RPC_STUB IHTMLElement7_put_onmspointerout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_get_onmspointerout_Proxy(
    IHTMLElement7* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement7_get_onmspointerout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_put_onmspointercancel_Proxy(
    IHTMLElement7* This,
    VARIANT v);
void __RPC_STUB IHTMLElement7_put_onmspointercancel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_get_onmspointercancel_Proxy(
    IHTMLElement7* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement7_get_onmspointercancel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_put_onmspointerhover_Proxy(
    IHTMLElement7* This,
    VARIANT v);
void __RPC_STUB IHTMLElement7_put_onmspointerhover_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_get_onmspointerhover_Proxy(
    IHTMLElement7* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement7_get_onmspointerhover_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_put_onmslostpointercapture_Proxy(
    IHTMLElement7* This,
    VARIANT v);
void __RPC_STUB IHTMLElement7_put_onmslostpointercapture_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_get_onmslostpointercapture_Proxy(
    IHTMLElement7* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement7_get_onmslostpointercapture_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_put_onmsgotpointercapture_Proxy(
    IHTMLElement7* This,
    VARIANT v);
void __RPC_STUB IHTMLElement7_put_onmsgotpointercapture_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_get_onmsgotpointercapture_Proxy(
    IHTMLElement7* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement7_get_onmsgotpointercapture_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_put_onmsgesturestart_Proxy(
    IHTMLElement7* This,
    VARIANT v);
void __RPC_STUB IHTMLElement7_put_onmsgesturestart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_get_onmsgesturestart_Proxy(
    IHTMLElement7* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement7_get_onmsgesturestart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_put_onmsgesturechange_Proxy(
    IHTMLElement7* This,
    VARIANT v);
void __RPC_STUB IHTMLElement7_put_onmsgesturechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_get_onmsgesturechange_Proxy(
    IHTMLElement7* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement7_get_onmsgesturechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_put_onmsgestureend_Proxy(
    IHTMLElement7* This,
    VARIANT v);
void __RPC_STUB IHTMLElement7_put_onmsgestureend_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_get_onmsgestureend_Proxy(
    IHTMLElement7* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement7_get_onmsgestureend_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_put_onmsgesturehold_Proxy(
    IHTMLElement7* This,
    VARIANT v);
void __RPC_STUB IHTMLElement7_put_onmsgesturehold_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_get_onmsgesturehold_Proxy(
    IHTMLElement7* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement7_get_onmsgesturehold_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_put_onmsgesturetap_Proxy(
    IHTMLElement7* This,
    VARIANT v);
void __RPC_STUB IHTMLElement7_put_onmsgesturetap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_get_onmsgesturetap_Proxy(
    IHTMLElement7* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement7_get_onmsgesturetap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_put_onmsgesturedoubletap_Proxy(
    IHTMLElement7* This,
    VARIANT v);
void __RPC_STUB IHTMLElement7_put_onmsgesturedoubletap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_get_onmsgesturedoubletap_Proxy(
    IHTMLElement7* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement7_get_onmsgesturedoubletap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_put_onmsinertiastart_Proxy(
    IHTMLElement7* This,
    VARIANT v);
void __RPC_STUB IHTMLElement7_put_onmsinertiastart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_get_onmsinertiastart_Proxy(
    IHTMLElement7* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement7_get_onmsinertiastart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_msSetPointerCapture_Proxy(
    IHTMLElement7* This,
    LONG pointerId);
void __RPC_STUB IHTMLElement7_msSetPointerCapture_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_msReleasePointerCapture_Proxy(
    IHTMLElement7* This,
    LONG pointerId);
void __RPC_STUB IHTMLElement7_msReleasePointerCapture_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_put_onmstransitionstart_Proxy(
    IHTMLElement7* This,
    VARIANT v);
void __RPC_STUB IHTMLElement7_put_onmstransitionstart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_get_onmstransitionstart_Proxy(
    IHTMLElement7* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement7_get_onmstransitionstart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_put_onmstransitionend_Proxy(
    IHTMLElement7* This,
    VARIANT v);
void __RPC_STUB IHTMLElement7_put_onmstransitionend_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_get_onmstransitionend_Proxy(
    IHTMLElement7* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement7_get_onmstransitionend_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_put_onmsanimationstart_Proxy(
    IHTMLElement7* This,
    VARIANT v);
void __RPC_STUB IHTMLElement7_put_onmsanimationstart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_get_onmsanimationstart_Proxy(
    IHTMLElement7* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement7_get_onmsanimationstart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_put_onmsanimationend_Proxy(
    IHTMLElement7* This,
    VARIANT v);
void __RPC_STUB IHTMLElement7_put_onmsanimationend_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_get_onmsanimationend_Proxy(
    IHTMLElement7* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement7_get_onmsanimationend_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_put_onmsanimationiteration_Proxy(
    IHTMLElement7* This,
    VARIANT v);
void __RPC_STUB IHTMLElement7_put_onmsanimationiteration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_get_onmsanimationiteration_Proxy(
    IHTMLElement7* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement7_get_onmsanimationiteration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_put_oninvalid_Proxy(
    IHTMLElement7* This,
    VARIANT v);
void __RPC_STUB IHTMLElement7_put_oninvalid_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_get_oninvalid_Proxy(
    IHTMLElement7* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement7_get_oninvalid_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_put_xmsAcceleratorKey_Proxy(
    IHTMLElement7* This,
    BSTR v);
void __RPC_STUB IHTMLElement7_put_xmsAcceleratorKey_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_get_xmsAcceleratorKey_Proxy(
    IHTMLElement7* This,
    BSTR *p);
void __RPC_STUB IHTMLElement7_get_xmsAcceleratorKey_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_put_spellcheck_Proxy(
    IHTMLElement7* This,
    VARIANT v);
void __RPC_STUB IHTMLElement7_put_spellcheck_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_get_spellcheck_Proxy(
    IHTMLElement7* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement7_get_spellcheck_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_put_onmsmanipulationstatechanged_Proxy(
    IHTMLElement7* This,
    VARIANT v);
void __RPC_STUB IHTMLElement7_put_onmsmanipulationstatechanged_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_get_onmsmanipulationstatechanged_Proxy(
    IHTMLElement7* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement7_get_onmsmanipulationstatechanged_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_put_oncuechange_Proxy(
    IHTMLElement7* This,
    VARIANT v);
void __RPC_STUB IHTMLElement7_put_oncuechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElement7_get_oncuechange_Proxy(
    IHTMLElement7* This,
    VARIANT *p);
void __RPC_STUB IHTMLElement7_get_oncuechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLElement7_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLElementAppliedStyles interface
 */
#ifndef __IHTMLElementAppliedStyles_INTERFACE_DEFINED__
#define __IHTMLElementAppliedStyles_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLElementAppliedStyles, 0x305104bd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104bd-98b5-11cf-bb82-00aa00bdce0b")
IHTMLElementAppliedStyles : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE msGetRulesApplied(
        IRulesAppliedCollection **ppRulesAppliedCollection) = 0;

    virtual HRESULT STDMETHODCALLTYPE msGetRulesAppliedWithAncestor(
        VARIANT varContext,
        IRulesAppliedCollection **ppRulesAppliedCollection) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLElementAppliedStyles, 0x305104bd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLElementAppliedStylesVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLElementAppliedStyles methods ***/
    HRESULT (STDMETHODCALLTYPE *msGetRulesApplied)(
        IHTMLElementAppliedStyles* This,
        IRulesAppliedCollection **ppRulesAppliedCollection);

    HRESULT (STDMETHODCALLTYPE *msGetRulesAppliedWithAncestor)(
        IHTMLElementAppliedStyles* This,
        VARIANT varContext,
        IRulesAppliedCollection **ppRulesAppliedCollection);

    END_INTERFACE
} IHTMLElementAppliedStylesVtbl;
interface IHTMLElementAppliedStyles {
    CONST_VTBL IHTMLElementAppliedStylesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLElementAppliedStyles_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLElementAppliedStyles_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLElementAppliedStyles_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLElementAppliedStyles_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLElementAppliedStyles_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLElementAppliedStyles_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLElementAppliedStyles_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLElementAppliedStyles methods ***/
#define IHTMLElementAppliedStyles_msGetRulesApplied(This,ppRulesAppliedCollection) (This)->lpVtbl->msGetRulesApplied(This,ppRulesAppliedCollection)
#define IHTMLElementAppliedStyles_msGetRulesAppliedWithAncestor(This,varContext,ppRulesAppliedCollection) (This)->lpVtbl->msGetRulesAppliedWithAncestor(This,varContext,ppRulesAppliedCollection)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLElementAppliedStyles_QueryInterface(IHTMLElementAppliedStyles* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLElementAppliedStyles_AddRef(IHTMLElementAppliedStyles* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLElementAppliedStyles_Release(IHTMLElementAppliedStyles* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLElementAppliedStyles_GetTypeInfoCount(IHTMLElementAppliedStyles* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLElementAppliedStyles_GetTypeInfo(IHTMLElementAppliedStyles* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLElementAppliedStyles_GetIDsOfNames(IHTMLElementAppliedStyles* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLElementAppliedStyles_Invoke(IHTMLElementAppliedStyles* 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);
}
/*** IHTMLElementAppliedStyles methods ***/
static FORCEINLINE HRESULT IHTMLElementAppliedStyles_msGetRulesApplied(IHTMLElementAppliedStyles* This,IRulesAppliedCollection **ppRulesAppliedCollection) {
    return This->lpVtbl->msGetRulesApplied(This,ppRulesAppliedCollection);
}
static FORCEINLINE HRESULT IHTMLElementAppliedStyles_msGetRulesAppliedWithAncestor(IHTMLElementAppliedStyles* This,VARIANT varContext,IRulesAppliedCollection **ppRulesAppliedCollection) {
    return This->lpVtbl->msGetRulesAppliedWithAncestor(This,varContext,ppRulesAppliedCollection);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLElementAppliedStyles_msGetRulesApplied_Proxy(
    IHTMLElementAppliedStyles* This,
    IRulesAppliedCollection **ppRulesAppliedCollection);
void __RPC_STUB IHTMLElementAppliedStyles_msGetRulesApplied_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElementAppliedStyles_msGetRulesAppliedWithAncestor_Proxy(
    IHTMLElementAppliedStyles* This,
    VARIANT varContext,
    IRulesAppliedCollection **ppRulesAppliedCollection);
void __RPC_STUB IHTMLElementAppliedStyles_msGetRulesAppliedWithAncestor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLElementAppliedStyles_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IElementTraversal interface
 */
#ifndef __IElementTraversal_INTERFACE_DEFINED__
#define __IElementTraversal_INTERFACE_DEFINED__

DEFINE_GUID(IID_IElementTraversal, 0x30510736, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510736-98b5-11cf-bb82-00aa00bdce0b")
IElementTraversal : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_firstElementChild(
        IHTMLElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_lastElementChild(
        IHTMLElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_previousElementSibling(
        IHTMLElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_nextElementSibling(
        IHTMLElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_childElementCount(
        LONG *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IElementTraversal, 0x30510736, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IElementTraversalVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IElementTraversal methods ***/
    HRESULT (STDMETHODCALLTYPE *get_firstElementChild)(
        IElementTraversal* This,
        IHTMLElement **p);

    HRESULT (STDMETHODCALLTYPE *get_lastElementChild)(
        IElementTraversal* This,
        IHTMLElement **p);

    HRESULT (STDMETHODCALLTYPE *get_previousElementSibling)(
        IElementTraversal* This,
        IHTMLElement **p);

    HRESULT (STDMETHODCALLTYPE *get_nextElementSibling)(
        IElementTraversal* This,
        IHTMLElement **p);

    HRESULT (STDMETHODCALLTYPE *get_childElementCount)(
        IElementTraversal* This,
        LONG *p);

    END_INTERFACE
} IElementTraversalVtbl;
interface IElementTraversal {
    CONST_VTBL IElementTraversalVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IElementTraversal_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IElementTraversal_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IElementTraversal_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IElementTraversal_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IElementTraversal_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IElementTraversal_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IElementTraversal_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IElementTraversal methods ***/
#define IElementTraversal_get_firstElementChild(This,p) (This)->lpVtbl->get_firstElementChild(This,p)
#define IElementTraversal_get_lastElementChild(This,p) (This)->lpVtbl->get_lastElementChild(This,p)
#define IElementTraversal_get_previousElementSibling(This,p) (This)->lpVtbl->get_previousElementSibling(This,p)
#define IElementTraversal_get_nextElementSibling(This,p) (This)->lpVtbl->get_nextElementSibling(This,p)
#define IElementTraversal_get_childElementCount(This,p) (This)->lpVtbl->get_childElementCount(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IElementTraversal_QueryInterface(IElementTraversal* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IElementTraversal_AddRef(IElementTraversal* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IElementTraversal_Release(IElementTraversal* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IElementTraversal_GetTypeInfoCount(IElementTraversal* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IElementTraversal_GetTypeInfo(IElementTraversal* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IElementTraversal_GetIDsOfNames(IElementTraversal* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IElementTraversal_Invoke(IElementTraversal* 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);
}
/*** IElementTraversal methods ***/
static FORCEINLINE HRESULT IElementTraversal_get_firstElementChild(IElementTraversal* This,IHTMLElement **p) {
    return This->lpVtbl->get_firstElementChild(This,p);
}
static FORCEINLINE HRESULT IElementTraversal_get_lastElementChild(IElementTraversal* This,IHTMLElement **p) {
    return This->lpVtbl->get_lastElementChild(This,p);
}
static FORCEINLINE HRESULT IElementTraversal_get_previousElementSibling(IElementTraversal* This,IHTMLElement **p) {
    return This->lpVtbl->get_previousElementSibling(This,p);
}
static FORCEINLINE HRESULT IElementTraversal_get_nextElementSibling(IElementTraversal* This,IHTMLElement **p) {
    return This->lpVtbl->get_nextElementSibling(This,p);
}
static FORCEINLINE HRESULT IElementTraversal_get_childElementCount(IElementTraversal* This,LONG *p) {
    return This->lpVtbl->get_childElementCount(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IElementTraversal_get_firstElementChild_Proxy(
    IElementTraversal* This,
    IHTMLElement **p);
void __RPC_STUB IElementTraversal_get_firstElementChild_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IElementTraversal_get_lastElementChild_Proxy(
    IElementTraversal* This,
    IHTMLElement **p);
void __RPC_STUB IElementTraversal_get_lastElementChild_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IElementTraversal_get_previousElementSibling_Proxy(
    IElementTraversal* This,
    IHTMLElement **p);
void __RPC_STUB IElementTraversal_get_previousElementSibling_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IElementTraversal_get_nextElementSibling_Proxy(
    IElementTraversal* This,
    IHTMLElement **p);
void __RPC_STUB IElementTraversal_get_nextElementSibling_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IElementTraversal_get_childElementCount_Proxy(
    IElementTraversal* This,
    LONG *p);
void __RPC_STUB IElementTraversal_get_childElementCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IElementTraversal_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLDatabinding interface
 */
#ifndef __IHTMLDatabinding_INTERFACE_DEFINED__
#define __IHTMLDatabinding_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDatabinding, 0x3050f3f2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f3f2-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDatabinding : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_dataFld(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_dataFld(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_dataSrc(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_dataSrc(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_dataFormatAs(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_dataFormatAs(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDatabinding, 0x3050f3f2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDatabindingVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLDatabinding methods ***/
    HRESULT (STDMETHODCALLTYPE *put_dataFld)(
        IHTMLDatabinding* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_dataFld)(
        IHTMLDatabinding* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_dataSrc)(
        IHTMLDatabinding* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_dataSrc)(
        IHTMLDatabinding* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_dataFormatAs)(
        IHTMLDatabinding* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_dataFormatAs)(
        IHTMLDatabinding* This,
        BSTR *p);

    END_INTERFACE
} IHTMLDatabindingVtbl;
interface IHTMLDatabinding {
    CONST_VTBL IHTMLDatabindingVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDatabinding_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDatabinding_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDatabinding_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDatabinding_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDatabinding_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDatabinding_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDatabinding_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDatabinding methods ***/
#define IHTMLDatabinding_put_dataFld(This,v) (This)->lpVtbl->put_dataFld(This,v)
#define IHTMLDatabinding_get_dataFld(This,p) (This)->lpVtbl->get_dataFld(This,p)
#define IHTMLDatabinding_put_dataSrc(This,v) (This)->lpVtbl->put_dataSrc(This,v)
#define IHTMLDatabinding_get_dataSrc(This,p) (This)->lpVtbl->get_dataSrc(This,p)
#define IHTMLDatabinding_put_dataFormatAs(This,v) (This)->lpVtbl->put_dataFormatAs(This,v)
#define IHTMLDatabinding_get_dataFormatAs(This,p) (This)->lpVtbl->get_dataFormatAs(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDatabinding_QueryInterface(IHTMLDatabinding* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDatabinding_AddRef(IHTMLDatabinding* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDatabinding_Release(IHTMLDatabinding* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDatabinding_GetTypeInfoCount(IHTMLDatabinding* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDatabinding_GetTypeInfo(IHTMLDatabinding* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDatabinding_GetIDsOfNames(IHTMLDatabinding* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDatabinding_Invoke(IHTMLDatabinding* 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);
}
/*** IHTMLDatabinding methods ***/
static FORCEINLINE HRESULT IHTMLDatabinding_put_dataFld(IHTMLDatabinding* This,BSTR v) {
    return This->lpVtbl->put_dataFld(This,v);
}
static FORCEINLINE HRESULT IHTMLDatabinding_get_dataFld(IHTMLDatabinding* This,BSTR *p) {
    return This->lpVtbl->get_dataFld(This,p);
}
static FORCEINLINE HRESULT IHTMLDatabinding_put_dataSrc(IHTMLDatabinding* This,BSTR v) {
    return This->lpVtbl->put_dataSrc(This,v);
}
static FORCEINLINE HRESULT IHTMLDatabinding_get_dataSrc(IHTMLDatabinding* This,BSTR *p) {
    return This->lpVtbl->get_dataSrc(This,p);
}
static FORCEINLINE HRESULT IHTMLDatabinding_put_dataFormatAs(IHTMLDatabinding* This,BSTR v) {
    return This->lpVtbl->put_dataFormatAs(This,v);
}
static FORCEINLINE HRESULT IHTMLDatabinding_get_dataFormatAs(IHTMLDatabinding* This,BSTR *p) {
    return This->lpVtbl->get_dataFormatAs(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDatabinding_put_dataFld_Proxy(
    IHTMLDatabinding* This,
    BSTR v);
void __RPC_STUB IHTMLDatabinding_put_dataFld_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDatabinding_get_dataFld_Proxy(
    IHTMLDatabinding* This,
    BSTR *p);
void __RPC_STUB IHTMLDatabinding_get_dataFld_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDatabinding_put_dataSrc_Proxy(
    IHTMLDatabinding* This,
    BSTR v);
void __RPC_STUB IHTMLDatabinding_put_dataSrc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDatabinding_get_dataSrc_Proxy(
    IHTMLDatabinding* This,
    BSTR *p);
void __RPC_STUB IHTMLDatabinding_get_dataSrc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDatabinding_put_dataFormatAs_Proxy(
    IHTMLDatabinding* This,
    BSTR v);
void __RPC_STUB IHTMLDatabinding_put_dataFormatAs_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDatabinding_get_dataFormatAs_Proxy(
    IHTMLDatabinding* This,
    BSTR *p);
void __RPC_STUB IHTMLDatabinding_get_dataFormatAs_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDatabinding_INTERFACE_DEFINED__ */

#ifndef __IHTMLDocument_FWD_DEFINED__
#define __IHTMLDocument_FWD_DEFINED__
typedef interface IHTMLDocument IHTMLDocument;
#endif

/*****************************************************************************
 * IHTMLElementDefaults interface
 */
#ifndef __IHTMLElementDefaults_INTERFACE_DEFINED__
#define __IHTMLElementDefaults_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLElementDefaults, 0x3050f6c9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f6c9-98b5-11cf-bb82-00aa00bdce0b")
IHTMLElementDefaults : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_style(
        IHTMLStyle **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_tabStop(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_tabStop(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_viewInheritStyle(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_viewInheritStyle(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_viewMasterTab(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_viewMasterTab(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollSegmentX(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollSegmentX(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollSegmentY(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollSegmentY(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_isMultiLine(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_isMultiLine(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_contentEditable(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_contentEditable(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_canHaveHTML(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_canHaveHTML(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_viewLink(
        IHTMLDocument *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_viewLink(
        IHTMLDocument **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_frozen(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_frozen(
        VARIANT_BOOL *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLElementDefaults, 0x3050f6c9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLElementDefaultsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLElementDefaults methods ***/
    HRESULT (STDMETHODCALLTYPE *get_style)(
        IHTMLElementDefaults* This,
        IHTMLStyle **p);

    HRESULT (STDMETHODCALLTYPE *put_tabStop)(
        IHTMLElementDefaults* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_tabStop)(
        IHTMLElementDefaults* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_viewInheritStyle)(
        IHTMLElementDefaults* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_viewInheritStyle)(
        IHTMLElementDefaults* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_viewMasterTab)(
        IHTMLElementDefaults* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_viewMasterTab)(
        IHTMLElementDefaults* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollSegmentX)(
        IHTMLElementDefaults* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_scrollSegmentX)(
        IHTMLElementDefaults* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollSegmentY)(
        IHTMLElementDefaults* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_scrollSegmentY)(
        IHTMLElementDefaults* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_isMultiLine)(
        IHTMLElementDefaults* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_isMultiLine)(
        IHTMLElementDefaults* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_contentEditable)(
        IHTMLElementDefaults* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_contentEditable)(
        IHTMLElementDefaults* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_canHaveHTML)(
        IHTMLElementDefaults* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_canHaveHTML)(
        IHTMLElementDefaults* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *putref_viewLink)(
        IHTMLElementDefaults* This,
        IHTMLDocument *v);

    HRESULT (STDMETHODCALLTYPE *get_viewLink)(
        IHTMLElementDefaults* This,
        IHTMLDocument **p);

    HRESULT (STDMETHODCALLTYPE *put_frozen)(
        IHTMLElementDefaults* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_frozen)(
        IHTMLElementDefaults* This,
        VARIANT_BOOL *p);

    END_INTERFACE
} IHTMLElementDefaultsVtbl;
interface IHTMLElementDefaults {
    CONST_VTBL IHTMLElementDefaultsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLElementDefaults_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLElementDefaults_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLElementDefaults_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLElementDefaults_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLElementDefaults_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLElementDefaults_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLElementDefaults_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLElementDefaults methods ***/
#define IHTMLElementDefaults_get_style(This,p) (This)->lpVtbl->get_style(This,p)
#define IHTMLElementDefaults_put_tabStop(This,v) (This)->lpVtbl->put_tabStop(This,v)
#define IHTMLElementDefaults_get_tabStop(This,p) (This)->lpVtbl->get_tabStop(This,p)
#define IHTMLElementDefaults_put_viewInheritStyle(This,v) (This)->lpVtbl->put_viewInheritStyle(This,v)
#define IHTMLElementDefaults_get_viewInheritStyle(This,p) (This)->lpVtbl->get_viewInheritStyle(This,p)
#define IHTMLElementDefaults_put_viewMasterTab(This,v) (This)->lpVtbl->put_viewMasterTab(This,v)
#define IHTMLElementDefaults_get_viewMasterTab(This,p) (This)->lpVtbl->get_viewMasterTab(This,p)
#define IHTMLElementDefaults_put_scrollSegmentX(This,v) (This)->lpVtbl->put_scrollSegmentX(This,v)
#define IHTMLElementDefaults_get_scrollSegmentX(This,p) (This)->lpVtbl->get_scrollSegmentX(This,p)
#define IHTMLElementDefaults_put_scrollSegmentY(This,v) (This)->lpVtbl->put_scrollSegmentY(This,v)
#define IHTMLElementDefaults_get_scrollSegmentY(This,p) (This)->lpVtbl->get_scrollSegmentY(This,p)
#define IHTMLElementDefaults_put_isMultiLine(This,v) (This)->lpVtbl->put_isMultiLine(This,v)
#define IHTMLElementDefaults_get_isMultiLine(This,p) (This)->lpVtbl->get_isMultiLine(This,p)
#define IHTMLElementDefaults_put_contentEditable(This,v) (This)->lpVtbl->put_contentEditable(This,v)
#define IHTMLElementDefaults_get_contentEditable(This,p) (This)->lpVtbl->get_contentEditable(This,p)
#define IHTMLElementDefaults_put_canHaveHTML(This,v) (This)->lpVtbl->put_canHaveHTML(This,v)
#define IHTMLElementDefaults_get_canHaveHTML(This,p) (This)->lpVtbl->get_canHaveHTML(This,p)
#define IHTMLElementDefaults_putref_viewLink(This,v) (This)->lpVtbl->putref_viewLink(This,v)
#define IHTMLElementDefaults_get_viewLink(This,p) (This)->lpVtbl->get_viewLink(This,p)
#define IHTMLElementDefaults_put_frozen(This,v) (This)->lpVtbl->put_frozen(This,v)
#define IHTMLElementDefaults_get_frozen(This,p) (This)->lpVtbl->get_frozen(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLElementDefaults_QueryInterface(IHTMLElementDefaults* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLElementDefaults_AddRef(IHTMLElementDefaults* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLElementDefaults_Release(IHTMLElementDefaults* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLElementDefaults_GetTypeInfoCount(IHTMLElementDefaults* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLElementDefaults_GetTypeInfo(IHTMLElementDefaults* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLElementDefaults_GetIDsOfNames(IHTMLElementDefaults* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLElementDefaults_Invoke(IHTMLElementDefaults* 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);
}
/*** IHTMLElementDefaults methods ***/
static FORCEINLINE HRESULT IHTMLElementDefaults_get_style(IHTMLElementDefaults* This,IHTMLStyle **p) {
    return This->lpVtbl->get_style(This,p);
}
static FORCEINLINE HRESULT IHTMLElementDefaults_put_tabStop(IHTMLElementDefaults* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_tabStop(This,v);
}
static FORCEINLINE HRESULT IHTMLElementDefaults_get_tabStop(IHTMLElementDefaults* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_tabStop(This,p);
}
static FORCEINLINE HRESULT IHTMLElementDefaults_put_viewInheritStyle(IHTMLElementDefaults* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_viewInheritStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLElementDefaults_get_viewInheritStyle(IHTMLElementDefaults* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_viewInheritStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLElementDefaults_put_viewMasterTab(IHTMLElementDefaults* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_viewMasterTab(This,v);
}
static FORCEINLINE HRESULT IHTMLElementDefaults_get_viewMasterTab(IHTMLElementDefaults* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_viewMasterTab(This,p);
}
static FORCEINLINE HRESULT IHTMLElementDefaults_put_scrollSegmentX(IHTMLElementDefaults* This,LONG v) {
    return This->lpVtbl->put_scrollSegmentX(This,v);
}
static FORCEINLINE HRESULT IHTMLElementDefaults_get_scrollSegmentX(IHTMLElementDefaults* This,LONG *p) {
    return This->lpVtbl->get_scrollSegmentX(This,p);
}
static FORCEINLINE HRESULT IHTMLElementDefaults_put_scrollSegmentY(IHTMLElementDefaults* This,LONG v) {
    return This->lpVtbl->put_scrollSegmentY(This,v);
}
static FORCEINLINE HRESULT IHTMLElementDefaults_get_scrollSegmentY(IHTMLElementDefaults* This,LONG *p) {
    return This->lpVtbl->get_scrollSegmentY(This,p);
}
static FORCEINLINE HRESULT IHTMLElementDefaults_put_isMultiLine(IHTMLElementDefaults* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_isMultiLine(This,v);
}
static FORCEINLINE HRESULT IHTMLElementDefaults_get_isMultiLine(IHTMLElementDefaults* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_isMultiLine(This,p);
}
static FORCEINLINE HRESULT IHTMLElementDefaults_put_contentEditable(IHTMLElementDefaults* This,BSTR v) {
    return This->lpVtbl->put_contentEditable(This,v);
}
static FORCEINLINE HRESULT IHTMLElementDefaults_get_contentEditable(IHTMLElementDefaults* This,BSTR *p) {
    return This->lpVtbl->get_contentEditable(This,p);
}
static FORCEINLINE HRESULT IHTMLElementDefaults_put_canHaveHTML(IHTMLElementDefaults* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_canHaveHTML(This,v);
}
static FORCEINLINE HRESULT IHTMLElementDefaults_get_canHaveHTML(IHTMLElementDefaults* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_canHaveHTML(This,p);
}
static FORCEINLINE HRESULT IHTMLElementDefaults_putref_viewLink(IHTMLElementDefaults* This,IHTMLDocument *v) {
    return This->lpVtbl->putref_viewLink(This,v);
}
static FORCEINLINE HRESULT IHTMLElementDefaults_get_viewLink(IHTMLElementDefaults* This,IHTMLDocument **p) {
    return This->lpVtbl->get_viewLink(This,p);
}
static FORCEINLINE HRESULT IHTMLElementDefaults_put_frozen(IHTMLElementDefaults* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_frozen(This,v);
}
static FORCEINLINE HRESULT IHTMLElementDefaults_get_frozen(IHTMLElementDefaults* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_frozen(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLElementDefaults_get_style_Proxy(
    IHTMLElementDefaults* This,
    IHTMLStyle **p);
void __RPC_STUB IHTMLElementDefaults_get_style_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElementDefaults_put_tabStop_Proxy(
    IHTMLElementDefaults* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLElementDefaults_put_tabStop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElementDefaults_get_tabStop_Proxy(
    IHTMLElementDefaults* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLElementDefaults_get_tabStop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElementDefaults_put_viewInheritStyle_Proxy(
    IHTMLElementDefaults* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLElementDefaults_put_viewInheritStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElementDefaults_get_viewInheritStyle_Proxy(
    IHTMLElementDefaults* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLElementDefaults_get_viewInheritStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElementDefaults_put_viewMasterTab_Proxy(
    IHTMLElementDefaults* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLElementDefaults_put_viewMasterTab_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElementDefaults_get_viewMasterTab_Proxy(
    IHTMLElementDefaults* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLElementDefaults_get_viewMasterTab_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElementDefaults_put_scrollSegmentX_Proxy(
    IHTMLElementDefaults* This,
    LONG v);
void __RPC_STUB IHTMLElementDefaults_put_scrollSegmentX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElementDefaults_get_scrollSegmentX_Proxy(
    IHTMLElementDefaults* This,
    LONG *p);
void __RPC_STUB IHTMLElementDefaults_get_scrollSegmentX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElementDefaults_put_scrollSegmentY_Proxy(
    IHTMLElementDefaults* This,
    LONG v);
void __RPC_STUB IHTMLElementDefaults_put_scrollSegmentY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElementDefaults_get_scrollSegmentY_Proxy(
    IHTMLElementDefaults* This,
    LONG *p);
void __RPC_STUB IHTMLElementDefaults_get_scrollSegmentY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElementDefaults_put_isMultiLine_Proxy(
    IHTMLElementDefaults* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLElementDefaults_put_isMultiLine_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElementDefaults_get_isMultiLine_Proxy(
    IHTMLElementDefaults* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLElementDefaults_get_isMultiLine_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElementDefaults_put_contentEditable_Proxy(
    IHTMLElementDefaults* This,
    BSTR v);
void __RPC_STUB IHTMLElementDefaults_put_contentEditable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElementDefaults_get_contentEditable_Proxy(
    IHTMLElementDefaults* This,
    BSTR *p);
void __RPC_STUB IHTMLElementDefaults_get_contentEditable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElementDefaults_put_canHaveHTML_Proxy(
    IHTMLElementDefaults* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLElementDefaults_put_canHaveHTML_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElementDefaults_get_canHaveHTML_Proxy(
    IHTMLElementDefaults* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLElementDefaults_get_canHaveHTML_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElementDefaults_putref_viewLink_Proxy(
    IHTMLElementDefaults* This,
    IHTMLDocument *v);
void __RPC_STUB IHTMLElementDefaults_putref_viewLink_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElementDefaults_get_viewLink_Proxy(
    IHTMLElementDefaults* This,
    IHTMLDocument **p);
void __RPC_STUB IHTMLElementDefaults_get_viewLink_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElementDefaults_put_frozen_Proxy(
    IHTMLElementDefaults* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLElementDefaults_put_frozen_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElementDefaults_get_frozen_Proxy(
    IHTMLElementDefaults* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLElementDefaults_get_frozen_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLElementDefaults_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLDefaults dispinterface
 */
#ifndef __DispHTMLDefaults_DISPINTERFACE_DEFINED__
#define __DispHTMLDefaults_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLDefaults, 0x3050f58c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f58c-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLDefaults : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLDefaults, 0x3050f58c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLDefaultsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} DispHTMLDefaultsVtbl;
interface DispHTMLDefaults {
    CONST_VTBL DispHTMLDefaultsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLDefaults_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLDefaults_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLDefaults_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLDefaults_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLDefaults_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLDefaults_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLDefaults_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 DispHTMLDefaults_QueryInterface(DispHTMLDefaults* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLDefaults_AddRef(DispHTMLDefaults* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLDefaults_Release(DispHTMLDefaults* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLDefaults_GetTypeInfoCount(DispHTMLDefaults* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLDefaults_GetTypeInfo(DispHTMLDefaults* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLDefaults_GetIDsOfNames(DispHTMLDefaults* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLDefaults_Invoke(DispHTMLDefaults* 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  /* __DispHTMLDefaults_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLDefaults coclass
 */

DEFINE_GUID(CLSID_HTMLDefaults, 0x3050f6c8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f6c8-98b5-11cf-bb82-00aa00bdce0b") HTMLDefaults;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLDefaults, 0x3050f6c8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDefaults;
#ifndef __IHTMLEventObj_FWD_DEFINED__
#define __IHTMLEventObj_FWD_DEFINED__
typedef interface IHTMLEventObj IHTMLEventObj;
#endif

/*****************************************************************************
 * IHTCDefaultDispatch interface
 */
#ifndef __IHTCDefaultDispatch_INTERFACE_DEFINED__
#define __IHTCDefaultDispatch_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTCDefaultDispatch, 0x3050f4fd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f4fd-98b5-11cf-bb82-00aa00bdce0b")
IHTCDefaultDispatch : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_element(
        IHTMLElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE createEventObject(
        IHTMLEventObj **eventObj) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_defaults(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_document(
        IDispatch **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTCDefaultDispatch, 0x3050f4fd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTCDefaultDispatchVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTCDefaultDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *get_element)(
        IHTCDefaultDispatch* This,
        IHTMLElement **p);

    HRESULT (STDMETHODCALLTYPE *createEventObject)(
        IHTCDefaultDispatch* This,
        IHTMLEventObj **eventObj);

    HRESULT (STDMETHODCALLTYPE *get_defaults)(
        IHTCDefaultDispatch* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_document)(
        IHTCDefaultDispatch* This,
        IDispatch **p);

    END_INTERFACE
} IHTCDefaultDispatchVtbl;
interface IHTCDefaultDispatch {
    CONST_VTBL IHTCDefaultDispatchVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTCDefaultDispatch_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTCDefaultDispatch_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTCDefaultDispatch_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTCDefaultDispatch_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTCDefaultDispatch_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTCDefaultDispatch_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTCDefaultDispatch_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTCDefaultDispatch methods ***/
#define IHTCDefaultDispatch_get_element(This,p) (This)->lpVtbl->get_element(This,p)
#define IHTCDefaultDispatch_createEventObject(This,eventObj) (This)->lpVtbl->createEventObject(This,eventObj)
#define IHTCDefaultDispatch_get_defaults(This,p) (This)->lpVtbl->get_defaults(This,p)
#define IHTCDefaultDispatch_get_document(This,p) (This)->lpVtbl->get_document(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTCDefaultDispatch_QueryInterface(IHTCDefaultDispatch* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTCDefaultDispatch_AddRef(IHTCDefaultDispatch* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTCDefaultDispatch_Release(IHTCDefaultDispatch* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTCDefaultDispatch_GetTypeInfoCount(IHTCDefaultDispatch* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTCDefaultDispatch_GetTypeInfo(IHTCDefaultDispatch* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTCDefaultDispatch_GetIDsOfNames(IHTCDefaultDispatch* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTCDefaultDispatch_Invoke(IHTCDefaultDispatch* 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);
}
/*** IHTCDefaultDispatch methods ***/
static FORCEINLINE HRESULT IHTCDefaultDispatch_get_element(IHTCDefaultDispatch* This,IHTMLElement **p) {
    return This->lpVtbl->get_element(This,p);
}
static FORCEINLINE HRESULT IHTCDefaultDispatch_createEventObject(IHTCDefaultDispatch* This,IHTMLEventObj **eventObj) {
    return This->lpVtbl->createEventObject(This,eventObj);
}
static FORCEINLINE HRESULT IHTCDefaultDispatch_get_defaults(IHTCDefaultDispatch* This,IDispatch **p) {
    return This->lpVtbl->get_defaults(This,p);
}
static FORCEINLINE HRESULT IHTCDefaultDispatch_get_document(IHTCDefaultDispatch* This,IDispatch **p) {
    return This->lpVtbl->get_document(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTCDefaultDispatch_get_element_Proxy(
    IHTCDefaultDispatch* This,
    IHTMLElement **p);
void __RPC_STUB IHTCDefaultDispatch_get_element_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTCDefaultDispatch_createEventObject_Proxy(
    IHTCDefaultDispatch* This,
    IHTMLEventObj **eventObj);
void __RPC_STUB IHTCDefaultDispatch_createEventObject_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTCDefaultDispatch_get_defaults_Proxy(
    IHTCDefaultDispatch* This,
    IDispatch **p);
void __RPC_STUB IHTCDefaultDispatch_get_defaults_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTCDefaultDispatch_get_document_Proxy(
    IHTCDefaultDispatch* This,
    IDispatch **p);
void __RPC_STUB IHTCDefaultDispatch_get_document_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTCDefaultDispatch_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTCPropertyBehavior interface
 */
#ifndef __IHTCPropertyBehavior_INTERFACE_DEFINED__
#define __IHTCPropertyBehavior_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTCPropertyBehavior, 0x3050f5df, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f5df-98b5-11cf-bb82-00aa00bdce0b")
IHTCPropertyBehavior : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE fireChange(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_value(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_value(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTCPropertyBehavior, 0x3050f5df, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTCPropertyBehaviorVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTCPropertyBehavior methods ***/
    HRESULT (STDMETHODCALLTYPE *fireChange)(
        IHTCPropertyBehavior* This);

    HRESULT (STDMETHODCALLTYPE *put_value)(
        IHTCPropertyBehavior* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_value)(
        IHTCPropertyBehavior* This,
        VARIANT *p);

    END_INTERFACE
} IHTCPropertyBehaviorVtbl;
interface IHTCPropertyBehavior {
    CONST_VTBL IHTCPropertyBehaviorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTCPropertyBehavior_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTCPropertyBehavior_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTCPropertyBehavior_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTCPropertyBehavior_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTCPropertyBehavior_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTCPropertyBehavior_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTCPropertyBehavior_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTCPropertyBehavior methods ***/
#define IHTCPropertyBehavior_fireChange(This) (This)->lpVtbl->fireChange(This)
#define IHTCPropertyBehavior_put_value(This,v) (This)->lpVtbl->put_value(This,v)
#define IHTCPropertyBehavior_get_value(This,p) (This)->lpVtbl->get_value(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTCPropertyBehavior_QueryInterface(IHTCPropertyBehavior* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTCPropertyBehavior_AddRef(IHTCPropertyBehavior* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTCPropertyBehavior_Release(IHTCPropertyBehavior* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTCPropertyBehavior_GetTypeInfoCount(IHTCPropertyBehavior* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTCPropertyBehavior_GetTypeInfo(IHTCPropertyBehavior* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTCPropertyBehavior_GetIDsOfNames(IHTCPropertyBehavior* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTCPropertyBehavior_Invoke(IHTCPropertyBehavior* 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);
}
/*** IHTCPropertyBehavior methods ***/
static FORCEINLINE HRESULT IHTCPropertyBehavior_fireChange(IHTCPropertyBehavior* This) {
    return This->lpVtbl->fireChange(This);
}
static FORCEINLINE HRESULT IHTCPropertyBehavior_put_value(IHTCPropertyBehavior* This,VARIANT v) {
    return This->lpVtbl->put_value(This,v);
}
static FORCEINLINE HRESULT IHTCPropertyBehavior_get_value(IHTCPropertyBehavior* This,VARIANT *p) {
    return This->lpVtbl->get_value(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTCPropertyBehavior_fireChange_Proxy(
    IHTCPropertyBehavior* This);
void __RPC_STUB IHTCPropertyBehavior_fireChange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTCPropertyBehavior_put_value_Proxy(
    IHTCPropertyBehavior* This,
    VARIANT v);
void __RPC_STUB IHTCPropertyBehavior_put_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTCPropertyBehavior_get_value_Proxy(
    IHTCPropertyBehavior* This,
    VARIANT *p);
void __RPC_STUB IHTCPropertyBehavior_get_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTCPropertyBehavior_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTCMethodBehavior interface
 */
#ifndef __IHTCMethodBehavior_INTERFACE_DEFINED__
#define __IHTCMethodBehavior_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTCMethodBehavior, 0x3050f631, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f631-98b5-11cf-bb82-00aa00bdce0b")
IHTCMethodBehavior : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTCMethodBehavior, 0x3050f631, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTCMethodBehaviorVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} IHTCMethodBehaviorVtbl;
interface IHTCMethodBehavior {
    CONST_VTBL IHTCMethodBehaviorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTCMethodBehavior_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTCMethodBehavior_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTCMethodBehavior_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTCMethodBehavior_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTCMethodBehavior_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTCMethodBehavior_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTCMethodBehavior_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 IHTCMethodBehavior_QueryInterface(IHTCMethodBehavior* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTCMethodBehavior_AddRef(IHTCMethodBehavior* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTCMethodBehavior_Release(IHTCMethodBehavior* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTCMethodBehavior_GetTypeInfoCount(IHTCMethodBehavior* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTCMethodBehavior_GetTypeInfo(IHTCMethodBehavior* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTCMethodBehavior_GetIDsOfNames(IHTCMethodBehavior* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTCMethodBehavior_Invoke(IHTCMethodBehavior* 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  /* __IHTCMethodBehavior_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTCEventBehavior interface
 */
#ifndef __IHTCEventBehavior_INTERFACE_DEFINED__
#define __IHTCEventBehavior_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTCEventBehavior, 0x3050f4ff, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f4ff-98b5-11cf-bb82-00aa00bdce0b")
IHTCEventBehavior : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE fire(
        IHTMLEventObj *pvar) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTCEventBehavior, 0x3050f4ff, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTCEventBehaviorVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTCEventBehavior methods ***/
    HRESULT (STDMETHODCALLTYPE *fire)(
        IHTCEventBehavior* This,
        IHTMLEventObj *pvar);

    END_INTERFACE
} IHTCEventBehaviorVtbl;
interface IHTCEventBehavior {
    CONST_VTBL IHTCEventBehaviorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTCEventBehavior_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTCEventBehavior_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTCEventBehavior_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTCEventBehavior_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTCEventBehavior_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTCEventBehavior_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTCEventBehavior_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTCEventBehavior methods ***/
#define IHTCEventBehavior_fire(This,pvar) (This)->lpVtbl->fire(This,pvar)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTCEventBehavior_QueryInterface(IHTCEventBehavior* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTCEventBehavior_AddRef(IHTCEventBehavior* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTCEventBehavior_Release(IHTCEventBehavior* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTCEventBehavior_GetTypeInfoCount(IHTCEventBehavior* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTCEventBehavior_GetTypeInfo(IHTCEventBehavior* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTCEventBehavior_GetIDsOfNames(IHTCEventBehavior* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTCEventBehavior_Invoke(IHTCEventBehavior* 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);
}
/*** IHTCEventBehavior methods ***/
static FORCEINLINE HRESULT IHTCEventBehavior_fire(IHTCEventBehavior* This,IHTMLEventObj *pvar) {
    return This->lpVtbl->fire(This,pvar);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTCEventBehavior_fire_Proxy(
    IHTCEventBehavior* This,
    IHTMLEventObj *pvar);
void __RPC_STUB IHTCEventBehavior_fire_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTCEventBehavior_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTCAttachBehavior interface
 */
#ifndef __IHTCAttachBehavior_INTERFACE_DEFINED__
#define __IHTCAttachBehavior_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTCAttachBehavior, 0x3050f5f4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f5f4-98b5-11cf-bb82-00aa00bdce0b")
IHTCAttachBehavior : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE fireEvent(
        IDispatch *evt) = 0;

    virtual HRESULT STDMETHODCALLTYPE detachEvent(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTCAttachBehavior, 0x3050f5f4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTCAttachBehaviorVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTCAttachBehavior methods ***/
    HRESULT (STDMETHODCALLTYPE *fireEvent)(
        IHTCAttachBehavior* This,
        IDispatch *evt);

    HRESULT (STDMETHODCALLTYPE *detachEvent)(
        IHTCAttachBehavior* This);

    END_INTERFACE
} IHTCAttachBehaviorVtbl;
interface IHTCAttachBehavior {
    CONST_VTBL IHTCAttachBehaviorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTCAttachBehavior_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTCAttachBehavior_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTCAttachBehavior_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTCAttachBehavior_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTCAttachBehavior_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTCAttachBehavior_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTCAttachBehavior_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTCAttachBehavior methods ***/
#define IHTCAttachBehavior_fireEvent(This,evt) (This)->lpVtbl->fireEvent(This,evt)
#define IHTCAttachBehavior_detachEvent(This) (This)->lpVtbl->detachEvent(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTCAttachBehavior_QueryInterface(IHTCAttachBehavior* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTCAttachBehavior_AddRef(IHTCAttachBehavior* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTCAttachBehavior_Release(IHTCAttachBehavior* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTCAttachBehavior_GetTypeInfoCount(IHTCAttachBehavior* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTCAttachBehavior_GetTypeInfo(IHTCAttachBehavior* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTCAttachBehavior_GetIDsOfNames(IHTCAttachBehavior* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTCAttachBehavior_Invoke(IHTCAttachBehavior* 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);
}
/*** IHTCAttachBehavior methods ***/
static FORCEINLINE HRESULT IHTCAttachBehavior_fireEvent(IHTCAttachBehavior* This,IDispatch *evt) {
    return This->lpVtbl->fireEvent(This,evt);
}
static FORCEINLINE HRESULT IHTCAttachBehavior_detachEvent(IHTCAttachBehavior* This) {
    return This->lpVtbl->detachEvent(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTCAttachBehavior_fireEvent_Proxy(
    IHTCAttachBehavior* This,
    IDispatch *evt);
void __RPC_STUB IHTCAttachBehavior_fireEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTCAttachBehavior_detachEvent_Proxy(
    IHTCAttachBehavior* This);
void __RPC_STUB IHTCAttachBehavior_detachEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTCAttachBehavior_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTCAttachBehavior2 interface
 */
#ifndef __IHTCAttachBehavior2_INTERFACE_DEFINED__
#define __IHTCAttachBehavior2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTCAttachBehavior2, 0x3050f7eb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f7eb-98b5-11cf-bb82-00aa00bdce0b")
IHTCAttachBehavior2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE fireEvent(
        VARIANT evt) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTCAttachBehavior2, 0x3050f7eb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTCAttachBehavior2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTCAttachBehavior2 methods ***/
    HRESULT (STDMETHODCALLTYPE *fireEvent)(
        IHTCAttachBehavior2* This,
        VARIANT evt);

    END_INTERFACE
} IHTCAttachBehavior2Vtbl;
interface IHTCAttachBehavior2 {
    CONST_VTBL IHTCAttachBehavior2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTCAttachBehavior2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTCAttachBehavior2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTCAttachBehavior2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTCAttachBehavior2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTCAttachBehavior2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTCAttachBehavior2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTCAttachBehavior2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTCAttachBehavior2 methods ***/
#define IHTCAttachBehavior2_fireEvent(This,evt) (This)->lpVtbl->fireEvent(This,evt)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTCAttachBehavior2_QueryInterface(IHTCAttachBehavior2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTCAttachBehavior2_AddRef(IHTCAttachBehavior2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTCAttachBehavior2_Release(IHTCAttachBehavior2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTCAttachBehavior2_GetTypeInfoCount(IHTCAttachBehavior2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTCAttachBehavior2_GetTypeInfo(IHTCAttachBehavior2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTCAttachBehavior2_GetIDsOfNames(IHTCAttachBehavior2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTCAttachBehavior2_Invoke(IHTCAttachBehavior2* 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);
}
/*** IHTCAttachBehavior2 methods ***/
static FORCEINLINE HRESULT IHTCAttachBehavior2_fireEvent(IHTCAttachBehavior2* This,VARIANT evt) {
    return This->lpVtbl->fireEvent(This,evt);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTCAttachBehavior2_fireEvent_Proxy(
    IHTCAttachBehavior2* This,
    VARIANT evt);
void __RPC_STUB IHTCAttachBehavior2_fireEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTCAttachBehavior2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTCDescBehavior interface
 */
#ifndef __IHTCDescBehavior_INTERFACE_DEFINED__
#define __IHTCDescBehavior_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTCDescBehavior, 0x3050f5dc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f5dc-98b5-11cf-bb82-00aa00bdce0b")
IHTCDescBehavior : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_urn(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTCDescBehavior, 0x3050f5dc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTCDescBehaviorVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTCDescBehavior methods ***/
    HRESULT (STDMETHODCALLTYPE *get_urn)(
        IHTCDescBehavior* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_name)(
        IHTCDescBehavior* This,
        BSTR *p);

    END_INTERFACE
} IHTCDescBehaviorVtbl;
interface IHTCDescBehavior {
    CONST_VTBL IHTCDescBehaviorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTCDescBehavior_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTCDescBehavior_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTCDescBehavior_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTCDescBehavior_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTCDescBehavior_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTCDescBehavior_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTCDescBehavior_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTCDescBehavior methods ***/
#define IHTCDescBehavior_get_urn(This,p) (This)->lpVtbl->get_urn(This,p)
#define IHTCDescBehavior_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTCDescBehavior_QueryInterface(IHTCDescBehavior* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTCDescBehavior_AddRef(IHTCDescBehavior* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTCDescBehavior_Release(IHTCDescBehavior* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTCDescBehavior_GetTypeInfoCount(IHTCDescBehavior* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTCDescBehavior_GetTypeInfo(IHTCDescBehavior* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTCDescBehavior_GetIDsOfNames(IHTCDescBehavior* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTCDescBehavior_Invoke(IHTCDescBehavior* 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);
}
/*** IHTCDescBehavior methods ***/
static FORCEINLINE HRESULT IHTCDescBehavior_get_urn(IHTCDescBehavior* This,BSTR *p) {
    return This->lpVtbl->get_urn(This,p);
}
static FORCEINLINE HRESULT IHTCDescBehavior_get_name(IHTCDescBehavior* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTCDescBehavior_get_urn_Proxy(
    IHTCDescBehavior* This,
    BSTR *p);
void __RPC_STUB IHTCDescBehavior_get_urn_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTCDescBehavior_get_name_Proxy(
    IHTCDescBehavior* This,
    BSTR *p);
void __RPC_STUB IHTCDescBehavior_get_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTCDescBehavior_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTCDefaultDispatch dispinterface
 */
#ifndef __DispHTCDefaultDispatch_DISPINTERFACE_DEFINED__
#define __DispHTCDefaultDispatch_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTCDefaultDispatch, 0x3050f573, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f573-98b5-11cf-bb82-00aa00bdce0b")
DispHTCDefaultDispatch : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTCDefaultDispatch, 0x3050f573, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTCDefaultDispatchVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} DispHTCDefaultDispatchVtbl;
interface DispHTCDefaultDispatch {
    CONST_VTBL DispHTCDefaultDispatchVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTCDefaultDispatch_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTCDefaultDispatch_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTCDefaultDispatch_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTCDefaultDispatch_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTCDefaultDispatch_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTCDefaultDispatch_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTCDefaultDispatch_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 DispHTCDefaultDispatch_QueryInterface(DispHTCDefaultDispatch* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTCDefaultDispatch_AddRef(DispHTCDefaultDispatch* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTCDefaultDispatch_Release(DispHTCDefaultDispatch* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTCDefaultDispatch_GetTypeInfoCount(DispHTCDefaultDispatch* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTCDefaultDispatch_GetTypeInfo(DispHTCDefaultDispatch* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTCDefaultDispatch_GetIDsOfNames(DispHTCDefaultDispatch* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTCDefaultDispatch_Invoke(DispHTCDefaultDispatch* 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  /* __DispHTCDefaultDispatch_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTCDefaultDispatch coclass
 */

DEFINE_GUID(CLSID_HTCDefaultDispatch, 0x3050f4fc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f4fc-98b5-11cf-bb82-00aa00bdce0b") HTCDefaultDispatch;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTCDefaultDispatch, 0x3050f4fc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CHtmlComponentDD;
/*****************************************************************************
 * DispHTCPropertyBehavior dispinterface
 */
#ifndef __DispHTCPropertyBehavior_DISPINTERFACE_DEFINED__
#define __DispHTCPropertyBehavior_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTCPropertyBehavior, 0x3050f57f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f57f-98b5-11cf-bb82-00aa00bdce0b")
DispHTCPropertyBehavior : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTCPropertyBehavior, 0x3050f57f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTCPropertyBehaviorVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} DispHTCPropertyBehaviorVtbl;
interface DispHTCPropertyBehavior {
    CONST_VTBL DispHTCPropertyBehaviorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTCPropertyBehavior_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTCPropertyBehavior_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTCPropertyBehavior_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTCPropertyBehavior_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTCPropertyBehavior_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTCPropertyBehavior_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTCPropertyBehavior_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 DispHTCPropertyBehavior_QueryInterface(DispHTCPropertyBehavior* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTCPropertyBehavior_AddRef(DispHTCPropertyBehavior* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTCPropertyBehavior_Release(DispHTCPropertyBehavior* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTCPropertyBehavior_GetTypeInfoCount(DispHTCPropertyBehavior* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTCPropertyBehavior_GetTypeInfo(DispHTCPropertyBehavior* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTCPropertyBehavior_GetIDsOfNames(DispHTCPropertyBehavior* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTCPropertyBehavior_Invoke(DispHTCPropertyBehavior* 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  /* __DispHTCPropertyBehavior_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTCPropertyBehavior coclass
 */

DEFINE_GUID(CLSID_HTCPropertyBehavior, 0x3050f5de, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f5de-98b5-11cf-bb82-00aa00bdce0b") HTCPropertyBehavior;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTCPropertyBehavior, 0x3050f5de, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CHtmlComponentProperty;
/*****************************************************************************
 * DispHTCMethodBehavior dispinterface
 */
#ifndef __DispHTCMethodBehavior_DISPINTERFACE_DEFINED__
#define __DispHTCMethodBehavior_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTCMethodBehavior, 0x3050f587, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f587-98b5-11cf-bb82-00aa00bdce0b")
DispHTCMethodBehavior : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTCMethodBehavior, 0x3050f587, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTCMethodBehaviorVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} DispHTCMethodBehaviorVtbl;
interface DispHTCMethodBehavior {
    CONST_VTBL DispHTCMethodBehaviorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTCMethodBehavior_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTCMethodBehavior_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTCMethodBehavior_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTCMethodBehavior_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTCMethodBehavior_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTCMethodBehavior_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTCMethodBehavior_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 DispHTCMethodBehavior_QueryInterface(DispHTCMethodBehavior* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTCMethodBehavior_AddRef(DispHTCMethodBehavior* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTCMethodBehavior_Release(DispHTCMethodBehavior* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTCMethodBehavior_GetTypeInfoCount(DispHTCMethodBehavior* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTCMethodBehavior_GetTypeInfo(DispHTCMethodBehavior* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTCMethodBehavior_GetIDsOfNames(DispHTCMethodBehavior* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTCMethodBehavior_Invoke(DispHTCMethodBehavior* 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  /* __DispHTCMethodBehavior_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTCMethodBehavior coclass
 */

DEFINE_GUID(CLSID_HTCMethodBehavior, 0x3050f630, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f630-98b5-11cf-bb82-00aa00bdce0b") HTCMethodBehavior;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTCMethodBehavior, 0x3050f630, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CHtmlComponentMethod;
/*****************************************************************************
 * DispHTCEventBehavior dispinterface
 */
#ifndef __DispHTCEventBehavior_DISPINTERFACE_DEFINED__
#define __DispHTCEventBehavior_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTCEventBehavior, 0x3050f574, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f574-98b5-11cf-bb82-00aa00bdce0b")
DispHTCEventBehavior : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTCEventBehavior, 0x3050f574, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTCEventBehaviorVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} DispHTCEventBehaviorVtbl;
interface DispHTCEventBehavior {
    CONST_VTBL DispHTCEventBehaviorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTCEventBehavior_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTCEventBehavior_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTCEventBehavior_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTCEventBehavior_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTCEventBehavior_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTCEventBehavior_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTCEventBehavior_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 DispHTCEventBehavior_QueryInterface(DispHTCEventBehavior* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTCEventBehavior_AddRef(DispHTCEventBehavior* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTCEventBehavior_Release(DispHTCEventBehavior* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTCEventBehavior_GetTypeInfoCount(DispHTCEventBehavior* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTCEventBehavior_GetTypeInfo(DispHTCEventBehavior* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTCEventBehavior_GetIDsOfNames(DispHTCEventBehavior* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTCEventBehavior_Invoke(DispHTCEventBehavior* 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  /* __DispHTCEventBehavior_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTCEventBehavior coclass
 */

DEFINE_GUID(CLSID_HTCEventBehavior, 0x3050f4fe, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f4fe-98b5-11cf-bb82-00aa00bdce0b") HTCEventBehavior;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTCEventBehavior, 0x3050f4fe, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CHtmlComponentEvent;
/*****************************************************************************
 * DispHTCAttachBehavior dispinterface
 */
#ifndef __DispHTCAttachBehavior_DISPINTERFACE_DEFINED__
#define __DispHTCAttachBehavior_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTCAttachBehavior, 0x3050f583, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f583-98b5-11cf-bb82-00aa00bdce0b")
DispHTCAttachBehavior : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTCAttachBehavior, 0x3050f583, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTCAttachBehaviorVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} DispHTCAttachBehaviorVtbl;
interface DispHTCAttachBehavior {
    CONST_VTBL DispHTCAttachBehaviorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTCAttachBehavior_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTCAttachBehavior_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTCAttachBehavior_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTCAttachBehavior_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTCAttachBehavior_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTCAttachBehavior_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTCAttachBehavior_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 DispHTCAttachBehavior_QueryInterface(DispHTCAttachBehavior* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTCAttachBehavior_AddRef(DispHTCAttachBehavior* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTCAttachBehavior_Release(DispHTCAttachBehavior* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTCAttachBehavior_GetTypeInfoCount(DispHTCAttachBehavior* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTCAttachBehavior_GetTypeInfo(DispHTCAttachBehavior* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTCAttachBehavior_GetIDsOfNames(DispHTCAttachBehavior* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTCAttachBehavior_Invoke(DispHTCAttachBehavior* 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  /* __DispHTCAttachBehavior_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTCAttachBehavior coclass
 */

DEFINE_GUID(CLSID_HTCAttachBehavior, 0x3050f5f5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f5f5-98b5-11cf-bb82-00aa00bdce0b") HTCAttachBehavior;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTCAttachBehavior, 0x3050f5f5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CHtmlComponentAttach;
/*****************************************************************************
 * DispHTCDescBehavior dispinterface
 */
#ifndef __DispHTCDescBehavior_DISPINTERFACE_DEFINED__
#define __DispHTCDescBehavior_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTCDescBehavior, 0x3050f57e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f57e-98b5-11cf-bb82-00aa00bdce0b")
DispHTCDescBehavior : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTCDescBehavior, 0x3050f57e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTCDescBehaviorVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} DispHTCDescBehaviorVtbl;
interface DispHTCDescBehavior {
    CONST_VTBL DispHTCDescBehaviorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTCDescBehavior_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTCDescBehavior_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTCDescBehavior_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTCDescBehavior_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTCDescBehavior_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTCDescBehavior_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTCDescBehavior_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 DispHTCDescBehavior_QueryInterface(DispHTCDescBehavior* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTCDescBehavior_AddRef(DispHTCDescBehavior* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTCDescBehavior_Release(DispHTCDescBehavior* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTCDescBehavior_GetTypeInfoCount(DispHTCDescBehavior* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTCDescBehavior_GetTypeInfo(DispHTCDescBehavior* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTCDescBehavior_GetIDsOfNames(DispHTCDescBehavior* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTCDescBehavior_Invoke(DispHTCDescBehavior* 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  /* __DispHTCDescBehavior_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTCDescBehavior coclass
 */

DEFINE_GUID(CLSID_HTCDescBehavior, 0x3050f5dd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f5dd-98b5-11cf-bb82-00aa00bdce0b") HTCDescBehavior;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTCDescBehavior, 0x3050f5dd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CHtmlComponentDesc;
/*****************************************************************************
 * IHTMLUrnCollection interface
 */
#ifndef __IHTMLUrnCollection_INTERFACE_DEFINED__
#define __IHTMLUrnCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLUrnCollection, 0x3050f5e2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f5e2-98b5-11cf-bb82-00aa00bdce0b")
IHTMLUrnCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE item(
        LONG index,
        BSTR *ppUrn) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLUrnCollection, 0x3050f5e2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLUrnCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLUrnCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLUrnCollection* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLUrnCollection* This,
        LONG index,
        BSTR *ppUrn);

    END_INTERFACE
} IHTMLUrnCollectionVtbl;
interface IHTMLUrnCollection {
    CONST_VTBL IHTMLUrnCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLUrnCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLUrnCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLUrnCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLUrnCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLUrnCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLUrnCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLUrnCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLUrnCollection methods ***/
#define IHTMLUrnCollection_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLUrnCollection_item(This,index,ppUrn) (This)->lpVtbl->item(This,index,ppUrn)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLUrnCollection_QueryInterface(IHTMLUrnCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLUrnCollection_AddRef(IHTMLUrnCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLUrnCollection_Release(IHTMLUrnCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLUrnCollection_GetTypeInfoCount(IHTMLUrnCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLUrnCollection_GetTypeInfo(IHTMLUrnCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLUrnCollection_GetIDsOfNames(IHTMLUrnCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLUrnCollection_Invoke(IHTMLUrnCollection* 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);
}
/*** IHTMLUrnCollection methods ***/
static FORCEINLINE HRESULT IHTMLUrnCollection_get_length(IHTMLUrnCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IHTMLUrnCollection_item(IHTMLUrnCollection* This,LONG index,BSTR *ppUrn) {
    return This->lpVtbl->item(This,index,ppUrn);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLUrnCollection_get_length_Proxy(
    IHTMLUrnCollection* This,
    LONG *p);
void __RPC_STUB IHTMLUrnCollection_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLUrnCollection_item_Proxy(
    IHTMLUrnCollection* This,
    LONG index,
    BSTR *ppUrn);
void __RPC_STUB IHTMLUrnCollection_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLUrnCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLUrnCollection dispinterface
 */
#ifndef __DispHTMLUrnCollection_DISPINTERFACE_DEFINED__
#define __DispHTMLUrnCollection_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLUrnCollection, 0x3050f551, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f551-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLUrnCollection : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLUrnCollection, 0x3050f551, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLUrnCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} DispHTMLUrnCollectionVtbl;
interface DispHTMLUrnCollection {
    CONST_VTBL DispHTMLUrnCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLUrnCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLUrnCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLUrnCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLUrnCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLUrnCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLUrnCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLUrnCollection_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 DispHTMLUrnCollection_QueryInterface(DispHTMLUrnCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLUrnCollection_AddRef(DispHTMLUrnCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLUrnCollection_Release(DispHTMLUrnCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLUrnCollection_GetTypeInfoCount(DispHTMLUrnCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLUrnCollection_GetTypeInfo(DispHTMLUrnCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLUrnCollection_GetIDsOfNames(DispHTMLUrnCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLUrnCollection_Invoke(DispHTMLUrnCollection* 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  /* __DispHTMLUrnCollection_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLUrnCollection coclass
 */

DEFINE_GUID(CLSID_HTMLUrnCollection, 0x3050f580, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f580-98b5-11cf-bb82-00aa00bdce0b") HTMLUrnCollection;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLUrnCollection, 0x3050f580, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CPeerUrnCollection;
/*****************************************************************************
 * IHTMLGenericElement interface
 */
#ifndef __IHTMLGenericElement_INTERFACE_DEFINED__
#define __IHTMLGenericElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLGenericElement, 0x3050f4b7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f4b7-98b5-11cf-bb82-00aa00bdce0b")
IHTMLGenericElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_recordset(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE namedRecordset(
        BSTR dataMember,
        VARIANT *hierarchy,
        IDispatch **ppRecordset) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLGenericElement, 0x3050f4b7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLGenericElementVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLGenericElement methods ***/
    HRESULT (STDMETHODCALLTYPE *get_recordset)(
        IHTMLGenericElement* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *namedRecordset)(
        IHTMLGenericElement* This,
        BSTR dataMember,
        VARIANT *hierarchy,
        IDispatch **ppRecordset);

    END_INTERFACE
} IHTMLGenericElementVtbl;
interface IHTMLGenericElement {
    CONST_VTBL IHTMLGenericElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLGenericElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLGenericElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLGenericElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLGenericElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLGenericElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLGenericElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLGenericElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLGenericElement methods ***/
#define IHTMLGenericElement_get_recordset(This,p) (This)->lpVtbl->get_recordset(This,p)
#define IHTMLGenericElement_namedRecordset(This,dataMember,hierarchy,ppRecordset) (This)->lpVtbl->namedRecordset(This,dataMember,hierarchy,ppRecordset)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLGenericElement_QueryInterface(IHTMLGenericElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLGenericElement_AddRef(IHTMLGenericElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLGenericElement_Release(IHTMLGenericElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLGenericElement_GetTypeInfoCount(IHTMLGenericElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLGenericElement_GetTypeInfo(IHTMLGenericElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLGenericElement_GetIDsOfNames(IHTMLGenericElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLGenericElement_Invoke(IHTMLGenericElement* 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);
}
/*** IHTMLGenericElement methods ***/
static FORCEINLINE HRESULT IHTMLGenericElement_get_recordset(IHTMLGenericElement* This,IDispatch **p) {
    return This->lpVtbl->get_recordset(This,p);
}
static FORCEINLINE HRESULT IHTMLGenericElement_namedRecordset(IHTMLGenericElement* This,BSTR dataMember,VARIANT *hierarchy,IDispatch **ppRecordset) {
    return This->lpVtbl->namedRecordset(This,dataMember,hierarchy,ppRecordset);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLGenericElement_get_recordset_Proxy(
    IHTMLGenericElement* This,
    IDispatch **p);
void __RPC_STUB IHTMLGenericElement_get_recordset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLGenericElement_namedRecordset_Proxy(
    IHTMLGenericElement* This,
    BSTR dataMember,
    VARIANT *hierarchy,
    IDispatch **ppRecordset);
void __RPC_STUB IHTMLGenericElement_namedRecordset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLGenericElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLGenericElement dispinterface
 */
#ifndef __DispHTMLGenericElement_DISPINTERFACE_DEFINED__
#define __DispHTMLGenericElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLGenericElement, 0x3050f563, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f563-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLGenericElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLGenericElement, 0x3050f563, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLGenericElementVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} DispHTMLGenericElementVtbl;
interface DispHTMLGenericElement {
    CONST_VTBL DispHTMLGenericElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLGenericElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLGenericElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLGenericElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLGenericElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLGenericElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLGenericElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLGenericElement_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 DispHTMLGenericElement_QueryInterface(DispHTMLGenericElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLGenericElement_AddRef(DispHTMLGenericElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLGenericElement_Release(DispHTMLGenericElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLGenericElement_GetTypeInfoCount(DispHTMLGenericElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLGenericElement_GetTypeInfo(DispHTMLGenericElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLGenericElement_GetIDsOfNames(DispHTMLGenericElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLGenericElement_Invoke(DispHTMLGenericElement* 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  /* __DispHTMLGenericElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLGenericElement coclass
 */

DEFINE_GUID(CLSID_HTMLGenericElement, 0x3050f4b8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f4b8-98b5-11cf-bb82-00aa00bdce0b") HTMLGenericElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLGenericElement, 0x3050f4b8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CGenericElement;
/*****************************************************************************
 * IHTMLStyleSheetRule interface
 */
#ifndef __IHTMLStyleSheetRule_INTERFACE_DEFINED__
#define __IHTMLStyleSheetRule_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLStyleSheetRule, 0x3050f357, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f357-98b5-11cf-bb82-00aa00bdce0b")
IHTMLStyleSheetRule : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_selectorText(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_selectorText(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_style(
        IHTMLRuleStyle **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_readOnly(
        VARIANT_BOOL *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLStyleSheetRule, 0x3050f357, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLStyleSheetRuleVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLStyleSheetRule methods ***/
    HRESULT (STDMETHODCALLTYPE *put_selectorText)(
        IHTMLStyleSheetRule* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_selectorText)(
        IHTMLStyleSheetRule* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_style)(
        IHTMLStyleSheetRule* This,
        IHTMLRuleStyle **p);

    HRESULT (STDMETHODCALLTYPE *get_readOnly)(
        IHTMLStyleSheetRule* This,
        VARIANT_BOOL *p);

    END_INTERFACE
} IHTMLStyleSheetRuleVtbl;
interface IHTMLStyleSheetRule {
    CONST_VTBL IHTMLStyleSheetRuleVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLStyleSheetRule_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLStyleSheetRule_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLStyleSheetRule_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLStyleSheetRule_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLStyleSheetRule_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLStyleSheetRule_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLStyleSheetRule_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLStyleSheetRule methods ***/
#define IHTMLStyleSheetRule_put_selectorText(This,v) (This)->lpVtbl->put_selectorText(This,v)
#define IHTMLStyleSheetRule_get_selectorText(This,p) (This)->lpVtbl->get_selectorText(This,p)
#define IHTMLStyleSheetRule_get_style(This,p) (This)->lpVtbl->get_style(This,p)
#define IHTMLStyleSheetRule_get_readOnly(This,p) (This)->lpVtbl->get_readOnly(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetRule_QueryInterface(IHTMLStyleSheetRule* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLStyleSheetRule_AddRef(IHTMLStyleSheetRule* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLStyleSheetRule_Release(IHTMLStyleSheetRule* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetRule_GetTypeInfoCount(IHTMLStyleSheetRule* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLStyleSheetRule_GetTypeInfo(IHTMLStyleSheetRule* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLStyleSheetRule_GetIDsOfNames(IHTMLStyleSheetRule* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLStyleSheetRule_Invoke(IHTMLStyleSheetRule* 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);
}
/*** IHTMLStyleSheetRule methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetRule_put_selectorText(IHTMLStyleSheetRule* This,BSTR v) {
    return This->lpVtbl->put_selectorText(This,v);
}
static FORCEINLINE HRESULT IHTMLStyleSheetRule_get_selectorText(IHTMLStyleSheetRule* This,BSTR *p) {
    return This->lpVtbl->get_selectorText(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheetRule_get_style(IHTMLStyleSheetRule* This,IHTMLRuleStyle **p) {
    return This->lpVtbl->get_style(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheetRule_get_readOnly(IHTMLStyleSheetRule* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_readOnly(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLStyleSheetRule_put_selectorText_Proxy(
    IHTMLStyleSheetRule* This,
    BSTR v);
void __RPC_STUB IHTMLStyleSheetRule_put_selectorText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheetRule_get_selectorText_Proxy(
    IHTMLStyleSheetRule* This,
    BSTR *p);
void __RPC_STUB IHTMLStyleSheetRule_get_selectorText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheetRule_get_style_Proxy(
    IHTMLStyleSheetRule* This,
    IHTMLRuleStyle **p);
void __RPC_STUB IHTMLStyleSheetRule_get_style_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheetRule_get_readOnly_Proxy(
    IHTMLStyleSheetRule* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLStyleSheetRule_get_readOnly_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLStyleSheetRule_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLStyleSheetRuleApplied interface
 */
#ifndef __IHTMLStyleSheetRuleApplied_INTERFACE_DEFINED__
#define __IHTMLStyleSheetRuleApplied_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLStyleSheetRuleApplied, 0x305104c1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104c1-98b5-11cf-bb82-00aa00bdce0b")
IHTMLStyleSheetRuleApplied : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_msSpecificity(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE msGetSpecificity(
        LONG index,
        LONG *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLStyleSheetRuleApplied, 0x305104c1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLStyleSheetRuleAppliedVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLStyleSheetRuleApplied methods ***/
    HRESULT (STDMETHODCALLTYPE *get_msSpecificity)(
        IHTMLStyleSheetRuleApplied* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *msGetSpecificity)(
        IHTMLStyleSheetRuleApplied* This,
        LONG index,
        LONG *p);

    END_INTERFACE
} IHTMLStyleSheetRuleAppliedVtbl;
interface IHTMLStyleSheetRuleApplied {
    CONST_VTBL IHTMLStyleSheetRuleAppliedVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLStyleSheetRuleApplied_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLStyleSheetRuleApplied_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLStyleSheetRuleApplied_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLStyleSheetRuleApplied_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLStyleSheetRuleApplied_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLStyleSheetRuleApplied_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLStyleSheetRuleApplied_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLStyleSheetRuleApplied methods ***/
#define IHTMLStyleSheetRuleApplied_get_msSpecificity(This,p) (This)->lpVtbl->get_msSpecificity(This,p)
#define IHTMLStyleSheetRuleApplied_msGetSpecificity(This,index,p) (This)->lpVtbl->msGetSpecificity(This,index,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetRuleApplied_QueryInterface(IHTMLStyleSheetRuleApplied* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLStyleSheetRuleApplied_AddRef(IHTMLStyleSheetRuleApplied* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLStyleSheetRuleApplied_Release(IHTMLStyleSheetRuleApplied* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetRuleApplied_GetTypeInfoCount(IHTMLStyleSheetRuleApplied* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLStyleSheetRuleApplied_GetTypeInfo(IHTMLStyleSheetRuleApplied* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLStyleSheetRuleApplied_GetIDsOfNames(IHTMLStyleSheetRuleApplied* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLStyleSheetRuleApplied_Invoke(IHTMLStyleSheetRuleApplied* 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);
}
/*** IHTMLStyleSheetRuleApplied methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetRuleApplied_get_msSpecificity(IHTMLStyleSheetRuleApplied* This,LONG *p) {
    return This->lpVtbl->get_msSpecificity(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheetRuleApplied_msGetSpecificity(IHTMLStyleSheetRuleApplied* This,LONG index,LONG *p) {
    return This->lpVtbl->msGetSpecificity(This,index,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLStyleSheetRuleApplied_get_msSpecificity_Proxy(
    IHTMLStyleSheetRuleApplied* This,
    LONG *p);
void __RPC_STUB IHTMLStyleSheetRuleApplied_get_msSpecificity_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheetRuleApplied_msGetSpecificity_Proxy(
    IHTMLStyleSheetRuleApplied* This,
    LONG index,
    LONG *p);
void __RPC_STUB IHTMLStyleSheetRuleApplied_msGetSpecificity_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLStyleSheetRuleApplied_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLStyleSheetRule2 interface
 */
#ifndef __IHTMLStyleSheetRule2_INTERFACE_DEFINED__
#define __IHTMLStyleSheetRule2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLStyleSheetRule2, 0x305106fd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106fd-98b5-11cf-bb82-00aa00bdce0b")
IHTMLStyleSheetRule2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_selectorText(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_selectorText(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLStyleSheetRule2, 0x305106fd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLStyleSheetRule2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLStyleSheetRule2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_selectorText)(
        IHTMLStyleSheetRule2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_selectorText)(
        IHTMLStyleSheetRule2* This,
        BSTR *p);

    END_INTERFACE
} IHTMLStyleSheetRule2Vtbl;
interface IHTMLStyleSheetRule2 {
    CONST_VTBL IHTMLStyleSheetRule2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLStyleSheetRule2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLStyleSheetRule2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLStyleSheetRule2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLStyleSheetRule2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLStyleSheetRule2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLStyleSheetRule2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLStyleSheetRule2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLStyleSheetRule2 methods ***/
#define IHTMLStyleSheetRule2_put_selectorText(This,v) (This)->lpVtbl->put_selectorText(This,v)
#define IHTMLStyleSheetRule2_get_selectorText(This,p) (This)->lpVtbl->get_selectorText(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetRule2_QueryInterface(IHTMLStyleSheetRule2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLStyleSheetRule2_AddRef(IHTMLStyleSheetRule2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLStyleSheetRule2_Release(IHTMLStyleSheetRule2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetRule2_GetTypeInfoCount(IHTMLStyleSheetRule2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLStyleSheetRule2_GetTypeInfo(IHTMLStyleSheetRule2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLStyleSheetRule2_GetIDsOfNames(IHTMLStyleSheetRule2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLStyleSheetRule2_Invoke(IHTMLStyleSheetRule2* 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);
}
/*** IHTMLStyleSheetRule2 methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetRule2_put_selectorText(IHTMLStyleSheetRule2* This,BSTR v) {
    return This->lpVtbl->put_selectorText(This,v);
}
static FORCEINLINE HRESULT IHTMLStyleSheetRule2_get_selectorText(IHTMLStyleSheetRule2* This,BSTR *p) {
    return This->lpVtbl->get_selectorText(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLStyleSheetRule2_put_selectorText_Proxy(
    IHTMLStyleSheetRule2* This,
    BSTR v);
void __RPC_STUB IHTMLStyleSheetRule2_put_selectorText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheetRule2_get_selectorText_Proxy(
    IHTMLStyleSheetRule2* This,
    BSTR *p);
void __RPC_STUB IHTMLStyleSheetRule2_get_selectorText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLStyleSheetRule2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLStyleSheetRulesCollection interface
 */
#ifndef __IHTMLStyleSheetRulesCollection_INTERFACE_DEFINED__
#define __IHTMLStyleSheetRulesCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLStyleSheetRulesCollection, 0x3050f2e5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f2e5-98b5-11cf-bb82-00aa00bdce0b")
IHTMLStyleSheetRulesCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE item(
        LONG index,
        IHTMLStyleSheetRule **ppHTMLStyleSheetRule) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLStyleSheetRulesCollection, 0x3050f2e5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLStyleSheetRulesCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLStyleSheetRulesCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLStyleSheetRulesCollection* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLStyleSheetRulesCollection* This,
        LONG index,
        IHTMLStyleSheetRule **ppHTMLStyleSheetRule);

    END_INTERFACE
} IHTMLStyleSheetRulesCollectionVtbl;
interface IHTMLStyleSheetRulesCollection {
    CONST_VTBL IHTMLStyleSheetRulesCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLStyleSheetRulesCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLStyleSheetRulesCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLStyleSheetRulesCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLStyleSheetRulesCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLStyleSheetRulesCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLStyleSheetRulesCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLStyleSheetRulesCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLStyleSheetRulesCollection methods ***/
#define IHTMLStyleSheetRulesCollection_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLStyleSheetRulesCollection_item(This,index,ppHTMLStyleSheetRule) (This)->lpVtbl->item(This,index,ppHTMLStyleSheetRule)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetRulesCollection_QueryInterface(IHTMLStyleSheetRulesCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLStyleSheetRulesCollection_AddRef(IHTMLStyleSheetRulesCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLStyleSheetRulesCollection_Release(IHTMLStyleSheetRulesCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetRulesCollection_GetTypeInfoCount(IHTMLStyleSheetRulesCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLStyleSheetRulesCollection_GetTypeInfo(IHTMLStyleSheetRulesCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLStyleSheetRulesCollection_GetIDsOfNames(IHTMLStyleSheetRulesCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLStyleSheetRulesCollection_Invoke(IHTMLStyleSheetRulesCollection* 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);
}
/*** IHTMLStyleSheetRulesCollection methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetRulesCollection_get_length(IHTMLStyleSheetRulesCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheetRulesCollection_item(IHTMLStyleSheetRulesCollection* This,LONG index,IHTMLStyleSheetRule **ppHTMLStyleSheetRule) {
    return This->lpVtbl->item(This,index,ppHTMLStyleSheetRule);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLStyleSheetRulesCollection_get_length_Proxy(
    IHTMLStyleSheetRulesCollection* This,
    LONG *p);
void __RPC_STUB IHTMLStyleSheetRulesCollection_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheetRulesCollection_item_Proxy(
    IHTMLStyleSheetRulesCollection* This,
    LONG index,
    IHTMLStyleSheetRule **ppHTMLStyleSheetRule);
void __RPC_STUB IHTMLStyleSheetRulesCollection_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLStyleSheetRulesCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLStyleSheetRulesCollection2 interface
 */
#ifndef __IHTMLStyleSheetRulesCollection2_INTERFACE_DEFINED__
#define __IHTMLStyleSheetRulesCollection2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLStyleSheetRulesCollection2, 0x305106e8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106e8-98b5-11cf-bb82-00aa00bdce0b")
IHTMLStyleSheetRulesCollection2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE item(
        LONG index,
        IHTMLCSSRule **ppHTMLCSSRule) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLStyleSheetRulesCollection2, 0x305106e8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLStyleSheetRulesCollection2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IHTMLStyleSheetRulesCollection2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLStyleSheetRulesCollection2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLStyleSheetRulesCollection2* This,
        LONG index,
        IHTMLCSSRule **ppHTMLCSSRule);

    END_INTERFACE
} IHTMLStyleSheetRulesCollection2Vtbl;
interface IHTMLStyleSheetRulesCollection2 {
    CONST_VTBL IHTMLStyleSheetRulesCollection2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLStyleSheetRulesCollection2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLStyleSheetRulesCollection2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLStyleSheetRulesCollection2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLStyleSheetRulesCollection2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLStyleSheetRulesCollection2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLStyleSheetRulesCollection2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLStyleSheetRulesCollection2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLStyleSheetRulesCollection2 methods ***/
#define IHTMLStyleSheetRulesCollection2_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLStyleSheetRulesCollection2_item(This,index,ppHTMLCSSRule) (This)->lpVtbl->item(This,index,ppHTMLCSSRule)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetRulesCollection2_QueryInterface(IHTMLStyleSheetRulesCollection2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLStyleSheetRulesCollection2_AddRef(IHTMLStyleSheetRulesCollection2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLStyleSheetRulesCollection2_Release(IHTMLStyleSheetRulesCollection2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetRulesCollection2_GetTypeInfoCount(IHTMLStyleSheetRulesCollection2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLStyleSheetRulesCollection2_GetTypeInfo(IHTMLStyleSheetRulesCollection2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLStyleSheetRulesCollection2_GetIDsOfNames(IHTMLStyleSheetRulesCollection2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLStyleSheetRulesCollection2_Invoke(IHTMLStyleSheetRulesCollection2* 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);
}
/*** IHTMLStyleSheetRulesCollection2 methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetRulesCollection2_get_length(IHTMLStyleSheetRulesCollection2* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheetRulesCollection2_item(IHTMLStyleSheetRulesCollection2* This,LONG index,IHTMLCSSRule **ppHTMLCSSRule) {
    return This->lpVtbl->item(This,index,ppHTMLCSSRule);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLStyleSheetRulesCollection2_get_length_Proxy(
    IHTMLStyleSheetRulesCollection2* This,
    LONG *p);
void __RPC_STUB IHTMLStyleSheetRulesCollection2_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheetRulesCollection2_item_Proxy(
    IHTMLStyleSheetRulesCollection2* This,
    LONG index,
    IHTMLCSSRule **ppHTMLCSSRule);
void __RPC_STUB IHTMLStyleSheetRulesCollection2_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLStyleSheetRulesCollection2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLStyleSheetRule dispinterface
 */
#ifndef __DispHTMLStyleSheetRule_DISPINTERFACE_DEFINED__
#define __DispHTMLStyleSheetRule_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLStyleSheetRule, 0x3050f50e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f50e-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLStyleSheetRule : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLStyleSheetRule, 0x3050f50e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLStyleSheetRuleVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} DispHTMLStyleSheetRuleVtbl;
interface DispHTMLStyleSheetRule {
    CONST_VTBL DispHTMLStyleSheetRuleVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLStyleSheetRule_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLStyleSheetRule_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLStyleSheetRule_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLStyleSheetRule_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLStyleSheetRule_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLStyleSheetRule_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLStyleSheetRule_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 DispHTMLStyleSheetRule_QueryInterface(DispHTMLStyleSheetRule* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLStyleSheetRule_AddRef(DispHTMLStyleSheetRule* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLStyleSheetRule_Release(DispHTMLStyleSheetRule* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLStyleSheetRule_GetTypeInfoCount(DispHTMLStyleSheetRule* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLStyleSheetRule_GetTypeInfo(DispHTMLStyleSheetRule* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLStyleSheetRule_GetIDsOfNames(DispHTMLStyleSheetRule* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLStyleSheetRule_Invoke(DispHTMLStyleSheetRule* 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  /* __DispHTMLStyleSheetRule_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLStyleSheetRule coclass
 */

DEFINE_GUID(CLSID_HTMLStyleSheetRule, 0x3050f3ce, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f3ce-98b5-11cf-bb82-00aa00bdce0b") HTMLStyleSheetRule;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLStyleSheetRule, 0x3050f3ce, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CStyleSheetRule;
/*****************************************************************************
 * DispHTMLStyleSheetRulesCollection dispinterface
 */
#ifndef __DispHTMLStyleSheetRulesCollection_DISPINTERFACE_DEFINED__
#define __DispHTMLStyleSheetRulesCollection_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLStyleSheetRulesCollection, 0x3050f52f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f52f-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLStyleSheetRulesCollection : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLStyleSheetRulesCollection, 0x3050f52f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLStyleSheetRulesCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} DispHTMLStyleSheetRulesCollectionVtbl;
interface DispHTMLStyleSheetRulesCollection {
    CONST_VTBL DispHTMLStyleSheetRulesCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLStyleSheetRulesCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLStyleSheetRulesCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLStyleSheetRulesCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLStyleSheetRulesCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLStyleSheetRulesCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLStyleSheetRulesCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLStyleSheetRulesCollection_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 DispHTMLStyleSheetRulesCollection_QueryInterface(DispHTMLStyleSheetRulesCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLStyleSheetRulesCollection_AddRef(DispHTMLStyleSheetRulesCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLStyleSheetRulesCollection_Release(DispHTMLStyleSheetRulesCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLStyleSheetRulesCollection_GetTypeInfoCount(DispHTMLStyleSheetRulesCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLStyleSheetRulesCollection_GetTypeInfo(DispHTMLStyleSheetRulesCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLStyleSheetRulesCollection_GetIDsOfNames(DispHTMLStyleSheetRulesCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLStyleSheetRulesCollection_Invoke(DispHTMLStyleSheetRulesCollection* 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  /* __DispHTMLStyleSheetRulesCollection_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLStyleSheetRulesCollection coclass
 */

DEFINE_GUID(CLSID_HTMLStyleSheetRulesCollection, 0x3050f3cd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f3cd-98b5-11cf-bb82-00aa00bdce0b") HTMLStyleSheetRulesCollection;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLStyleSheetRulesCollection, 0x3050f3cd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CStyleSheetRuleArray;
/*****************************************************************************
 * IHTMLStyleSheetPage interface
 */
#ifndef __IHTMLStyleSheetPage_INTERFACE_DEFINED__
#define __IHTMLStyleSheetPage_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLStyleSheetPage, 0x3050f7ee, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f7ee-98b5-11cf-bb82-00aa00bdce0b")
IHTMLStyleSheetPage : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_selector(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pseudoClass(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLStyleSheetPage, 0x3050f7ee, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLStyleSheetPageVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLStyleSheetPage* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLStyleSheetPage* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLStyleSheetPage methods ***/
    HRESULT (STDMETHODCALLTYPE *get_selector)(
        IHTMLStyleSheetPage* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_pseudoClass)(
        IHTMLStyleSheetPage* This,
        BSTR *p);

    END_INTERFACE
} IHTMLStyleSheetPageVtbl;
interface IHTMLStyleSheetPage {
    CONST_VTBL IHTMLStyleSheetPageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLStyleSheetPage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLStyleSheetPage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLStyleSheetPage_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLStyleSheetPage_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLStyleSheetPage_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLStyleSheetPage_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLStyleSheetPage_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLStyleSheetPage methods ***/
#define IHTMLStyleSheetPage_get_selector(This,p) (This)->lpVtbl->get_selector(This,p)
#define IHTMLStyleSheetPage_get_pseudoClass(This,p) (This)->lpVtbl->get_pseudoClass(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetPage_QueryInterface(IHTMLStyleSheetPage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLStyleSheetPage_AddRef(IHTMLStyleSheetPage* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLStyleSheetPage_Release(IHTMLStyleSheetPage* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetPage_GetTypeInfoCount(IHTMLStyleSheetPage* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLStyleSheetPage_GetTypeInfo(IHTMLStyleSheetPage* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLStyleSheetPage_GetIDsOfNames(IHTMLStyleSheetPage* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLStyleSheetPage_Invoke(IHTMLStyleSheetPage* 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);
}
/*** IHTMLStyleSheetPage methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetPage_get_selector(IHTMLStyleSheetPage* This,BSTR *p) {
    return This->lpVtbl->get_selector(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheetPage_get_pseudoClass(IHTMLStyleSheetPage* This,BSTR *p) {
    return This->lpVtbl->get_pseudoClass(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLStyleSheetPage_get_selector_Proxy(
    IHTMLStyleSheetPage* This,
    BSTR *p);
void __RPC_STUB IHTMLStyleSheetPage_get_selector_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheetPage_get_pseudoClass_Proxy(
    IHTMLStyleSheetPage* This,
    BSTR *p);
void __RPC_STUB IHTMLStyleSheetPage_get_pseudoClass_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLStyleSheetPage_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLStyleSheetPage2 interface
 */
#ifndef __IHTMLStyleSheetPage2_INTERFACE_DEFINED__
#define __IHTMLStyleSheetPage2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLStyleSheetPage2, 0x305106ed, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106ed-98b5-11cf-bb82-00aa00bdce0b")
IHTMLStyleSheetPage2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_selectorText(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_selectorText(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_style(
        IHTMLRuleStyle **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLStyleSheetPage2, 0x305106ed, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLStyleSheetPage2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLStyleSheetPage2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLStyleSheetPage2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLStyleSheetPage2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLStyleSheetPage2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLStyleSheetPage2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLStyleSheetPage2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLStyleSheetPage2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLStyleSheetPage2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_selectorText)(
        IHTMLStyleSheetPage2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_selectorText)(
        IHTMLStyleSheetPage2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_style)(
        IHTMLStyleSheetPage2* This,
        IHTMLRuleStyle **p);

    END_INTERFACE
} IHTMLStyleSheetPage2Vtbl;
interface IHTMLStyleSheetPage2 {
    CONST_VTBL IHTMLStyleSheetPage2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLStyleSheetPage2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLStyleSheetPage2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLStyleSheetPage2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLStyleSheetPage2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLStyleSheetPage2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLStyleSheetPage2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLStyleSheetPage2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLStyleSheetPage2 methods ***/
#define IHTMLStyleSheetPage2_put_selectorText(This,v) (This)->lpVtbl->put_selectorText(This,v)
#define IHTMLStyleSheetPage2_get_selectorText(This,p) (This)->lpVtbl->get_selectorText(This,p)
#define IHTMLStyleSheetPage2_get_style(This,p) (This)->lpVtbl->get_style(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetPage2_QueryInterface(IHTMLStyleSheetPage2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLStyleSheetPage2_AddRef(IHTMLStyleSheetPage2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLStyleSheetPage2_Release(IHTMLStyleSheetPage2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetPage2_GetTypeInfoCount(IHTMLStyleSheetPage2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLStyleSheetPage2_GetTypeInfo(IHTMLStyleSheetPage2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLStyleSheetPage2_GetIDsOfNames(IHTMLStyleSheetPage2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLStyleSheetPage2_Invoke(IHTMLStyleSheetPage2* 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);
}
/*** IHTMLStyleSheetPage2 methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetPage2_put_selectorText(IHTMLStyleSheetPage2* This,BSTR v) {
    return This->lpVtbl->put_selectorText(This,v);
}
static FORCEINLINE HRESULT IHTMLStyleSheetPage2_get_selectorText(IHTMLStyleSheetPage2* This,BSTR *p) {
    return This->lpVtbl->get_selectorText(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheetPage2_get_style(IHTMLStyleSheetPage2* This,IHTMLRuleStyle **p) {
    return This->lpVtbl->get_style(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLStyleSheetPage2_put_selectorText_Proxy(
    IHTMLStyleSheetPage2* This,
    BSTR v);
void __RPC_STUB IHTMLStyleSheetPage2_put_selectorText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheetPage2_get_selectorText_Proxy(
    IHTMLStyleSheetPage2* This,
    BSTR *p);
void __RPC_STUB IHTMLStyleSheetPage2_get_selectorText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheetPage2_get_style_Proxy(
    IHTMLStyleSheetPage2* This,
    IHTMLRuleStyle **p);
void __RPC_STUB IHTMLStyleSheetPage2_get_style_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLStyleSheetPage2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLStyleSheetPagesCollection interface
 */
#ifndef __IHTMLStyleSheetPagesCollection_INTERFACE_DEFINED__
#define __IHTMLStyleSheetPagesCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLStyleSheetPagesCollection, 0x3050f7f0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f7f0-98b5-11cf-bb82-00aa00bdce0b")
IHTMLStyleSheetPagesCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE item(
        LONG index,
        IHTMLStyleSheetPage **ppHTMLStyleSheetPage) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLStyleSheetPagesCollection, 0x3050f7f0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLStyleSheetPagesCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLStyleSheetPagesCollection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLStyleSheetPagesCollection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLStyleSheetPagesCollection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLStyleSheetPagesCollection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLStyleSheetPagesCollection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLStyleSheetPagesCollection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLStyleSheetPagesCollection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLStyleSheetPagesCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLStyleSheetPagesCollection* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLStyleSheetPagesCollection* This,
        LONG index,
        IHTMLStyleSheetPage **ppHTMLStyleSheetPage);

    END_INTERFACE
} IHTMLStyleSheetPagesCollectionVtbl;
interface IHTMLStyleSheetPagesCollection {
    CONST_VTBL IHTMLStyleSheetPagesCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLStyleSheetPagesCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLStyleSheetPagesCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLStyleSheetPagesCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLStyleSheetPagesCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLStyleSheetPagesCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLStyleSheetPagesCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLStyleSheetPagesCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLStyleSheetPagesCollection methods ***/
#define IHTMLStyleSheetPagesCollection_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLStyleSheetPagesCollection_item(This,index,ppHTMLStyleSheetPage) (This)->lpVtbl->item(This,index,ppHTMLStyleSheetPage)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetPagesCollection_QueryInterface(IHTMLStyleSheetPagesCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLStyleSheetPagesCollection_AddRef(IHTMLStyleSheetPagesCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLStyleSheetPagesCollection_Release(IHTMLStyleSheetPagesCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetPagesCollection_GetTypeInfoCount(IHTMLStyleSheetPagesCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLStyleSheetPagesCollection_GetTypeInfo(IHTMLStyleSheetPagesCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLStyleSheetPagesCollection_GetIDsOfNames(IHTMLStyleSheetPagesCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLStyleSheetPagesCollection_Invoke(IHTMLStyleSheetPagesCollection* 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);
}
/*** IHTMLStyleSheetPagesCollection methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetPagesCollection_get_length(IHTMLStyleSheetPagesCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheetPagesCollection_item(IHTMLStyleSheetPagesCollection* This,LONG index,IHTMLStyleSheetPage **ppHTMLStyleSheetPage) {
    return This->lpVtbl->item(This,index,ppHTMLStyleSheetPage);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLStyleSheetPagesCollection_get_length_Proxy(
    IHTMLStyleSheetPagesCollection* This,
    LONG *p);
void __RPC_STUB IHTMLStyleSheetPagesCollection_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheetPagesCollection_item_Proxy(
    IHTMLStyleSheetPagesCollection* This,
    LONG index,
    IHTMLStyleSheetPage **ppHTMLStyleSheetPage);
void __RPC_STUB IHTMLStyleSheetPagesCollection_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLStyleSheetPagesCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLStyleSheetPage dispinterface
 */
#ifndef __DispHTMLStyleSheetPage_DISPINTERFACE_DEFINED__
#define __DispHTMLStyleSheetPage_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLStyleSheetPage, 0x3050f540, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f540-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLStyleSheetPage : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLStyleSheetPage, 0x3050f540, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLStyleSheetPageVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLStyleSheetPage* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLStyleSheetPage* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLStyleSheetPage* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLStyleSheetPage* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLStyleSheetPage* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLStyleSheetPage* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLStyleSheetPage* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLStyleSheetPageVtbl;
interface DispHTMLStyleSheetPage {
    CONST_VTBL DispHTMLStyleSheetPageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLStyleSheetPage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLStyleSheetPage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLStyleSheetPage_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLStyleSheetPage_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLStyleSheetPage_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLStyleSheetPage_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLStyleSheetPage_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 DispHTMLStyleSheetPage_QueryInterface(DispHTMLStyleSheetPage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLStyleSheetPage_AddRef(DispHTMLStyleSheetPage* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLStyleSheetPage_Release(DispHTMLStyleSheetPage* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLStyleSheetPage_GetTypeInfoCount(DispHTMLStyleSheetPage* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLStyleSheetPage_GetTypeInfo(DispHTMLStyleSheetPage* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLStyleSheetPage_GetIDsOfNames(DispHTMLStyleSheetPage* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLStyleSheetPage_Invoke(DispHTMLStyleSheetPage* 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  /* __DispHTMLStyleSheetPage_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLStyleSheetPage coclass
 */

DEFINE_GUID(CLSID_HTMLStyleSheetPage, 0x3050f7ef, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f7ef-98b5-11cf-bb82-00aa00bdce0b") HTMLStyleSheetPage;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLStyleSheetPage, 0x3050f7ef, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CStyleSheetPage;
/*****************************************************************************
 * DispHTMLStyleSheetPagesCollection dispinterface
 */
#ifndef __DispHTMLStyleSheetPagesCollection_DISPINTERFACE_DEFINED__
#define __DispHTMLStyleSheetPagesCollection_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLStyleSheetPagesCollection, 0x3050f543, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f543-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLStyleSheetPagesCollection : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLStyleSheetPagesCollection, 0x3050f543, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLStyleSheetPagesCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLStyleSheetPagesCollection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLStyleSheetPagesCollection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLStyleSheetPagesCollection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLStyleSheetPagesCollection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLStyleSheetPagesCollection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLStyleSheetPagesCollection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLStyleSheetPagesCollection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLStyleSheetPagesCollectionVtbl;
interface DispHTMLStyleSheetPagesCollection {
    CONST_VTBL DispHTMLStyleSheetPagesCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLStyleSheetPagesCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLStyleSheetPagesCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLStyleSheetPagesCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLStyleSheetPagesCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLStyleSheetPagesCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLStyleSheetPagesCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLStyleSheetPagesCollection_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 DispHTMLStyleSheetPagesCollection_QueryInterface(DispHTMLStyleSheetPagesCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLStyleSheetPagesCollection_AddRef(DispHTMLStyleSheetPagesCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLStyleSheetPagesCollection_Release(DispHTMLStyleSheetPagesCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLStyleSheetPagesCollection_GetTypeInfoCount(DispHTMLStyleSheetPagesCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLStyleSheetPagesCollection_GetTypeInfo(DispHTMLStyleSheetPagesCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLStyleSheetPagesCollection_GetIDsOfNames(DispHTMLStyleSheetPagesCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLStyleSheetPagesCollection_Invoke(DispHTMLStyleSheetPagesCollection* 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  /* __DispHTMLStyleSheetPagesCollection_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLStyleSheetPagesCollection coclass
 */

DEFINE_GUID(CLSID_HTMLStyleSheetPagesCollection, 0x3050f7f1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f7f1-98b5-11cf-bb82-00aa00bdce0b") HTMLStyleSheetPagesCollection;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLStyleSheetPagesCollection, 0x3050f7f1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CStyleSheetPageArray;
#ifndef __IHTMLStyleSheetsCollection_FWD_DEFINED__
#define __IHTMLStyleSheetsCollection_FWD_DEFINED__
typedef interface IHTMLStyleSheetsCollection IHTMLStyleSheetsCollection;
#endif

/*****************************************************************************
 * IHTMLStyleSheet interface
 */
#ifndef __IHTMLStyleSheet_INTERFACE_DEFINED__
#define __IHTMLStyleSheet_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLStyleSheet, 0x3050f2e3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f2e3-98b5-11cf-bb82-00aa00bdce0b")
IHTMLStyleSheet : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_title(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_title(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_parentStyleSheet(
        IHTMLStyleSheet **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_owningElement(
        IHTMLElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_disabled(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_disabled(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_readOnly(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_imports(
        IHTMLStyleSheetsCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_href(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_href(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_id(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE addImport(
        BSTR bstrURL,
        LONG lIndex = -1,
        LONG *plIndex = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE addRule(
        BSTR bstrSelector,
        BSTR bstrStyle,
        LONG lIndex = -1,
        LONG *plNewIndex = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeImport(
        LONG lIndex) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeRule(
        LONG lIndex) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_media(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_media(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_cssText(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cssText(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_rules(
        IHTMLStyleSheetRulesCollection **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLStyleSheet, 0x3050f2e3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLStyleSheetVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLStyleSheet* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLStyleSheet* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLStyleSheet* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLStyleSheet* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLStyleSheet* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLStyleSheet* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLStyleSheet* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLStyleSheet methods ***/
    HRESULT (STDMETHODCALLTYPE *put_title)(
        IHTMLStyleSheet* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_title)(
        IHTMLStyleSheet* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_parentStyleSheet)(
        IHTMLStyleSheet* This,
        IHTMLStyleSheet **p);

    HRESULT (STDMETHODCALLTYPE *get_owningElement)(
        IHTMLStyleSheet* This,
        IHTMLElement **p);

    HRESULT (STDMETHODCALLTYPE *put_disabled)(
        IHTMLStyleSheet* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_disabled)(
        IHTMLStyleSheet* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_readOnly)(
        IHTMLStyleSheet* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_imports)(
        IHTMLStyleSheet* This,
        IHTMLStyleSheetsCollection **p);

    HRESULT (STDMETHODCALLTYPE *put_href)(
        IHTMLStyleSheet* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_href)(
        IHTMLStyleSheet* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLStyleSheet* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_id)(
        IHTMLStyleSheet* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *addImport)(
        IHTMLStyleSheet* This,
        BSTR bstrURL,
        LONG lIndex,
        LONG *plIndex);

    HRESULT (STDMETHODCALLTYPE *addRule)(
        IHTMLStyleSheet* This,
        BSTR bstrSelector,
        BSTR bstrStyle,
        LONG lIndex,
        LONG *plNewIndex);

    HRESULT (STDMETHODCALLTYPE *removeImport)(
        IHTMLStyleSheet* This,
        LONG lIndex);

    HRESULT (STDMETHODCALLTYPE *removeRule)(
        IHTMLStyleSheet* This,
        LONG lIndex);

    HRESULT (STDMETHODCALLTYPE *put_media)(
        IHTMLStyleSheet* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_media)(
        IHTMLStyleSheet* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_cssText)(
        IHTMLStyleSheet* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_cssText)(
        IHTMLStyleSheet* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_rules)(
        IHTMLStyleSheet* This,
        IHTMLStyleSheetRulesCollection **p);

    END_INTERFACE
} IHTMLStyleSheetVtbl;
interface IHTMLStyleSheet {
    CONST_VTBL IHTMLStyleSheetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLStyleSheet_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLStyleSheet_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLStyleSheet_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLStyleSheet_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLStyleSheet_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLStyleSheet_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLStyleSheet_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLStyleSheet methods ***/
#define IHTMLStyleSheet_put_title(This,v) (This)->lpVtbl->put_title(This,v)
#define IHTMLStyleSheet_get_title(This,p) (This)->lpVtbl->get_title(This,p)
#define IHTMLStyleSheet_get_parentStyleSheet(This,p) (This)->lpVtbl->get_parentStyleSheet(This,p)
#define IHTMLStyleSheet_get_owningElement(This,p) (This)->lpVtbl->get_owningElement(This,p)
#define IHTMLStyleSheet_put_disabled(This,v) (This)->lpVtbl->put_disabled(This,v)
#define IHTMLStyleSheet_get_disabled(This,p) (This)->lpVtbl->get_disabled(This,p)
#define IHTMLStyleSheet_get_readOnly(This,p) (This)->lpVtbl->get_readOnly(This,p)
#define IHTMLStyleSheet_get_imports(This,p) (This)->lpVtbl->get_imports(This,p)
#define IHTMLStyleSheet_put_href(This,v) (This)->lpVtbl->put_href(This,v)
#define IHTMLStyleSheet_get_href(This,p) (This)->lpVtbl->get_href(This,p)
#define IHTMLStyleSheet_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#define IHTMLStyleSheet_get_id(This,p) (This)->lpVtbl->get_id(This,p)
#define IHTMLStyleSheet_addImport(This,bstrURL,lIndex,plIndex) (This)->lpVtbl->addImport(This,bstrURL,lIndex,plIndex)
#define IHTMLStyleSheet_addRule(This,bstrSelector,bstrStyle,lIndex,plNewIndex) (This)->lpVtbl->addRule(This,bstrSelector,bstrStyle,lIndex,plNewIndex)
#define IHTMLStyleSheet_removeImport(This,lIndex) (This)->lpVtbl->removeImport(This,lIndex)
#define IHTMLStyleSheet_removeRule(This,lIndex) (This)->lpVtbl->removeRule(This,lIndex)
#define IHTMLStyleSheet_put_media(This,v) (This)->lpVtbl->put_media(This,v)
#define IHTMLStyleSheet_get_media(This,p) (This)->lpVtbl->get_media(This,p)
#define IHTMLStyleSheet_put_cssText(This,v) (This)->lpVtbl->put_cssText(This,v)
#define IHTMLStyleSheet_get_cssText(This,p) (This)->lpVtbl->get_cssText(This,p)
#define IHTMLStyleSheet_get_rules(This,p) (This)->lpVtbl->get_rules(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheet_QueryInterface(IHTMLStyleSheet* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLStyleSheet_AddRef(IHTMLStyleSheet* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLStyleSheet_Release(IHTMLStyleSheet* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheet_GetTypeInfoCount(IHTMLStyleSheet* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLStyleSheet_GetTypeInfo(IHTMLStyleSheet* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLStyleSheet_GetIDsOfNames(IHTMLStyleSheet* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLStyleSheet_Invoke(IHTMLStyleSheet* 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);
}
/*** IHTMLStyleSheet methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheet_put_title(IHTMLStyleSheet* This,BSTR v) {
    return This->lpVtbl->put_title(This,v);
}
static FORCEINLINE HRESULT IHTMLStyleSheet_get_title(IHTMLStyleSheet* This,BSTR *p) {
    return This->lpVtbl->get_title(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheet_get_parentStyleSheet(IHTMLStyleSheet* This,IHTMLStyleSheet **p) {
    return This->lpVtbl->get_parentStyleSheet(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheet_get_owningElement(IHTMLStyleSheet* This,IHTMLElement **p) {
    return This->lpVtbl->get_owningElement(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheet_put_disabled(IHTMLStyleSheet* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_disabled(This,v);
}
static FORCEINLINE HRESULT IHTMLStyleSheet_get_disabled(IHTMLStyleSheet* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_disabled(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheet_get_readOnly(IHTMLStyleSheet* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_readOnly(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheet_get_imports(IHTMLStyleSheet* This,IHTMLStyleSheetsCollection **p) {
    return This->lpVtbl->get_imports(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheet_put_href(IHTMLStyleSheet* This,BSTR v) {
    return This->lpVtbl->put_href(This,v);
}
static FORCEINLINE HRESULT IHTMLStyleSheet_get_href(IHTMLStyleSheet* This,BSTR *p) {
    return This->lpVtbl->get_href(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheet_get_type(IHTMLStyleSheet* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheet_get_id(IHTMLStyleSheet* This,BSTR *p) {
    return This->lpVtbl->get_id(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheet_addImport(IHTMLStyleSheet* This,BSTR bstrURL,LONG lIndex,LONG *plIndex) {
    return This->lpVtbl->addImport(This,bstrURL,lIndex,plIndex);
}
static FORCEINLINE HRESULT IHTMLStyleSheet_addRule(IHTMLStyleSheet* This,BSTR bstrSelector,BSTR bstrStyle,LONG lIndex,LONG *plNewIndex) {
    return This->lpVtbl->addRule(This,bstrSelector,bstrStyle,lIndex,plNewIndex);
}
static FORCEINLINE HRESULT IHTMLStyleSheet_removeImport(IHTMLStyleSheet* This,LONG lIndex) {
    return This->lpVtbl->removeImport(This,lIndex);
}
static FORCEINLINE HRESULT IHTMLStyleSheet_removeRule(IHTMLStyleSheet* This,LONG lIndex) {
    return This->lpVtbl->removeRule(This,lIndex);
}
static FORCEINLINE HRESULT IHTMLStyleSheet_put_media(IHTMLStyleSheet* This,BSTR v) {
    return This->lpVtbl->put_media(This,v);
}
static FORCEINLINE HRESULT IHTMLStyleSheet_get_media(IHTMLStyleSheet* This,BSTR *p) {
    return This->lpVtbl->get_media(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheet_put_cssText(IHTMLStyleSheet* This,BSTR v) {
    return This->lpVtbl->put_cssText(This,v);
}
static FORCEINLINE HRESULT IHTMLStyleSheet_get_cssText(IHTMLStyleSheet* This,BSTR *p) {
    return This->lpVtbl->get_cssText(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheet_get_rules(IHTMLStyleSheet* This,IHTMLStyleSheetRulesCollection **p) {
    return This->lpVtbl->get_rules(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLStyleSheet_put_title_Proxy(
    IHTMLStyleSheet* This,
    BSTR v);
void __RPC_STUB IHTMLStyleSheet_put_title_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet_get_title_Proxy(
    IHTMLStyleSheet* This,
    BSTR *p);
void __RPC_STUB IHTMLStyleSheet_get_title_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet_get_parentStyleSheet_Proxy(
    IHTMLStyleSheet* This,
    IHTMLStyleSheet **p);
void __RPC_STUB IHTMLStyleSheet_get_parentStyleSheet_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet_get_owningElement_Proxy(
    IHTMLStyleSheet* This,
    IHTMLElement **p);
void __RPC_STUB IHTMLStyleSheet_get_owningElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet_put_disabled_Proxy(
    IHTMLStyleSheet* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLStyleSheet_put_disabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet_get_disabled_Proxy(
    IHTMLStyleSheet* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLStyleSheet_get_disabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet_get_readOnly_Proxy(
    IHTMLStyleSheet* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLStyleSheet_get_readOnly_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet_get_imports_Proxy(
    IHTMLStyleSheet* This,
    IHTMLStyleSheetsCollection **p);
void __RPC_STUB IHTMLStyleSheet_get_imports_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet_put_href_Proxy(
    IHTMLStyleSheet* This,
    BSTR v);
void __RPC_STUB IHTMLStyleSheet_put_href_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet_get_href_Proxy(
    IHTMLStyleSheet* This,
    BSTR *p);
void __RPC_STUB IHTMLStyleSheet_get_href_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet_get_type_Proxy(
    IHTMLStyleSheet* This,
    BSTR *p);
void __RPC_STUB IHTMLStyleSheet_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet_get_id_Proxy(
    IHTMLStyleSheet* This,
    BSTR *p);
void __RPC_STUB IHTMLStyleSheet_get_id_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet_addImport_Proxy(
    IHTMLStyleSheet* This,
    BSTR bstrURL,
    LONG lIndex,
    LONG *plIndex);
void __RPC_STUB IHTMLStyleSheet_addImport_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet_addRule_Proxy(
    IHTMLStyleSheet* This,
    BSTR bstrSelector,
    BSTR bstrStyle,
    LONG lIndex,
    LONG *plNewIndex);
void __RPC_STUB IHTMLStyleSheet_addRule_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet_removeImport_Proxy(
    IHTMLStyleSheet* This,
    LONG lIndex);
void __RPC_STUB IHTMLStyleSheet_removeImport_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet_removeRule_Proxy(
    IHTMLStyleSheet* This,
    LONG lIndex);
void __RPC_STUB IHTMLStyleSheet_removeRule_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet_put_media_Proxy(
    IHTMLStyleSheet* This,
    BSTR v);
void __RPC_STUB IHTMLStyleSheet_put_media_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet_get_media_Proxy(
    IHTMLStyleSheet* This,
    BSTR *p);
void __RPC_STUB IHTMLStyleSheet_get_media_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet_put_cssText_Proxy(
    IHTMLStyleSheet* This,
    BSTR v);
void __RPC_STUB IHTMLStyleSheet_put_cssText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet_get_cssText_Proxy(
    IHTMLStyleSheet* This,
    BSTR *p);
void __RPC_STUB IHTMLStyleSheet_get_cssText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet_get_rules_Proxy(
    IHTMLStyleSheet* This,
    IHTMLStyleSheetRulesCollection **p);
void __RPC_STUB IHTMLStyleSheet_get_rules_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLStyleSheet_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLStyleSheet2 interface
 */
#ifndef __IHTMLStyleSheet2_INTERFACE_DEFINED__
#define __IHTMLStyleSheet2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLStyleSheet2, 0x3050f3d1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f3d1-98b5-11cf-bb82-00aa00bdce0b")
IHTMLStyleSheet2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_pages(
        IHTMLStyleSheetPagesCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE addPageRule(
        BSTR bstrSelector,
        BSTR bstrStyle,
        LONG lIndex = -1,
        LONG *plNewIndex = 0) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLStyleSheet2, 0x3050f3d1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLStyleSheet2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLStyleSheet2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLStyleSheet2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLStyleSheet2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLStyleSheet2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLStyleSheet2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLStyleSheet2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLStyleSheet2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLStyleSheet2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_pages)(
        IHTMLStyleSheet2* This,
        IHTMLStyleSheetPagesCollection **p);

    HRESULT (STDMETHODCALLTYPE *addPageRule)(
        IHTMLStyleSheet2* This,
        BSTR bstrSelector,
        BSTR bstrStyle,
        LONG lIndex,
        LONG *plNewIndex);

    END_INTERFACE
} IHTMLStyleSheet2Vtbl;
interface IHTMLStyleSheet2 {
    CONST_VTBL IHTMLStyleSheet2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLStyleSheet2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLStyleSheet2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLStyleSheet2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLStyleSheet2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLStyleSheet2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLStyleSheet2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLStyleSheet2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLStyleSheet2 methods ***/
#define IHTMLStyleSheet2_get_pages(This,p) (This)->lpVtbl->get_pages(This,p)
#define IHTMLStyleSheet2_addPageRule(This,bstrSelector,bstrStyle,lIndex,plNewIndex) (This)->lpVtbl->addPageRule(This,bstrSelector,bstrStyle,lIndex,plNewIndex)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheet2_QueryInterface(IHTMLStyleSheet2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLStyleSheet2_AddRef(IHTMLStyleSheet2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLStyleSheet2_Release(IHTMLStyleSheet2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheet2_GetTypeInfoCount(IHTMLStyleSheet2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLStyleSheet2_GetTypeInfo(IHTMLStyleSheet2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLStyleSheet2_GetIDsOfNames(IHTMLStyleSheet2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLStyleSheet2_Invoke(IHTMLStyleSheet2* 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);
}
/*** IHTMLStyleSheet2 methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheet2_get_pages(IHTMLStyleSheet2* This,IHTMLStyleSheetPagesCollection **p) {
    return This->lpVtbl->get_pages(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheet2_addPageRule(IHTMLStyleSheet2* This,BSTR bstrSelector,BSTR bstrStyle,LONG lIndex,LONG *plNewIndex) {
    return This->lpVtbl->addPageRule(This,bstrSelector,bstrStyle,lIndex,plNewIndex);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLStyleSheet2_get_pages_Proxy(
    IHTMLStyleSheet2* This,
    IHTMLStyleSheetPagesCollection **p);
void __RPC_STUB IHTMLStyleSheet2_get_pages_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet2_addPageRule_Proxy(
    IHTMLStyleSheet2* This,
    BSTR bstrSelector,
    BSTR bstrStyle,
    LONG lIndex,
    LONG *plNewIndex);
void __RPC_STUB IHTMLStyleSheet2_addPageRule_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLStyleSheet2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLStyleSheet3 interface
 */
#ifndef __IHTMLStyleSheet3_INTERFACE_DEFINED__
#define __IHTMLStyleSheet3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLStyleSheet3, 0x30510496, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510496-98b5-11cf-bb82-00aa00bdce0b")
IHTMLStyleSheet3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_href(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_href(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_isAlternate(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_isPrefAlternate(
        VARIANT_BOOL *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLStyleSheet3, 0x30510496, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLStyleSheet3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLStyleSheet3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLStyleSheet3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLStyleSheet3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLStyleSheet3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLStyleSheet3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLStyleSheet3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLStyleSheet3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLStyleSheet3 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_href)(
        IHTMLStyleSheet3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_href)(
        IHTMLStyleSheet3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_isAlternate)(
        IHTMLStyleSheet3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_isPrefAlternate)(
        IHTMLStyleSheet3* This,
        VARIANT_BOOL *p);

    END_INTERFACE
} IHTMLStyleSheet3Vtbl;
interface IHTMLStyleSheet3 {
    CONST_VTBL IHTMLStyleSheet3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLStyleSheet3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLStyleSheet3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLStyleSheet3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLStyleSheet3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLStyleSheet3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLStyleSheet3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLStyleSheet3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLStyleSheet3 methods ***/
#define IHTMLStyleSheet3_put_href(This,v) (This)->lpVtbl->put_href(This,v)
#define IHTMLStyleSheet3_get_href(This,p) (This)->lpVtbl->get_href(This,p)
#define IHTMLStyleSheet3_get_isAlternate(This,p) (This)->lpVtbl->get_isAlternate(This,p)
#define IHTMLStyleSheet3_get_isPrefAlternate(This,p) (This)->lpVtbl->get_isPrefAlternate(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheet3_QueryInterface(IHTMLStyleSheet3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLStyleSheet3_AddRef(IHTMLStyleSheet3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLStyleSheet3_Release(IHTMLStyleSheet3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheet3_GetTypeInfoCount(IHTMLStyleSheet3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLStyleSheet3_GetTypeInfo(IHTMLStyleSheet3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLStyleSheet3_GetIDsOfNames(IHTMLStyleSheet3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLStyleSheet3_Invoke(IHTMLStyleSheet3* 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);
}
/*** IHTMLStyleSheet3 methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheet3_put_href(IHTMLStyleSheet3* This,BSTR v) {
    return This->lpVtbl->put_href(This,v);
}
static FORCEINLINE HRESULT IHTMLStyleSheet3_get_href(IHTMLStyleSheet3* This,BSTR *p) {
    return This->lpVtbl->get_href(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheet3_get_isAlternate(IHTMLStyleSheet3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_isAlternate(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheet3_get_isPrefAlternate(IHTMLStyleSheet3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_isPrefAlternate(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLStyleSheet3_put_href_Proxy(
    IHTMLStyleSheet3* This,
    BSTR v);
void __RPC_STUB IHTMLStyleSheet3_put_href_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet3_get_href_Proxy(
    IHTMLStyleSheet3* This,
    BSTR *p);
void __RPC_STUB IHTMLStyleSheet3_get_href_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet3_get_isAlternate_Proxy(
    IHTMLStyleSheet3* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLStyleSheet3_get_isAlternate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet3_get_isPrefAlternate_Proxy(
    IHTMLStyleSheet3* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLStyleSheet3_get_isPrefAlternate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLStyleSheet3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLStyleSheet4 interface
 */
#ifndef __IHTMLStyleSheet4_INTERFACE_DEFINED__
#define __IHTMLStyleSheet4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLStyleSheet4, 0x305106f4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106f4-98b5-11cf-bb82-00aa00bdce0b")
IHTMLStyleSheet4 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_href(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_title(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ownerNode(
        IHTMLElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ownerRule(
        IHTMLCSSRule **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cssRules(
        IHTMLStyleSheetRulesCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_media(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE insertRule(
        BSTR bstrRule,
        LONG lIndex = -1,
        LONG *plNewIndex = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE deleteRule(
        LONG lIndex = -1) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLStyleSheet4, 0x305106f4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLStyleSheet4Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLStyleSheet4* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLStyleSheet4* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLStyleSheet4* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLStyleSheet4* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLStyleSheet4* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLStyleSheet4* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLStyleSheet4* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLStyleSheet4 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLStyleSheet4* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_href)(
        IHTMLStyleSheet4* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_title)(
        IHTMLStyleSheet4* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_ownerNode)(
        IHTMLStyleSheet4* This,
        IHTMLElement **p);

    HRESULT (STDMETHODCALLTYPE *get_ownerRule)(
        IHTMLStyleSheet4* This,
        IHTMLCSSRule **p);

    HRESULT (STDMETHODCALLTYPE *get_cssRules)(
        IHTMLStyleSheet4* This,
        IHTMLStyleSheetRulesCollection **p);

    HRESULT (STDMETHODCALLTYPE *get_media)(
        IHTMLStyleSheet4* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *insertRule)(
        IHTMLStyleSheet4* This,
        BSTR bstrRule,
        LONG lIndex,
        LONG *plNewIndex);

    HRESULT (STDMETHODCALLTYPE *deleteRule)(
        IHTMLStyleSheet4* This,
        LONG lIndex);

    END_INTERFACE
} IHTMLStyleSheet4Vtbl;
interface IHTMLStyleSheet4 {
    CONST_VTBL IHTMLStyleSheet4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLStyleSheet4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLStyleSheet4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLStyleSheet4_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLStyleSheet4_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLStyleSheet4_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLStyleSheet4_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLStyleSheet4_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLStyleSheet4 methods ***/
#define IHTMLStyleSheet4_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#define IHTMLStyleSheet4_get_href(This,p) (This)->lpVtbl->get_href(This,p)
#define IHTMLStyleSheet4_get_title(This,p) (This)->lpVtbl->get_title(This,p)
#define IHTMLStyleSheet4_get_ownerNode(This,p) (This)->lpVtbl->get_ownerNode(This,p)
#define IHTMLStyleSheet4_get_ownerRule(This,p) (This)->lpVtbl->get_ownerRule(This,p)
#define IHTMLStyleSheet4_get_cssRules(This,p) (This)->lpVtbl->get_cssRules(This,p)
#define IHTMLStyleSheet4_get_media(This,p) (This)->lpVtbl->get_media(This,p)
#define IHTMLStyleSheet4_insertRule(This,bstrRule,lIndex,plNewIndex) (This)->lpVtbl->insertRule(This,bstrRule,lIndex,plNewIndex)
#define IHTMLStyleSheet4_deleteRule(This,lIndex) (This)->lpVtbl->deleteRule(This,lIndex)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheet4_QueryInterface(IHTMLStyleSheet4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLStyleSheet4_AddRef(IHTMLStyleSheet4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLStyleSheet4_Release(IHTMLStyleSheet4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheet4_GetTypeInfoCount(IHTMLStyleSheet4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLStyleSheet4_GetTypeInfo(IHTMLStyleSheet4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLStyleSheet4_GetIDsOfNames(IHTMLStyleSheet4* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLStyleSheet4_Invoke(IHTMLStyleSheet4* 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);
}
/*** IHTMLStyleSheet4 methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheet4_get_type(IHTMLStyleSheet4* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheet4_get_href(IHTMLStyleSheet4* This,VARIANT *p) {
    return This->lpVtbl->get_href(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheet4_get_title(IHTMLStyleSheet4* This,BSTR *p) {
    return This->lpVtbl->get_title(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheet4_get_ownerNode(IHTMLStyleSheet4* This,IHTMLElement **p) {
    return This->lpVtbl->get_ownerNode(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheet4_get_ownerRule(IHTMLStyleSheet4* This,IHTMLCSSRule **p) {
    return This->lpVtbl->get_ownerRule(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheet4_get_cssRules(IHTMLStyleSheet4* This,IHTMLStyleSheetRulesCollection **p) {
    return This->lpVtbl->get_cssRules(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheet4_get_media(IHTMLStyleSheet4* This,VARIANT *p) {
    return This->lpVtbl->get_media(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheet4_insertRule(IHTMLStyleSheet4* This,BSTR bstrRule,LONG lIndex,LONG *plNewIndex) {
    return This->lpVtbl->insertRule(This,bstrRule,lIndex,plNewIndex);
}
static FORCEINLINE HRESULT IHTMLStyleSheet4_deleteRule(IHTMLStyleSheet4* This,LONG lIndex) {
    return This->lpVtbl->deleteRule(This,lIndex);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLStyleSheet4_get_type_Proxy(
    IHTMLStyleSheet4* This,
    BSTR *p);
void __RPC_STUB IHTMLStyleSheet4_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet4_get_href_Proxy(
    IHTMLStyleSheet4* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyleSheet4_get_href_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet4_get_title_Proxy(
    IHTMLStyleSheet4* This,
    BSTR *p);
void __RPC_STUB IHTMLStyleSheet4_get_title_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet4_get_ownerNode_Proxy(
    IHTMLStyleSheet4* This,
    IHTMLElement **p);
void __RPC_STUB IHTMLStyleSheet4_get_ownerNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet4_get_ownerRule_Proxy(
    IHTMLStyleSheet4* This,
    IHTMLCSSRule **p);
void __RPC_STUB IHTMLStyleSheet4_get_ownerRule_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet4_get_cssRules_Proxy(
    IHTMLStyleSheet4* This,
    IHTMLStyleSheetRulesCollection **p);
void __RPC_STUB IHTMLStyleSheet4_get_cssRules_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet4_get_media_Proxy(
    IHTMLStyleSheet4* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyleSheet4_get_media_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet4_insertRule_Proxy(
    IHTMLStyleSheet4* This,
    BSTR bstrRule,
    LONG lIndex,
    LONG *plNewIndex);
void __RPC_STUB IHTMLStyleSheet4_insertRule_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheet4_deleteRule_Proxy(
    IHTMLStyleSheet4* This,
    LONG lIndex);
void __RPC_STUB IHTMLStyleSheet4_deleteRule_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLStyleSheet4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLStyleSheet dispinterface
 */
#ifndef __DispHTMLStyleSheet_DISPINTERFACE_DEFINED__
#define __DispHTMLStyleSheet_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLStyleSheet, 0x3050f58d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f58d-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLStyleSheet : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLStyleSheet, 0x3050f58d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLStyleSheetVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLStyleSheet* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLStyleSheet* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLStyleSheet* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLStyleSheet* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLStyleSheet* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLStyleSheet* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLStyleSheet* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLStyleSheetVtbl;
interface DispHTMLStyleSheet {
    CONST_VTBL DispHTMLStyleSheetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLStyleSheet_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLStyleSheet_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLStyleSheet_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLStyleSheet_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLStyleSheet_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLStyleSheet_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLStyleSheet_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 DispHTMLStyleSheet_QueryInterface(DispHTMLStyleSheet* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLStyleSheet_AddRef(DispHTMLStyleSheet* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLStyleSheet_Release(DispHTMLStyleSheet* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLStyleSheet_GetTypeInfoCount(DispHTMLStyleSheet* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLStyleSheet_GetTypeInfo(DispHTMLStyleSheet* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLStyleSheet_GetIDsOfNames(DispHTMLStyleSheet* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLStyleSheet_Invoke(DispHTMLStyleSheet* 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  /* __DispHTMLStyleSheet_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLStyleSheet coclass
 */

DEFINE_GUID(CLSID_HTMLStyleSheet, 0x3050f2e4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f2e4-98b5-11cf-bb82-00aa00bdce0b") HTMLStyleSheet;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLStyleSheet, 0x3050f2e4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CStyleSheet;
/*****************************************************************************
 * IHTMLStyleSheetsCollection interface
 */
#ifndef __IHTMLStyleSheetsCollection_INTERFACE_DEFINED__
#define __IHTMLStyleSheetsCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLStyleSheetsCollection, 0x3050f37e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f37e-98b5-11cf-bb82-00aa00bdce0b")
IHTMLStyleSheetsCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__newEnum(
        IUnknown **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE item(
        VARIANT *pvarIndex,
        VARIANT *pvarResult) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLStyleSheetsCollection, 0x3050f37e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLStyleSheetsCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLStyleSheetsCollection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLStyleSheetsCollection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLStyleSheetsCollection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLStyleSheetsCollection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLStyleSheetsCollection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLStyleSheetsCollection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLStyleSheetsCollection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLStyleSheetsCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLStyleSheetsCollection* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get__newEnum)(
        IHTMLStyleSheetsCollection* This,
        IUnknown **p);

    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLStyleSheetsCollection* This,
        VARIANT *pvarIndex,
        VARIANT *pvarResult);

    END_INTERFACE
} IHTMLStyleSheetsCollectionVtbl;
interface IHTMLStyleSheetsCollection {
    CONST_VTBL IHTMLStyleSheetsCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLStyleSheetsCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLStyleSheetsCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLStyleSheetsCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLStyleSheetsCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLStyleSheetsCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLStyleSheetsCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLStyleSheetsCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLStyleSheetsCollection methods ***/
#define IHTMLStyleSheetsCollection_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLStyleSheetsCollection_get__newEnum(This,p) (This)->lpVtbl->get__newEnum(This,p)
#define IHTMLStyleSheetsCollection_item(This,pvarIndex,pvarResult) (This)->lpVtbl->item(This,pvarIndex,pvarResult)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetsCollection_QueryInterface(IHTMLStyleSheetsCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLStyleSheetsCollection_AddRef(IHTMLStyleSheetsCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLStyleSheetsCollection_Release(IHTMLStyleSheetsCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetsCollection_GetTypeInfoCount(IHTMLStyleSheetsCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLStyleSheetsCollection_GetTypeInfo(IHTMLStyleSheetsCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLStyleSheetsCollection_GetIDsOfNames(IHTMLStyleSheetsCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLStyleSheetsCollection_Invoke(IHTMLStyleSheetsCollection* 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);
}
/*** IHTMLStyleSheetsCollection methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetsCollection_get_length(IHTMLStyleSheetsCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheetsCollection_get__newEnum(IHTMLStyleSheetsCollection* This,IUnknown **p) {
    return This->lpVtbl->get__newEnum(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheetsCollection_item(IHTMLStyleSheetsCollection* This,VARIANT *pvarIndex,VARIANT *pvarResult) {
    return This->lpVtbl->item(This,pvarIndex,pvarResult);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLStyleSheetsCollection_get_length_Proxy(
    IHTMLStyleSheetsCollection* This,
    LONG *p);
void __RPC_STUB IHTMLStyleSheetsCollection_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheetsCollection_get__newEnum_Proxy(
    IHTMLStyleSheetsCollection* This,
    IUnknown **p);
void __RPC_STUB IHTMLStyleSheetsCollection_get__newEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheetsCollection_item_Proxy(
    IHTMLStyleSheetsCollection* This,
    VARIANT *pvarIndex,
    VARIANT *pvarResult);
void __RPC_STUB IHTMLStyleSheetsCollection_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLStyleSheetsCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLStyleSheetsCollection2 interface
 */
#ifndef __IHTMLStyleSheetsCollection2_INTERFACE_DEFINED__
#define __IHTMLStyleSheetsCollection2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLStyleSheetsCollection2, 0x305106e7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106e7-98b5-11cf-bb82-00aa00bdce0b")
IHTMLStyleSheetsCollection2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE item(
        LONG index,
        VARIANT *pvarResult) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLStyleSheetsCollection2, 0x305106e7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLStyleSheetsCollection2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLStyleSheetsCollection2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLStyleSheetsCollection2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLStyleSheetsCollection2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLStyleSheetsCollection2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLStyleSheetsCollection2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLStyleSheetsCollection2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLStyleSheetsCollection2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLStyleSheetsCollection2 methods ***/
    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLStyleSheetsCollection2* This,
        LONG index,
        VARIANT *pvarResult);

    END_INTERFACE
} IHTMLStyleSheetsCollection2Vtbl;
interface IHTMLStyleSheetsCollection2 {
    CONST_VTBL IHTMLStyleSheetsCollection2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLStyleSheetsCollection2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLStyleSheetsCollection2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLStyleSheetsCollection2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLStyleSheetsCollection2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLStyleSheetsCollection2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLStyleSheetsCollection2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLStyleSheetsCollection2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLStyleSheetsCollection2 methods ***/
#define IHTMLStyleSheetsCollection2_item(This,index,pvarResult) (This)->lpVtbl->item(This,index,pvarResult)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetsCollection2_QueryInterface(IHTMLStyleSheetsCollection2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLStyleSheetsCollection2_AddRef(IHTMLStyleSheetsCollection2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLStyleSheetsCollection2_Release(IHTMLStyleSheetsCollection2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetsCollection2_GetTypeInfoCount(IHTMLStyleSheetsCollection2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLStyleSheetsCollection2_GetTypeInfo(IHTMLStyleSheetsCollection2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLStyleSheetsCollection2_GetIDsOfNames(IHTMLStyleSheetsCollection2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLStyleSheetsCollection2_Invoke(IHTMLStyleSheetsCollection2* 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);
}
/*** IHTMLStyleSheetsCollection2 methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetsCollection2_item(IHTMLStyleSheetsCollection2* This,LONG index,VARIANT *pvarResult) {
    return This->lpVtbl->item(This,index,pvarResult);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLStyleSheetsCollection2_item_Proxy(
    IHTMLStyleSheetsCollection2* This,
    LONG index,
    VARIANT *pvarResult);
void __RPC_STUB IHTMLStyleSheetsCollection2_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLStyleSheetsCollection2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLStyleSheetsCollection dispinterface
 */
#ifndef __DispHTMLStyleSheetsCollection_DISPINTERFACE_DEFINED__
#define __DispHTMLStyleSheetsCollection_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLStyleSheetsCollection, 0x3050f547, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f547-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLStyleSheetsCollection : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLStyleSheetsCollection, 0x3050f547, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLStyleSheetsCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLStyleSheetsCollection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLStyleSheetsCollection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLStyleSheetsCollection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLStyleSheetsCollection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLStyleSheetsCollection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLStyleSheetsCollection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLStyleSheetsCollection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLStyleSheetsCollectionVtbl;
interface DispHTMLStyleSheetsCollection {
    CONST_VTBL DispHTMLStyleSheetsCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLStyleSheetsCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLStyleSheetsCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLStyleSheetsCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLStyleSheetsCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLStyleSheetsCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLStyleSheetsCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLStyleSheetsCollection_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 DispHTMLStyleSheetsCollection_QueryInterface(DispHTMLStyleSheetsCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLStyleSheetsCollection_AddRef(DispHTMLStyleSheetsCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLStyleSheetsCollection_Release(DispHTMLStyleSheetsCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLStyleSheetsCollection_GetTypeInfoCount(DispHTMLStyleSheetsCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLStyleSheetsCollection_GetTypeInfo(DispHTMLStyleSheetsCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLStyleSheetsCollection_GetIDsOfNames(DispHTMLStyleSheetsCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLStyleSheetsCollection_Invoke(DispHTMLStyleSheetsCollection* 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  /* __DispHTMLStyleSheetsCollection_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLStyleSheetsCollection coclass
 */

DEFINE_GUID(CLSID_HTMLStyleSheetsCollection, 0x3050f37f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f37f-98b5-11cf-bb82-00aa00bdce0b") HTMLStyleSheetsCollection;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLStyleSheetsCollection, 0x3050f37f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CStyleSheetArray;
/*****************************************************************************
 * HTMLLinkElementEvents2 dispinterface
 */
#ifndef __HTMLLinkElementEvents2_DISPINTERFACE_DEFINED__
#define __HTMLLinkElementEvents2_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLLinkElementEvents2, 0x3050f61d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f61d-98b5-11cf-bb82-00aa00bdce0b")
HTMLLinkElementEvents2 : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLLinkElementEvents2, 0x3050f61d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLLinkElementEvents2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLLinkElementEvents2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLLinkElementEvents2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLLinkElementEvents2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLLinkElementEvents2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLLinkElementEvents2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLLinkElementEvents2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLLinkElementEvents2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLLinkElementEvents2Vtbl;
interface HTMLLinkElementEvents2 {
    CONST_VTBL HTMLLinkElementEvents2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLLinkElementEvents2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLLinkElementEvents2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLLinkElementEvents2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLLinkElementEvents2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLLinkElementEvents2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLLinkElementEvents2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLLinkElementEvents2_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 HTMLLinkElementEvents2_QueryInterface(HTMLLinkElementEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLLinkElementEvents2_AddRef(HTMLLinkElementEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLLinkElementEvents2_Release(HTMLLinkElementEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLLinkElementEvents2_GetTypeInfoCount(HTMLLinkElementEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLLinkElementEvents2_GetTypeInfo(HTMLLinkElementEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLLinkElementEvents2_GetIDsOfNames(HTMLLinkElementEvents2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLLinkElementEvents2_Invoke(HTMLLinkElementEvents2* 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  /* __HTMLLinkElementEvents2_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLLinkElementEvents dispinterface
 */
#ifndef __HTMLLinkElementEvents_DISPINTERFACE_DEFINED__
#define __HTMLLinkElementEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLLinkElementEvents, 0x3050f3cc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f3cc-98b5-11cf-bb82-00aa00bdce0b")
HTMLLinkElementEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLLinkElementEvents, 0x3050f3cc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLLinkElementEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLLinkElementEvents* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLLinkElementEvents* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLLinkElementEvents* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLLinkElementEvents* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLLinkElementEvents* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLLinkElementEvents* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLLinkElementEvents* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLLinkElementEventsVtbl;
interface HTMLLinkElementEvents {
    CONST_VTBL HTMLLinkElementEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLLinkElementEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLLinkElementEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLLinkElementEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLLinkElementEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLLinkElementEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLLinkElementEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLLinkElementEvents_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 HTMLLinkElementEvents_QueryInterface(HTMLLinkElementEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLLinkElementEvents_AddRef(HTMLLinkElementEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLLinkElementEvents_Release(HTMLLinkElementEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLLinkElementEvents_GetTypeInfoCount(HTMLLinkElementEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLLinkElementEvents_GetTypeInfo(HTMLLinkElementEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLLinkElementEvents_GetIDsOfNames(HTMLLinkElementEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLLinkElementEvents_Invoke(HTMLLinkElementEvents* 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  /* __HTMLLinkElementEvents_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLLinkElement interface
 */
#ifndef __IHTMLLinkElement_INTERFACE_DEFINED__
#define __IHTMLLinkElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLLinkElement, 0x3050f205, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f205-98b5-11cf-bb82-00aa00bdce0b")
IHTMLLinkElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_href(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_href(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_rel(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_rel(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_rev(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_rev(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_type(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_readyState(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onreadystatechange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onreadystatechange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onload(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onload(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onerror(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onerror(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_styleSheet(
        IHTMLStyleSheet **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_disabled(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_disabled(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_media(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_media(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLLinkElement, 0x3050f205, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLLinkElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLLinkElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLLinkElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLLinkElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLLinkElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLLinkElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLLinkElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLLinkElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLLinkElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_href)(
        IHTMLLinkElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_href)(
        IHTMLLinkElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_rel)(
        IHTMLLinkElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_rel)(
        IHTMLLinkElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_rev)(
        IHTMLLinkElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_rev)(
        IHTMLLinkElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_type)(
        IHTMLLinkElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLLinkElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_readyState)(
        IHTMLLinkElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_onreadystatechange)(
        IHTMLLinkElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onreadystatechange)(
        IHTMLLinkElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onload)(
        IHTMLLinkElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onload)(
        IHTMLLinkElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onerror)(
        IHTMLLinkElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onerror)(
        IHTMLLinkElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_styleSheet)(
        IHTMLLinkElement* This,
        IHTMLStyleSheet **p);

    HRESULT (STDMETHODCALLTYPE *put_disabled)(
        IHTMLLinkElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_disabled)(
        IHTMLLinkElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_media)(
        IHTMLLinkElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_media)(
        IHTMLLinkElement* This,
        BSTR *p);

    END_INTERFACE
} IHTMLLinkElementVtbl;
interface IHTMLLinkElement {
    CONST_VTBL IHTMLLinkElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLLinkElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLLinkElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLLinkElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLLinkElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLLinkElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLLinkElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLLinkElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLLinkElement methods ***/
#define IHTMLLinkElement_put_href(This,v) (This)->lpVtbl->put_href(This,v)
#define IHTMLLinkElement_get_href(This,p) (This)->lpVtbl->get_href(This,p)
#define IHTMLLinkElement_put_rel(This,v) (This)->lpVtbl->put_rel(This,v)
#define IHTMLLinkElement_get_rel(This,p) (This)->lpVtbl->get_rel(This,p)
#define IHTMLLinkElement_put_rev(This,v) (This)->lpVtbl->put_rev(This,v)
#define IHTMLLinkElement_get_rev(This,p) (This)->lpVtbl->get_rev(This,p)
#define IHTMLLinkElement_put_type(This,v) (This)->lpVtbl->put_type(This,v)
#define IHTMLLinkElement_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#define IHTMLLinkElement_get_readyState(This,p) (This)->lpVtbl->get_readyState(This,p)
#define IHTMLLinkElement_put_onreadystatechange(This,v) (This)->lpVtbl->put_onreadystatechange(This,v)
#define IHTMLLinkElement_get_onreadystatechange(This,p) (This)->lpVtbl->get_onreadystatechange(This,p)
#define IHTMLLinkElement_put_onload(This,v) (This)->lpVtbl->put_onload(This,v)
#define IHTMLLinkElement_get_onload(This,p) (This)->lpVtbl->get_onload(This,p)
#define IHTMLLinkElement_put_onerror(This,v) (This)->lpVtbl->put_onerror(This,v)
#define IHTMLLinkElement_get_onerror(This,p) (This)->lpVtbl->get_onerror(This,p)
#define IHTMLLinkElement_get_styleSheet(This,p) (This)->lpVtbl->get_styleSheet(This,p)
#define IHTMLLinkElement_put_disabled(This,v) (This)->lpVtbl->put_disabled(This,v)
#define IHTMLLinkElement_get_disabled(This,p) (This)->lpVtbl->get_disabled(This,p)
#define IHTMLLinkElement_put_media(This,v) (This)->lpVtbl->put_media(This,v)
#define IHTMLLinkElement_get_media(This,p) (This)->lpVtbl->get_media(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLLinkElement_QueryInterface(IHTMLLinkElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLLinkElement_AddRef(IHTMLLinkElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLLinkElement_Release(IHTMLLinkElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLLinkElement_GetTypeInfoCount(IHTMLLinkElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLLinkElement_GetTypeInfo(IHTMLLinkElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLLinkElement_GetIDsOfNames(IHTMLLinkElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLLinkElement_Invoke(IHTMLLinkElement* 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);
}
/*** IHTMLLinkElement methods ***/
static FORCEINLINE HRESULT IHTMLLinkElement_put_href(IHTMLLinkElement* This,BSTR v) {
    return This->lpVtbl->put_href(This,v);
}
static FORCEINLINE HRESULT IHTMLLinkElement_get_href(IHTMLLinkElement* This,BSTR *p) {
    return This->lpVtbl->get_href(This,p);
}
static FORCEINLINE HRESULT IHTMLLinkElement_put_rel(IHTMLLinkElement* This,BSTR v) {
    return This->lpVtbl->put_rel(This,v);
}
static FORCEINLINE HRESULT IHTMLLinkElement_get_rel(IHTMLLinkElement* This,BSTR *p) {
    return This->lpVtbl->get_rel(This,p);
}
static FORCEINLINE HRESULT IHTMLLinkElement_put_rev(IHTMLLinkElement* This,BSTR v) {
    return This->lpVtbl->put_rev(This,v);
}
static FORCEINLINE HRESULT IHTMLLinkElement_get_rev(IHTMLLinkElement* This,BSTR *p) {
    return This->lpVtbl->get_rev(This,p);
}
static FORCEINLINE HRESULT IHTMLLinkElement_put_type(IHTMLLinkElement* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static FORCEINLINE HRESULT IHTMLLinkElement_get_type(IHTMLLinkElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static FORCEINLINE HRESULT IHTMLLinkElement_get_readyState(IHTMLLinkElement* This,BSTR *p) {
    return This->lpVtbl->get_readyState(This,p);
}
static FORCEINLINE HRESULT IHTMLLinkElement_put_onreadystatechange(IHTMLLinkElement* This,VARIANT v) {
    return This->lpVtbl->put_onreadystatechange(This,v);
}
static FORCEINLINE HRESULT IHTMLLinkElement_get_onreadystatechange(IHTMLLinkElement* This,VARIANT *p) {
    return This->lpVtbl->get_onreadystatechange(This,p);
}
static FORCEINLINE HRESULT IHTMLLinkElement_put_onload(IHTMLLinkElement* This,VARIANT v) {
    return This->lpVtbl->put_onload(This,v);
}
static FORCEINLINE HRESULT IHTMLLinkElement_get_onload(IHTMLLinkElement* This,VARIANT *p) {
    return This->lpVtbl->get_onload(This,p);
}
static FORCEINLINE HRESULT IHTMLLinkElement_put_onerror(IHTMLLinkElement* This,VARIANT v) {
    return This->lpVtbl->put_onerror(This,v);
}
static FORCEINLINE HRESULT IHTMLLinkElement_get_onerror(IHTMLLinkElement* This,VARIANT *p) {
    return This->lpVtbl->get_onerror(This,p);
}
static FORCEINLINE HRESULT IHTMLLinkElement_get_styleSheet(IHTMLLinkElement* This,IHTMLStyleSheet **p) {
    return This->lpVtbl->get_styleSheet(This,p);
}
static FORCEINLINE HRESULT IHTMLLinkElement_put_disabled(IHTMLLinkElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_disabled(This,v);
}
static FORCEINLINE HRESULT IHTMLLinkElement_get_disabled(IHTMLLinkElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_disabled(This,p);
}
static FORCEINLINE HRESULT IHTMLLinkElement_put_media(IHTMLLinkElement* This,BSTR v) {
    return This->lpVtbl->put_media(This,v);
}
static FORCEINLINE HRESULT IHTMLLinkElement_get_media(IHTMLLinkElement* This,BSTR *p) {
    return This->lpVtbl->get_media(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLLinkElement_put_href_Proxy(
    IHTMLLinkElement* This,
    BSTR v);
void __RPC_STUB IHTMLLinkElement_put_href_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLinkElement_get_href_Proxy(
    IHTMLLinkElement* This,
    BSTR *p);
void __RPC_STUB IHTMLLinkElement_get_href_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLinkElement_put_rel_Proxy(
    IHTMLLinkElement* This,
    BSTR v);
void __RPC_STUB IHTMLLinkElement_put_rel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLinkElement_get_rel_Proxy(
    IHTMLLinkElement* This,
    BSTR *p);
void __RPC_STUB IHTMLLinkElement_get_rel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLinkElement_put_rev_Proxy(
    IHTMLLinkElement* This,
    BSTR v);
void __RPC_STUB IHTMLLinkElement_put_rev_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLinkElement_get_rev_Proxy(
    IHTMLLinkElement* This,
    BSTR *p);
void __RPC_STUB IHTMLLinkElement_get_rev_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLinkElement_put_type_Proxy(
    IHTMLLinkElement* This,
    BSTR v);
void __RPC_STUB IHTMLLinkElement_put_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLinkElement_get_type_Proxy(
    IHTMLLinkElement* This,
    BSTR *p);
void __RPC_STUB IHTMLLinkElement_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLinkElement_get_readyState_Proxy(
    IHTMLLinkElement* This,
    BSTR *p);
void __RPC_STUB IHTMLLinkElement_get_readyState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLinkElement_put_onreadystatechange_Proxy(
    IHTMLLinkElement* This,
    VARIANT v);
void __RPC_STUB IHTMLLinkElement_put_onreadystatechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLinkElement_get_onreadystatechange_Proxy(
    IHTMLLinkElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLLinkElement_get_onreadystatechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLinkElement_put_onload_Proxy(
    IHTMLLinkElement* This,
    VARIANT v);
void __RPC_STUB IHTMLLinkElement_put_onload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLinkElement_get_onload_Proxy(
    IHTMLLinkElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLLinkElement_get_onload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLinkElement_put_onerror_Proxy(
    IHTMLLinkElement* This,
    VARIANT v);
void __RPC_STUB IHTMLLinkElement_put_onerror_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLinkElement_get_onerror_Proxy(
    IHTMLLinkElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLLinkElement_get_onerror_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLinkElement_get_styleSheet_Proxy(
    IHTMLLinkElement* This,
    IHTMLStyleSheet **p);
void __RPC_STUB IHTMLLinkElement_get_styleSheet_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLinkElement_put_disabled_Proxy(
    IHTMLLinkElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLLinkElement_put_disabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLinkElement_get_disabled_Proxy(
    IHTMLLinkElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLLinkElement_get_disabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLinkElement_put_media_Proxy(
    IHTMLLinkElement* This,
    BSTR v);
void __RPC_STUB IHTMLLinkElement_put_media_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLinkElement_get_media_Proxy(
    IHTMLLinkElement* This,
    BSTR *p);
void __RPC_STUB IHTMLLinkElement_get_media_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLLinkElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLLinkElement2 interface
 */
#ifndef __IHTMLLinkElement2_INTERFACE_DEFINED__
#define __IHTMLLinkElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLLinkElement2, 0x3050f4e5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f4e5-98b5-11cf-bb82-00aa00bdce0b")
IHTMLLinkElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_target(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_target(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLLinkElement2, 0x3050f4e5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLLinkElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLLinkElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLLinkElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLLinkElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLLinkElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLLinkElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLLinkElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLLinkElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLLinkElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_target)(
        IHTMLLinkElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_target)(
        IHTMLLinkElement2* This,
        BSTR *p);

    END_INTERFACE
} IHTMLLinkElement2Vtbl;
interface IHTMLLinkElement2 {
    CONST_VTBL IHTMLLinkElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLLinkElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLLinkElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLLinkElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLLinkElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLLinkElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLLinkElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLLinkElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLLinkElement2 methods ***/
#define IHTMLLinkElement2_put_target(This,v) (This)->lpVtbl->put_target(This,v)
#define IHTMLLinkElement2_get_target(This,p) (This)->lpVtbl->get_target(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLLinkElement2_QueryInterface(IHTMLLinkElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLLinkElement2_AddRef(IHTMLLinkElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLLinkElement2_Release(IHTMLLinkElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLLinkElement2_GetTypeInfoCount(IHTMLLinkElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLLinkElement2_GetTypeInfo(IHTMLLinkElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLLinkElement2_GetIDsOfNames(IHTMLLinkElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLLinkElement2_Invoke(IHTMLLinkElement2* 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);
}
/*** IHTMLLinkElement2 methods ***/
static FORCEINLINE HRESULT IHTMLLinkElement2_put_target(IHTMLLinkElement2* This,BSTR v) {
    return This->lpVtbl->put_target(This,v);
}
static FORCEINLINE HRESULT IHTMLLinkElement2_get_target(IHTMLLinkElement2* This,BSTR *p) {
    return This->lpVtbl->get_target(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLLinkElement2_put_target_Proxy(
    IHTMLLinkElement2* This,
    BSTR v);
void __RPC_STUB IHTMLLinkElement2_put_target_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLinkElement2_get_target_Proxy(
    IHTMLLinkElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLLinkElement2_get_target_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLLinkElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLLinkElement3 interface
 */
#ifndef __IHTMLLinkElement3_INTERFACE_DEFINED__
#define __IHTMLLinkElement3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLLinkElement3, 0x3050f81e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f81e-98b5-11cf-bb82-00aa00bdce0b")
IHTMLLinkElement3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_charset(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_charset(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_hreflang(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_hreflang(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLLinkElement3, 0x3050f81e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLLinkElement3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLLinkElement3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLLinkElement3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLLinkElement3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLLinkElement3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLLinkElement3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLLinkElement3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLLinkElement3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLLinkElement3 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_charset)(
        IHTMLLinkElement3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_charset)(
        IHTMLLinkElement3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_hreflang)(
        IHTMLLinkElement3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_hreflang)(
        IHTMLLinkElement3* This,
        BSTR *p);

    END_INTERFACE
} IHTMLLinkElement3Vtbl;
interface IHTMLLinkElement3 {
    CONST_VTBL IHTMLLinkElement3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLLinkElement3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLLinkElement3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLLinkElement3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLLinkElement3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLLinkElement3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLLinkElement3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLLinkElement3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLLinkElement3 methods ***/
#define IHTMLLinkElement3_put_charset(This,v) (This)->lpVtbl->put_charset(This,v)
#define IHTMLLinkElement3_get_charset(This,p) (This)->lpVtbl->get_charset(This,p)
#define IHTMLLinkElement3_put_hreflang(This,v) (This)->lpVtbl->put_hreflang(This,v)
#define IHTMLLinkElement3_get_hreflang(This,p) (This)->lpVtbl->get_hreflang(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLLinkElement3_QueryInterface(IHTMLLinkElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLLinkElement3_AddRef(IHTMLLinkElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLLinkElement3_Release(IHTMLLinkElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLLinkElement3_GetTypeInfoCount(IHTMLLinkElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLLinkElement3_GetTypeInfo(IHTMLLinkElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLLinkElement3_GetIDsOfNames(IHTMLLinkElement3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLLinkElement3_Invoke(IHTMLLinkElement3* 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);
}
/*** IHTMLLinkElement3 methods ***/
static FORCEINLINE HRESULT IHTMLLinkElement3_put_charset(IHTMLLinkElement3* This,BSTR v) {
    return This->lpVtbl->put_charset(This,v);
}
static FORCEINLINE HRESULT IHTMLLinkElement3_get_charset(IHTMLLinkElement3* This,BSTR *p) {
    return This->lpVtbl->get_charset(This,p);
}
static FORCEINLINE HRESULT IHTMLLinkElement3_put_hreflang(IHTMLLinkElement3* This,BSTR v) {
    return This->lpVtbl->put_hreflang(This,v);
}
static FORCEINLINE HRESULT IHTMLLinkElement3_get_hreflang(IHTMLLinkElement3* This,BSTR *p) {
    return This->lpVtbl->get_hreflang(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLLinkElement3_put_charset_Proxy(
    IHTMLLinkElement3* This,
    BSTR v);
void __RPC_STUB IHTMLLinkElement3_put_charset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLinkElement3_get_charset_Proxy(
    IHTMLLinkElement3* This,
    BSTR *p);
void __RPC_STUB IHTMLLinkElement3_get_charset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLinkElement3_put_hreflang_Proxy(
    IHTMLLinkElement3* This,
    BSTR v);
void __RPC_STUB IHTMLLinkElement3_put_hreflang_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLinkElement3_get_hreflang_Proxy(
    IHTMLLinkElement3* This,
    BSTR *p);
void __RPC_STUB IHTMLLinkElement3_get_hreflang_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLLinkElement3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLLinkElement4 interface
 */
#ifndef __IHTMLLinkElement4_INTERFACE_DEFINED__
#define __IHTMLLinkElement4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLLinkElement4, 0x3051043a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051043a-98b5-11cf-bb82-00aa00bdce0b")
IHTMLLinkElement4 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_href(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_href(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLLinkElement4, 0x3051043a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLLinkElement4Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLLinkElement4* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLLinkElement4* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLLinkElement4* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLLinkElement4* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLLinkElement4* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLLinkElement4* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLLinkElement4* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLLinkElement4 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_href)(
        IHTMLLinkElement4* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_href)(
        IHTMLLinkElement4* This,
        BSTR *p);

    END_INTERFACE
} IHTMLLinkElement4Vtbl;
interface IHTMLLinkElement4 {
    CONST_VTBL IHTMLLinkElement4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLLinkElement4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLLinkElement4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLLinkElement4_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLLinkElement4_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLLinkElement4_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLLinkElement4_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLLinkElement4_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLLinkElement4 methods ***/
#define IHTMLLinkElement4_put_href(This,v) (This)->lpVtbl->put_href(This,v)
#define IHTMLLinkElement4_get_href(This,p) (This)->lpVtbl->get_href(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLLinkElement4_QueryInterface(IHTMLLinkElement4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLLinkElement4_AddRef(IHTMLLinkElement4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLLinkElement4_Release(IHTMLLinkElement4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLLinkElement4_GetTypeInfoCount(IHTMLLinkElement4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLLinkElement4_GetTypeInfo(IHTMLLinkElement4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLLinkElement4_GetIDsOfNames(IHTMLLinkElement4* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLLinkElement4_Invoke(IHTMLLinkElement4* 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);
}
/*** IHTMLLinkElement4 methods ***/
static FORCEINLINE HRESULT IHTMLLinkElement4_put_href(IHTMLLinkElement4* This,BSTR v) {
    return This->lpVtbl->put_href(This,v);
}
static FORCEINLINE HRESULT IHTMLLinkElement4_get_href(IHTMLLinkElement4* This,BSTR *p) {
    return This->lpVtbl->get_href(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLLinkElement4_put_href_Proxy(
    IHTMLLinkElement4* This,
    BSTR v);
void __RPC_STUB IHTMLLinkElement4_put_href_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLinkElement4_get_href_Proxy(
    IHTMLLinkElement4* This,
    BSTR *p);
void __RPC_STUB IHTMLLinkElement4_get_href_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLLinkElement4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLLinkElement5 interface
 */
#ifndef __IHTMLLinkElement5_INTERFACE_DEFINED__
#define __IHTMLLinkElement5_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLLinkElement5, 0x30510726, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510726-98b5-11cf-bb82-00aa00bdce0b")
IHTMLLinkElement5 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_sheet(
        IHTMLStyleSheet **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLLinkElement5, 0x30510726, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLLinkElement5Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLLinkElement5* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLLinkElement5* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLLinkElement5* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLLinkElement5* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLLinkElement5* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLLinkElement5* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLLinkElement5* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLLinkElement5 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_sheet)(
        IHTMLLinkElement5* This,
        IHTMLStyleSheet **p);

    END_INTERFACE
} IHTMLLinkElement5Vtbl;
interface IHTMLLinkElement5 {
    CONST_VTBL IHTMLLinkElement5Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLLinkElement5_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLLinkElement5_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLLinkElement5_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLLinkElement5_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLLinkElement5_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLLinkElement5_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLLinkElement5_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLLinkElement5 methods ***/
#define IHTMLLinkElement5_get_sheet(This,p) (This)->lpVtbl->get_sheet(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLLinkElement5_QueryInterface(IHTMLLinkElement5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLLinkElement5_AddRef(IHTMLLinkElement5* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLLinkElement5_Release(IHTMLLinkElement5* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLLinkElement5_GetTypeInfoCount(IHTMLLinkElement5* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLLinkElement5_GetTypeInfo(IHTMLLinkElement5* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLLinkElement5_GetIDsOfNames(IHTMLLinkElement5* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLLinkElement5_Invoke(IHTMLLinkElement5* 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);
}
/*** IHTMLLinkElement5 methods ***/
static FORCEINLINE HRESULT IHTMLLinkElement5_get_sheet(IHTMLLinkElement5* This,IHTMLStyleSheet **p) {
    return This->lpVtbl->get_sheet(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLLinkElement5_get_sheet_Proxy(
    IHTMLLinkElement5* This,
    IHTMLStyleSheet **p);
void __RPC_STUB IHTMLLinkElement5_get_sheet_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLLinkElement5_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLLinkElement dispinterface
 */
#ifndef __DispHTMLLinkElement_DISPINTERFACE_DEFINED__
#define __DispHTMLLinkElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLLinkElement, 0x3050f524, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f524-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLLinkElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLLinkElement, 0x3050f524, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLLinkElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLLinkElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLLinkElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLLinkElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLLinkElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLLinkElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLLinkElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLLinkElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLLinkElementVtbl;
interface DispHTMLLinkElement {
    CONST_VTBL DispHTMLLinkElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLLinkElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLLinkElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLLinkElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLLinkElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLLinkElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLLinkElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLLinkElement_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 DispHTMLLinkElement_QueryInterface(DispHTMLLinkElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLLinkElement_AddRef(DispHTMLLinkElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLLinkElement_Release(DispHTMLLinkElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLLinkElement_GetTypeInfoCount(DispHTMLLinkElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLLinkElement_GetTypeInfo(DispHTMLLinkElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLLinkElement_GetIDsOfNames(DispHTMLLinkElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLLinkElement_Invoke(DispHTMLLinkElement* 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  /* __DispHTMLLinkElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLLinkElement coclass
 */

DEFINE_GUID(CLSID_HTMLLinkElement, 0x3050f277, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f277-98b5-11cf-bb82-00aa00bdce0b") HTMLLinkElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLLinkElement, 0x3050f277, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CLinkElement;
typedef enum _htmlUnit {
    htmlUnitCharacter = 1,
    htmlUnitWord = 2,
    htmlUnitSentence = 3,
    htmlUnitTextEdit = 6,
    htmlUnit_Max = 0x7fffffff
} htmlUnit;
typedef enum _htmlEndPoints {
    htmlEndPointsStartToStart = 1,
    htmlEndPointsStartToEnd = 2,
    htmlEndPointsEndToStart = 3,
    htmlEndPointsEndToEnd = 4,
    htmlEndPoints_Max = 0x7fffffff
} htmlEndPoints;
typedef enum _htmlDirection {
    htmlDirectionForward = 99999,
    htmlDirectionBackward = -99999,
    htmlDirection_Max = 0x7fffffff
} htmlDirection;
/*****************************************************************************
 * IHTMLTxtRange interface
 */
#ifndef __IHTMLTxtRange_INTERFACE_DEFINED__
#define __IHTMLTxtRange_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTxtRange, 0x3050f220, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f220-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTxtRange : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_htmlText(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_text(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_text(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE parentElement(
        IHTMLElement **parent) = 0;

    virtual HRESULT STDMETHODCALLTYPE duplicate(
        IHTMLTxtRange **Duplicate) = 0;

    virtual HRESULT STDMETHODCALLTYPE inRange(
        IHTMLTxtRange *Range,
        VARIANT_BOOL *InRange) = 0;

    virtual HRESULT STDMETHODCALLTYPE isEqual(
        IHTMLTxtRange *Range,
        VARIANT_BOOL *IsEqual) = 0;

    virtual HRESULT STDMETHODCALLTYPE scrollIntoView(
        VARIANT_BOOL fStart = -1) = 0;

    virtual HRESULT STDMETHODCALLTYPE collapse(
        VARIANT_BOOL Start = -1) = 0;

    virtual HRESULT STDMETHODCALLTYPE expand(
        BSTR Unit,
        VARIANT_BOOL *Success) = 0;

    virtual HRESULT STDMETHODCALLTYPE move(
        BSTR Unit,
        LONG Count = 1,
        LONG *ActualCount = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE moveStart(
        BSTR Unit,
        LONG Count = 1,
        LONG *ActualCount = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE moveEnd(
        BSTR Unit,
        LONG Count = 1,
        LONG *ActualCount = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE select(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE pasteHTML(
        BSTR html) = 0;

    virtual HRESULT STDMETHODCALLTYPE moveToElementText(
        IHTMLElement *element) = 0;

    virtual HRESULT STDMETHODCALLTYPE setEndPoint(
        BSTR how,
        IHTMLTxtRange *SourceRange) = 0;

    virtual HRESULT STDMETHODCALLTYPE compareEndPoints(
        BSTR how,
        IHTMLTxtRange *SourceRange,
        LONG *ret) = 0;

    virtual HRESULT STDMETHODCALLTYPE findText(
        BSTR String,
        LONG count = 1073741823,
        LONG Flags = 0,
        VARIANT_BOOL *Success = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE moveToPoint(
        LONG x,
        LONG y) = 0;

    virtual HRESULT STDMETHODCALLTYPE getBookmark(
        BSTR *Boolmark) = 0;

    virtual HRESULT STDMETHODCALLTYPE moveToBookmark(
        BSTR Bookmark,
        VARIANT_BOOL *Success) = 0;

    virtual HRESULT STDMETHODCALLTYPE queryCommandSupported(
        BSTR cmdID,
        VARIANT_BOOL *pfRet) = 0;

    virtual HRESULT STDMETHODCALLTYPE queryCommandEnabled(
        BSTR cmdID,
        VARIANT_BOOL *pfRet) = 0;

    virtual HRESULT STDMETHODCALLTYPE queryCommandState(
        BSTR cmdID,
        VARIANT_BOOL *pfRet) = 0;

    virtual HRESULT STDMETHODCALLTYPE queryCommandIndeterm(
        BSTR cmdID,
        VARIANT_BOOL *pfRet) = 0;

    virtual HRESULT STDMETHODCALLTYPE queryCommandText(
        BSTR cmdID,
        BSTR *pcmdText) = 0;

    virtual HRESULT STDMETHODCALLTYPE queryCommandValue(
        BSTR cmdID,
        VARIANT *pcmdValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE execCommand(
        BSTR cmdID,
        VARIANT_BOOL showUI,
        VARIANT value,
        VARIANT_BOOL *pfRet) = 0;

    virtual HRESULT STDMETHODCALLTYPE execCommandShowHelp(
        BSTR cmdID,
        VARIANT_BOOL *pfRet) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTxtRange, 0x3050f220, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTxtRangeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTxtRange* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTxtRange* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTxtRange* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTxtRange* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTxtRange* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTxtRange* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTxtRange* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLTxtRange methods ***/
    HRESULT (STDMETHODCALLTYPE *get_htmlText)(
        IHTMLTxtRange* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_text)(
        IHTMLTxtRange* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_text)(
        IHTMLTxtRange* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *parentElement)(
        IHTMLTxtRange* This,
        IHTMLElement **parent);

    HRESULT (STDMETHODCALLTYPE *duplicate)(
        IHTMLTxtRange* This,
        IHTMLTxtRange **Duplicate);

    HRESULT (STDMETHODCALLTYPE *inRange)(
        IHTMLTxtRange* This,
        IHTMLTxtRange *Range,
        VARIANT_BOOL *InRange);

    HRESULT (STDMETHODCALLTYPE *isEqual)(
        IHTMLTxtRange* This,
        IHTMLTxtRange *Range,
        VARIANT_BOOL *IsEqual);

    HRESULT (STDMETHODCALLTYPE *scrollIntoView)(
        IHTMLTxtRange* This,
        VARIANT_BOOL fStart);

    HRESULT (STDMETHODCALLTYPE *collapse)(
        IHTMLTxtRange* This,
        VARIANT_BOOL Start);

    HRESULT (STDMETHODCALLTYPE *expand)(
        IHTMLTxtRange* This,
        BSTR Unit,
        VARIANT_BOOL *Success);

    HRESULT (STDMETHODCALLTYPE *move)(
        IHTMLTxtRange* This,
        BSTR Unit,
        LONG Count,
        LONG *ActualCount);

    HRESULT (STDMETHODCALLTYPE *moveStart)(
        IHTMLTxtRange* This,
        BSTR Unit,
        LONG Count,
        LONG *ActualCount);

    HRESULT (STDMETHODCALLTYPE *moveEnd)(
        IHTMLTxtRange* This,
        BSTR Unit,
        LONG Count,
        LONG *ActualCount);

    HRESULT (STDMETHODCALLTYPE *select)(
        IHTMLTxtRange* This);

    HRESULT (STDMETHODCALLTYPE *pasteHTML)(
        IHTMLTxtRange* This,
        BSTR html);

    HRESULT (STDMETHODCALLTYPE *moveToElementText)(
        IHTMLTxtRange* This,
        IHTMLElement *element);

    HRESULT (STDMETHODCALLTYPE *setEndPoint)(
        IHTMLTxtRange* This,
        BSTR how,
        IHTMLTxtRange *SourceRange);

    HRESULT (STDMETHODCALLTYPE *compareEndPoints)(
        IHTMLTxtRange* This,
        BSTR how,
        IHTMLTxtRange *SourceRange,
        LONG *ret);

    HRESULT (STDMETHODCALLTYPE *findText)(
        IHTMLTxtRange* This,
        BSTR String,
        LONG count,
        LONG Flags,
        VARIANT_BOOL *Success);

    HRESULT (STDMETHODCALLTYPE *moveToPoint)(
        IHTMLTxtRange* This,
        LONG x,
        LONG y);

    HRESULT (STDMETHODCALLTYPE *getBookmark)(
        IHTMLTxtRange* This,
        BSTR *Boolmark);

    HRESULT (STDMETHODCALLTYPE *moveToBookmark)(
        IHTMLTxtRange* This,
        BSTR Bookmark,
        VARIANT_BOOL *Success);

    HRESULT (STDMETHODCALLTYPE *queryCommandSupported)(
        IHTMLTxtRange* This,
        BSTR cmdID,
        VARIANT_BOOL *pfRet);

    HRESULT (STDMETHODCALLTYPE *queryCommandEnabled)(
        IHTMLTxtRange* This,
        BSTR cmdID,
        VARIANT_BOOL *pfRet);

    HRESULT (STDMETHODCALLTYPE *queryCommandState)(
        IHTMLTxtRange* This,
        BSTR cmdID,
        VARIANT_BOOL *pfRet);

    HRESULT (STDMETHODCALLTYPE *queryCommandIndeterm)(
        IHTMLTxtRange* This,
        BSTR cmdID,
        VARIANT_BOOL *pfRet);

    HRESULT (STDMETHODCALLTYPE *queryCommandText)(
        IHTMLTxtRange* This,
        BSTR cmdID,
        BSTR *pcmdText);

    HRESULT (STDMETHODCALLTYPE *queryCommandValue)(
        IHTMLTxtRange* This,
        BSTR cmdID,
        VARIANT *pcmdValue);

    HRESULT (STDMETHODCALLTYPE *execCommand)(
        IHTMLTxtRange* This,
        BSTR cmdID,
        VARIANT_BOOL showUI,
        VARIANT value,
        VARIANT_BOOL *pfRet);

    HRESULT (STDMETHODCALLTYPE *execCommandShowHelp)(
        IHTMLTxtRange* This,
        BSTR cmdID,
        VARIANT_BOOL *pfRet);

    END_INTERFACE
} IHTMLTxtRangeVtbl;
interface IHTMLTxtRange {
    CONST_VTBL IHTMLTxtRangeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTxtRange_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTxtRange_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTxtRange_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTxtRange_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTxtRange_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTxtRange_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTxtRange_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLTxtRange methods ***/
#define IHTMLTxtRange_get_htmlText(This,p) (This)->lpVtbl->get_htmlText(This,p)
#define IHTMLTxtRange_put_text(This,v) (This)->lpVtbl->put_text(This,v)
#define IHTMLTxtRange_get_text(This,p) (This)->lpVtbl->get_text(This,p)
#define IHTMLTxtRange_parentElement(This,parent) (This)->lpVtbl->parentElement(This,parent)
#define IHTMLTxtRange_duplicate(This,Duplicate) (This)->lpVtbl->duplicate(This,Duplicate)
#define IHTMLTxtRange_inRange(This,Range,InRange) (This)->lpVtbl->inRange(This,Range,InRange)
#define IHTMLTxtRange_isEqual(This,Range,IsEqual) (This)->lpVtbl->isEqual(This,Range,IsEqual)
#define IHTMLTxtRange_scrollIntoView(This,fStart) (This)->lpVtbl->scrollIntoView(This,fStart)
#define IHTMLTxtRange_collapse(This,Start) (This)->lpVtbl->collapse(This,Start)
#define IHTMLTxtRange_expand(This,Unit,Success) (This)->lpVtbl->expand(This,Unit,Success)
#define IHTMLTxtRange_move(This,Unit,Count,ActualCount) (This)->lpVtbl->move(This,Unit,Count,ActualCount)
#define IHTMLTxtRange_moveStart(This,Unit,Count,ActualCount) (This)->lpVtbl->moveStart(This,Unit,Count,ActualCount)
#define IHTMLTxtRange_moveEnd(This,Unit,Count,ActualCount) (This)->lpVtbl->moveEnd(This,Unit,Count,ActualCount)
#define IHTMLTxtRange_select(This) (This)->lpVtbl->select(This)
#define IHTMLTxtRange_pasteHTML(This,html) (This)->lpVtbl->pasteHTML(This,html)
#define IHTMLTxtRange_moveToElementText(This,element) (This)->lpVtbl->moveToElementText(This,element)
#define IHTMLTxtRange_setEndPoint(This,how,SourceRange) (This)->lpVtbl->setEndPoint(This,how,SourceRange)
#define IHTMLTxtRange_compareEndPoints(This,how,SourceRange,ret) (This)->lpVtbl->compareEndPoints(This,how,SourceRange,ret)
#define IHTMLTxtRange_findText(This,String,count,Flags,Success) (This)->lpVtbl->findText(This,String,count,Flags,Success)
#define IHTMLTxtRange_moveToPoint(This,x,y) (This)->lpVtbl->moveToPoint(This,x,y)
#define IHTMLTxtRange_getBookmark(This,Boolmark) (This)->lpVtbl->getBookmark(This,Boolmark)
#define IHTMLTxtRange_moveToBookmark(This,Bookmark,Success) (This)->lpVtbl->moveToBookmark(This,Bookmark,Success)
#define IHTMLTxtRange_queryCommandSupported(This,cmdID,pfRet) (This)->lpVtbl->queryCommandSupported(This,cmdID,pfRet)
#define IHTMLTxtRange_queryCommandEnabled(This,cmdID,pfRet) (This)->lpVtbl->queryCommandEnabled(This,cmdID,pfRet)
#define IHTMLTxtRange_queryCommandState(This,cmdID,pfRet) (This)->lpVtbl->queryCommandState(This,cmdID,pfRet)
#define IHTMLTxtRange_queryCommandIndeterm(This,cmdID,pfRet) (This)->lpVtbl->queryCommandIndeterm(This,cmdID,pfRet)
#define IHTMLTxtRange_queryCommandText(This,cmdID,pcmdText) (This)->lpVtbl->queryCommandText(This,cmdID,pcmdText)
#define IHTMLTxtRange_queryCommandValue(This,cmdID,pcmdValue) (This)->lpVtbl->queryCommandValue(This,cmdID,pcmdValue)
#define IHTMLTxtRange_execCommand(This,cmdID,showUI,value,pfRet) (This)->lpVtbl->execCommand(This,cmdID,showUI,value,pfRet)
#define IHTMLTxtRange_execCommandShowHelp(This,cmdID,pfRet) (This)->lpVtbl->execCommandShowHelp(This,cmdID,pfRet)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLTxtRange_QueryInterface(IHTMLTxtRange* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTxtRange_AddRef(IHTMLTxtRange* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTxtRange_Release(IHTMLTxtRange* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTxtRange_GetTypeInfoCount(IHTMLTxtRange* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTxtRange_GetTypeInfo(IHTMLTxtRange* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTxtRange_GetIDsOfNames(IHTMLTxtRange* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTxtRange_Invoke(IHTMLTxtRange* 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);
}
/*** IHTMLTxtRange methods ***/
static FORCEINLINE HRESULT IHTMLTxtRange_get_htmlText(IHTMLTxtRange* This,BSTR *p) {
    return This->lpVtbl->get_htmlText(This,p);
}
static FORCEINLINE HRESULT IHTMLTxtRange_put_text(IHTMLTxtRange* This,BSTR v) {
    return This->lpVtbl->put_text(This,v);
}
static FORCEINLINE HRESULT IHTMLTxtRange_get_text(IHTMLTxtRange* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static FORCEINLINE HRESULT IHTMLTxtRange_parentElement(IHTMLTxtRange* This,IHTMLElement **parent) {
    return This->lpVtbl->parentElement(This,parent);
}
static FORCEINLINE HRESULT IHTMLTxtRange_duplicate(IHTMLTxtRange* This,IHTMLTxtRange **Duplicate) {
    return This->lpVtbl->duplicate(This,Duplicate);
}
static FORCEINLINE HRESULT IHTMLTxtRange_inRange(IHTMLTxtRange* This,IHTMLTxtRange *Range,VARIANT_BOOL *InRange) {
    return This->lpVtbl->inRange(This,Range,InRange);
}
static FORCEINLINE HRESULT IHTMLTxtRange_isEqual(IHTMLTxtRange* This,IHTMLTxtRange *Range,VARIANT_BOOL *IsEqual) {
    return This->lpVtbl->isEqual(This,Range,IsEqual);
}
static FORCEINLINE HRESULT IHTMLTxtRange_scrollIntoView(IHTMLTxtRange* This,VARIANT_BOOL fStart) {
    return This->lpVtbl->scrollIntoView(This,fStart);
}
static FORCEINLINE HRESULT IHTMLTxtRange_collapse(IHTMLTxtRange* This,VARIANT_BOOL Start) {
    return This->lpVtbl->collapse(This,Start);
}
static FORCEINLINE HRESULT IHTMLTxtRange_expand(IHTMLTxtRange* This,BSTR Unit,VARIANT_BOOL *Success) {
    return This->lpVtbl->expand(This,Unit,Success);
}
static FORCEINLINE HRESULT IHTMLTxtRange_move(IHTMLTxtRange* This,BSTR Unit,LONG Count,LONG *ActualCount) {
    return This->lpVtbl->move(This,Unit,Count,ActualCount);
}
static FORCEINLINE HRESULT IHTMLTxtRange_moveStart(IHTMLTxtRange* This,BSTR Unit,LONG Count,LONG *ActualCount) {
    return This->lpVtbl->moveStart(This,Unit,Count,ActualCount);
}
static FORCEINLINE HRESULT IHTMLTxtRange_moveEnd(IHTMLTxtRange* This,BSTR Unit,LONG Count,LONG *ActualCount) {
    return This->lpVtbl->moveEnd(This,Unit,Count,ActualCount);
}
static FORCEINLINE HRESULT IHTMLTxtRange_select(IHTMLTxtRange* This) {
    return This->lpVtbl->select(This);
}
static FORCEINLINE HRESULT IHTMLTxtRange_pasteHTML(IHTMLTxtRange* This,BSTR html) {
    return This->lpVtbl->pasteHTML(This,html);
}
static FORCEINLINE HRESULT IHTMLTxtRange_moveToElementText(IHTMLTxtRange* This,IHTMLElement *element) {
    return This->lpVtbl->moveToElementText(This,element);
}
static FORCEINLINE HRESULT IHTMLTxtRange_setEndPoint(IHTMLTxtRange* This,BSTR how,IHTMLTxtRange *SourceRange) {
    return This->lpVtbl->setEndPoint(This,how,SourceRange);
}
static FORCEINLINE HRESULT IHTMLTxtRange_compareEndPoints(IHTMLTxtRange* This,BSTR how,IHTMLTxtRange *SourceRange,LONG *ret) {
    return This->lpVtbl->compareEndPoints(This,how,SourceRange,ret);
}
static FORCEINLINE HRESULT IHTMLTxtRange_findText(IHTMLTxtRange* This,BSTR String,LONG count,LONG Flags,VARIANT_BOOL *Success) {
    return This->lpVtbl->findText(This,String,count,Flags,Success);
}
static FORCEINLINE HRESULT IHTMLTxtRange_moveToPoint(IHTMLTxtRange* This,LONG x,LONG y) {
    return This->lpVtbl->moveToPoint(This,x,y);
}
static FORCEINLINE HRESULT IHTMLTxtRange_getBookmark(IHTMLTxtRange* This,BSTR *Boolmark) {
    return This->lpVtbl->getBookmark(This,Boolmark);
}
static FORCEINLINE HRESULT IHTMLTxtRange_moveToBookmark(IHTMLTxtRange* This,BSTR Bookmark,VARIANT_BOOL *Success) {
    return This->lpVtbl->moveToBookmark(This,Bookmark,Success);
}
static FORCEINLINE HRESULT IHTMLTxtRange_queryCommandSupported(IHTMLTxtRange* This,BSTR cmdID,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->queryCommandSupported(This,cmdID,pfRet);
}
static FORCEINLINE HRESULT IHTMLTxtRange_queryCommandEnabled(IHTMLTxtRange* This,BSTR cmdID,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->queryCommandEnabled(This,cmdID,pfRet);
}
static FORCEINLINE HRESULT IHTMLTxtRange_queryCommandState(IHTMLTxtRange* This,BSTR cmdID,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->queryCommandState(This,cmdID,pfRet);
}
static FORCEINLINE HRESULT IHTMLTxtRange_queryCommandIndeterm(IHTMLTxtRange* This,BSTR cmdID,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->queryCommandIndeterm(This,cmdID,pfRet);
}
static FORCEINLINE HRESULT IHTMLTxtRange_queryCommandText(IHTMLTxtRange* This,BSTR cmdID,BSTR *pcmdText) {
    return This->lpVtbl->queryCommandText(This,cmdID,pcmdText);
}
static FORCEINLINE HRESULT IHTMLTxtRange_queryCommandValue(IHTMLTxtRange* This,BSTR cmdID,VARIANT *pcmdValue) {
    return This->lpVtbl->queryCommandValue(This,cmdID,pcmdValue);
}
static FORCEINLINE HRESULT IHTMLTxtRange_execCommand(IHTMLTxtRange* This,BSTR cmdID,VARIANT_BOOL showUI,VARIANT value,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->execCommand(This,cmdID,showUI,value,pfRet);
}
static FORCEINLINE HRESULT IHTMLTxtRange_execCommandShowHelp(IHTMLTxtRange* This,BSTR cmdID,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->execCommandShowHelp(This,cmdID,pfRet);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLTxtRange_get_htmlText_Proxy(
    IHTMLTxtRange* This,
    BSTR *p);
void __RPC_STUB IHTMLTxtRange_get_htmlText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRange_put_text_Proxy(
    IHTMLTxtRange* This,
    BSTR v);
void __RPC_STUB IHTMLTxtRange_put_text_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRange_get_text_Proxy(
    IHTMLTxtRange* This,
    BSTR *p);
void __RPC_STUB IHTMLTxtRange_get_text_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRange_parentElement_Proxy(
    IHTMLTxtRange* This,
    IHTMLElement **parent);
void __RPC_STUB IHTMLTxtRange_parentElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRange_duplicate_Proxy(
    IHTMLTxtRange* This,
    IHTMLTxtRange **Duplicate);
void __RPC_STUB IHTMLTxtRange_duplicate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRange_inRange_Proxy(
    IHTMLTxtRange* This,
    IHTMLTxtRange *Range,
    VARIANT_BOOL *InRange);
void __RPC_STUB IHTMLTxtRange_inRange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRange_isEqual_Proxy(
    IHTMLTxtRange* This,
    IHTMLTxtRange *Range,
    VARIANT_BOOL *IsEqual);
void __RPC_STUB IHTMLTxtRange_isEqual_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRange_scrollIntoView_Proxy(
    IHTMLTxtRange* This,
    VARIANT_BOOL fStart);
void __RPC_STUB IHTMLTxtRange_scrollIntoView_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRange_collapse_Proxy(
    IHTMLTxtRange* This,
    VARIANT_BOOL Start);
void __RPC_STUB IHTMLTxtRange_collapse_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRange_expand_Proxy(
    IHTMLTxtRange* This,
    BSTR Unit,
    VARIANT_BOOL *Success);
void __RPC_STUB IHTMLTxtRange_expand_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRange_move_Proxy(
    IHTMLTxtRange* This,
    BSTR Unit,
    LONG Count,
    LONG *ActualCount);
void __RPC_STUB IHTMLTxtRange_move_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRange_moveStart_Proxy(
    IHTMLTxtRange* This,
    BSTR Unit,
    LONG Count,
    LONG *ActualCount);
void __RPC_STUB IHTMLTxtRange_moveStart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRange_moveEnd_Proxy(
    IHTMLTxtRange* This,
    BSTR Unit,
    LONG Count,
    LONG *ActualCount);
void __RPC_STUB IHTMLTxtRange_moveEnd_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRange_select_Proxy(
    IHTMLTxtRange* This);
void __RPC_STUB IHTMLTxtRange_select_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRange_pasteHTML_Proxy(
    IHTMLTxtRange* This,
    BSTR html);
void __RPC_STUB IHTMLTxtRange_pasteHTML_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRange_moveToElementText_Proxy(
    IHTMLTxtRange* This,
    IHTMLElement *element);
void __RPC_STUB IHTMLTxtRange_moveToElementText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRange_setEndPoint_Proxy(
    IHTMLTxtRange* This,
    BSTR how,
    IHTMLTxtRange *SourceRange);
void __RPC_STUB IHTMLTxtRange_setEndPoint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRange_compareEndPoints_Proxy(
    IHTMLTxtRange* This,
    BSTR how,
    IHTMLTxtRange *SourceRange,
    LONG *ret);
void __RPC_STUB IHTMLTxtRange_compareEndPoints_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRange_findText_Proxy(
    IHTMLTxtRange* This,
    BSTR String,
    LONG count,
    LONG Flags,
    VARIANT_BOOL *Success);
void __RPC_STUB IHTMLTxtRange_findText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRange_moveToPoint_Proxy(
    IHTMLTxtRange* This,
    LONG x,
    LONG y);
void __RPC_STUB IHTMLTxtRange_moveToPoint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRange_getBookmark_Proxy(
    IHTMLTxtRange* This,
    BSTR *Boolmark);
void __RPC_STUB IHTMLTxtRange_getBookmark_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRange_moveToBookmark_Proxy(
    IHTMLTxtRange* This,
    BSTR Bookmark,
    VARIANT_BOOL *Success);
void __RPC_STUB IHTMLTxtRange_moveToBookmark_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRange_queryCommandSupported_Proxy(
    IHTMLTxtRange* This,
    BSTR cmdID,
    VARIANT_BOOL *pfRet);
void __RPC_STUB IHTMLTxtRange_queryCommandSupported_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRange_queryCommandEnabled_Proxy(
    IHTMLTxtRange* This,
    BSTR cmdID,
    VARIANT_BOOL *pfRet);
void __RPC_STUB IHTMLTxtRange_queryCommandEnabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRange_queryCommandState_Proxy(
    IHTMLTxtRange* This,
    BSTR cmdID,
    VARIANT_BOOL *pfRet);
void __RPC_STUB IHTMLTxtRange_queryCommandState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRange_queryCommandIndeterm_Proxy(
    IHTMLTxtRange* This,
    BSTR cmdID,
    VARIANT_BOOL *pfRet);
void __RPC_STUB IHTMLTxtRange_queryCommandIndeterm_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRange_queryCommandText_Proxy(
    IHTMLTxtRange* This,
    BSTR cmdID,
    BSTR *pcmdText);
void __RPC_STUB IHTMLTxtRange_queryCommandText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRange_queryCommandValue_Proxy(
    IHTMLTxtRange* This,
    BSTR cmdID,
    VARIANT *pcmdValue);
void __RPC_STUB IHTMLTxtRange_queryCommandValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRange_execCommand_Proxy(
    IHTMLTxtRange* This,
    BSTR cmdID,
    VARIANT_BOOL showUI,
    VARIANT value,
    VARIANT_BOOL *pfRet);
void __RPC_STUB IHTMLTxtRange_execCommand_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRange_execCommandShowHelp_Proxy(
    IHTMLTxtRange* This,
    BSTR cmdID,
    VARIANT_BOOL *pfRet);
void __RPC_STUB IHTMLTxtRange_execCommandShowHelp_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLTxtRange_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLTextRangeMetrics interface
 */
#ifndef __IHTMLTextRangeMetrics_INTERFACE_DEFINED__
#define __IHTMLTextRangeMetrics_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTextRangeMetrics, 0x3050f40b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f40b-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTextRangeMetrics : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_offsetTop(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_offsetLeft(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_boundingTop(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_boundingLeft(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_boundingWidth(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_boundingHeight(
        LONG *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTextRangeMetrics, 0x3050f40b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTextRangeMetricsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTextRangeMetrics* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTextRangeMetrics* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTextRangeMetrics* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTextRangeMetrics* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTextRangeMetrics* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTextRangeMetrics* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTextRangeMetrics* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLTextRangeMetrics methods ***/
    HRESULT (STDMETHODCALLTYPE *get_offsetTop)(
        IHTMLTextRangeMetrics* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_offsetLeft)(
        IHTMLTextRangeMetrics* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_boundingTop)(
        IHTMLTextRangeMetrics* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_boundingLeft)(
        IHTMLTextRangeMetrics* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_boundingWidth)(
        IHTMLTextRangeMetrics* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_boundingHeight)(
        IHTMLTextRangeMetrics* This,
        LONG *p);

    END_INTERFACE
} IHTMLTextRangeMetricsVtbl;
interface IHTMLTextRangeMetrics {
    CONST_VTBL IHTMLTextRangeMetricsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTextRangeMetrics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTextRangeMetrics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTextRangeMetrics_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTextRangeMetrics_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTextRangeMetrics_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTextRangeMetrics_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTextRangeMetrics_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLTextRangeMetrics methods ***/
#define IHTMLTextRangeMetrics_get_offsetTop(This,p) (This)->lpVtbl->get_offsetTop(This,p)
#define IHTMLTextRangeMetrics_get_offsetLeft(This,p) (This)->lpVtbl->get_offsetLeft(This,p)
#define IHTMLTextRangeMetrics_get_boundingTop(This,p) (This)->lpVtbl->get_boundingTop(This,p)
#define IHTMLTextRangeMetrics_get_boundingLeft(This,p) (This)->lpVtbl->get_boundingLeft(This,p)
#define IHTMLTextRangeMetrics_get_boundingWidth(This,p) (This)->lpVtbl->get_boundingWidth(This,p)
#define IHTMLTextRangeMetrics_get_boundingHeight(This,p) (This)->lpVtbl->get_boundingHeight(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLTextRangeMetrics_QueryInterface(IHTMLTextRangeMetrics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTextRangeMetrics_AddRef(IHTMLTextRangeMetrics* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTextRangeMetrics_Release(IHTMLTextRangeMetrics* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTextRangeMetrics_GetTypeInfoCount(IHTMLTextRangeMetrics* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTextRangeMetrics_GetTypeInfo(IHTMLTextRangeMetrics* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTextRangeMetrics_GetIDsOfNames(IHTMLTextRangeMetrics* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTextRangeMetrics_Invoke(IHTMLTextRangeMetrics* 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);
}
/*** IHTMLTextRangeMetrics methods ***/
static FORCEINLINE HRESULT IHTMLTextRangeMetrics_get_offsetTop(IHTMLTextRangeMetrics* This,LONG *p) {
    return This->lpVtbl->get_offsetTop(This,p);
}
static FORCEINLINE HRESULT IHTMLTextRangeMetrics_get_offsetLeft(IHTMLTextRangeMetrics* This,LONG *p) {
    return This->lpVtbl->get_offsetLeft(This,p);
}
static FORCEINLINE HRESULT IHTMLTextRangeMetrics_get_boundingTop(IHTMLTextRangeMetrics* This,LONG *p) {
    return This->lpVtbl->get_boundingTop(This,p);
}
static FORCEINLINE HRESULT IHTMLTextRangeMetrics_get_boundingLeft(IHTMLTextRangeMetrics* This,LONG *p) {
    return This->lpVtbl->get_boundingLeft(This,p);
}
static FORCEINLINE HRESULT IHTMLTextRangeMetrics_get_boundingWidth(IHTMLTextRangeMetrics* This,LONG *p) {
    return This->lpVtbl->get_boundingWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLTextRangeMetrics_get_boundingHeight(IHTMLTextRangeMetrics* This,LONG *p) {
    return This->lpVtbl->get_boundingHeight(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLTextRangeMetrics_get_offsetTop_Proxy(
    IHTMLTextRangeMetrics* This,
    LONG *p);
void __RPC_STUB IHTMLTextRangeMetrics_get_offsetTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextRangeMetrics_get_offsetLeft_Proxy(
    IHTMLTextRangeMetrics* This,
    LONG *p);
void __RPC_STUB IHTMLTextRangeMetrics_get_offsetLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextRangeMetrics_get_boundingTop_Proxy(
    IHTMLTextRangeMetrics* This,
    LONG *p);
void __RPC_STUB IHTMLTextRangeMetrics_get_boundingTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextRangeMetrics_get_boundingLeft_Proxy(
    IHTMLTextRangeMetrics* This,
    LONG *p);
void __RPC_STUB IHTMLTextRangeMetrics_get_boundingLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextRangeMetrics_get_boundingWidth_Proxy(
    IHTMLTextRangeMetrics* This,
    LONG *p);
void __RPC_STUB IHTMLTextRangeMetrics_get_boundingWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextRangeMetrics_get_boundingHeight_Proxy(
    IHTMLTextRangeMetrics* This,
    LONG *p);
void __RPC_STUB IHTMLTextRangeMetrics_get_boundingHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLTextRangeMetrics_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLTextRangeMetrics2 interface
 */
#ifndef __IHTMLTextRangeMetrics2_INTERFACE_DEFINED__
#define __IHTMLTextRangeMetrics2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTextRangeMetrics2, 0x3050f4a6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f4a6-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTextRangeMetrics2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE getClientRects(
        IHTMLRectCollection **pRectCol) = 0;

    virtual HRESULT STDMETHODCALLTYPE getBoundingClientRect(
        IHTMLRect **pRect) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTextRangeMetrics2, 0x3050f4a6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTextRangeMetrics2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTextRangeMetrics2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTextRangeMetrics2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTextRangeMetrics2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTextRangeMetrics2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTextRangeMetrics2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTextRangeMetrics2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTextRangeMetrics2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLTextRangeMetrics2 methods ***/
    HRESULT (STDMETHODCALLTYPE *getClientRects)(
        IHTMLTextRangeMetrics2* This,
        IHTMLRectCollection **pRectCol);

    HRESULT (STDMETHODCALLTYPE *getBoundingClientRect)(
        IHTMLTextRangeMetrics2* This,
        IHTMLRect **pRect);

    END_INTERFACE
} IHTMLTextRangeMetrics2Vtbl;
interface IHTMLTextRangeMetrics2 {
    CONST_VTBL IHTMLTextRangeMetrics2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTextRangeMetrics2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTextRangeMetrics2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTextRangeMetrics2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTextRangeMetrics2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTextRangeMetrics2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTextRangeMetrics2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTextRangeMetrics2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLTextRangeMetrics2 methods ***/
#define IHTMLTextRangeMetrics2_getClientRects(This,pRectCol) (This)->lpVtbl->getClientRects(This,pRectCol)
#define IHTMLTextRangeMetrics2_getBoundingClientRect(This,pRect) (This)->lpVtbl->getBoundingClientRect(This,pRect)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLTextRangeMetrics2_QueryInterface(IHTMLTextRangeMetrics2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTextRangeMetrics2_AddRef(IHTMLTextRangeMetrics2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTextRangeMetrics2_Release(IHTMLTextRangeMetrics2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTextRangeMetrics2_GetTypeInfoCount(IHTMLTextRangeMetrics2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTextRangeMetrics2_GetTypeInfo(IHTMLTextRangeMetrics2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTextRangeMetrics2_GetIDsOfNames(IHTMLTextRangeMetrics2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTextRangeMetrics2_Invoke(IHTMLTextRangeMetrics2* 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);
}
/*** IHTMLTextRangeMetrics2 methods ***/
static FORCEINLINE HRESULT IHTMLTextRangeMetrics2_getClientRects(IHTMLTextRangeMetrics2* This,IHTMLRectCollection **pRectCol) {
    return This->lpVtbl->getClientRects(This,pRectCol);
}
static FORCEINLINE HRESULT IHTMLTextRangeMetrics2_getBoundingClientRect(IHTMLTextRangeMetrics2* This,IHTMLRect **pRect) {
    return This->lpVtbl->getBoundingClientRect(This,pRect);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLTextRangeMetrics2_getClientRects_Proxy(
    IHTMLTextRangeMetrics2* This,
    IHTMLRectCollection **pRectCol);
void __RPC_STUB IHTMLTextRangeMetrics2_getClientRects_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextRangeMetrics2_getBoundingClientRect_Proxy(
    IHTMLTextRangeMetrics2* This,
    IHTMLRect **pRect);
void __RPC_STUB IHTMLTextRangeMetrics2_getBoundingClientRect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLTextRangeMetrics2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLTxtRangeCollection interface
 */
#ifndef __IHTMLTxtRangeCollection_INTERFACE_DEFINED__
#define __IHTMLTxtRangeCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTxtRangeCollection, 0x3050f7ed, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f7ed-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTxtRangeCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__newEnum(
        IUnknown **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE item(
        VARIANT *pvarIndex,
        VARIANT *pvarResult) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTxtRangeCollection, 0x3050f7ed, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTxtRangeCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTxtRangeCollection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTxtRangeCollection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTxtRangeCollection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTxtRangeCollection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTxtRangeCollection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTxtRangeCollection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTxtRangeCollection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLTxtRangeCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLTxtRangeCollection* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get__newEnum)(
        IHTMLTxtRangeCollection* This,
        IUnknown **p);

    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLTxtRangeCollection* This,
        VARIANT *pvarIndex,
        VARIANT *pvarResult);

    END_INTERFACE
} IHTMLTxtRangeCollectionVtbl;
interface IHTMLTxtRangeCollection {
    CONST_VTBL IHTMLTxtRangeCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTxtRangeCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTxtRangeCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTxtRangeCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTxtRangeCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTxtRangeCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTxtRangeCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTxtRangeCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLTxtRangeCollection methods ***/
#define IHTMLTxtRangeCollection_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLTxtRangeCollection_get__newEnum(This,p) (This)->lpVtbl->get__newEnum(This,p)
#define IHTMLTxtRangeCollection_item(This,pvarIndex,pvarResult) (This)->lpVtbl->item(This,pvarIndex,pvarResult)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLTxtRangeCollection_QueryInterface(IHTMLTxtRangeCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTxtRangeCollection_AddRef(IHTMLTxtRangeCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTxtRangeCollection_Release(IHTMLTxtRangeCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTxtRangeCollection_GetTypeInfoCount(IHTMLTxtRangeCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTxtRangeCollection_GetTypeInfo(IHTMLTxtRangeCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTxtRangeCollection_GetIDsOfNames(IHTMLTxtRangeCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTxtRangeCollection_Invoke(IHTMLTxtRangeCollection* 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);
}
/*** IHTMLTxtRangeCollection methods ***/
static FORCEINLINE HRESULT IHTMLTxtRangeCollection_get_length(IHTMLTxtRangeCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IHTMLTxtRangeCollection_get__newEnum(IHTMLTxtRangeCollection* This,IUnknown **p) {
    return This->lpVtbl->get__newEnum(This,p);
}
static FORCEINLINE HRESULT IHTMLTxtRangeCollection_item(IHTMLTxtRangeCollection* This,VARIANT *pvarIndex,VARIANT *pvarResult) {
    return This->lpVtbl->item(This,pvarIndex,pvarResult);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLTxtRangeCollection_get_length_Proxy(
    IHTMLTxtRangeCollection* This,
    LONG *p);
void __RPC_STUB IHTMLTxtRangeCollection_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRangeCollection_get__newEnum_Proxy(
    IHTMLTxtRangeCollection* This,
    IUnknown **p);
void __RPC_STUB IHTMLTxtRangeCollection_get__newEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTxtRangeCollection_item_Proxy(
    IHTMLTxtRangeCollection* This,
    VARIANT *pvarIndex,
    VARIANT *pvarResult);
void __RPC_STUB IHTMLTxtRangeCollection_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLTxtRangeCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLDOMRange interface
 */
#ifndef __IHTMLDOMRange_INTERFACE_DEFINED__
#define __IHTMLDOMRange_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDOMRange, 0x305104ae, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104ae-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDOMRange : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_startContainer(
        IHTMLDOMNode **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_startOffset(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_endContainer(
        IHTMLDOMNode **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_endOffset(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_collapsed(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_commonAncestorContainer(
        IHTMLDOMNode **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE setStart(
        IDispatch *refNode,
        LONG offset) = 0;

    virtual HRESULT STDMETHODCALLTYPE setEnd(
        IDispatch *refNode,
        LONG offset) = 0;

    virtual HRESULT STDMETHODCALLTYPE setStartBefore(
        IDispatch *refNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE setStartAfter(
        IDispatch *refNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE setEndBefore(
        IDispatch *refNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE setEndAfter(
        IDispatch *refNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE collapse(
        VARIANT_BOOL toStart) = 0;

    virtual HRESULT STDMETHODCALLTYPE selectNode(
        IDispatch *refNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE selectNodeContents(
        IDispatch *refNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE compareBoundaryPoints(
        short how,
        IDispatch *sourceRange,
        LONG *compareResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE deleteContents(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE extractContents(
        IDispatch **ppDocumentFragment) = 0;

    virtual HRESULT STDMETHODCALLTYPE cloneContents(
        IDispatch **ppDocumentFragment) = 0;

    virtual HRESULT STDMETHODCALLTYPE insertNode(
        IDispatch *newNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE surroundContents(
        IDispatch *newParent) = 0;

    virtual HRESULT STDMETHODCALLTYPE cloneRange(
        IHTMLDOMRange **ppClonedRange) = 0;

    virtual HRESULT STDMETHODCALLTYPE toString(
        BSTR *pRangeString) = 0;

    virtual HRESULT STDMETHODCALLTYPE detach(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE getClientRects(
        IHTMLRectCollection **ppRectCol) = 0;

    virtual HRESULT STDMETHODCALLTYPE getBoundingClientRect(
        IHTMLRect **ppRect) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDOMRange, 0x305104ae, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDOMRangeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLDOMRange* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLDOMRange* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLDOMRange* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLDOMRange* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLDOMRange* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLDOMRange* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLDOMRange* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLDOMRange methods ***/
    HRESULT (STDMETHODCALLTYPE *get_startContainer)(
        IHTMLDOMRange* This,
        IHTMLDOMNode **p);

    HRESULT (STDMETHODCALLTYPE *get_startOffset)(
        IHTMLDOMRange* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_endContainer)(
        IHTMLDOMRange* This,
        IHTMLDOMNode **p);

    HRESULT (STDMETHODCALLTYPE *get_endOffset)(
        IHTMLDOMRange* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_collapsed)(
        IHTMLDOMRange* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_commonAncestorContainer)(
        IHTMLDOMRange* This,
        IHTMLDOMNode **p);

    HRESULT (STDMETHODCALLTYPE *setStart)(
        IHTMLDOMRange* This,
        IDispatch *refNode,
        LONG offset);

    HRESULT (STDMETHODCALLTYPE *setEnd)(
        IHTMLDOMRange* This,
        IDispatch *refNode,
        LONG offset);

    HRESULT (STDMETHODCALLTYPE *setStartBefore)(
        IHTMLDOMRange* This,
        IDispatch *refNode);

    HRESULT (STDMETHODCALLTYPE *setStartAfter)(
        IHTMLDOMRange* This,
        IDispatch *refNode);

    HRESULT (STDMETHODCALLTYPE *setEndBefore)(
        IHTMLDOMRange* This,
        IDispatch *refNode);

    HRESULT (STDMETHODCALLTYPE *setEndAfter)(
        IHTMLDOMRange* This,
        IDispatch *refNode);

    HRESULT (STDMETHODCALLTYPE *collapse)(
        IHTMLDOMRange* This,
        VARIANT_BOOL toStart);

    HRESULT (STDMETHODCALLTYPE *selectNode)(
        IHTMLDOMRange* This,
        IDispatch *refNode);

    HRESULT (STDMETHODCALLTYPE *selectNodeContents)(
        IHTMLDOMRange* This,
        IDispatch *refNode);

    HRESULT (STDMETHODCALLTYPE *compareBoundaryPoints)(
        IHTMLDOMRange* This,
        short how,
        IDispatch *sourceRange,
        LONG *compareResult);

    HRESULT (STDMETHODCALLTYPE *deleteContents)(
        IHTMLDOMRange* This);

    HRESULT (STDMETHODCALLTYPE *extractContents)(
        IHTMLDOMRange* This,
        IDispatch **ppDocumentFragment);

    HRESULT (STDMETHODCALLTYPE *cloneContents)(
        IHTMLDOMRange* This,
        IDispatch **ppDocumentFragment);

    HRESULT (STDMETHODCALLTYPE *insertNode)(
        IHTMLDOMRange* This,
        IDispatch *newNode);

    HRESULT (STDMETHODCALLTYPE *surroundContents)(
        IHTMLDOMRange* This,
        IDispatch *newParent);

    HRESULT (STDMETHODCALLTYPE *cloneRange)(
        IHTMLDOMRange* This,
        IHTMLDOMRange **ppClonedRange);

    HRESULT (STDMETHODCALLTYPE *toString)(
        IHTMLDOMRange* This,
        BSTR *pRangeString);

    HRESULT (STDMETHODCALLTYPE *detach)(
        IHTMLDOMRange* This);

    HRESULT (STDMETHODCALLTYPE *getClientRects)(
        IHTMLDOMRange* This,
        IHTMLRectCollection **ppRectCol);

    HRESULT (STDMETHODCALLTYPE *getBoundingClientRect)(
        IHTMLDOMRange* This,
        IHTMLRect **ppRect);

    END_INTERFACE
} IHTMLDOMRangeVtbl;
interface IHTMLDOMRange {
    CONST_VTBL IHTMLDOMRangeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDOMRange_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDOMRange_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDOMRange_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDOMRange_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDOMRange_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDOMRange_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDOMRange_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDOMRange methods ***/
#define IHTMLDOMRange_get_startContainer(This,p) (This)->lpVtbl->get_startContainer(This,p)
#define IHTMLDOMRange_get_startOffset(This,p) (This)->lpVtbl->get_startOffset(This,p)
#define IHTMLDOMRange_get_endContainer(This,p) (This)->lpVtbl->get_endContainer(This,p)
#define IHTMLDOMRange_get_endOffset(This,p) (This)->lpVtbl->get_endOffset(This,p)
#define IHTMLDOMRange_get_collapsed(This,p) (This)->lpVtbl->get_collapsed(This,p)
#define IHTMLDOMRange_get_commonAncestorContainer(This,p) (This)->lpVtbl->get_commonAncestorContainer(This,p)
#define IHTMLDOMRange_setStart(This,refNode,offset) (This)->lpVtbl->setStart(This,refNode,offset)
#define IHTMLDOMRange_setEnd(This,refNode,offset) (This)->lpVtbl->setEnd(This,refNode,offset)
#define IHTMLDOMRange_setStartBefore(This,refNode) (This)->lpVtbl->setStartBefore(This,refNode)
#define IHTMLDOMRange_setStartAfter(This,refNode) (This)->lpVtbl->setStartAfter(This,refNode)
#define IHTMLDOMRange_setEndBefore(This,refNode) (This)->lpVtbl->setEndBefore(This,refNode)
#define IHTMLDOMRange_setEndAfter(This,refNode) (This)->lpVtbl->setEndAfter(This,refNode)
#define IHTMLDOMRange_collapse(This,toStart) (This)->lpVtbl->collapse(This,toStart)
#define IHTMLDOMRange_selectNode(This,refNode) (This)->lpVtbl->selectNode(This,refNode)
#define IHTMLDOMRange_selectNodeContents(This,refNode) (This)->lpVtbl->selectNodeContents(This,refNode)
#define IHTMLDOMRange_compareBoundaryPoints(This,how,sourceRange,compareResult) (This)->lpVtbl->compareBoundaryPoints(This,how,sourceRange,compareResult)
#define IHTMLDOMRange_deleteContents(This) (This)->lpVtbl->deleteContents(This)
#define IHTMLDOMRange_extractContents(This,ppDocumentFragment) (This)->lpVtbl->extractContents(This,ppDocumentFragment)
#define IHTMLDOMRange_cloneContents(This,ppDocumentFragment) (This)->lpVtbl->cloneContents(This,ppDocumentFragment)
#define IHTMLDOMRange_insertNode(This,newNode) (This)->lpVtbl->insertNode(This,newNode)
#define IHTMLDOMRange_surroundContents(This,newParent) (This)->lpVtbl->surroundContents(This,newParent)
#define IHTMLDOMRange_cloneRange(This,ppClonedRange) (This)->lpVtbl->cloneRange(This,ppClonedRange)
#define IHTMLDOMRange_toString(This,pRangeString) (This)->lpVtbl->toString(This,pRangeString)
#define IHTMLDOMRange_detach(This) (This)->lpVtbl->detach(This)
#define IHTMLDOMRange_getClientRects(This,ppRectCol) (This)->lpVtbl->getClientRects(This,ppRectCol)
#define IHTMLDOMRange_getBoundingClientRect(This,ppRect) (This)->lpVtbl->getBoundingClientRect(This,ppRect)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDOMRange_QueryInterface(IHTMLDOMRange* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDOMRange_AddRef(IHTMLDOMRange* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDOMRange_Release(IHTMLDOMRange* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDOMRange_GetTypeInfoCount(IHTMLDOMRange* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDOMRange_GetTypeInfo(IHTMLDOMRange* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDOMRange_GetIDsOfNames(IHTMLDOMRange* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDOMRange_Invoke(IHTMLDOMRange* 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);
}
/*** IHTMLDOMRange methods ***/
static FORCEINLINE HRESULT IHTMLDOMRange_get_startContainer(IHTMLDOMRange* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_startContainer(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMRange_get_startOffset(IHTMLDOMRange* This,LONG *p) {
    return This->lpVtbl->get_startOffset(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMRange_get_endContainer(IHTMLDOMRange* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_endContainer(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMRange_get_endOffset(IHTMLDOMRange* This,LONG *p) {
    return This->lpVtbl->get_endOffset(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMRange_get_collapsed(IHTMLDOMRange* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_collapsed(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMRange_get_commonAncestorContainer(IHTMLDOMRange* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_commonAncestorContainer(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMRange_setStart(IHTMLDOMRange* This,IDispatch *refNode,LONG offset) {
    return This->lpVtbl->setStart(This,refNode,offset);
}
static FORCEINLINE HRESULT IHTMLDOMRange_setEnd(IHTMLDOMRange* This,IDispatch *refNode,LONG offset) {
    return This->lpVtbl->setEnd(This,refNode,offset);
}
static FORCEINLINE HRESULT IHTMLDOMRange_setStartBefore(IHTMLDOMRange* This,IDispatch *refNode) {
    return This->lpVtbl->setStartBefore(This,refNode);
}
static FORCEINLINE HRESULT IHTMLDOMRange_setStartAfter(IHTMLDOMRange* This,IDispatch *refNode) {
    return This->lpVtbl->setStartAfter(This,refNode);
}
static FORCEINLINE HRESULT IHTMLDOMRange_setEndBefore(IHTMLDOMRange* This,IDispatch *refNode) {
    return This->lpVtbl->setEndBefore(This,refNode);
}
static FORCEINLINE HRESULT IHTMLDOMRange_setEndAfter(IHTMLDOMRange* This,IDispatch *refNode) {
    return This->lpVtbl->setEndAfter(This,refNode);
}
static FORCEINLINE HRESULT IHTMLDOMRange_collapse(IHTMLDOMRange* This,VARIANT_BOOL toStart) {
    return This->lpVtbl->collapse(This,toStart);
}
static FORCEINLINE HRESULT IHTMLDOMRange_selectNode(IHTMLDOMRange* This,IDispatch *refNode) {
    return This->lpVtbl->selectNode(This,refNode);
}
static FORCEINLINE HRESULT IHTMLDOMRange_selectNodeContents(IHTMLDOMRange* This,IDispatch *refNode) {
    return This->lpVtbl->selectNodeContents(This,refNode);
}
static FORCEINLINE HRESULT IHTMLDOMRange_compareBoundaryPoints(IHTMLDOMRange* This,short how,IDispatch *sourceRange,LONG *compareResult) {
    return This->lpVtbl->compareBoundaryPoints(This,how,sourceRange,compareResult);
}
static FORCEINLINE HRESULT IHTMLDOMRange_deleteContents(IHTMLDOMRange* This) {
    return This->lpVtbl->deleteContents(This);
}
static FORCEINLINE HRESULT IHTMLDOMRange_extractContents(IHTMLDOMRange* This,IDispatch **ppDocumentFragment) {
    return This->lpVtbl->extractContents(This,ppDocumentFragment);
}
static FORCEINLINE HRESULT IHTMLDOMRange_cloneContents(IHTMLDOMRange* This,IDispatch **ppDocumentFragment) {
    return This->lpVtbl->cloneContents(This,ppDocumentFragment);
}
static FORCEINLINE HRESULT IHTMLDOMRange_insertNode(IHTMLDOMRange* This,IDispatch *newNode) {
    return This->lpVtbl->insertNode(This,newNode);
}
static FORCEINLINE HRESULT IHTMLDOMRange_surroundContents(IHTMLDOMRange* This,IDispatch *newParent) {
    return This->lpVtbl->surroundContents(This,newParent);
}
static FORCEINLINE HRESULT IHTMLDOMRange_cloneRange(IHTMLDOMRange* This,IHTMLDOMRange **ppClonedRange) {
    return This->lpVtbl->cloneRange(This,ppClonedRange);
}
static FORCEINLINE HRESULT IHTMLDOMRange_toString(IHTMLDOMRange* This,BSTR *pRangeString) {
    return This->lpVtbl->toString(This,pRangeString);
}
static FORCEINLINE HRESULT IHTMLDOMRange_detach(IHTMLDOMRange* This) {
    return This->lpVtbl->detach(This);
}
static FORCEINLINE HRESULT IHTMLDOMRange_getClientRects(IHTMLDOMRange* This,IHTMLRectCollection **ppRectCol) {
    return This->lpVtbl->getClientRects(This,ppRectCol);
}
static FORCEINLINE HRESULT IHTMLDOMRange_getBoundingClientRect(IHTMLDOMRange* This,IHTMLRect **ppRect) {
    return This->lpVtbl->getBoundingClientRect(This,ppRect);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDOMRange_get_startContainer_Proxy(
    IHTMLDOMRange* This,
    IHTMLDOMNode **p);
void __RPC_STUB IHTMLDOMRange_get_startContainer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMRange_get_startOffset_Proxy(
    IHTMLDOMRange* This,
    LONG *p);
void __RPC_STUB IHTMLDOMRange_get_startOffset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMRange_get_endContainer_Proxy(
    IHTMLDOMRange* This,
    IHTMLDOMNode **p);
void __RPC_STUB IHTMLDOMRange_get_endContainer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMRange_get_endOffset_Proxy(
    IHTMLDOMRange* This,
    LONG *p);
void __RPC_STUB IHTMLDOMRange_get_endOffset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMRange_get_collapsed_Proxy(
    IHTMLDOMRange* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLDOMRange_get_collapsed_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMRange_get_commonAncestorContainer_Proxy(
    IHTMLDOMRange* This,
    IHTMLDOMNode **p);
void __RPC_STUB IHTMLDOMRange_get_commonAncestorContainer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMRange_setStart_Proxy(
    IHTMLDOMRange* This,
    IDispatch *refNode,
    LONG offset);
void __RPC_STUB IHTMLDOMRange_setStart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMRange_setEnd_Proxy(
    IHTMLDOMRange* This,
    IDispatch *refNode,
    LONG offset);
void __RPC_STUB IHTMLDOMRange_setEnd_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMRange_setStartBefore_Proxy(
    IHTMLDOMRange* This,
    IDispatch *refNode);
void __RPC_STUB IHTMLDOMRange_setStartBefore_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMRange_setStartAfter_Proxy(
    IHTMLDOMRange* This,
    IDispatch *refNode);
void __RPC_STUB IHTMLDOMRange_setStartAfter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMRange_setEndBefore_Proxy(
    IHTMLDOMRange* This,
    IDispatch *refNode);
void __RPC_STUB IHTMLDOMRange_setEndBefore_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMRange_setEndAfter_Proxy(
    IHTMLDOMRange* This,
    IDispatch *refNode);
void __RPC_STUB IHTMLDOMRange_setEndAfter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMRange_collapse_Proxy(
    IHTMLDOMRange* This,
    VARIANT_BOOL toStart);
void __RPC_STUB IHTMLDOMRange_collapse_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMRange_selectNode_Proxy(
    IHTMLDOMRange* This,
    IDispatch *refNode);
void __RPC_STUB IHTMLDOMRange_selectNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMRange_selectNodeContents_Proxy(
    IHTMLDOMRange* This,
    IDispatch *refNode);
void __RPC_STUB IHTMLDOMRange_selectNodeContents_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMRange_compareBoundaryPoints_Proxy(
    IHTMLDOMRange* This,
    short how,
    IDispatch *sourceRange,
    LONG *compareResult);
void __RPC_STUB IHTMLDOMRange_compareBoundaryPoints_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMRange_deleteContents_Proxy(
    IHTMLDOMRange* This);
void __RPC_STUB IHTMLDOMRange_deleteContents_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMRange_extractContents_Proxy(
    IHTMLDOMRange* This,
    IDispatch **ppDocumentFragment);
void __RPC_STUB IHTMLDOMRange_extractContents_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMRange_cloneContents_Proxy(
    IHTMLDOMRange* This,
    IDispatch **ppDocumentFragment);
void __RPC_STUB IHTMLDOMRange_cloneContents_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMRange_insertNode_Proxy(
    IHTMLDOMRange* This,
    IDispatch *newNode);
void __RPC_STUB IHTMLDOMRange_insertNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMRange_surroundContents_Proxy(
    IHTMLDOMRange* This,
    IDispatch *newParent);
void __RPC_STUB IHTMLDOMRange_surroundContents_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMRange_cloneRange_Proxy(
    IHTMLDOMRange* This,
    IHTMLDOMRange **ppClonedRange);
void __RPC_STUB IHTMLDOMRange_cloneRange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMRange_toString_Proxy(
    IHTMLDOMRange* This,
    BSTR *pRangeString);
void __RPC_STUB IHTMLDOMRange_toString_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMRange_detach_Proxy(
    IHTMLDOMRange* This);
void __RPC_STUB IHTMLDOMRange_detach_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMRange_getClientRects_Proxy(
    IHTMLDOMRange* This,
    IHTMLRectCollection **ppRectCol);
void __RPC_STUB IHTMLDOMRange_getClientRects_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMRange_getBoundingClientRect_Proxy(
    IHTMLDOMRange* This,
    IHTMLRect **ppRect);
void __RPC_STUB IHTMLDOMRange_getBoundingClientRect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDOMRange_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLDOMRange dispinterface
 */
#ifndef __DispHTMLDOMRange_DISPINTERFACE_DEFINED__
#define __DispHTMLDOMRange_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLDOMRange, 0x3050f5a3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f5a3-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLDOMRange : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLDOMRange, 0x3050f5a3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLDOMRangeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLDOMRange* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLDOMRange* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLDOMRange* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLDOMRange* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLDOMRange* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLDOMRange* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLDOMRange* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLDOMRangeVtbl;
interface DispHTMLDOMRange {
    CONST_VTBL DispHTMLDOMRangeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLDOMRange_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLDOMRange_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLDOMRange_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLDOMRange_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLDOMRange_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLDOMRange_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLDOMRange_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 DispHTMLDOMRange_QueryInterface(DispHTMLDOMRange* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLDOMRange_AddRef(DispHTMLDOMRange* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLDOMRange_Release(DispHTMLDOMRange* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLDOMRange_GetTypeInfoCount(DispHTMLDOMRange* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLDOMRange_GetTypeInfo(DispHTMLDOMRange* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLDOMRange_GetIDsOfNames(DispHTMLDOMRange* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLDOMRange_Invoke(DispHTMLDOMRange* 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  /* __DispHTMLDOMRange_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLDOMRange coclass
 */

DEFINE_GUID(CLSID_HTMLDOMRange, 0x305106c3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305106c3-98b5-11cf-bb82-00aa00bdce0b") HTMLDOMRange;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLDOMRange, 0x305106c3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDomRange;
/*****************************************************************************
 * HTMLFormElementEvents2 dispinterface
 */
#ifndef __HTMLFormElementEvents2_DISPINTERFACE_DEFINED__
#define __HTMLFormElementEvents2_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLFormElementEvents2, 0x3050f614, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f614-98b5-11cf-bb82-00aa00bdce0b")
HTMLFormElementEvents2 : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLFormElementEvents2, 0x3050f614, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLFormElementEvents2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLFormElementEvents2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLFormElementEvents2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLFormElementEvents2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLFormElementEvents2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLFormElementEvents2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLFormElementEvents2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLFormElementEvents2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLFormElementEvents2Vtbl;
interface HTMLFormElementEvents2 {
    CONST_VTBL HTMLFormElementEvents2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLFormElementEvents2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLFormElementEvents2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLFormElementEvents2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLFormElementEvents2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLFormElementEvents2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLFormElementEvents2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLFormElementEvents2_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 HTMLFormElementEvents2_QueryInterface(HTMLFormElementEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLFormElementEvents2_AddRef(HTMLFormElementEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLFormElementEvents2_Release(HTMLFormElementEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLFormElementEvents2_GetTypeInfoCount(HTMLFormElementEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLFormElementEvents2_GetTypeInfo(HTMLFormElementEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLFormElementEvents2_GetIDsOfNames(HTMLFormElementEvents2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLFormElementEvents2_Invoke(HTMLFormElementEvents2* 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  /* __HTMLFormElementEvents2_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLFormElementEvents dispinterface
 */
#ifndef __HTMLFormElementEvents_DISPINTERFACE_DEFINED__
#define __HTMLFormElementEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLFormElementEvents, 0x3050f364, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f364-98b5-11cf-bb82-00aa00bdce0b")
HTMLFormElementEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLFormElementEvents, 0x3050f364, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLFormElementEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLFormElementEvents* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLFormElementEvents* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLFormElementEvents* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLFormElementEvents* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLFormElementEvents* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLFormElementEvents* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLFormElementEvents* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLFormElementEventsVtbl;
interface HTMLFormElementEvents {
    CONST_VTBL HTMLFormElementEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLFormElementEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLFormElementEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLFormElementEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLFormElementEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLFormElementEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLFormElementEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLFormElementEvents_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 HTMLFormElementEvents_QueryInterface(HTMLFormElementEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLFormElementEvents_AddRef(HTMLFormElementEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLFormElementEvents_Release(HTMLFormElementEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLFormElementEvents_GetTypeInfoCount(HTMLFormElementEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLFormElementEvents_GetTypeInfo(HTMLFormElementEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLFormElementEvents_GetIDsOfNames(HTMLFormElementEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLFormElementEvents_Invoke(HTMLFormElementEvents* 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  /* __HTMLFormElementEvents_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLFormElement interface
 */
#ifndef __IHTMLFormElement_INTERFACE_DEFINED__
#define __IHTMLFormElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLFormElement, 0x3050f1f7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f1f7-98b5-11cf-bb82-00aa00bdce0b")
IHTMLFormElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_action(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_action(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_dir(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_dir(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_encoding(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_encoding(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_method(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_method(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_elements(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_target(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_target(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_name(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onsubmit(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onsubmit(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onreset(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onreset(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE submit(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_length(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__newEnum(
        IUnknown **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE item(
        VARIANT name,
        VARIANT index,
        IDispatch **pdisp) = 0;

    virtual HRESULT STDMETHODCALLTYPE tags(
        VARIANT tagName,
        IDispatch **pdisp) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLFormElement, 0x3050f1f7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLFormElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLFormElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLFormElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLFormElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLFormElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLFormElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLFormElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLFormElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLFormElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_action)(
        IHTMLFormElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_action)(
        IHTMLFormElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_dir)(
        IHTMLFormElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_dir)(
        IHTMLFormElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_encoding)(
        IHTMLFormElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_encoding)(
        IHTMLFormElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_method)(
        IHTMLFormElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_method)(
        IHTMLFormElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_elements)(
        IHTMLFormElement* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *put_target)(
        IHTMLFormElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_target)(
        IHTMLFormElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_name)(
        IHTMLFormElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_name)(
        IHTMLFormElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_onsubmit)(
        IHTMLFormElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onsubmit)(
        IHTMLFormElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onreset)(
        IHTMLFormElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onreset)(
        IHTMLFormElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *submit)(
        IHTMLFormElement* This);

    HRESULT (STDMETHODCALLTYPE *reset)(
        IHTMLFormElement* This);

    HRESULT (STDMETHODCALLTYPE *put_length)(
        IHTMLFormElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLFormElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get__newEnum)(
        IHTMLFormElement* This,
        IUnknown **p);

    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLFormElement* This,
        VARIANT name,
        VARIANT index,
        IDispatch **pdisp);

    HRESULT (STDMETHODCALLTYPE *tags)(
        IHTMLFormElement* This,
        VARIANT tagName,
        IDispatch **pdisp);

    END_INTERFACE
} IHTMLFormElementVtbl;
interface IHTMLFormElement {
    CONST_VTBL IHTMLFormElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLFormElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLFormElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLFormElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLFormElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLFormElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLFormElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLFormElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLFormElement methods ***/
#define IHTMLFormElement_put_action(This,v) (This)->lpVtbl->put_action(This,v)
#define IHTMLFormElement_get_action(This,p) (This)->lpVtbl->get_action(This,p)
#define IHTMLFormElement_put_dir(This,v) (This)->lpVtbl->put_dir(This,v)
#define IHTMLFormElement_get_dir(This,p) (This)->lpVtbl->get_dir(This,p)
#define IHTMLFormElement_put_encoding(This,v) (This)->lpVtbl->put_encoding(This,v)
#define IHTMLFormElement_get_encoding(This,p) (This)->lpVtbl->get_encoding(This,p)
#define IHTMLFormElement_put_method(This,v) (This)->lpVtbl->put_method(This,v)
#define IHTMLFormElement_get_method(This,p) (This)->lpVtbl->get_method(This,p)
#define IHTMLFormElement_get_elements(This,p) (This)->lpVtbl->get_elements(This,p)
#define IHTMLFormElement_put_target(This,v) (This)->lpVtbl->put_target(This,v)
#define IHTMLFormElement_get_target(This,p) (This)->lpVtbl->get_target(This,p)
#define IHTMLFormElement_put_name(This,v) (This)->lpVtbl->put_name(This,v)
#define IHTMLFormElement_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#define IHTMLFormElement_put_onsubmit(This,v) (This)->lpVtbl->put_onsubmit(This,v)
#define IHTMLFormElement_get_onsubmit(This,p) (This)->lpVtbl->get_onsubmit(This,p)
#define IHTMLFormElement_put_onreset(This,v) (This)->lpVtbl->put_onreset(This,v)
#define IHTMLFormElement_get_onreset(This,p) (This)->lpVtbl->get_onreset(This,p)
#define IHTMLFormElement_submit(This) (This)->lpVtbl->submit(This)
#define IHTMLFormElement_reset(This) (This)->lpVtbl->reset(This)
#define IHTMLFormElement_put_length(This,v) (This)->lpVtbl->put_length(This,v)
#define IHTMLFormElement_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLFormElement_get__newEnum(This,p) (This)->lpVtbl->get__newEnum(This,p)
#define IHTMLFormElement_item(This,name,index,pdisp) (This)->lpVtbl->item(This,name,index,pdisp)
#define IHTMLFormElement_tags(This,tagName,pdisp) (This)->lpVtbl->tags(This,tagName,pdisp)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLFormElement_QueryInterface(IHTMLFormElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLFormElement_AddRef(IHTMLFormElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLFormElement_Release(IHTMLFormElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLFormElement_GetTypeInfoCount(IHTMLFormElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLFormElement_GetTypeInfo(IHTMLFormElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLFormElement_GetIDsOfNames(IHTMLFormElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLFormElement_Invoke(IHTMLFormElement* 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);
}
/*** IHTMLFormElement methods ***/
static FORCEINLINE HRESULT IHTMLFormElement_put_action(IHTMLFormElement* This,BSTR v) {
    return This->lpVtbl->put_action(This,v);
}
static FORCEINLINE HRESULT IHTMLFormElement_get_action(IHTMLFormElement* This,BSTR *p) {
    return This->lpVtbl->get_action(This,p);
}
static FORCEINLINE HRESULT IHTMLFormElement_put_dir(IHTMLFormElement* This,BSTR v) {
    return This->lpVtbl->put_dir(This,v);
}
static FORCEINLINE HRESULT IHTMLFormElement_get_dir(IHTMLFormElement* This,BSTR *p) {
    return This->lpVtbl->get_dir(This,p);
}
static FORCEINLINE HRESULT IHTMLFormElement_put_encoding(IHTMLFormElement* This,BSTR v) {
    return This->lpVtbl->put_encoding(This,v);
}
static FORCEINLINE HRESULT IHTMLFormElement_get_encoding(IHTMLFormElement* This,BSTR *p) {
    return This->lpVtbl->get_encoding(This,p);
}
static FORCEINLINE HRESULT IHTMLFormElement_put_method(IHTMLFormElement* This,BSTR v) {
    return This->lpVtbl->put_method(This,v);
}
static FORCEINLINE HRESULT IHTMLFormElement_get_method(IHTMLFormElement* This,BSTR *p) {
    return This->lpVtbl->get_method(This,p);
}
static FORCEINLINE HRESULT IHTMLFormElement_get_elements(IHTMLFormElement* This,IDispatch **p) {
    return This->lpVtbl->get_elements(This,p);
}
static FORCEINLINE HRESULT IHTMLFormElement_put_target(IHTMLFormElement* This,BSTR v) {
    return This->lpVtbl->put_target(This,v);
}
static FORCEINLINE HRESULT IHTMLFormElement_get_target(IHTMLFormElement* This,BSTR *p) {
    return This->lpVtbl->get_target(This,p);
}
static FORCEINLINE HRESULT IHTMLFormElement_put_name(IHTMLFormElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static FORCEINLINE HRESULT IHTMLFormElement_get_name(IHTMLFormElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static FORCEINLINE HRESULT IHTMLFormElement_put_onsubmit(IHTMLFormElement* This,VARIANT v) {
    return This->lpVtbl->put_onsubmit(This,v);
}
static FORCEINLINE HRESULT IHTMLFormElement_get_onsubmit(IHTMLFormElement* This,VARIANT *p) {
    return This->lpVtbl->get_onsubmit(This,p);
}
static FORCEINLINE HRESULT IHTMLFormElement_put_onreset(IHTMLFormElement* This,VARIANT v) {
    return This->lpVtbl->put_onreset(This,v);
}
static FORCEINLINE HRESULT IHTMLFormElement_get_onreset(IHTMLFormElement* This,VARIANT *p) {
    return This->lpVtbl->get_onreset(This,p);
}
static FORCEINLINE HRESULT IHTMLFormElement_submit(IHTMLFormElement* This) {
    return This->lpVtbl->submit(This);
}
static FORCEINLINE HRESULT IHTMLFormElement_reset(IHTMLFormElement* This) {
    return This->lpVtbl->reset(This);
}
static FORCEINLINE HRESULT IHTMLFormElement_put_length(IHTMLFormElement* This,LONG v) {
    return This->lpVtbl->put_length(This,v);
}
static FORCEINLINE HRESULT IHTMLFormElement_get_length(IHTMLFormElement* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IHTMLFormElement_get__newEnum(IHTMLFormElement* This,IUnknown **p) {
    return This->lpVtbl->get__newEnum(This,p);
}
static FORCEINLINE HRESULT IHTMLFormElement_item(IHTMLFormElement* This,VARIANT name,VARIANT index,IDispatch **pdisp) {
    return This->lpVtbl->item(This,name,index,pdisp);
}
static FORCEINLINE HRESULT IHTMLFormElement_tags(IHTMLFormElement* This,VARIANT tagName,IDispatch **pdisp) {
    return This->lpVtbl->tags(This,tagName,pdisp);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLFormElement_put_action_Proxy(
    IHTMLFormElement* This,
    BSTR v);
void __RPC_STUB IHTMLFormElement_put_action_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFormElement_get_action_Proxy(
    IHTMLFormElement* This,
    BSTR *p);
void __RPC_STUB IHTMLFormElement_get_action_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFormElement_put_dir_Proxy(
    IHTMLFormElement* This,
    BSTR v);
void __RPC_STUB IHTMLFormElement_put_dir_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFormElement_get_dir_Proxy(
    IHTMLFormElement* This,
    BSTR *p);
void __RPC_STUB IHTMLFormElement_get_dir_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFormElement_put_encoding_Proxy(
    IHTMLFormElement* This,
    BSTR v);
void __RPC_STUB IHTMLFormElement_put_encoding_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFormElement_get_encoding_Proxy(
    IHTMLFormElement* This,
    BSTR *p);
void __RPC_STUB IHTMLFormElement_get_encoding_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFormElement_put_method_Proxy(
    IHTMLFormElement* This,
    BSTR v);
void __RPC_STUB IHTMLFormElement_put_method_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFormElement_get_method_Proxy(
    IHTMLFormElement* This,
    BSTR *p);
void __RPC_STUB IHTMLFormElement_get_method_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFormElement_get_elements_Proxy(
    IHTMLFormElement* This,
    IDispatch **p);
void __RPC_STUB IHTMLFormElement_get_elements_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFormElement_put_target_Proxy(
    IHTMLFormElement* This,
    BSTR v);
void __RPC_STUB IHTMLFormElement_put_target_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFormElement_get_target_Proxy(
    IHTMLFormElement* This,
    BSTR *p);
void __RPC_STUB IHTMLFormElement_get_target_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFormElement_put_name_Proxy(
    IHTMLFormElement* This,
    BSTR v);
void __RPC_STUB IHTMLFormElement_put_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFormElement_get_name_Proxy(
    IHTMLFormElement* This,
    BSTR *p);
void __RPC_STUB IHTMLFormElement_get_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFormElement_put_onsubmit_Proxy(
    IHTMLFormElement* This,
    VARIANT v);
void __RPC_STUB IHTMLFormElement_put_onsubmit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFormElement_get_onsubmit_Proxy(
    IHTMLFormElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLFormElement_get_onsubmit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFormElement_put_onreset_Proxy(
    IHTMLFormElement* This,
    VARIANT v);
void __RPC_STUB IHTMLFormElement_put_onreset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFormElement_get_onreset_Proxy(
    IHTMLFormElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLFormElement_get_onreset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFormElement_submit_Proxy(
    IHTMLFormElement* This);
void __RPC_STUB IHTMLFormElement_submit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFormElement_reset_Proxy(
    IHTMLFormElement* This);
void __RPC_STUB IHTMLFormElement_reset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFormElement_put_length_Proxy(
    IHTMLFormElement* This,
    LONG v);
void __RPC_STUB IHTMLFormElement_put_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFormElement_get_length_Proxy(
    IHTMLFormElement* This,
    LONG *p);
void __RPC_STUB IHTMLFormElement_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFormElement_get__newEnum_Proxy(
    IHTMLFormElement* This,
    IUnknown **p);
void __RPC_STUB IHTMLFormElement_get__newEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFormElement_item_Proxy(
    IHTMLFormElement* This,
    VARIANT name,
    VARIANT index,
    IDispatch **pdisp);
void __RPC_STUB IHTMLFormElement_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFormElement_tags_Proxy(
    IHTMLFormElement* This,
    VARIANT tagName,
    IDispatch **pdisp);
void __RPC_STUB IHTMLFormElement_tags_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLFormElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLFormElement2 interface
 */
#ifndef __IHTMLFormElement2_INTERFACE_DEFINED__
#define __IHTMLFormElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLFormElement2, 0x3050f4f6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f4f6-98b5-11cf-bb82-00aa00bdce0b")
IHTMLFormElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_acceptCharset(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_acceptCharset(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE urns(
        VARIANT urn,
        IDispatch **pdisp) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLFormElement2, 0x3050f4f6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLFormElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLFormElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLFormElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLFormElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLFormElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLFormElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLFormElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLFormElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLFormElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_acceptCharset)(
        IHTMLFormElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_acceptCharset)(
        IHTMLFormElement2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *urns)(
        IHTMLFormElement2* This,
        VARIANT urn,
        IDispatch **pdisp);

    END_INTERFACE
} IHTMLFormElement2Vtbl;
interface IHTMLFormElement2 {
    CONST_VTBL IHTMLFormElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLFormElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLFormElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLFormElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLFormElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLFormElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLFormElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLFormElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLFormElement2 methods ***/
#define IHTMLFormElement2_put_acceptCharset(This,v) (This)->lpVtbl->put_acceptCharset(This,v)
#define IHTMLFormElement2_get_acceptCharset(This,p) (This)->lpVtbl->get_acceptCharset(This,p)
#define IHTMLFormElement2_urns(This,urn,pdisp) (This)->lpVtbl->urns(This,urn,pdisp)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLFormElement2_QueryInterface(IHTMLFormElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLFormElement2_AddRef(IHTMLFormElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLFormElement2_Release(IHTMLFormElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLFormElement2_GetTypeInfoCount(IHTMLFormElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLFormElement2_GetTypeInfo(IHTMLFormElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLFormElement2_GetIDsOfNames(IHTMLFormElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLFormElement2_Invoke(IHTMLFormElement2* 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);
}
/*** IHTMLFormElement2 methods ***/
static FORCEINLINE HRESULT IHTMLFormElement2_put_acceptCharset(IHTMLFormElement2* This,BSTR v) {
    return This->lpVtbl->put_acceptCharset(This,v);
}
static FORCEINLINE HRESULT IHTMLFormElement2_get_acceptCharset(IHTMLFormElement2* This,BSTR *p) {
    return This->lpVtbl->get_acceptCharset(This,p);
}
static FORCEINLINE HRESULT IHTMLFormElement2_urns(IHTMLFormElement2* This,VARIANT urn,IDispatch **pdisp) {
    return This->lpVtbl->urns(This,urn,pdisp);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLFormElement2_put_acceptCharset_Proxy(
    IHTMLFormElement2* This,
    BSTR v);
void __RPC_STUB IHTMLFormElement2_put_acceptCharset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFormElement2_get_acceptCharset_Proxy(
    IHTMLFormElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLFormElement2_get_acceptCharset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFormElement2_urns_Proxy(
    IHTMLFormElement2* This,
    VARIANT urn,
    IDispatch **pdisp);
void __RPC_STUB IHTMLFormElement2_urns_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLFormElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLFormElement3 interface
 */
#ifndef __IHTMLFormElement3_INTERFACE_DEFINED__
#define __IHTMLFormElement3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLFormElement3, 0x3050f836, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f836-98b5-11cf-bb82-00aa00bdce0b")
IHTMLFormElement3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE namedItem(
        BSTR name,
        IDispatch **pdisp) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLFormElement3, 0x3050f836, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLFormElement3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLFormElement3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLFormElement3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLFormElement3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLFormElement3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLFormElement3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLFormElement3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLFormElement3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLFormElement3 methods ***/
    HRESULT (STDMETHODCALLTYPE *namedItem)(
        IHTMLFormElement3* This,
        BSTR name,
        IDispatch **pdisp);

    END_INTERFACE
} IHTMLFormElement3Vtbl;
interface IHTMLFormElement3 {
    CONST_VTBL IHTMLFormElement3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLFormElement3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLFormElement3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLFormElement3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLFormElement3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLFormElement3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLFormElement3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLFormElement3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLFormElement3 methods ***/
#define IHTMLFormElement3_namedItem(This,name,pdisp) (This)->lpVtbl->namedItem(This,name,pdisp)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLFormElement3_QueryInterface(IHTMLFormElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLFormElement3_AddRef(IHTMLFormElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLFormElement3_Release(IHTMLFormElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLFormElement3_GetTypeInfoCount(IHTMLFormElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLFormElement3_GetTypeInfo(IHTMLFormElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLFormElement3_GetIDsOfNames(IHTMLFormElement3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLFormElement3_Invoke(IHTMLFormElement3* 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);
}
/*** IHTMLFormElement3 methods ***/
static FORCEINLINE HRESULT IHTMLFormElement3_namedItem(IHTMLFormElement3* This,BSTR name,IDispatch **pdisp) {
    return This->lpVtbl->namedItem(This,name,pdisp);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLFormElement3_namedItem_Proxy(
    IHTMLFormElement3* This,
    BSTR name,
    IDispatch **pdisp);
void __RPC_STUB IHTMLFormElement3_namedItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLFormElement3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLSubmitData interface
 */
#ifndef __IHTMLSubmitData_INTERFACE_DEFINED__
#define __IHTMLSubmitData_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLSubmitData, 0x3050f645, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f645-98b5-11cf-bb82-00aa00bdce0b")
IHTMLSubmitData : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE appendNameValuePair(
        BSTR name = L"",
        BSTR value = L"") = 0;

    virtual HRESULT STDMETHODCALLTYPE appendNameFilePair(
        BSTR name = L"",
        BSTR filename = L"") = 0;

    virtual HRESULT STDMETHODCALLTYPE appendItemSeparator(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLSubmitData, 0x3050f645, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLSubmitDataVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLSubmitData* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLSubmitData* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLSubmitData* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLSubmitData* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLSubmitData* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLSubmitData* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLSubmitData* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLSubmitData methods ***/
    HRESULT (STDMETHODCALLTYPE *appendNameValuePair)(
        IHTMLSubmitData* This,
        BSTR name,
        BSTR value);

    HRESULT (STDMETHODCALLTYPE *appendNameFilePair)(
        IHTMLSubmitData* This,
        BSTR name,
        BSTR filename);

    HRESULT (STDMETHODCALLTYPE *appendItemSeparator)(
        IHTMLSubmitData* This);

    END_INTERFACE
} IHTMLSubmitDataVtbl;
interface IHTMLSubmitData {
    CONST_VTBL IHTMLSubmitDataVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLSubmitData_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLSubmitData_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLSubmitData_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLSubmitData_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLSubmitData_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLSubmitData_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLSubmitData_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLSubmitData methods ***/
#define IHTMLSubmitData_appendNameValuePair(This,name,value) (This)->lpVtbl->appendNameValuePair(This,name,value)
#define IHTMLSubmitData_appendNameFilePair(This,name,filename) (This)->lpVtbl->appendNameFilePair(This,name,filename)
#define IHTMLSubmitData_appendItemSeparator(This) (This)->lpVtbl->appendItemSeparator(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLSubmitData_QueryInterface(IHTMLSubmitData* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLSubmitData_AddRef(IHTMLSubmitData* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLSubmitData_Release(IHTMLSubmitData* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLSubmitData_GetTypeInfoCount(IHTMLSubmitData* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLSubmitData_GetTypeInfo(IHTMLSubmitData* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLSubmitData_GetIDsOfNames(IHTMLSubmitData* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLSubmitData_Invoke(IHTMLSubmitData* 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);
}
/*** IHTMLSubmitData methods ***/
static FORCEINLINE HRESULT IHTMLSubmitData_appendNameValuePair(IHTMLSubmitData* This,BSTR name,BSTR value) {
    return This->lpVtbl->appendNameValuePair(This,name,value);
}
static FORCEINLINE HRESULT IHTMLSubmitData_appendNameFilePair(IHTMLSubmitData* This,BSTR name,BSTR filename) {
    return This->lpVtbl->appendNameFilePair(This,name,filename);
}
static FORCEINLINE HRESULT IHTMLSubmitData_appendItemSeparator(IHTMLSubmitData* This) {
    return This->lpVtbl->appendItemSeparator(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLSubmitData_appendNameValuePair_Proxy(
    IHTMLSubmitData* This,
    BSTR name,
    BSTR value);
void __RPC_STUB IHTMLSubmitData_appendNameValuePair_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSubmitData_appendNameFilePair_Proxy(
    IHTMLSubmitData* This,
    BSTR name,
    BSTR filename);
void __RPC_STUB IHTMLSubmitData_appendNameFilePair_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSubmitData_appendItemSeparator_Proxy(
    IHTMLSubmitData* This);
void __RPC_STUB IHTMLSubmitData_appendItemSeparator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLSubmitData_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLFormElement4 interface
 */
#ifndef __IHTMLFormElement4_INTERFACE_DEFINED__
#define __IHTMLFormElement4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLFormElement4, 0x3051042c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051042c-98b5-11cf-bb82-00aa00bdce0b")
IHTMLFormElement4 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_action(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_action(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLFormElement4, 0x3051042c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLFormElement4Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLFormElement4* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLFormElement4* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLFormElement4* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLFormElement4* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLFormElement4* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLFormElement4* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLFormElement4* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLFormElement4 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_action)(
        IHTMLFormElement4* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_action)(
        IHTMLFormElement4* This,
        BSTR *p);

    END_INTERFACE
} IHTMLFormElement4Vtbl;
interface IHTMLFormElement4 {
    CONST_VTBL IHTMLFormElement4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLFormElement4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLFormElement4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLFormElement4_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLFormElement4_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLFormElement4_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLFormElement4_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLFormElement4_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLFormElement4 methods ***/
#define IHTMLFormElement4_put_action(This,v) (This)->lpVtbl->put_action(This,v)
#define IHTMLFormElement4_get_action(This,p) (This)->lpVtbl->get_action(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLFormElement4_QueryInterface(IHTMLFormElement4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLFormElement4_AddRef(IHTMLFormElement4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLFormElement4_Release(IHTMLFormElement4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLFormElement4_GetTypeInfoCount(IHTMLFormElement4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLFormElement4_GetTypeInfo(IHTMLFormElement4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLFormElement4_GetIDsOfNames(IHTMLFormElement4* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLFormElement4_Invoke(IHTMLFormElement4* 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);
}
/*** IHTMLFormElement4 methods ***/
static FORCEINLINE HRESULT IHTMLFormElement4_put_action(IHTMLFormElement4* This,BSTR v) {
    return This->lpVtbl->put_action(This,v);
}
static FORCEINLINE HRESULT IHTMLFormElement4_get_action(IHTMLFormElement4* This,BSTR *p) {
    return This->lpVtbl->get_action(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLFormElement4_put_action_Proxy(
    IHTMLFormElement4* This,
    BSTR v);
void __RPC_STUB IHTMLFormElement4_put_action_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFormElement4_get_action_Proxy(
    IHTMLFormElement4* This,
    BSTR *p);
void __RPC_STUB IHTMLFormElement4_get_action_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLFormElement4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLFormElement dispinterface
 */
#ifndef __DispHTMLFormElement_DISPINTERFACE_DEFINED__
#define __DispHTMLFormElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLFormElement, 0x3050f510, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f510-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLFormElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLFormElement, 0x3050f510, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLFormElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLFormElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLFormElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLFormElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLFormElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLFormElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLFormElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLFormElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLFormElementVtbl;
interface DispHTMLFormElement {
    CONST_VTBL DispHTMLFormElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLFormElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLFormElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLFormElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLFormElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLFormElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLFormElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLFormElement_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 DispHTMLFormElement_QueryInterface(DispHTMLFormElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLFormElement_AddRef(DispHTMLFormElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLFormElement_Release(DispHTMLFormElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLFormElement_GetTypeInfoCount(DispHTMLFormElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLFormElement_GetTypeInfo(DispHTMLFormElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLFormElement_GetIDsOfNames(DispHTMLFormElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLFormElement_Invoke(DispHTMLFormElement* 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  /* __DispHTMLFormElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLFormElement coclass
 */

DEFINE_GUID(CLSID_HTMLFormElement, 0x3050f251, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f251-98b5-11cf-bb82-00aa00bdce0b") HTMLFormElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLFormElement, 0x3050f251, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CFormElement;
/*****************************************************************************
 * HTMLControlElementEvents2 dispinterface
 */
#ifndef __HTMLControlElementEvents2_DISPINTERFACE_DEFINED__
#define __HTMLControlElementEvents2_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLControlElementEvents2, 0x3050f612, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f612-98b5-11cf-bb82-00aa00bdce0b")
HTMLControlElementEvents2 : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLControlElementEvents2, 0x3050f612, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLControlElementEvents2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLControlElementEvents2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLControlElementEvents2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLControlElementEvents2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLControlElementEvents2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLControlElementEvents2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLControlElementEvents2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLControlElementEvents2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLControlElementEvents2Vtbl;
interface HTMLControlElementEvents2 {
    CONST_VTBL HTMLControlElementEvents2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLControlElementEvents2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLControlElementEvents2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLControlElementEvents2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLControlElementEvents2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLControlElementEvents2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLControlElementEvents2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLControlElementEvents2_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 HTMLControlElementEvents2_QueryInterface(HTMLControlElementEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLControlElementEvents2_AddRef(HTMLControlElementEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLControlElementEvents2_Release(HTMLControlElementEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLControlElementEvents2_GetTypeInfoCount(HTMLControlElementEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLControlElementEvents2_GetTypeInfo(HTMLControlElementEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLControlElementEvents2_GetIDsOfNames(HTMLControlElementEvents2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLControlElementEvents2_Invoke(HTMLControlElementEvents2* 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  /* __HTMLControlElementEvents2_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLControlElementEvents dispinterface
 */
#ifndef __HTMLControlElementEvents_DISPINTERFACE_DEFINED__
#define __HTMLControlElementEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLControlElementEvents, 0x3050f4ea, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f4ea-98b5-11cf-bb82-00aa00bdce0b")
HTMLControlElementEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLControlElementEvents, 0x3050f4ea, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLControlElementEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLControlElementEvents* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLControlElementEvents* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLControlElementEvents* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLControlElementEvents* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLControlElementEvents* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLControlElementEvents* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLControlElementEvents* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLControlElementEventsVtbl;
interface HTMLControlElementEvents {
    CONST_VTBL HTMLControlElementEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLControlElementEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLControlElementEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLControlElementEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLControlElementEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLControlElementEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLControlElementEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLControlElementEvents_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 HTMLControlElementEvents_QueryInterface(HTMLControlElementEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLControlElementEvents_AddRef(HTMLControlElementEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLControlElementEvents_Release(HTMLControlElementEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLControlElementEvents_GetTypeInfoCount(HTMLControlElementEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLControlElementEvents_GetTypeInfo(HTMLControlElementEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLControlElementEvents_GetIDsOfNames(HTMLControlElementEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLControlElementEvents_Invoke(HTMLControlElementEvents* 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  /* __HTMLControlElementEvents_DISPINTERFACE_DEFINED__ */

typedef enum _htmlStart {
    htmlStartfileopen = 0,
    htmlStartmouseover = 1,
    htmlStart_Max = 0x7fffffff
} htmlStart;
/*****************************************************************************
 * IHTMLControlElement interface
 */
#ifndef __IHTMLControlElement_INTERFACE_DEFINED__
#define __IHTMLControlElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLControlElement, 0x3050f4e9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f4e9-98b5-11cf-bb82-00aa00bdce0b")
IHTMLControlElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_tabIndex(
        short v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_tabIndex(
        short *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE focus(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_accessKey(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_accessKey(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onblur(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onblur(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onfocus(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onfocus(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onresize(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onresize(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE blur(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE addFilter(
        IUnknown *pUnk) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeFilter(
        IUnknown *pUnk) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clientHeight(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clientWidth(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clientTop(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clientLeft(
        LONG *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLControlElement, 0x3050f4e9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLControlElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLControlElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLControlElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLControlElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLControlElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLControlElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLControlElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLControlElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLControlElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_tabIndex)(
        IHTMLControlElement* This,
        short v);

    HRESULT (STDMETHODCALLTYPE *get_tabIndex)(
        IHTMLControlElement* This,
        short *p);

    HRESULT (STDMETHODCALLTYPE *focus)(
        IHTMLControlElement* This);

    HRESULT (STDMETHODCALLTYPE *put_accessKey)(
        IHTMLControlElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_accessKey)(
        IHTMLControlElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_onblur)(
        IHTMLControlElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onblur)(
        IHTMLControlElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onfocus)(
        IHTMLControlElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onfocus)(
        IHTMLControlElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onresize)(
        IHTMLControlElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onresize)(
        IHTMLControlElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *blur)(
        IHTMLControlElement* This);

    HRESULT (STDMETHODCALLTYPE *addFilter)(
        IHTMLControlElement* This,
        IUnknown *pUnk);

    HRESULT (STDMETHODCALLTYPE *removeFilter)(
        IHTMLControlElement* This,
        IUnknown *pUnk);

    HRESULT (STDMETHODCALLTYPE *get_clientHeight)(
        IHTMLControlElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_clientWidth)(
        IHTMLControlElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_clientTop)(
        IHTMLControlElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_clientLeft)(
        IHTMLControlElement* This,
        LONG *p);

    END_INTERFACE
} IHTMLControlElementVtbl;
interface IHTMLControlElement {
    CONST_VTBL IHTMLControlElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLControlElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLControlElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLControlElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLControlElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLControlElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLControlElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLControlElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLControlElement methods ***/
#define IHTMLControlElement_put_tabIndex(This,v) (This)->lpVtbl->put_tabIndex(This,v)
#define IHTMLControlElement_get_tabIndex(This,p) (This)->lpVtbl->get_tabIndex(This,p)
#define IHTMLControlElement_focus(This) (This)->lpVtbl->focus(This)
#define IHTMLControlElement_put_accessKey(This,v) (This)->lpVtbl->put_accessKey(This,v)
#define IHTMLControlElement_get_accessKey(This,p) (This)->lpVtbl->get_accessKey(This,p)
#define IHTMLControlElement_put_onblur(This,v) (This)->lpVtbl->put_onblur(This,v)
#define IHTMLControlElement_get_onblur(This,p) (This)->lpVtbl->get_onblur(This,p)
#define IHTMLControlElement_put_onfocus(This,v) (This)->lpVtbl->put_onfocus(This,v)
#define IHTMLControlElement_get_onfocus(This,p) (This)->lpVtbl->get_onfocus(This,p)
#define IHTMLControlElement_put_onresize(This,v) (This)->lpVtbl->put_onresize(This,v)
#define IHTMLControlElement_get_onresize(This,p) (This)->lpVtbl->get_onresize(This,p)
#define IHTMLControlElement_blur(This) (This)->lpVtbl->blur(This)
#define IHTMLControlElement_addFilter(This,pUnk) (This)->lpVtbl->addFilter(This,pUnk)
#define IHTMLControlElement_removeFilter(This,pUnk) (This)->lpVtbl->removeFilter(This,pUnk)
#define IHTMLControlElement_get_clientHeight(This,p) (This)->lpVtbl->get_clientHeight(This,p)
#define IHTMLControlElement_get_clientWidth(This,p) (This)->lpVtbl->get_clientWidth(This,p)
#define IHTMLControlElement_get_clientTop(This,p) (This)->lpVtbl->get_clientTop(This,p)
#define IHTMLControlElement_get_clientLeft(This,p) (This)->lpVtbl->get_clientLeft(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLControlElement_QueryInterface(IHTMLControlElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLControlElement_AddRef(IHTMLControlElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLControlElement_Release(IHTMLControlElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLControlElement_GetTypeInfoCount(IHTMLControlElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLControlElement_GetTypeInfo(IHTMLControlElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLControlElement_GetIDsOfNames(IHTMLControlElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLControlElement_Invoke(IHTMLControlElement* 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);
}
/*** IHTMLControlElement methods ***/
static FORCEINLINE HRESULT IHTMLControlElement_put_tabIndex(IHTMLControlElement* This,short v) {
    return This->lpVtbl->put_tabIndex(This,v);
}
static FORCEINLINE HRESULT IHTMLControlElement_get_tabIndex(IHTMLControlElement* This,short *p) {
    return This->lpVtbl->get_tabIndex(This,p);
}
static FORCEINLINE HRESULT IHTMLControlElement_focus(IHTMLControlElement* This) {
    return This->lpVtbl->focus(This);
}
static FORCEINLINE HRESULT IHTMLControlElement_put_accessKey(IHTMLControlElement* This,BSTR v) {
    return This->lpVtbl->put_accessKey(This,v);
}
static FORCEINLINE HRESULT IHTMLControlElement_get_accessKey(IHTMLControlElement* This,BSTR *p) {
    return This->lpVtbl->get_accessKey(This,p);
}
static FORCEINLINE HRESULT IHTMLControlElement_put_onblur(IHTMLControlElement* This,VARIANT v) {
    return This->lpVtbl->put_onblur(This,v);
}
static FORCEINLINE HRESULT IHTMLControlElement_get_onblur(IHTMLControlElement* This,VARIANT *p) {
    return This->lpVtbl->get_onblur(This,p);
}
static FORCEINLINE HRESULT IHTMLControlElement_put_onfocus(IHTMLControlElement* This,VARIANT v) {
    return This->lpVtbl->put_onfocus(This,v);
}
static FORCEINLINE HRESULT IHTMLControlElement_get_onfocus(IHTMLControlElement* This,VARIANT *p) {
    return This->lpVtbl->get_onfocus(This,p);
}
static FORCEINLINE HRESULT IHTMLControlElement_put_onresize(IHTMLControlElement* This,VARIANT v) {
    return This->lpVtbl->put_onresize(This,v);
}
static FORCEINLINE HRESULT IHTMLControlElement_get_onresize(IHTMLControlElement* This,VARIANT *p) {
    return This->lpVtbl->get_onresize(This,p);
}
static FORCEINLINE HRESULT IHTMLControlElement_blur(IHTMLControlElement* This) {
    return This->lpVtbl->blur(This);
}
static FORCEINLINE HRESULT IHTMLControlElement_addFilter(IHTMLControlElement* This,IUnknown *pUnk) {
    return This->lpVtbl->addFilter(This,pUnk);
}
static FORCEINLINE HRESULT IHTMLControlElement_removeFilter(IHTMLControlElement* This,IUnknown *pUnk) {
    return This->lpVtbl->removeFilter(This,pUnk);
}
static FORCEINLINE HRESULT IHTMLControlElement_get_clientHeight(IHTMLControlElement* This,LONG *p) {
    return This->lpVtbl->get_clientHeight(This,p);
}
static FORCEINLINE HRESULT IHTMLControlElement_get_clientWidth(IHTMLControlElement* This,LONG *p) {
    return This->lpVtbl->get_clientWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLControlElement_get_clientTop(IHTMLControlElement* This,LONG *p) {
    return This->lpVtbl->get_clientTop(This,p);
}
static FORCEINLINE HRESULT IHTMLControlElement_get_clientLeft(IHTMLControlElement* This,LONG *p) {
    return This->lpVtbl->get_clientLeft(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLControlElement_put_tabIndex_Proxy(
    IHTMLControlElement* This,
    short v);
void __RPC_STUB IHTMLControlElement_put_tabIndex_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlElement_get_tabIndex_Proxy(
    IHTMLControlElement* This,
    short *p);
void __RPC_STUB IHTMLControlElement_get_tabIndex_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlElement_focus_Proxy(
    IHTMLControlElement* This);
void __RPC_STUB IHTMLControlElement_focus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlElement_put_accessKey_Proxy(
    IHTMLControlElement* This,
    BSTR v);
void __RPC_STUB IHTMLControlElement_put_accessKey_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlElement_get_accessKey_Proxy(
    IHTMLControlElement* This,
    BSTR *p);
void __RPC_STUB IHTMLControlElement_get_accessKey_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlElement_put_onblur_Proxy(
    IHTMLControlElement* This,
    VARIANT v);
void __RPC_STUB IHTMLControlElement_put_onblur_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlElement_get_onblur_Proxy(
    IHTMLControlElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLControlElement_get_onblur_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlElement_put_onfocus_Proxy(
    IHTMLControlElement* This,
    VARIANT v);
void __RPC_STUB IHTMLControlElement_put_onfocus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlElement_get_onfocus_Proxy(
    IHTMLControlElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLControlElement_get_onfocus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlElement_put_onresize_Proxy(
    IHTMLControlElement* This,
    VARIANT v);
void __RPC_STUB IHTMLControlElement_put_onresize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlElement_get_onresize_Proxy(
    IHTMLControlElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLControlElement_get_onresize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlElement_blur_Proxy(
    IHTMLControlElement* This);
void __RPC_STUB IHTMLControlElement_blur_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlElement_addFilter_Proxy(
    IHTMLControlElement* This,
    IUnknown *pUnk);
void __RPC_STUB IHTMLControlElement_addFilter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlElement_removeFilter_Proxy(
    IHTMLControlElement* This,
    IUnknown *pUnk);
void __RPC_STUB IHTMLControlElement_removeFilter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlElement_get_clientHeight_Proxy(
    IHTMLControlElement* This,
    LONG *p);
void __RPC_STUB IHTMLControlElement_get_clientHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlElement_get_clientWidth_Proxy(
    IHTMLControlElement* This,
    LONG *p);
void __RPC_STUB IHTMLControlElement_get_clientWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlElement_get_clientTop_Proxy(
    IHTMLControlElement* This,
    LONG *p);
void __RPC_STUB IHTMLControlElement_get_clientTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlElement_get_clientLeft_Proxy(
    IHTMLControlElement* This,
    LONG *p);
void __RPC_STUB IHTMLControlElement_get_clientLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLControlElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLTextElement interface
 */
#ifndef __IHTMLTextElement_INTERFACE_DEFINED__
#define __IHTMLTextElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTextElement, 0x3050f218, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f218-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTextElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTextElement, 0x3050f218, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTextElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTextElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTextElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTextElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTextElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTextElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTextElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTextElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} IHTMLTextElementVtbl;
interface IHTMLTextElement {
    CONST_VTBL IHTMLTextElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTextElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTextElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTextElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTextElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTextElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTextElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTextElement_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 IHTMLTextElement_QueryInterface(IHTMLTextElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTextElement_AddRef(IHTMLTextElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTextElement_Release(IHTMLTextElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTextElement_GetTypeInfoCount(IHTMLTextElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTextElement_GetTypeInfo(IHTMLTextElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTextElement_GetIDsOfNames(IHTMLTextElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTextElement_Invoke(IHTMLTextElement* 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  /* __IHTMLTextElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLTextElement dispinterface
 */
#ifndef __DispHTMLTextElement_DISPINTERFACE_DEFINED__
#define __DispHTMLTextElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLTextElement, 0x3050f537, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f537-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLTextElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLTextElement, 0x3050f537, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLTextElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLTextElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLTextElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLTextElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLTextElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLTextElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLTextElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLTextElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLTextElementVtbl;
interface DispHTMLTextElement {
    CONST_VTBL DispHTMLTextElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLTextElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLTextElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLTextElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLTextElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLTextElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLTextElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLTextElement_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 DispHTMLTextElement_QueryInterface(DispHTMLTextElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLTextElement_AddRef(DispHTMLTextElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLTextElement_Release(DispHTMLTextElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLTextElement_GetTypeInfoCount(DispHTMLTextElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLTextElement_GetTypeInfo(DispHTMLTextElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLTextElement_GetIDsOfNames(DispHTMLTextElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLTextElement_Invoke(DispHTMLTextElement* 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  /* __DispHTMLTextElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLTextElement coclass
 */

DEFINE_GUID(CLSID_HTMLTextElement, 0x3050f26a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f26a-98b5-11cf-bb82-00aa00bdce0b") HTMLTextElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLTextElement, 0x3050f26a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CTextElement;
/*****************************************************************************
 * HTMLTextContainerEvents2 dispinterface
 */
#ifndef __HTMLTextContainerEvents2_DISPINTERFACE_DEFINED__
#define __HTMLTextContainerEvents2_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLTextContainerEvents2, 0x3050f624, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f624-98b5-11cf-bb82-00aa00bdce0b")
HTMLTextContainerEvents2 : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLTextContainerEvents2, 0x3050f624, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLTextContainerEvents2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLTextContainerEvents2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLTextContainerEvents2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLTextContainerEvents2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLTextContainerEvents2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLTextContainerEvents2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLTextContainerEvents2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLTextContainerEvents2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLTextContainerEvents2Vtbl;
interface HTMLTextContainerEvents2 {
    CONST_VTBL HTMLTextContainerEvents2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLTextContainerEvents2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLTextContainerEvents2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLTextContainerEvents2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLTextContainerEvents2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLTextContainerEvents2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLTextContainerEvents2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLTextContainerEvents2_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 HTMLTextContainerEvents2_QueryInterface(HTMLTextContainerEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLTextContainerEvents2_AddRef(HTMLTextContainerEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLTextContainerEvents2_Release(HTMLTextContainerEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLTextContainerEvents2_GetTypeInfoCount(HTMLTextContainerEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLTextContainerEvents2_GetTypeInfo(HTMLTextContainerEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLTextContainerEvents2_GetIDsOfNames(HTMLTextContainerEvents2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLTextContainerEvents2_Invoke(HTMLTextContainerEvents2* 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  /* __HTMLTextContainerEvents2_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLTextContainerEvents dispinterface
 */
#ifndef __HTMLTextContainerEvents_DISPINTERFACE_DEFINED__
#define __HTMLTextContainerEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLTextContainerEvents, 0x1ff6aa72, 0x5842, 0x11cf, 0xa7,0x07, 0x00,0xaa,0x00,0xc0,0x09,0x8d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1ff6aa72-5842-11cf-a707-00aa00c0098d")
HTMLTextContainerEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLTextContainerEvents, 0x1ff6aa72, 0x5842, 0x11cf, 0xa7,0x07, 0x00,0xaa,0x00,0xc0,0x09,0x8d)
#endif
#else
typedef struct HTMLTextContainerEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLTextContainerEvents* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLTextContainerEvents* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLTextContainerEvents* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLTextContainerEvents* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLTextContainerEvents* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLTextContainerEvents* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLTextContainerEvents* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLTextContainerEventsVtbl;
interface HTMLTextContainerEvents {
    CONST_VTBL HTMLTextContainerEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLTextContainerEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLTextContainerEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLTextContainerEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLTextContainerEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLTextContainerEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLTextContainerEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLTextContainerEvents_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 HTMLTextContainerEvents_QueryInterface(HTMLTextContainerEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLTextContainerEvents_AddRef(HTMLTextContainerEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLTextContainerEvents_Release(HTMLTextContainerEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLTextContainerEvents_GetTypeInfoCount(HTMLTextContainerEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLTextContainerEvents_GetTypeInfo(HTMLTextContainerEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLTextContainerEvents_GetIDsOfNames(HTMLTextContainerEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLTextContainerEvents_Invoke(HTMLTextContainerEvents* 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  /* __HTMLTextContainerEvents_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLTextContainer interface
 */
#ifndef __IHTMLTextContainer_INTERFACE_DEFINED__
#define __IHTMLTextContainer_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTextContainer, 0x3050f230, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f230-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTextContainer : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE createControlRange(
        IDispatch **range) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollHeight(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollWidth(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollTop(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollTop(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollLeft(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollLeft(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onscroll(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onscroll(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTextContainer, 0x3050f230, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTextContainerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTextContainer* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTextContainer* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTextContainer* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTextContainer* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTextContainer* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTextContainer* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTextContainer* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLTextContainer methods ***/
    HRESULT (STDMETHODCALLTYPE *createControlRange)(
        IHTMLTextContainer* This,
        IDispatch **range);

    HRESULT (STDMETHODCALLTYPE *get_scrollHeight)(
        IHTMLTextContainer* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_scrollWidth)(
        IHTMLTextContainer* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollTop)(
        IHTMLTextContainer* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_scrollTop)(
        IHTMLTextContainer* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollLeft)(
        IHTMLTextContainer* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_scrollLeft)(
        IHTMLTextContainer* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_onscroll)(
        IHTMLTextContainer* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onscroll)(
        IHTMLTextContainer* This,
        VARIANT *p);

    END_INTERFACE
} IHTMLTextContainerVtbl;
interface IHTMLTextContainer {
    CONST_VTBL IHTMLTextContainerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTextContainer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTextContainer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTextContainer_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTextContainer_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTextContainer_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTextContainer_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTextContainer_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLTextContainer methods ***/
#define IHTMLTextContainer_createControlRange(This,range) (This)->lpVtbl->createControlRange(This,range)
#define IHTMLTextContainer_get_scrollHeight(This,p) (This)->lpVtbl->get_scrollHeight(This,p)
#define IHTMLTextContainer_get_scrollWidth(This,p) (This)->lpVtbl->get_scrollWidth(This,p)
#define IHTMLTextContainer_put_scrollTop(This,v) (This)->lpVtbl->put_scrollTop(This,v)
#define IHTMLTextContainer_get_scrollTop(This,p) (This)->lpVtbl->get_scrollTop(This,p)
#define IHTMLTextContainer_put_scrollLeft(This,v) (This)->lpVtbl->put_scrollLeft(This,v)
#define IHTMLTextContainer_get_scrollLeft(This,p) (This)->lpVtbl->get_scrollLeft(This,p)
#define IHTMLTextContainer_put_onscroll(This,v) (This)->lpVtbl->put_onscroll(This,v)
#define IHTMLTextContainer_get_onscroll(This,p) (This)->lpVtbl->get_onscroll(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLTextContainer_QueryInterface(IHTMLTextContainer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTextContainer_AddRef(IHTMLTextContainer* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTextContainer_Release(IHTMLTextContainer* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTextContainer_GetTypeInfoCount(IHTMLTextContainer* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTextContainer_GetTypeInfo(IHTMLTextContainer* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTextContainer_GetIDsOfNames(IHTMLTextContainer* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTextContainer_Invoke(IHTMLTextContainer* 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);
}
/*** IHTMLTextContainer methods ***/
static FORCEINLINE HRESULT IHTMLTextContainer_createControlRange(IHTMLTextContainer* This,IDispatch **range) {
    return This->lpVtbl->createControlRange(This,range);
}
static FORCEINLINE HRESULT IHTMLTextContainer_get_scrollHeight(IHTMLTextContainer* This,LONG *p) {
    return This->lpVtbl->get_scrollHeight(This,p);
}
static FORCEINLINE HRESULT IHTMLTextContainer_get_scrollWidth(IHTMLTextContainer* This,LONG *p) {
    return This->lpVtbl->get_scrollWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLTextContainer_put_scrollTop(IHTMLTextContainer* This,LONG v) {
    return This->lpVtbl->put_scrollTop(This,v);
}
static FORCEINLINE HRESULT IHTMLTextContainer_get_scrollTop(IHTMLTextContainer* This,LONG *p) {
    return This->lpVtbl->get_scrollTop(This,p);
}
static FORCEINLINE HRESULT IHTMLTextContainer_put_scrollLeft(IHTMLTextContainer* This,LONG v) {
    return This->lpVtbl->put_scrollLeft(This,v);
}
static FORCEINLINE HRESULT IHTMLTextContainer_get_scrollLeft(IHTMLTextContainer* This,LONG *p) {
    return This->lpVtbl->get_scrollLeft(This,p);
}
static FORCEINLINE HRESULT IHTMLTextContainer_put_onscroll(IHTMLTextContainer* This,VARIANT v) {
    return This->lpVtbl->put_onscroll(This,v);
}
static FORCEINLINE HRESULT IHTMLTextContainer_get_onscroll(IHTMLTextContainer* This,VARIANT *p) {
    return This->lpVtbl->get_onscroll(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLTextContainer_createControlRange_Proxy(
    IHTMLTextContainer* This,
    IDispatch **range);
void __RPC_STUB IHTMLTextContainer_createControlRange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextContainer_get_scrollHeight_Proxy(
    IHTMLTextContainer* This,
    LONG *p);
void __RPC_STUB IHTMLTextContainer_get_scrollHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextContainer_get_scrollWidth_Proxy(
    IHTMLTextContainer* This,
    LONG *p);
void __RPC_STUB IHTMLTextContainer_get_scrollWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextContainer_put_scrollTop_Proxy(
    IHTMLTextContainer* This,
    LONG v);
void __RPC_STUB IHTMLTextContainer_put_scrollTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextContainer_get_scrollTop_Proxy(
    IHTMLTextContainer* This,
    LONG *p);
void __RPC_STUB IHTMLTextContainer_get_scrollTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextContainer_put_scrollLeft_Proxy(
    IHTMLTextContainer* This,
    LONG v);
void __RPC_STUB IHTMLTextContainer_put_scrollLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextContainer_get_scrollLeft_Proxy(
    IHTMLTextContainer* This,
    LONG *p);
void __RPC_STUB IHTMLTextContainer_get_scrollLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextContainer_put_onscroll_Proxy(
    IHTMLTextContainer* This,
    VARIANT v);
void __RPC_STUB IHTMLTextContainer_put_onscroll_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextContainer_get_onscroll_Proxy(
    IHTMLTextContainer* This,
    VARIANT *p);
void __RPC_STUB IHTMLTextContainer_get_onscroll_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLTextContainer_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLControlRange interface
 */
#ifndef __IHTMLControlRange_INTERFACE_DEFINED__
#define __IHTMLControlRange_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLControlRange, 0x3050f29c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f29c-98b5-11cf-bb82-00aa00bdce0b")
IHTMLControlRange : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE select(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE add(
        IHTMLControlElement *item) = 0;

    virtual HRESULT STDMETHODCALLTYPE remove(
        LONG index) = 0;

    virtual HRESULT STDMETHODCALLTYPE item(
        LONG index,
        IHTMLElement **pdisp) = 0;

    virtual HRESULT STDMETHODCALLTYPE scrollIntoView(
        VARIANT varargStart) = 0;

    virtual HRESULT STDMETHODCALLTYPE queryCommandSupported(
        BSTR cmdID,
        VARIANT_BOOL *pfRet) = 0;

    virtual HRESULT STDMETHODCALLTYPE queryCommandEnabled(
        BSTR cmdID,
        VARIANT_BOOL *pfRet) = 0;

    virtual HRESULT STDMETHODCALLTYPE queryCommandState(
        BSTR cmdID,
        VARIANT_BOOL *pfRet) = 0;

    virtual HRESULT STDMETHODCALLTYPE queryCommandIndeterm(
        BSTR cmdID,
        VARIANT_BOOL *pfRet) = 0;

    virtual HRESULT STDMETHODCALLTYPE queryCommandText(
        BSTR cmdID,
        BSTR *pcmdText) = 0;

    virtual HRESULT STDMETHODCALLTYPE queryCommandValue(
        BSTR cmdID,
        VARIANT *pcmdValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE execCommand(
        BSTR cmdID,
        VARIANT_BOOL showUI,
        VARIANT value,
        VARIANT_BOOL *pfRet) = 0;

    virtual HRESULT STDMETHODCALLTYPE execCommandShowHelp(
        BSTR cmdID,
        VARIANT_BOOL *pfRet) = 0;

    virtual HRESULT STDMETHODCALLTYPE commonParentElement(
        IHTMLElement **parent) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLControlRange, 0x3050f29c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLControlRangeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLControlRange* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLControlRange* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLControlRange* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLControlRange* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLControlRange* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLControlRange* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLControlRange* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLControlRange methods ***/
    HRESULT (STDMETHODCALLTYPE *select)(
        IHTMLControlRange* This);

    HRESULT (STDMETHODCALLTYPE *add)(
        IHTMLControlRange* This,
        IHTMLControlElement *item);

    HRESULT (STDMETHODCALLTYPE *remove)(
        IHTMLControlRange* This,
        LONG index);

    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLControlRange* This,
        LONG index,
        IHTMLElement **pdisp);

    HRESULT (STDMETHODCALLTYPE *scrollIntoView)(
        IHTMLControlRange* This,
        VARIANT varargStart);

    HRESULT (STDMETHODCALLTYPE *queryCommandSupported)(
        IHTMLControlRange* This,
        BSTR cmdID,
        VARIANT_BOOL *pfRet);

    HRESULT (STDMETHODCALLTYPE *queryCommandEnabled)(
        IHTMLControlRange* This,
        BSTR cmdID,
        VARIANT_BOOL *pfRet);

    HRESULT (STDMETHODCALLTYPE *queryCommandState)(
        IHTMLControlRange* This,
        BSTR cmdID,
        VARIANT_BOOL *pfRet);

    HRESULT (STDMETHODCALLTYPE *queryCommandIndeterm)(
        IHTMLControlRange* This,
        BSTR cmdID,
        VARIANT_BOOL *pfRet);

    HRESULT (STDMETHODCALLTYPE *queryCommandText)(
        IHTMLControlRange* This,
        BSTR cmdID,
        BSTR *pcmdText);

    HRESULT (STDMETHODCALLTYPE *queryCommandValue)(
        IHTMLControlRange* This,
        BSTR cmdID,
        VARIANT *pcmdValue);

    HRESULT (STDMETHODCALLTYPE *execCommand)(
        IHTMLControlRange* This,
        BSTR cmdID,
        VARIANT_BOOL showUI,
        VARIANT value,
        VARIANT_BOOL *pfRet);

    HRESULT (STDMETHODCALLTYPE *execCommandShowHelp)(
        IHTMLControlRange* This,
        BSTR cmdID,
        VARIANT_BOOL *pfRet);

    HRESULT (STDMETHODCALLTYPE *commonParentElement)(
        IHTMLControlRange* This,
        IHTMLElement **parent);

    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLControlRange* This,
        LONG *p);

    END_INTERFACE
} IHTMLControlRangeVtbl;
interface IHTMLControlRange {
    CONST_VTBL IHTMLControlRangeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLControlRange_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLControlRange_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLControlRange_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLControlRange_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLControlRange_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLControlRange_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLControlRange_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLControlRange methods ***/
#define IHTMLControlRange_select(This) (This)->lpVtbl->select(This)
#define IHTMLControlRange_add(This,item) (This)->lpVtbl->add(This,item)
#define IHTMLControlRange_remove(This,index) (This)->lpVtbl->remove(This,index)
#define IHTMLControlRange_item(This,index,pdisp) (This)->lpVtbl->item(This,index,pdisp)
#define IHTMLControlRange_scrollIntoView(This,varargStart) (This)->lpVtbl->scrollIntoView(This,varargStart)
#define IHTMLControlRange_queryCommandSupported(This,cmdID,pfRet) (This)->lpVtbl->queryCommandSupported(This,cmdID,pfRet)
#define IHTMLControlRange_queryCommandEnabled(This,cmdID,pfRet) (This)->lpVtbl->queryCommandEnabled(This,cmdID,pfRet)
#define IHTMLControlRange_queryCommandState(This,cmdID,pfRet) (This)->lpVtbl->queryCommandState(This,cmdID,pfRet)
#define IHTMLControlRange_queryCommandIndeterm(This,cmdID,pfRet) (This)->lpVtbl->queryCommandIndeterm(This,cmdID,pfRet)
#define IHTMLControlRange_queryCommandText(This,cmdID,pcmdText) (This)->lpVtbl->queryCommandText(This,cmdID,pcmdText)
#define IHTMLControlRange_queryCommandValue(This,cmdID,pcmdValue) (This)->lpVtbl->queryCommandValue(This,cmdID,pcmdValue)
#define IHTMLControlRange_execCommand(This,cmdID,showUI,value,pfRet) (This)->lpVtbl->execCommand(This,cmdID,showUI,value,pfRet)
#define IHTMLControlRange_execCommandShowHelp(This,cmdID,pfRet) (This)->lpVtbl->execCommandShowHelp(This,cmdID,pfRet)
#define IHTMLControlRange_commonParentElement(This,parent) (This)->lpVtbl->commonParentElement(This,parent)
#define IHTMLControlRange_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLControlRange_QueryInterface(IHTMLControlRange* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLControlRange_AddRef(IHTMLControlRange* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLControlRange_Release(IHTMLControlRange* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLControlRange_GetTypeInfoCount(IHTMLControlRange* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLControlRange_GetTypeInfo(IHTMLControlRange* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLControlRange_GetIDsOfNames(IHTMLControlRange* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLControlRange_Invoke(IHTMLControlRange* 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);
}
/*** IHTMLControlRange methods ***/
static FORCEINLINE HRESULT IHTMLControlRange_select(IHTMLControlRange* This) {
    return This->lpVtbl->select(This);
}
static FORCEINLINE HRESULT IHTMLControlRange_add(IHTMLControlRange* This,IHTMLControlElement *item) {
    return This->lpVtbl->add(This,item);
}
static FORCEINLINE HRESULT IHTMLControlRange_remove(IHTMLControlRange* This,LONG index) {
    return This->lpVtbl->remove(This,index);
}
static FORCEINLINE HRESULT IHTMLControlRange_item(IHTMLControlRange* This,LONG index,IHTMLElement **pdisp) {
    return This->lpVtbl->item(This,index,pdisp);
}
static FORCEINLINE HRESULT IHTMLControlRange_scrollIntoView(IHTMLControlRange* This,VARIANT varargStart) {
    return This->lpVtbl->scrollIntoView(This,varargStart);
}
static FORCEINLINE HRESULT IHTMLControlRange_queryCommandSupported(IHTMLControlRange* This,BSTR cmdID,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->queryCommandSupported(This,cmdID,pfRet);
}
static FORCEINLINE HRESULT IHTMLControlRange_queryCommandEnabled(IHTMLControlRange* This,BSTR cmdID,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->queryCommandEnabled(This,cmdID,pfRet);
}
static FORCEINLINE HRESULT IHTMLControlRange_queryCommandState(IHTMLControlRange* This,BSTR cmdID,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->queryCommandState(This,cmdID,pfRet);
}
static FORCEINLINE HRESULT IHTMLControlRange_queryCommandIndeterm(IHTMLControlRange* This,BSTR cmdID,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->queryCommandIndeterm(This,cmdID,pfRet);
}
static FORCEINLINE HRESULT IHTMLControlRange_queryCommandText(IHTMLControlRange* This,BSTR cmdID,BSTR *pcmdText) {
    return This->lpVtbl->queryCommandText(This,cmdID,pcmdText);
}
static FORCEINLINE HRESULT IHTMLControlRange_queryCommandValue(IHTMLControlRange* This,BSTR cmdID,VARIANT *pcmdValue) {
    return This->lpVtbl->queryCommandValue(This,cmdID,pcmdValue);
}
static FORCEINLINE HRESULT IHTMLControlRange_execCommand(IHTMLControlRange* This,BSTR cmdID,VARIANT_BOOL showUI,VARIANT value,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->execCommand(This,cmdID,showUI,value,pfRet);
}
static FORCEINLINE HRESULT IHTMLControlRange_execCommandShowHelp(IHTMLControlRange* This,BSTR cmdID,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->execCommandShowHelp(This,cmdID,pfRet);
}
static FORCEINLINE HRESULT IHTMLControlRange_commonParentElement(IHTMLControlRange* This,IHTMLElement **parent) {
    return This->lpVtbl->commonParentElement(This,parent);
}
static FORCEINLINE HRESULT IHTMLControlRange_get_length(IHTMLControlRange* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLControlRange_select_Proxy(
    IHTMLControlRange* This);
void __RPC_STUB IHTMLControlRange_select_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlRange_add_Proxy(
    IHTMLControlRange* This,
    IHTMLControlElement *item);
void __RPC_STUB IHTMLControlRange_add_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlRange_remove_Proxy(
    IHTMLControlRange* This,
    LONG index);
void __RPC_STUB IHTMLControlRange_remove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlRange_item_Proxy(
    IHTMLControlRange* This,
    LONG index,
    IHTMLElement **pdisp);
void __RPC_STUB IHTMLControlRange_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlRange_scrollIntoView_Proxy(
    IHTMLControlRange* This,
    VARIANT varargStart);
void __RPC_STUB IHTMLControlRange_scrollIntoView_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlRange_queryCommandSupported_Proxy(
    IHTMLControlRange* This,
    BSTR cmdID,
    VARIANT_BOOL *pfRet);
void __RPC_STUB IHTMLControlRange_queryCommandSupported_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlRange_queryCommandEnabled_Proxy(
    IHTMLControlRange* This,
    BSTR cmdID,
    VARIANT_BOOL *pfRet);
void __RPC_STUB IHTMLControlRange_queryCommandEnabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlRange_queryCommandState_Proxy(
    IHTMLControlRange* This,
    BSTR cmdID,
    VARIANT_BOOL *pfRet);
void __RPC_STUB IHTMLControlRange_queryCommandState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlRange_queryCommandIndeterm_Proxy(
    IHTMLControlRange* This,
    BSTR cmdID,
    VARIANT_BOOL *pfRet);
void __RPC_STUB IHTMLControlRange_queryCommandIndeterm_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlRange_queryCommandText_Proxy(
    IHTMLControlRange* This,
    BSTR cmdID,
    BSTR *pcmdText);
void __RPC_STUB IHTMLControlRange_queryCommandText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlRange_queryCommandValue_Proxy(
    IHTMLControlRange* This,
    BSTR cmdID,
    VARIANT *pcmdValue);
void __RPC_STUB IHTMLControlRange_queryCommandValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlRange_execCommand_Proxy(
    IHTMLControlRange* This,
    BSTR cmdID,
    VARIANT_BOOL showUI,
    VARIANT value,
    VARIANT_BOOL *pfRet);
void __RPC_STUB IHTMLControlRange_execCommand_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlRange_execCommandShowHelp_Proxy(
    IHTMLControlRange* This,
    BSTR cmdID,
    VARIANT_BOOL *pfRet);
void __RPC_STUB IHTMLControlRange_execCommandShowHelp_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlRange_commonParentElement_Proxy(
    IHTMLControlRange* This,
    IHTMLElement **parent);
void __RPC_STUB IHTMLControlRange_commonParentElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLControlRange_get_length_Proxy(
    IHTMLControlRange* This,
    LONG *p);
void __RPC_STUB IHTMLControlRange_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLControlRange_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLControlRange2 interface
 */
#ifndef __IHTMLControlRange2_INTERFACE_DEFINED__
#define __IHTMLControlRange2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLControlRange2, 0x3050f65e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f65e-98b5-11cf-bb82-00aa00bdce0b")
IHTMLControlRange2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE addElement(
        IHTMLElement *item) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLControlRange2, 0x3050f65e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLControlRange2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLControlRange2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLControlRange2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLControlRange2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLControlRange2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLControlRange2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLControlRange2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLControlRange2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLControlRange2 methods ***/
    HRESULT (STDMETHODCALLTYPE *addElement)(
        IHTMLControlRange2* This,
        IHTMLElement *item);

    END_INTERFACE
} IHTMLControlRange2Vtbl;
interface IHTMLControlRange2 {
    CONST_VTBL IHTMLControlRange2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLControlRange2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLControlRange2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLControlRange2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLControlRange2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLControlRange2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLControlRange2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLControlRange2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLControlRange2 methods ***/
#define IHTMLControlRange2_addElement(This,item) (This)->lpVtbl->addElement(This,item)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLControlRange2_QueryInterface(IHTMLControlRange2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLControlRange2_AddRef(IHTMLControlRange2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLControlRange2_Release(IHTMLControlRange2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLControlRange2_GetTypeInfoCount(IHTMLControlRange2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLControlRange2_GetTypeInfo(IHTMLControlRange2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLControlRange2_GetIDsOfNames(IHTMLControlRange2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLControlRange2_Invoke(IHTMLControlRange2* 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);
}
/*** IHTMLControlRange2 methods ***/
static FORCEINLINE HRESULT IHTMLControlRange2_addElement(IHTMLControlRange2* This,IHTMLElement *item) {
    return This->lpVtbl->addElement(This,item);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLControlRange2_addElement_Proxy(
    IHTMLControlRange2* This,
    IHTMLElement *item);
void __RPC_STUB IHTMLControlRange2_addElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLControlRange2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLImgEvents2 dispinterface
 */
#ifndef __HTMLImgEvents2_DISPINTERFACE_DEFINED__
#define __HTMLImgEvents2_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLImgEvents2, 0x3050f616, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f616-98b5-11cf-bb82-00aa00bdce0b")
HTMLImgEvents2 : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLImgEvents2, 0x3050f616, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLImgEvents2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLImgEvents2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLImgEvents2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLImgEvents2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLImgEvents2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLImgEvents2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLImgEvents2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLImgEvents2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLImgEvents2Vtbl;
interface HTMLImgEvents2 {
    CONST_VTBL HTMLImgEvents2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLImgEvents2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLImgEvents2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLImgEvents2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLImgEvents2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLImgEvents2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLImgEvents2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLImgEvents2_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 HTMLImgEvents2_QueryInterface(HTMLImgEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLImgEvents2_AddRef(HTMLImgEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLImgEvents2_Release(HTMLImgEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLImgEvents2_GetTypeInfoCount(HTMLImgEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLImgEvents2_GetTypeInfo(HTMLImgEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLImgEvents2_GetIDsOfNames(HTMLImgEvents2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLImgEvents2_Invoke(HTMLImgEvents2* 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  /* __HTMLImgEvents2_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLImgEvents dispinterface
 */
#ifndef __HTMLImgEvents_DISPINTERFACE_DEFINED__
#define __HTMLImgEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLImgEvents, 0x3050f25b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f25b-98b5-11cf-bb82-00aa00bdce0b")
HTMLImgEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLImgEvents, 0x3050f25b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLImgEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLImgEvents* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLImgEvents* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLImgEvents* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLImgEvents* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLImgEvents* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLImgEvents* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLImgEvents* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLImgEventsVtbl;
interface HTMLImgEvents {
    CONST_VTBL HTMLImgEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLImgEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLImgEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLImgEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLImgEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLImgEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLImgEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLImgEvents_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 HTMLImgEvents_QueryInterface(HTMLImgEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLImgEvents_AddRef(HTMLImgEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLImgEvents_Release(HTMLImgEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLImgEvents_GetTypeInfoCount(HTMLImgEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLImgEvents_GetTypeInfo(HTMLImgEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLImgEvents_GetIDsOfNames(HTMLImgEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLImgEvents_Invoke(HTMLImgEvents* 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  /* __HTMLImgEvents_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLImgElement interface
 */
#ifndef __IHTMLImgElement_INTERFACE_DEFINED__
#define __IHTMLImgElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLImgElement, 0x3050f240, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f240-98b5-11cf-bb82-00aa00bdce0b")
IHTMLImgElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_isMap(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_isMap(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_useMap(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_useMap(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_mimeType(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fileSize(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fileCreatedDate(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fileModifiedDate(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fileUpdatedDate(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_protocol(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_href(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_nameProp(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_border(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_border(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_vspace(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_vspace(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_hspace(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_hspace(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_alt(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_alt(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_src(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_src(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_lowsrc(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_lowsrc(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_vrml(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_vrml(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_dynsrc(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_dynsrc(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_readyState(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_complete(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_loop(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_loop(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_align(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_align(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onload(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onload(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onerror(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onerror(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onabort(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onabort(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_name(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_width(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_width(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_height(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_height(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_start(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_start(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLImgElement, 0x3050f240, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLImgElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLImgElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLImgElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLImgElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLImgElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLImgElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLImgElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLImgElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLImgElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_isMap)(
        IHTMLImgElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_isMap)(
        IHTMLImgElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_useMap)(
        IHTMLImgElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_useMap)(
        IHTMLImgElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_mimeType)(
        IHTMLImgElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_fileSize)(
        IHTMLImgElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_fileCreatedDate)(
        IHTMLImgElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_fileModifiedDate)(
        IHTMLImgElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_fileUpdatedDate)(
        IHTMLImgElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_protocol)(
        IHTMLImgElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_href)(
        IHTMLImgElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_nameProp)(
        IHTMLImgElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_border)(
        IHTMLImgElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_border)(
        IHTMLImgElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_vspace)(
        IHTMLImgElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_vspace)(
        IHTMLImgElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_hspace)(
        IHTMLImgElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_hspace)(
        IHTMLImgElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_alt)(
        IHTMLImgElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_alt)(
        IHTMLImgElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_src)(
        IHTMLImgElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_src)(
        IHTMLImgElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_lowsrc)(
        IHTMLImgElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_lowsrc)(
        IHTMLImgElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_vrml)(
        IHTMLImgElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_vrml)(
        IHTMLImgElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_dynsrc)(
        IHTMLImgElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_dynsrc)(
        IHTMLImgElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_readyState)(
        IHTMLImgElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_complete)(
        IHTMLImgElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_loop)(
        IHTMLImgElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_loop)(
        IHTMLImgElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_align)(
        IHTMLImgElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_align)(
        IHTMLImgElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_onload)(
        IHTMLImgElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onload)(
        IHTMLImgElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onerror)(
        IHTMLImgElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onerror)(
        IHTMLImgElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onabort)(
        IHTMLImgElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onabort)(
        IHTMLImgElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_name)(
        IHTMLImgElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_name)(
        IHTMLImgElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_width)(
        IHTMLImgElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_width)(
        IHTMLImgElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_height)(
        IHTMLImgElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_height)(
        IHTMLImgElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_start)(
        IHTMLImgElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_start)(
        IHTMLImgElement* This,
        BSTR *p);

    END_INTERFACE
} IHTMLImgElementVtbl;
interface IHTMLImgElement {
    CONST_VTBL IHTMLImgElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLImgElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLImgElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLImgElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLImgElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLImgElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLImgElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLImgElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLImgElement methods ***/
#define IHTMLImgElement_put_isMap(This,v) (This)->lpVtbl->put_isMap(This,v)
#define IHTMLImgElement_get_isMap(This,p) (This)->lpVtbl->get_isMap(This,p)
#define IHTMLImgElement_put_useMap(This,v) (This)->lpVtbl->put_useMap(This,v)
#define IHTMLImgElement_get_useMap(This,p) (This)->lpVtbl->get_useMap(This,p)
#define IHTMLImgElement_get_mimeType(This,p) (This)->lpVtbl->get_mimeType(This,p)
#define IHTMLImgElement_get_fileSize(This,p) (This)->lpVtbl->get_fileSize(This,p)
#define IHTMLImgElement_get_fileCreatedDate(This,p) (This)->lpVtbl->get_fileCreatedDate(This,p)
#define IHTMLImgElement_get_fileModifiedDate(This,p) (This)->lpVtbl->get_fileModifiedDate(This,p)
#define IHTMLImgElement_get_fileUpdatedDate(This,p) (This)->lpVtbl->get_fileUpdatedDate(This,p)
#define IHTMLImgElement_get_protocol(This,p) (This)->lpVtbl->get_protocol(This,p)
#define IHTMLImgElement_get_href(This,p) (This)->lpVtbl->get_href(This,p)
#define IHTMLImgElement_get_nameProp(This,p) (This)->lpVtbl->get_nameProp(This,p)
#define IHTMLImgElement_put_border(This,v) (This)->lpVtbl->put_border(This,v)
#define IHTMLImgElement_get_border(This,p) (This)->lpVtbl->get_border(This,p)
#define IHTMLImgElement_put_vspace(This,v) (This)->lpVtbl->put_vspace(This,v)
#define IHTMLImgElement_get_vspace(This,p) (This)->lpVtbl->get_vspace(This,p)
#define IHTMLImgElement_put_hspace(This,v) (This)->lpVtbl->put_hspace(This,v)
#define IHTMLImgElement_get_hspace(This,p) (This)->lpVtbl->get_hspace(This,p)
#define IHTMLImgElement_put_alt(This,v) (This)->lpVtbl->put_alt(This,v)
#define IHTMLImgElement_get_alt(This,p) (This)->lpVtbl->get_alt(This,p)
#define IHTMLImgElement_put_src(This,v) (This)->lpVtbl->put_src(This,v)
#define IHTMLImgElement_get_src(This,p) (This)->lpVtbl->get_src(This,p)
#define IHTMLImgElement_put_lowsrc(This,v) (This)->lpVtbl->put_lowsrc(This,v)
#define IHTMLImgElement_get_lowsrc(This,p) (This)->lpVtbl->get_lowsrc(This,p)
#define IHTMLImgElement_put_vrml(This,v) (This)->lpVtbl->put_vrml(This,v)
#define IHTMLImgElement_get_vrml(This,p) (This)->lpVtbl->get_vrml(This,p)
#define IHTMLImgElement_put_dynsrc(This,v) (This)->lpVtbl->put_dynsrc(This,v)
#define IHTMLImgElement_get_dynsrc(This,p) (This)->lpVtbl->get_dynsrc(This,p)
#define IHTMLImgElement_get_readyState(This,p) (This)->lpVtbl->get_readyState(This,p)
#define IHTMLImgElement_get_complete(This,p) (This)->lpVtbl->get_complete(This,p)
#define IHTMLImgElement_put_loop(This,v) (This)->lpVtbl->put_loop(This,v)
#define IHTMLImgElement_get_loop(This,p) (This)->lpVtbl->get_loop(This,p)
#define IHTMLImgElement_put_align(This,v) (This)->lpVtbl->put_align(This,v)
#define IHTMLImgElement_get_align(This,p) (This)->lpVtbl->get_align(This,p)
#define IHTMLImgElement_put_onload(This,v) (This)->lpVtbl->put_onload(This,v)
#define IHTMLImgElement_get_onload(This,p) (This)->lpVtbl->get_onload(This,p)
#define IHTMLImgElement_put_onerror(This,v) (This)->lpVtbl->put_onerror(This,v)
#define IHTMLImgElement_get_onerror(This,p) (This)->lpVtbl->get_onerror(This,p)
#define IHTMLImgElement_put_onabort(This,v) (This)->lpVtbl->put_onabort(This,v)
#define IHTMLImgElement_get_onabort(This,p) (This)->lpVtbl->get_onabort(This,p)
#define IHTMLImgElement_put_name(This,v) (This)->lpVtbl->put_name(This,v)
#define IHTMLImgElement_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#define IHTMLImgElement_put_width(This,v) (This)->lpVtbl->put_width(This,v)
#define IHTMLImgElement_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#define IHTMLImgElement_put_height(This,v) (This)->lpVtbl->put_height(This,v)
#define IHTMLImgElement_get_height(This,p) (This)->lpVtbl->get_height(This,p)
#define IHTMLImgElement_put_start(This,v) (This)->lpVtbl->put_start(This,v)
#define IHTMLImgElement_get_start(This,p) (This)->lpVtbl->get_start(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLImgElement_QueryInterface(IHTMLImgElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLImgElement_AddRef(IHTMLImgElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLImgElement_Release(IHTMLImgElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLImgElement_GetTypeInfoCount(IHTMLImgElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLImgElement_GetTypeInfo(IHTMLImgElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLImgElement_GetIDsOfNames(IHTMLImgElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLImgElement_Invoke(IHTMLImgElement* 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);
}
/*** IHTMLImgElement methods ***/
static FORCEINLINE HRESULT IHTMLImgElement_put_isMap(IHTMLImgElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_isMap(This,v);
}
static FORCEINLINE HRESULT IHTMLImgElement_get_isMap(IHTMLImgElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_isMap(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement_put_useMap(IHTMLImgElement* This,BSTR v) {
    return This->lpVtbl->put_useMap(This,v);
}
static FORCEINLINE HRESULT IHTMLImgElement_get_useMap(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_useMap(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement_get_mimeType(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_mimeType(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement_get_fileSize(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_fileSize(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement_get_fileCreatedDate(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_fileCreatedDate(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement_get_fileModifiedDate(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_fileModifiedDate(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement_get_fileUpdatedDate(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_fileUpdatedDate(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement_get_protocol(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_protocol(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement_get_href(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_href(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement_get_nameProp(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_nameProp(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement_put_border(IHTMLImgElement* This,VARIANT v) {
    return This->lpVtbl->put_border(This,v);
}
static FORCEINLINE HRESULT IHTMLImgElement_get_border(IHTMLImgElement* This,VARIANT *p) {
    return This->lpVtbl->get_border(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement_put_vspace(IHTMLImgElement* This,LONG v) {
    return This->lpVtbl->put_vspace(This,v);
}
static FORCEINLINE HRESULT IHTMLImgElement_get_vspace(IHTMLImgElement* This,LONG *p) {
    return This->lpVtbl->get_vspace(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement_put_hspace(IHTMLImgElement* This,LONG v) {
    return This->lpVtbl->put_hspace(This,v);
}
static FORCEINLINE HRESULT IHTMLImgElement_get_hspace(IHTMLImgElement* This,LONG *p) {
    return This->lpVtbl->get_hspace(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement_put_alt(IHTMLImgElement* This,BSTR v) {
    return This->lpVtbl->put_alt(This,v);
}
static FORCEINLINE HRESULT IHTMLImgElement_get_alt(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_alt(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement_put_src(IHTMLImgElement* This,BSTR v) {
    return This->lpVtbl->put_src(This,v);
}
static FORCEINLINE HRESULT IHTMLImgElement_get_src(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_src(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement_put_lowsrc(IHTMLImgElement* This,BSTR v) {
    return This->lpVtbl->put_lowsrc(This,v);
}
static FORCEINLINE HRESULT IHTMLImgElement_get_lowsrc(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_lowsrc(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement_put_vrml(IHTMLImgElement* This,BSTR v) {
    return This->lpVtbl->put_vrml(This,v);
}
static FORCEINLINE HRESULT IHTMLImgElement_get_vrml(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_vrml(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement_put_dynsrc(IHTMLImgElement* This,BSTR v) {
    return This->lpVtbl->put_dynsrc(This,v);
}
static FORCEINLINE HRESULT IHTMLImgElement_get_dynsrc(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_dynsrc(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement_get_readyState(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_readyState(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement_get_complete(IHTMLImgElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_complete(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement_put_loop(IHTMLImgElement* This,VARIANT v) {
    return This->lpVtbl->put_loop(This,v);
}
static FORCEINLINE HRESULT IHTMLImgElement_get_loop(IHTMLImgElement* This,VARIANT *p) {
    return This->lpVtbl->get_loop(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement_put_align(IHTMLImgElement* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static FORCEINLINE HRESULT IHTMLImgElement_get_align(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement_put_onload(IHTMLImgElement* This,VARIANT v) {
    return This->lpVtbl->put_onload(This,v);
}
static FORCEINLINE HRESULT IHTMLImgElement_get_onload(IHTMLImgElement* This,VARIANT *p) {
    return This->lpVtbl->get_onload(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement_put_onerror(IHTMLImgElement* This,VARIANT v) {
    return This->lpVtbl->put_onerror(This,v);
}
static FORCEINLINE HRESULT IHTMLImgElement_get_onerror(IHTMLImgElement* This,VARIANT *p) {
    return This->lpVtbl->get_onerror(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement_put_onabort(IHTMLImgElement* This,VARIANT v) {
    return This->lpVtbl->put_onabort(This,v);
}
static FORCEINLINE HRESULT IHTMLImgElement_get_onabort(IHTMLImgElement* This,VARIANT *p) {
    return This->lpVtbl->get_onabort(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement_put_name(IHTMLImgElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static FORCEINLINE HRESULT IHTMLImgElement_get_name(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement_put_width(IHTMLImgElement* This,LONG v) {
    return This->lpVtbl->put_width(This,v);
}
static FORCEINLINE HRESULT IHTMLImgElement_get_width(IHTMLImgElement* This,LONG *p) {
    return This->lpVtbl->get_width(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement_put_height(IHTMLImgElement* This,LONG v) {
    return This->lpVtbl->put_height(This,v);
}
static FORCEINLINE HRESULT IHTMLImgElement_get_height(IHTMLImgElement* This,LONG *p) {
    return This->lpVtbl->get_height(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement_put_start(IHTMLImgElement* This,BSTR v) {
    return This->lpVtbl->put_start(This,v);
}
static FORCEINLINE HRESULT IHTMLImgElement_get_start(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_start(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLImgElement_put_isMap_Proxy(
    IHTMLImgElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLImgElement_put_isMap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_get_isMap_Proxy(
    IHTMLImgElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLImgElement_get_isMap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_put_useMap_Proxy(
    IHTMLImgElement* This,
    BSTR v);
void __RPC_STUB IHTMLImgElement_put_useMap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_get_useMap_Proxy(
    IHTMLImgElement* This,
    BSTR *p);
void __RPC_STUB IHTMLImgElement_get_useMap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_get_mimeType_Proxy(
    IHTMLImgElement* This,
    BSTR *p);
void __RPC_STUB IHTMLImgElement_get_mimeType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_get_fileSize_Proxy(
    IHTMLImgElement* This,
    BSTR *p);
void __RPC_STUB IHTMLImgElement_get_fileSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_get_fileCreatedDate_Proxy(
    IHTMLImgElement* This,
    BSTR *p);
void __RPC_STUB IHTMLImgElement_get_fileCreatedDate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_get_fileModifiedDate_Proxy(
    IHTMLImgElement* This,
    BSTR *p);
void __RPC_STUB IHTMLImgElement_get_fileModifiedDate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_get_fileUpdatedDate_Proxy(
    IHTMLImgElement* This,
    BSTR *p);
void __RPC_STUB IHTMLImgElement_get_fileUpdatedDate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_get_protocol_Proxy(
    IHTMLImgElement* This,
    BSTR *p);
void __RPC_STUB IHTMLImgElement_get_protocol_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_get_href_Proxy(
    IHTMLImgElement* This,
    BSTR *p);
void __RPC_STUB IHTMLImgElement_get_href_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_get_nameProp_Proxy(
    IHTMLImgElement* This,
    BSTR *p);
void __RPC_STUB IHTMLImgElement_get_nameProp_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_put_border_Proxy(
    IHTMLImgElement* This,
    VARIANT v);
void __RPC_STUB IHTMLImgElement_put_border_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_get_border_Proxy(
    IHTMLImgElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLImgElement_get_border_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_put_vspace_Proxy(
    IHTMLImgElement* This,
    LONG v);
void __RPC_STUB IHTMLImgElement_put_vspace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_get_vspace_Proxy(
    IHTMLImgElement* This,
    LONG *p);
void __RPC_STUB IHTMLImgElement_get_vspace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_put_hspace_Proxy(
    IHTMLImgElement* This,
    LONG v);
void __RPC_STUB IHTMLImgElement_put_hspace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_get_hspace_Proxy(
    IHTMLImgElement* This,
    LONG *p);
void __RPC_STUB IHTMLImgElement_get_hspace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_put_alt_Proxy(
    IHTMLImgElement* This,
    BSTR v);
void __RPC_STUB IHTMLImgElement_put_alt_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_get_alt_Proxy(
    IHTMLImgElement* This,
    BSTR *p);
void __RPC_STUB IHTMLImgElement_get_alt_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_put_src_Proxy(
    IHTMLImgElement* This,
    BSTR v);
void __RPC_STUB IHTMLImgElement_put_src_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_get_src_Proxy(
    IHTMLImgElement* This,
    BSTR *p);
void __RPC_STUB IHTMLImgElement_get_src_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_put_lowsrc_Proxy(
    IHTMLImgElement* This,
    BSTR v);
void __RPC_STUB IHTMLImgElement_put_lowsrc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_get_lowsrc_Proxy(
    IHTMLImgElement* This,
    BSTR *p);
void __RPC_STUB IHTMLImgElement_get_lowsrc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_put_vrml_Proxy(
    IHTMLImgElement* This,
    BSTR v);
void __RPC_STUB IHTMLImgElement_put_vrml_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_get_vrml_Proxy(
    IHTMLImgElement* This,
    BSTR *p);
void __RPC_STUB IHTMLImgElement_get_vrml_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_put_dynsrc_Proxy(
    IHTMLImgElement* This,
    BSTR v);
void __RPC_STUB IHTMLImgElement_put_dynsrc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_get_dynsrc_Proxy(
    IHTMLImgElement* This,
    BSTR *p);
void __RPC_STUB IHTMLImgElement_get_dynsrc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_get_readyState_Proxy(
    IHTMLImgElement* This,
    BSTR *p);
void __RPC_STUB IHTMLImgElement_get_readyState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_get_complete_Proxy(
    IHTMLImgElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLImgElement_get_complete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_put_loop_Proxy(
    IHTMLImgElement* This,
    VARIANT v);
void __RPC_STUB IHTMLImgElement_put_loop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_get_loop_Proxy(
    IHTMLImgElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLImgElement_get_loop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_put_align_Proxy(
    IHTMLImgElement* This,
    BSTR v);
void __RPC_STUB IHTMLImgElement_put_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_get_align_Proxy(
    IHTMLImgElement* This,
    BSTR *p);
void __RPC_STUB IHTMLImgElement_get_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_put_onload_Proxy(
    IHTMLImgElement* This,
    VARIANT v);
void __RPC_STUB IHTMLImgElement_put_onload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_get_onload_Proxy(
    IHTMLImgElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLImgElement_get_onload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_put_onerror_Proxy(
    IHTMLImgElement* This,
    VARIANT v);
void __RPC_STUB IHTMLImgElement_put_onerror_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_get_onerror_Proxy(
    IHTMLImgElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLImgElement_get_onerror_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_put_onabort_Proxy(
    IHTMLImgElement* This,
    VARIANT v);
void __RPC_STUB IHTMLImgElement_put_onabort_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_get_onabort_Proxy(
    IHTMLImgElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLImgElement_get_onabort_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_put_name_Proxy(
    IHTMLImgElement* This,
    BSTR v);
void __RPC_STUB IHTMLImgElement_put_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_get_name_Proxy(
    IHTMLImgElement* This,
    BSTR *p);
void __RPC_STUB IHTMLImgElement_get_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_put_width_Proxy(
    IHTMLImgElement* This,
    LONG v);
void __RPC_STUB IHTMLImgElement_put_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_get_width_Proxy(
    IHTMLImgElement* This,
    LONG *p);
void __RPC_STUB IHTMLImgElement_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_put_height_Proxy(
    IHTMLImgElement* This,
    LONG v);
void __RPC_STUB IHTMLImgElement_put_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_get_height_Proxy(
    IHTMLImgElement* This,
    LONG *p);
void __RPC_STUB IHTMLImgElement_get_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_put_start_Proxy(
    IHTMLImgElement* This,
    BSTR v);
void __RPC_STUB IHTMLImgElement_put_start_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement_get_start_Proxy(
    IHTMLImgElement* This,
    BSTR *p);
void __RPC_STUB IHTMLImgElement_get_start_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLImgElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLImgElement2 interface
 */
#ifndef __IHTMLImgElement2_INTERFACE_DEFINED__
#define __IHTMLImgElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLImgElement2, 0x3050f826, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f826-98b5-11cf-bb82-00aa00bdce0b")
IHTMLImgElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_longDesc(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_longDesc(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLImgElement2, 0x3050f826, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLImgElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLImgElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLImgElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLImgElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLImgElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLImgElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLImgElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLImgElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLImgElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_longDesc)(
        IHTMLImgElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_longDesc)(
        IHTMLImgElement2* This,
        BSTR *p);

    END_INTERFACE
} IHTMLImgElement2Vtbl;
interface IHTMLImgElement2 {
    CONST_VTBL IHTMLImgElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLImgElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLImgElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLImgElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLImgElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLImgElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLImgElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLImgElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLImgElement2 methods ***/
#define IHTMLImgElement2_put_longDesc(This,v) (This)->lpVtbl->put_longDesc(This,v)
#define IHTMLImgElement2_get_longDesc(This,p) (This)->lpVtbl->get_longDesc(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLImgElement2_QueryInterface(IHTMLImgElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLImgElement2_AddRef(IHTMLImgElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLImgElement2_Release(IHTMLImgElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLImgElement2_GetTypeInfoCount(IHTMLImgElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLImgElement2_GetTypeInfo(IHTMLImgElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLImgElement2_GetIDsOfNames(IHTMLImgElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLImgElement2_Invoke(IHTMLImgElement2* 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);
}
/*** IHTMLImgElement2 methods ***/
static FORCEINLINE HRESULT IHTMLImgElement2_put_longDesc(IHTMLImgElement2* This,BSTR v) {
    return This->lpVtbl->put_longDesc(This,v);
}
static FORCEINLINE HRESULT IHTMLImgElement2_get_longDesc(IHTMLImgElement2* This,BSTR *p) {
    return This->lpVtbl->get_longDesc(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLImgElement2_put_longDesc_Proxy(
    IHTMLImgElement2* This,
    BSTR v);
void __RPC_STUB IHTMLImgElement2_put_longDesc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement2_get_longDesc_Proxy(
    IHTMLImgElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLImgElement2_get_longDesc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLImgElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLImgElement3 interface
 */
#ifndef __IHTMLImgElement3_INTERFACE_DEFINED__
#define __IHTMLImgElement3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLImgElement3, 0x30510434, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510434-98b5-11cf-bb82-00aa00bdce0b")
IHTMLImgElement3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_longDesc(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_longDesc(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_vrml(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_vrml(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_lowsrc(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_lowsrc(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_dynsrc(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_dynsrc(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLImgElement3, 0x30510434, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLImgElement3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLImgElement3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLImgElement3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLImgElement3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLImgElement3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLImgElement3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLImgElement3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLImgElement3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLImgElement3 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_longDesc)(
        IHTMLImgElement3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_longDesc)(
        IHTMLImgElement3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_vrml)(
        IHTMLImgElement3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_vrml)(
        IHTMLImgElement3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_lowsrc)(
        IHTMLImgElement3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_lowsrc)(
        IHTMLImgElement3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_dynsrc)(
        IHTMLImgElement3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_dynsrc)(
        IHTMLImgElement3* This,
        BSTR *p);

    END_INTERFACE
} IHTMLImgElement3Vtbl;
interface IHTMLImgElement3 {
    CONST_VTBL IHTMLImgElement3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLImgElement3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLImgElement3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLImgElement3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLImgElement3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLImgElement3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLImgElement3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLImgElement3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLImgElement3 methods ***/
#define IHTMLImgElement3_put_longDesc(This,v) (This)->lpVtbl->put_longDesc(This,v)
#define IHTMLImgElement3_get_longDesc(This,p) (This)->lpVtbl->get_longDesc(This,p)
#define IHTMLImgElement3_put_vrml(This,v) (This)->lpVtbl->put_vrml(This,v)
#define IHTMLImgElement3_get_vrml(This,p) (This)->lpVtbl->get_vrml(This,p)
#define IHTMLImgElement3_put_lowsrc(This,v) (This)->lpVtbl->put_lowsrc(This,v)
#define IHTMLImgElement3_get_lowsrc(This,p) (This)->lpVtbl->get_lowsrc(This,p)
#define IHTMLImgElement3_put_dynsrc(This,v) (This)->lpVtbl->put_dynsrc(This,v)
#define IHTMLImgElement3_get_dynsrc(This,p) (This)->lpVtbl->get_dynsrc(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLImgElement3_QueryInterface(IHTMLImgElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLImgElement3_AddRef(IHTMLImgElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLImgElement3_Release(IHTMLImgElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLImgElement3_GetTypeInfoCount(IHTMLImgElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLImgElement3_GetTypeInfo(IHTMLImgElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLImgElement3_GetIDsOfNames(IHTMLImgElement3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLImgElement3_Invoke(IHTMLImgElement3* 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);
}
/*** IHTMLImgElement3 methods ***/
static FORCEINLINE HRESULT IHTMLImgElement3_put_longDesc(IHTMLImgElement3* This,BSTR v) {
    return This->lpVtbl->put_longDesc(This,v);
}
static FORCEINLINE HRESULT IHTMLImgElement3_get_longDesc(IHTMLImgElement3* This,BSTR *p) {
    return This->lpVtbl->get_longDesc(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement3_put_vrml(IHTMLImgElement3* This,BSTR v) {
    return This->lpVtbl->put_vrml(This,v);
}
static FORCEINLINE HRESULT IHTMLImgElement3_get_vrml(IHTMLImgElement3* This,BSTR *p) {
    return This->lpVtbl->get_vrml(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement3_put_lowsrc(IHTMLImgElement3* This,BSTR v) {
    return This->lpVtbl->put_lowsrc(This,v);
}
static FORCEINLINE HRESULT IHTMLImgElement3_get_lowsrc(IHTMLImgElement3* This,BSTR *p) {
    return This->lpVtbl->get_lowsrc(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement3_put_dynsrc(IHTMLImgElement3* This,BSTR v) {
    return This->lpVtbl->put_dynsrc(This,v);
}
static FORCEINLINE HRESULT IHTMLImgElement3_get_dynsrc(IHTMLImgElement3* This,BSTR *p) {
    return This->lpVtbl->get_dynsrc(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLImgElement3_put_longDesc_Proxy(
    IHTMLImgElement3* This,
    BSTR v);
void __RPC_STUB IHTMLImgElement3_put_longDesc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement3_get_longDesc_Proxy(
    IHTMLImgElement3* This,
    BSTR *p);
void __RPC_STUB IHTMLImgElement3_get_longDesc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement3_put_vrml_Proxy(
    IHTMLImgElement3* This,
    BSTR v);
void __RPC_STUB IHTMLImgElement3_put_vrml_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement3_get_vrml_Proxy(
    IHTMLImgElement3* This,
    BSTR *p);
void __RPC_STUB IHTMLImgElement3_get_vrml_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement3_put_lowsrc_Proxy(
    IHTMLImgElement3* This,
    BSTR v);
void __RPC_STUB IHTMLImgElement3_put_lowsrc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement3_get_lowsrc_Proxy(
    IHTMLImgElement3* This,
    BSTR *p);
void __RPC_STUB IHTMLImgElement3_get_lowsrc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement3_put_dynsrc_Proxy(
    IHTMLImgElement3* This,
    BSTR v);
void __RPC_STUB IHTMLImgElement3_put_dynsrc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement3_get_dynsrc_Proxy(
    IHTMLImgElement3* This,
    BSTR *p);
void __RPC_STUB IHTMLImgElement3_get_dynsrc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLImgElement3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLImgElement4 interface
 */
#ifndef __IHTMLImgElement4_INTERFACE_DEFINED__
#define __IHTMLImgElement4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLImgElement4, 0x305107f6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305107f6-98b5-11cf-bb82-00aa00bdce0b")
IHTMLImgElement4 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_naturalWidth(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_naturalHeight(
        LONG *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLImgElement4, 0x305107f6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLImgElement4Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLImgElement4* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLImgElement4* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLImgElement4* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLImgElement4* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLImgElement4* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLImgElement4* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLImgElement4* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLImgElement4 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_naturalWidth)(
        IHTMLImgElement4* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_naturalHeight)(
        IHTMLImgElement4* This,
        LONG *p);

    END_INTERFACE
} IHTMLImgElement4Vtbl;
interface IHTMLImgElement4 {
    CONST_VTBL IHTMLImgElement4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLImgElement4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLImgElement4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLImgElement4_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLImgElement4_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLImgElement4_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLImgElement4_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLImgElement4_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLImgElement4 methods ***/
#define IHTMLImgElement4_get_naturalWidth(This,p) (This)->lpVtbl->get_naturalWidth(This,p)
#define IHTMLImgElement4_get_naturalHeight(This,p) (This)->lpVtbl->get_naturalHeight(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLImgElement4_QueryInterface(IHTMLImgElement4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLImgElement4_AddRef(IHTMLImgElement4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLImgElement4_Release(IHTMLImgElement4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLImgElement4_GetTypeInfoCount(IHTMLImgElement4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLImgElement4_GetTypeInfo(IHTMLImgElement4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLImgElement4_GetIDsOfNames(IHTMLImgElement4* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLImgElement4_Invoke(IHTMLImgElement4* 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);
}
/*** IHTMLImgElement4 methods ***/
static FORCEINLINE HRESULT IHTMLImgElement4_get_naturalWidth(IHTMLImgElement4* This,LONG *p) {
    return This->lpVtbl->get_naturalWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLImgElement4_get_naturalHeight(IHTMLImgElement4* This,LONG *p) {
    return This->lpVtbl->get_naturalHeight(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLImgElement4_get_naturalWidth_Proxy(
    IHTMLImgElement4* This,
    LONG *p);
void __RPC_STUB IHTMLImgElement4_get_naturalWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLImgElement4_get_naturalHeight_Proxy(
    IHTMLImgElement4* This,
    LONG *p);
void __RPC_STUB IHTMLImgElement4_get_naturalHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLImgElement4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLMSImgElement interface
 */
#ifndef __IHTMLMSImgElement_INTERFACE_DEFINED__
#define __IHTMLMSImgElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLMSImgElement, 0x30510793, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510793-98b5-11cf-bb82-00aa00bdce0b")
IHTMLMSImgElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_msPlayToDisabled(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msPlayToDisabled(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msPlayToPrimary(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msPlayToPrimary(
        VARIANT_BOOL *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLMSImgElement, 0x30510793, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLMSImgElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLMSImgElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLMSImgElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLMSImgElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLMSImgElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLMSImgElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLMSImgElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLMSImgElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLMSImgElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_msPlayToDisabled)(
        IHTMLMSImgElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_msPlayToDisabled)(
        IHTMLMSImgElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_msPlayToPrimary)(
        IHTMLMSImgElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_msPlayToPrimary)(
        IHTMLMSImgElement* This,
        VARIANT_BOOL *p);

    END_INTERFACE
} IHTMLMSImgElementVtbl;
interface IHTMLMSImgElement {
    CONST_VTBL IHTMLMSImgElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLMSImgElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLMSImgElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLMSImgElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLMSImgElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLMSImgElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLMSImgElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLMSImgElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLMSImgElement methods ***/
#define IHTMLMSImgElement_put_msPlayToDisabled(This,v) (This)->lpVtbl->put_msPlayToDisabled(This,v)
#define IHTMLMSImgElement_get_msPlayToDisabled(This,p) (This)->lpVtbl->get_msPlayToDisabled(This,p)
#define IHTMLMSImgElement_put_msPlayToPrimary(This,v) (This)->lpVtbl->put_msPlayToPrimary(This,v)
#define IHTMLMSImgElement_get_msPlayToPrimary(This,p) (This)->lpVtbl->get_msPlayToPrimary(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLMSImgElement_QueryInterface(IHTMLMSImgElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLMSImgElement_AddRef(IHTMLMSImgElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLMSImgElement_Release(IHTMLMSImgElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLMSImgElement_GetTypeInfoCount(IHTMLMSImgElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLMSImgElement_GetTypeInfo(IHTMLMSImgElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLMSImgElement_GetIDsOfNames(IHTMLMSImgElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLMSImgElement_Invoke(IHTMLMSImgElement* 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);
}
/*** IHTMLMSImgElement methods ***/
static FORCEINLINE HRESULT IHTMLMSImgElement_put_msPlayToDisabled(IHTMLMSImgElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_msPlayToDisabled(This,v);
}
static FORCEINLINE HRESULT IHTMLMSImgElement_get_msPlayToDisabled(IHTMLMSImgElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_msPlayToDisabled(This,p);
}
static FORCEINLINE HRESULT IHTMLMSImgElement_put_msPlayToPrimary(IHTMLMSImgElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_msPlayToPrimary(This,v);
}
static FORCEINLINE HRESULT IHTMLMSImgElement_get_msPlayToPrimary(IHTMLMSImgElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_msPlayToPrimary(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLMSImgElement_put_msPlayToDisabled_Proxy(
    IHTMLMSImgElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLMSImgElement_put_msPlayToDisabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMSImgElement_get_msPlayToDisabled_Proxy(
    IHTMLMSImgElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLMSImgElement_get_msPlayToDisabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMSImgElement_put_msPlayToPrimary_Proxy(
    IHTMLMSImgElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLMSImgElement_put_msPlayToPrimary_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMSImgElement_get_msPlayToPrimary_Proxy(
    IHTMLMSImgElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLMSImgElement_get_msPlayToPrimary_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLMSImgElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLImageElementFactory interface
 */
#ifndef __IHTMLImageElementFactory_INTERFACE_DEFINED__
#define __IHTMLImageElementFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLImageElementFactory, 0x3050f38e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f38e-98b5-11cf-bb82-00aa00bdce0b")
IHTMLImageElementFactory : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE create(
        VARIANT width,
        VARIANT height,
        IHTMLImgElement **a) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLImageElementFactory, 0x3050f38e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLImageElementFactoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLImageElementFactory* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLImageElementFactory* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLImageElementFactory* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLImageElementFactory* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLImageElementFactory* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLImageElementFactory* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLImageElementFactory* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLImageElementFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *create)(
        IHTMLImageElementFactory* This,
        VARIANT width,
        VARIANT height,
        IHTMLImgElement **a);

    END_INTERFACE
} IHTMLImageElementFactoryVtbl;
interface IHTMLImageElementFactory {
    CONST_VTBL IHTMLImageElementFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLImageElementFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLImageElementFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLImageElementFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLImageElementFactory_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLImageElementFactory_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLImageElementFactory_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLImageElementFactory_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLImageElementFactory methods ***/
#define IHTMLImageElementFactory_create(This,width,height,a) (This)->lpVtbl->create(This,width,height,a)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLImageElementFactory_QueryInterface(IHTMLImageElementFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLImageElementFactory_AddRef(IHTMLImageElementFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLImageElementFactory_Release(IHTMLImageElementFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLImageElementFactory_GetTypeInfoCount(IHTMLImageElementFactory* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLImageElementFactory_GetTypeInfo(IHTMLImageElementFactory* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLImageElementFactory_GetIDsOfNames(IHTMLImageElementFactory* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLImageElementFactory_Invoke(IHTMLImageElementFactory* 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);
}
/*** IHTMLImageElementFactory methods ***/
static FORCEINLINE HRESULT IHTMLImageElementFactory_create(IHTMLImageElementFactory* This,VARIANT width,VARIANT height,IHTMLImgElement **a) {
    return This->lpVtbl->create(This,width,height,a);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLImageElementFactory_create_Proxy(
    IHTMLImageElementFactory* This,
    VARIANT width,
    VARIANT height,
    IHTMLImgElement **a);
void __RPC_STUB IHTMLImageElementFactory_create_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLImageElementFactory_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLImg dispinterface
 */
#ifndef __DispHTMLImg_DISPINTERFACE_DEFINED__
#define __DispHTMLImg_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLImg, 0x3050f51c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f51c-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLImg : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLImg, 0x3050f51c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLImgVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLImg* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLImg* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLImg* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLImg* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLImg* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLImg* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLImg* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLImgVtbl;
interface DispHTMLImg {
    CONST_VTBL DispHTMLImgVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLImg_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLImg_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLImg_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLImg_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLImg_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLImg_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLImg_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 DispHTMLImg_QueryInterface(DispHTMLImg* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLImg_AddRef(DispHTMLImg* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLImg_Release(DispHTMLImg* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLImg_GetTypeInfoCount(DispHTMLImg* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLImg_GetTypeInfo(DispHTMLImg* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLImg_GetIDsOfNames(DispHTMLImg* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLImg_Invoke(DispHTMLImg* 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  /* __DispHTMLImg_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLImg coclass
 */

DEFINE_GUID(CLSID_HTMLImg, 0x3050f241, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f241-98b5-11cf-bb82-00aa00bdce0b") HTMLImg;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLImg, 0x3050f241, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CImgElement;
/*****************************************************************************
 * HTMLImageElementFactory coclass
 */

DEFINE_GUID(CLSID_HTMLImageElementFactory, 0x3050f38f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f38f-98b5-11cf-bb82-00aa00bdce0b") HTMLImageElementFactory;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLImageElementFactory, 0x3050f38f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CImageElementFactory;
typedef enum _bodyScroll {
    bodyScrollyes = 1,
    bodyScrollno = 2,
    bodyScrollauto = 4,
    bodyScrolldefault = 3,
    bodyScroll_Max = 0x7fffffff
} bodyScroll;
/*****************************************************************************
 * IHTMLBodyElement interface
 */
#ifndef __IHTMLBodyElement_INTERFACE_DEFINED__
#define __IHTMLBodyElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLBodyElement, 0x3050f1d8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f1d8-98b5-11cf-bb82-00aa00bdce0b")
IHTMLBodyElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_background(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_background(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_bgProperties(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_bgProperties(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_leftMargin(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_leftMargin(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_topMargin(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_topMargin(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_rightMargin(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_rightMargin(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_bottomMargin(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_bottomMargin(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_noWrap(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_noWrap(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_bgColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_bgColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_text(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_text(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_link(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_link(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_vLink(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_vLink(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_aLink(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_aLink(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onload(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onload(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onunload(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onunload(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scroll(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scroll(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onselect(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onselect(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onbeforeunload(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onbeforeunload(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE createTextRange(
        IHTMLTxtRange **range) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLBodyElement, 0x3050f1d8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLBodyElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLBodyElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLBodyElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLBodyElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLBodyElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLBodyElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLBodyElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLBodyElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLBodyElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_background)(
        IHTMLBodyElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_background)(
        IHTMLBodyElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_bgProperties)(
        IHTMLBodyElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_bgProperties)(
        IHTMLBodyElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_leftMargin)(
        IHTMLBodyElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_leftMargin)(
        IHTMLBodyElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_topMargin)(
        IHTMLBodyElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_topMargin)(
        IHTMLBodyElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_rightMargin)(
        IHTMLBodyElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_rightMargin)(
        IHTMLBodyElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_bottomMargin)(
        IHTMLBodyElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_bottomMargin)(
        IHTMLBodyElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_noWrap)(
        IHTMLBodyElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_noWrap)(
        IHTMLBodyElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_bgColor)(
        IHTMLBodyElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_bgColor)(
        IHTMLBodyElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_text)(
        IHTMLBodyElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_text)(
        IHTMLBodyElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_link)(
        IHTMLBodyElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_link)(
        IHTMLBodyElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_vLink)(
        IHTMLBodyElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_vLink)(
        IHTMLBodyElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_aLink)(
        IHTMLBodyElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_aLink)(
        IHTMLBodyElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onload)(
        IHTMLBodyElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onload)(
        IHTMLBodyElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onunload)(
        IHTMLBodyElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onunload)(
        IHTMLBodyElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_scroll)(
        IHTMLBodyElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_scroll)(
        IHTMLBodyElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_onselect)(
        IHTMLBodyElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onselect)(
        IHTMLBodyElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onbeforeunload)(
        IHTMLBodyElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onbeforeunload)(
        IHTMLBodyElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *createTextRange)(
        IHTMLBodyElement* This,
        IHTMLTxtRange **range);

    END_INTERFACE
} IHTMLBodyElementVtbl;
interface IHTMLBodyElement {
    CONST_VTBL IHTMLBodyElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLBodyElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLBodyElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLBodyElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLBodyElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLBodyElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLBodyElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLBodyElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLBodyElement methods ***/
#define IHTMLBodyElement_put_background(This,v) (This)->lpVtbl->put_background(This,v)
#define IHTMLBodyElement_get_background(This,p) (This)->lpVtbl->get_background(This,p)
#define IHTMLBodyElement_put_bgProperties(This,v) (This)->lpVtbl->put_bgProperties(This,v)
#define IHTMLBodyElement_get_bgProperties(This,p) (This)->lpVtbl->get_bgProperties(This,p)
#define IHTMLBodyElement_put_leftMargin(This,v) (This)->lpVtbl->put_leftMargin(This,v)
#define IHTMLBodyElement_get_leftMargin(This,p) (This)->lpVtbl->get_leftMargin(This,p)
#define IHTMLBodyElement_put_topMargin(This,v) (This)->lpVtbl->put_topMargin(This,v)
#define IHTMLBodyElement_get_topMargin(This,p) (This)->lpVtbl->get_topMargin(This,p)
#define IHTMLBodyElement_put_rightMargin(This,v) (This)->lpVtbl->put_rightMargin(This,v)
#define IHTMLBodyElement_get_rightMargin(This,p) (This)->lpVtbl->get_rightMargin(This,p)
#define IHTMLBodyElement_put_bottomMargin(This,v) (This)->lpVtbl->put_bottomMargin(This,v)
#define IHTMLBodyElement_get_bottomMargin(This,p) (This)->lpVtbl->get_bottomMargin(This,p)
#define IHTMLBodyElement_put_noWrap(This,v) (This)->lpVtbl->put_noWrap(This,v)
#define IHTMLBodyElement_get_noWrap(This,p) (This)->lpVtbl->get_noWrap(This,p)
#define IHTMLBodyElement_put_bgColor(This,v) (This)->lpVtbl->put_bgColor(This,v)
#define IHTMLBodyElement_get_bgColor(This,p) (This)->lpVtbl->get_bgColor(This,p)
#define IHTMLBodyElement_put_text(This,v) (This)->lpVtbl->put_text(This,v)
#define IHTMLBodyElement_get_text(This,p) (This)->lpVtbl->get_text(This,p)
#define IHTMLBodyElement_put_link(This,v) (This)->lpVtbl->put_link(This,v)
#define IHTMLBodyElement_get_link(This,p) (This)->lpVtbl->get_link(This,p)
#define IHTMLBodyElement_put_vLink(This,v) (This)->lpVtbl->put_vLink(This,v)
#define IHTMLBodyElement_get_vLink(This,p) (This)->lpVtbl->get_vLink(This,p)
#define IHTMLBodyElement_put_aLink(This,v) (This)->lpVtbl->put_aLink(This,v)
#define IHTMLBodyElement_get_aLink(This,p) (This)->lpVtbl->get_aLink(This,p)
#define IHTMLBodyElement_put_onload(This,v) (This)->lpVtbl->put_onload(This,v)
#define IHTMLBodyElement_get_onload(This,p) (This)->lpVtbl->get_onload(This,p)
#define IHTMLBodyElement_put_onunload(This,v) (This)->lpVtbl->put_onunload(This,v)
#define IHTMLBodyElement_get_onunload(This,p) (This)->lpVtbl->get_onunload(This,p)
#define IHTMLBodyElement_put_scroll(This,v) (This)->lpVtbl->put_scroll(This,v)
#define IHTMLBodyElement_get_scroll(This,p) (This)->lpVtbl->get_scroll(This,p)
#define IHTMLBodyElement_put_onselect(This,v) (This)->lpVtbl->put_onselect(This,v)
#define IHTMLBodyElement_get_onselect(This,p) (This)->lpVtbl->get_onselect(This,p)
#define IHTMLBodyElement_put_onbeforeunload(This,v) (This)->lpVtbl->put_onbeforeunload(This,v)
#define IHTMLBodyElement_get_onbeforeunload(This,p) (This)->lpVtbl->get_onbeforeunload(This,p)
#define IHTMLBodyElement_createTextRange(This,range) (This)->lpVtbl->createTextRange(This,range)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLBodyElement_QueryInterface(IHTMLBodyElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLBodyElement_AddRef(IHTMLBodyElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLBodyElement_Release(IHTMLBodyElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLBodyElement_GetTypeInfoCount(IHTMLBodyElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLBodyElement_GetTypeInfo(IHTMLBodyElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLBodyElement_GetIDsOfNames(IHTMLBodyElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLBodyElement_Invoke(IHTMLBodyElement* 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);
}
/*** IHTMLBodyElement methods ***/
static FORCEINLINE HRESULT IHTMLBodyElement_put_background(IHTMLBodyElement* This,BSTR v) {
    return This->lpVtbl->put_background(This,v);
}
static FORCEINLINE HRESULT IHTMLBodyElement_get_background(IHTMLBodyElement* This,BSTR *p) {
    return This->lpVtbl->get_background(This,p);
}
static FORCEINLINE HRESULT IHTMLBodyElement_put_bgProperties(IHTMLBodyElement* This,BSTR v) {
    return This->lpVtbl->put_bgProperties(This,v);
}
static FORCEINLINE HRESULT IHTMLBodyElement_get_bgProperties(IHTMLBodyElement* This,BSTR *p) {
    return This->lpVtbl->get_bgProperties(This,p);
}
static FORCEINLINE HRESULT IHTMLBodyElement_put_leftMargin(IHTMLBodyElement* This,VARIANT v) {
    return This->lpVtbl->put_leftMargin(This,v);
}
static FORCEINLINE HRESULT IHTMLBodyElement_get_leftMargin(IHTMLBodyElement* This,VARIANT *p) {
    return This->lpVtbl->get_leftMargin(This,p);
}
static FORCEINLINE HRESULT IHTMLBodyElement_put_topMargin(IHTMLBodyElement* This,VARIANT v) {
    return This->lpVtbl->put_topMargin(This,v);
}
static FORCEINLINE HRESULT IHTMLBodyElement_get_topMargin(IHTMLBodyElement* This,VARIANT *p) {
    return This->lpVtbl->get_topMargin(This,p);
}
static FORCEINLINE HRESULT IHTMLBodyElement_put_rightMargin(IHTMLBodyElement* This,VARIANT v) {
    return This->lpVtbl->put_rightMargin(This,v);
}
static FORCEINLINE HRESULT IHTMLBodyElement_get_rightMargin(IHTMLBodyElement* This,VARIANT *p) {
    return This->lpVtbl->get_rightMargin(This,p);
}
static FORCEINLINE HRESULT IHTMLBodyElement_put_bottomMargin(IHTMLBodyElement* This,VARIANT v) {
    return This->lpVtbl->put_bottomMargin(This,v);
}
static FORCEINLINE HRESULT IHTMLBodyElement_get_bottomMargin(IHTMLBodyElement* This,VARIANT *p) {
    return This->lpVtbl->get_bottomMargin(This,p);
}
static FORCEINLINE HRESULT IHTMLBodyElement_put_noWrap(IHTMLBodyElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_noWrap(This,v);
}
static FORCEINLINE HRESULT IHTMLBodyElement_get_noWrap(IHTMLBodyElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_noWrap(This,p);
}
static FORCEINLINE HRESULT IHTMLBodyElement_put_bgColor(IHTMLBodyElement* This,VARIANT v) {
    return This->lpVtbl->put_bgColor(This,v);
}
static FORCEINLINE HRESULT IHTMLBodyElement_get_bgColor(IHTMLBodyElement* This,VARIANT *p) {
    return This->lpVtbl->get_bgColor(This,p);
}
static FORCEINLINE HRESULT IHTMLBodyElement_put_text(IHTMLBodyElement* This,VARIANT v) {
    return This->lpVtbl->put_text(This,v);
}
static FORCEINLINE HRESULT IHTMLBodyElement_get_text(IHTMLBodyElement* This,VARIANT *p) {
    return This->lpVtbl->get_text(This,p);
}
static FORCEINLINE HRESULT IHTMLBodyElement_put_link(IHTMLBodyElement* This,VARIANT v) {
    return This->lpVtbl->put_link(This,v);
}
static FORCEINLINE HRESULT IHTMLBodyElement_get_link(IHTMLBodyElement* This,VARIANT *p) {
    return This->lpVtbl->get_link(This,p);
}
static FORCEINLINE HRESULT IHTMLBodyElement_put_vLink(IHTMLBodyElement* This,VARIANT v) {
    return This->lpVtbl->put_vLink(This,v);
}
static FORCEINLINE HRESULT IHTMLBodyElement_get_vLink(IHTMLBodyElement* This,VARIANT *p) {
    return This->lpVtbl->get_vLink(This,p);
}
static FORCEINLINE HRESULT IHTMLBodyElement_put_aLink(IHTMLBodyElement* This,VARIANT v) {
    return This->lpVtbl->put_aLink(This,v);
}
static FORCEINLINE HRESULT IHTMLBodyElement_get_aLink(IHTMLBodyElement* This,VARIANT *p) {
    return This->lpVtbl->get_aLink(This,p);
}
static FORCEINLINE HRESULT IHTMLBodyElement_put_onload(IHTMLBodyElement* This,VARIANT v) {
    return This->lpVtbl->put_onload(This,v);
}
static FORCEINLINE HRESULT IHTMLBodyElement_get_onload(IHTMLBodyElement* This,VARIANT *p) {
    return This->lpVtbl->get_onload(This,p);
}
static FORCEINLINE HRESULT IHTMLBodyElement_put_onunload(IHTMLBodyElement* This,VARIANT v) {
    return This->lpVtbl->put_onunload(This,v);
}
static FORCEINLINE HRESULT IHTMLBodyElement_get_onunload(IHTMLBodyElement* This,VARIANT *p) {
    return This->lpVtbl->get_onunload(This,p);
}
static FORCEINLINE HRESULT IHTMLBodyElement_put_scroll(IHTMLBodyElement* This,BSTR v) {
    return This->lpVtbl->put_scroll(This,v);
}
static FORCEINLINE HRESULT IHTMLBodyElement_get_scroll(IHTMLBodyElement* This,BSTR *p) {
    return This->lpVtbl->get_scroll(This,p);
}
static FORCEINLINE HRESULT IHTMLBodyElement_put_onselect(IHTMLBodyElement* This,VARIANT v) {
    return This->lpVtbl->put_onselect(This,v);
}
static FORCEINLINE HRESULT IHTMLBodyElement_get_onselect(IHTMLBodyElement* This,VARIANT *p) {
    return This->lpVtbl->get_onselect(This,p);
}
static FORCEINLINE HRESULT IHTMLBodyElement_put_onbeforeunload(IHTMLBodyElement* This,VARIANT v) {
    return This->lpVtbl->put_onbeforeunload(This,v);
}
static FORCEINLINE HRESULT IHTMLBodyElement_get_onbeforeunload(IHTMLBodyElement* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforeunload(This,p);
}
static FORCEINLINE HRESULT IHTMLBodyElement_createTextRange(IHTMLBodyElement* This,IHTMLTxtRange **range) {
    return This->lpVtbl->createTextRange(This,range);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLBodyElement_put_background_Proxy(
    IHTMLBodyElement* This,
    BSTR v);
void __RPC_STUB IHTMLBodyElement_put_background_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_get_background_Proxy(
    IHTMLBodyElement* This,
    BSTR *p);
void __RPC_STUB IHTMLBodyElement_get_background_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_put_bgProperties_Proxy(
    IHTMLBodyElement* This,
    BSTR v);
void __RPC_STUB IHTMLBodyElement_put_bgProperties_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_get_bgProperties_Proxy(
    IHTMLBodyElement* This,
    BSTR *p);
void __RPC_STUB IHTMLBodyElement_get_bgProperties_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_put_leftMargin_Proxy(
    IHTMLBodyElement* This,
    VARIANT v);
void __RPC_STUB IHTMLBodyElement_put_leftMargin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_get_leftMargin_Proxy(
    IHTMLBodyElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLBodyElement_get_leftMargin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_put_topMargin_Proxy(
    IHTMLBodyElement* This,
    VARIANT v);
void __RPC_STUB IHTMLBodyElement_put_topMargin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_get_topMargin_Proxy(
    IHTMLBodyElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLBodyElement_get_topMargin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_put_rightMargin_Proxy(
    IHTMLBodyElement* This,
    VARIANT v);
void __RPC_STUB IHTMLBodyElement_put_rightMargin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_get_rightMargin_Proxy(
    IHTMLBodyElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLBodyElement_get_rightMargin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_put_bottomMargin_Proxy(
    IHTMLBodyElement* This,
    VARIANT v);
void __RPC_STUB IHTMLBodyElement_put_bottomMargin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_get_bottomMargin_Proxy(
    IHTMLBodyElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLBodyElement_get_bottomMargin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_put_noWrap_Proxy(
    IHTMLBodyElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLBodyElement_put_noWrap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_get_noWrap_Proxy(
    IHTMLBodyElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLBodyElement_get_noWrap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_put_bgColor_Proxy(
    IHTMLBodyElement* This,
    VARIANT v);
void __RPC_STUB IHTMLBodyElement_put_bgColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_get_bgColor_Proxy(
    IHTMLBodyElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLBodyElement_get_bgColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_put_text_Proxy(
    IHTMLBodyElement* This,
    VARIANT v);
void __RPC_STUB IHTMLBodyElement_put_text_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_get_text_Proxy(
    IHTMLBodyElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLBodyElement_get_text_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_put_link_Proxy(
    IHTMLBodyElement* This,
    VARIANT v);
void __RPC_STUB IHTMLBodyElement_put_link_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_get_link_Proxy(
    IHTMLBodyElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLBodyElement_get_link_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_put_vLink_Proxy(
    IHTMLBodyElement* This,
    VARIANT v);
void __RPC_STUB IHTMLBodyElement_put_vLink_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_get_vLink_Proxy(
    IHTMLBodyElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLBodyElement_get_vLink_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_put_aLink_Proxy(
    IHTMLBodyElement* This,
    VARIANT v);
void __RPC_STUB IHTMLBodyElement_put_aLink_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_get_aLink_Proxy(
    IHTMLBodyElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLBodyElement_get_aLink_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_put_onload_Proxy(
    IHTMLBodyElement* This,
    VARIANT v);
void __RPC_STUB IHTMLBodyElement_put_onload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_get_onload_Proxy(
    IHTMLBodyElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLBodyElement_get_onload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_put_onunload_Proxy(
    IHTMLBodyElement* This,
    VARIANT v);
void __RPC_STUB IHTMLBodyElement_put_onunload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_get_onunload_Proxy(
    IHTMLBodyElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLBodyElement_get_onunload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_put_scroll_Proxy(
    IHTMLBodyElement* This,
    BSTR v);
void __RPC_STUB IHTMLBodyElement_put_scroll_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_get_scroll_Proxy(
    IHTMLBodyElement* This,
    BSTR *p);
void __RPC_STUB IHTMLBodyElement_get_scroll_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_put_onselect_Proxy(
    IHTMLBodyElement* This,
    VARIANT v);
void __RPC_STUB IHTMLBodyElement_put_onselect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_get_onselect_Proxy(
    IHTMLBodyElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLBodyElement_get_onselect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_put_onbeforeunload_Proxy(
    IHTMLBodyElement* This,
    VARIANT v);
void __RPC_STUB IHTMLBodyElement_put_onbeforeunload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_get_onbeforeunload_Proxy(
    IHTMLBodyElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLBodyElement_get_onbeforeunload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement_createTextRange_Proxy(
    IHTMLBodyElement* This,
    IHTMLTxtRange **range);
void __RPC_STUB IHTMLBodyElement_createTextRange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLBodyElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLBodyElement2 interface
 */
#ifndef __IHTMLBodyElement2_INTERFACE_DEFINED__
#define __IHTMLBodyElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLBodyElement2, 0x3050f5c5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f5c5-98b5-11cf-bb82-00aa00bdce0b")
IHTMLBodyElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_onbeforeprint(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onbeforeprint(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onafterprint(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onafterprint(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLBodyElement2, 0x3050f5c5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLBodyElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLBodyElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLBodyElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLBodyElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLBodyElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLBodyElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLBodyElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLBodyElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLBodyElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_onbeforeprint)(
        IHTMLBodyElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onbeforeprint)(
        IHTMLBodyElement2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onafterprint)(
        IHTMLBodyElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onafterprint)(
        IHTMLBodyElement2* This,
        VARIANT *p);

    END_INTERFACE
} IHTMLBodyElement2Vtbl;
interface IHTMLBodyElement2 {
    CONST_VTBL IHTMLBodyElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLBodyElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLBodyElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLBodyElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLBodyElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLBodyElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLBodyElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLBodyElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLBodyElement2 methods ***/
#define IHTMLBodyElement2_put_onbeforeprint(This,v) (This)->lpVtbl->put_onbeforeprint(This,v)
#define IHTMLBodyElement2_get_onbeforeprint(This,p) (This)->lpVtbl->get_onbeforeprint(This,p)
#define IHTMLBodyElement2_put_onafterprint(This,v) (This)->lpVtbl->put_onafterprint(This,v)
#define IHTMLBodyElement2_get_onafterprint(This,p) (This)->lpVtbl->get_onafterprint(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLBodyElement2_QueryInterface(IHTMLBodyElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLBodyElement2_AddRef(IHTMLBodyElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLBodyElement2_Release(IHTMLBodyElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLBodyElement2_GetTypeInfoCount(IHTMLBodyElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLBodyElement2_GetTypeInfo(IHTMLBodyElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLBodyElement2_GetIDsOfNames(IHTMLBodyElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLBodyElement2_Invoke(IHTMLBodyElement2* 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);
}
/*** IHTMLBodyElement2 methods ***/
static FORCEINLINE HRESULT IHTMLBodyElement2_put_onbeforeprint(IHTMLBodyElement2* This,VARIANT v) {
    return This->lpVtbl->put_onbeforeprint(This,v);
}
static FORCEINLINE HRESULT IHTMLBodyElement2_get_onbeforeprint(IHTMLBodyElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforeprint(This,p);
}
static FORCEINLINE HRESULT IHTMLBodyElement2_put_onafterprint(IHTMLBodyElement2* This,VARIANT v) {
    return This->lpVtbl->put_onafterprint(This,v);
}
static FORCEINLINE HRESULT IHTMLBodyElement2_get_onafterprint(IHTMLBodyElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onafterprint(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLBodyElement2_put_onbeforeprint_Proxy(
    IHTMLBodyElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLBodyElement2_put_onbeforeprint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement2_get_onbeforeprint_Proxy(
    IHTMLBodyElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLBodyElement2_get_onbeforeprint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement2_put_onafterprint_Proxy(
    IHTMLBodyElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLBodyElement2_put_onafterprint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement2_get_onafterprint_Proxy(
    IHTMLBodyElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLBodyElement2_get_onafterprint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLBodyElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLBodyElement3 interface
 */
#ifndef __IHTMLBodyElement3_INTERFACE_DEFINED__
#define __IHTMLBodyElement3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLBodyElement3, 0x30510422, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510422-98b5-11cf-bb82-00aa00bdce0b")
IHTMLBodyElement3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_background(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_background(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ononline(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ononline(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onoffline(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onoffline(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onhashchange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onhashchange(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLBodyElement3, 0x30510422, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLBodyElement3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLBodyElement3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLBodyElement3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLBodyElement3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLBodyElement3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLBodyElement3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLBodyElement3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLBodyElement3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLBodyElement3 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_background)(
        IHTMLBodyElement3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_background)(
        IHTMLBodyElement3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_ononline)(
        IHTMLBodyElement3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ononline)(
        IHTMLBodyElement3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onoffline)(
        IHTMLBodyElement3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onoffline)(
        IHTMLBodyElement3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onhashchange)(
        IHTMLBodyElement3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onhashchange)(
        IHTMLBodyElement3* This,
        VARIANT *p);

    END_INTERFACE
} IHTMLBodyElement3Vtbl;
interface IHTMLBodyElement3 {
    CONST_VTBL IHTMLBodyElement3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLBodyElement3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLBodyElement3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLBodyElement3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLBodyElement3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLBodyElement3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLBodyElement3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLBodyElement3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLBodyElement3 methods ***/
#define IHTMLBodyElement3_put_background(This,v) (This)->lpVtbl->put_background(This,v)
#define IHTMLBodyElement3_get_background(This,p) (This)->lpVtbl->get_background(This,p)
#define IHTMLBodyElement3_put_ononline(This,v) (This)->lpVtbl->put_ononline(This,v)
#define IHTMLBodyElement3_get_ononline(This,p) (This)->lpVtbl->get_ononline(This,p)
#define IHTMLBodyElement3_put_onoffline(This,v) (This)->lpVtbl->put_onoffline(This,v)
#define IHTMLBodyElement3_get_onoffline(This,p) (This)->lpVtbl->get_onoffline(This,p)
#define IHTMLBodyElement3_put_onhashchange(This,v) (This)->lpVtbl->put_onhashchange(This,v)
#define IHTMLBodyElement3_get_onhashchange(This,p) (This)->lpVtbl->get_onhashchange(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLBodyElement3_QueryInterface(IHTMLBodyElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLBodyElement3_AddRef(IHTMLBodyElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLBodyElement3_Release(IHTMLBodyElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLBodyElement3_GetTypeInfoCount(IHTMLBodyElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLBodyElement3_GetTypeInfo(IHTMLBodyElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLBodyElement3_GetIDsOfNames(IHTMLBodyElement3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLBodyElement3_Invoke(IHTMLBodyElement3* 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);
}
/*** IHTMLBodyElement3 methods ***/
static FORCEINLINE HRESULT IHTMLBodyElement3_put_background(IHTMLBodyElement3* This,BSTR v) {
    return This->lpVtbl->put_background(This,v);
}
static FORCEINLINE HRESULT IHTMLBodyElement3_get_background(IHTMLBodyElement3* This,BSTR *p) {
    return This->lpVtbl->get_background(This,p);
}
static FORCEINLINE HRESULT IHTMLBodyElement3_put_ononline(IHTMLBodyElement3* This,VARIANT v) {
    return This->lpVtbl->put_ononline(This,v);
}
static FORCEINLINE HRESULT IHTMLBodyElement3_get_ononline(IHTMLBodyElement3* This,VARIANT *p) {
    return This->lpVtbl->get_ononline(This,p);
}
static FORCEINLINE HRESULT IHTMLBodyElement3_put_onoffline(IHTMLBodyElement3* This,VARIANT v) {
    return This->lpVtbl->put_onoffline(This,v);
}
static FORCEINLINE HRESULT IHTMLBodyElement3_get_onoffline(IHTMLBodyElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onoffline(This,p);
}
static FORCEINLINE HRESULT IHTMLBodyElement3_put_onhashchange(IHTMLBodyElement3* This,VARIANT v) {
    return This->lpVtbl->put_onhashchange(This,v);
}
static FORCEINLINE HRESULT IHTMLBodyElement3_get_onhashchange(IHTMLBodyElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onhashchange(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLBodyElement3_put_background_Proxy(
    IHTMLBodyElement3* This,
    BSTR v);
void __RPC_STUB IHTMLBodyElement3_put_background_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement3_get_background_Proxy(
    IHTMLBodyElement3* This,
    BSTR *p);
void __RPC_STUB IHTMLBodyElement3_get_background_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement3_put_ononline_Proxy(
    IHTMLBodyElement3* This,
    VARIANT v);
void __RPC_STUB IHTMLBodyElement3_put_ononline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement3_get_ononline_Proxy(
    IHTMLBodyElement3* This,
    VARIANT *p);
void __RPC_STUB IHTMLBodyElement3_get_ononline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement3_put_onoffline_Proxy(
    IHTMLBodyElement3* This,
    VARIANT v);
void __RPC_STUB IHTMLBodyElement3_put_onoffline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement3_get_onoffline_Proxy(
    IHTMLBodyElement3* This,
    VARIANT *p);
void __RPC_STUB IHTMLBodyElement3_get_onoffline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement3_put_onhashchange_Proxy(
    IHTMLBodyElement3* This,
    VARIANT v);
void __RPC_STUB IHTMLBodyElement3_put_onhashchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement3_get_onhashchange_Proxy(
    IHTMLBodyElement3* This,
    VARIANT *p);
void __RPC_STUB IHTMLBodyElement3_get_onhashchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLBodyElement3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLBodyElement4 interface
 */
#ifndef __IHTMLBodyElement4_INTERFACE_DEFINED__
#define __IHTMLBodyElement4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLBodyElement4, 0x30510795, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510795-98b5-11cf-bb82-00aa00bdce0b")
IHTMLBodyElement4 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_onmessage(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmessage(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onstorage(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onstorage(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLBodyElement4, 0x30510795, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLBodyElement4Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLBodyElement4* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLBodyElement4* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLBodyElement4* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLBodyElement4* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLBodyElement4* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLBodyElement4* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLBodyElement4* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLBodyElement4 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_onmessage)(
        IHTMLBodyElement4* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmessage)(
        IHTMLBodyElement4* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onstorage)(
        IHTMLBodyElement4* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onstorage)(
        IHTMLBodyElement4* This,
        VARIANT *p);

    END_INTERFACE
} IHTMLBodyElement4Vtbl;
interface IHTMLBodyElement4 {
    CONST_VTBL IHTMLBodyElement4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLBodyElement4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLBodyElement4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLBodyElement4_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLBodyElement4_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLBodyElement4_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLBodyElement4_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLBodyElement4_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLBodyElement4 methods ***/
#define IHTMLBodyElement4_put_onmessage(This,v) (This)->lpVtbl->put_onmessage(This,v)
#define IHTMLBodyElement4_get_onmessage(This,p) (This)->lpVtbl->get_onmessage(This,p)
#define IHTMLBodyElement4_put_onstorage(This,v) (This)->lpVtbl->put_onstorage(This,v)
#define IHTMLBodyElement4_get_onstorage(This,p) (This)->lpVtbl->get_onstorage(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLBodyElement4_QueryInterface(IHTMLBodyElement4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLBodyElement4_AddRef(IHTMLBodyElement4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLBodyElement4_Release(IHTMLBodyElement4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLBodyElement4_GetTypeInfoCount(IHTMLBodyElement4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLBodyElement4_GetTypeInfo(IHTMLBodyElement4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLBodyElement4_GetIDsOfNames(IHTMLBodyElement4* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLBodyElement4_Invoke(IHTMLBodyElement4* 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);
}
/*** IHTMLBodyElement4 methods ***/
static FORCEINLINE HRESULT IHTMLBodyElement4_put_onmessage(IHTMLBodyElement4* This,VARIANT v) {
    return This->lpVtbl->put_onmessage(This,v);
}
static FORCEINLINE HRESULT IHTMLBodyElement4_get_onmessage(IHTMLBodyElement4* This,VARIANT *p) {
    return This->lpVtbl->get_onmessage(This,p);
}
static FORCEINLINE HRESULT IHTMLBodyElement4_put_onstorage(IHTMLBodyElement4* This,VARIANT v) {
    return This->lpVtbl->put_onstorage(This,v);
}
static FORCEINLINE HRESULT IHTMLBodyElement4_get_onstorage(IHTMLBodyElement4* This,VARIANT *p) {
    return This->lpVtbl->get_onstorage(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLBodyElement4_put_onmessage_Proxy(
    IHTMLBodyElement4* This,
    VARIANT v);
void __RPC_STUB IHTMLBodyElement4_put_onmessage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement4_get_onmessage_Proxy(
    IHTMLBodyElement4* This,
    VARIANT *p);
void __RPC_STUB IHTMLBodyElement4_get_onmessage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement4_put_onstorage_Proxy(
    IHTMLBodyElement4* This,
    VARIANT v);
void __RPC_STUB IHTMLBodyElement4_put_onstorage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement4_get_onstorage_Proxy(
    IHTMLBodyElement4* This,
    VARIANT *p);
void __RPC_STUB IHTMLBodyElement4_get_onstorage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLBodyElement4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLBodyElement5 interface
 */
#ifndef __IHTMLBodyElement5_INTERFACE_DEFINED__
#define __IHTMLBodyElement5_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLBodyElement5, 0x30510822, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510822-98b5-11cf-bb82-00aa00bdce0b")
IHTMLBodyElement5 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_onpopstate(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onpopstate(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLBodyElement5, 0x30510822, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLBodyElement5Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLBodyElement5* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLBodyElement5* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLBodyElement5* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLBodyElement5* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLBodyElement5* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLBodyElement5* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLBodyElement5* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLBodyElement5 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_onpopstate)(
        IHTMLBodyElement5* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onpopstate)(
        IHTMLBodyElement5* This,
        VARIANT *p);

    END_INTERFACE
} IHTMLBodyElement5Vtbl;
interface IHTMLBodyElement5 {
    CONST_VTBL IHTMLBodyElement5Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLBodyElement5_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLBodyElement5_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLBodyElement5_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLBodyElement5_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLBodyElement5_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLBodyElement5_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLBodyElement5_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLBodyElement5 methods ***/
#define IHTMLBodyElement5_put_onpopstate(This,v) (This)->lpVtbl->put_onpopstate(This,v)
#define IHTMLBodyElement5_get_onpopstate(This,p) (This)->lpVtbl->get_onpopstate(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLBodyElement5_QueryInterface(IHTMLBodyElement5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLBodyElement5_AddRef(IHTMLBodyElement5* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLBodyElement5_Release(IHTMLBodyElement5* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLBodyElement5_GetTypeInfoCount(IHTMLBodyElement5* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLBodyElement5_GetTypeInfo(IHTMLBodyElement5* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLBodyElement5_GetIDsOfNames(IHTMLBodyElement5* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLBodyElement5_Invoke(IHTMLBodyElement5* 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);
}
/*** IHTMLBodyElement5 methods ***/
static FORCEINLINE HRESULT IHTMLBodyElement5_put_onpopstate(IHTMLBodyElement5* This,VARIANT v) {
    return This->lpVtbl->put_onpopstate(This,v);
}
static FORCEINLINE HRESULT IHTMLBodyElement5_get_onpopstate(IHTMLBodyElement5* This,VARIANT *p) {
    return This->lpVtbl->get_onpopstate(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLBodyElement5_put_onpopstate_Proxy(
    IHTMLBodyElement5* This,
    VARIANT v);
void __RPC_STUB IHTMLBodyElement5_put_onpopstate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBodyElement5_get_onpopstate_Proxy(
    IHTMLBodyElement5* This,
    VARIANT *p);
void __RPC_STUB IHTMLBodyElement5_get_onpopstate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLBodyElement5_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLBody dispinterface
 */
#ifndef __DispHTMLBody_DISPINTERFACE_DEFINED__
#define __DispHTMLBody_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLBody, 0x3050f507, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f507-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLBody : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLBody, 0x3050f507, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLBodyVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLBody* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLBody* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLBody* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLBody* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLBody* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLBody* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLBody* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLBodyVtbl;
interface DispHTMLBody {
    CONST_VTBL DispHTMLBodyVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLBody_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLBody_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLBody_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLBody_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLBody_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLBody_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLBody_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 DispHTMLBody_QueryInterface(DispHTMLBody* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLBody_AddRef(DispHTMLBody* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLBody_Release(DispHTMLBody* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLBody_GetTypeInfoCount(DispHTMLBody* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLBody_GetTypeInfo(DispHTMLBody* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLBody_GetIDsOfNames(DispHTMLBody* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLBody_Invoke(DispHTMLBody* 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  /* __DispHTMLBody_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLBody coclass
 */

DEFINE_GUID(CLSID_HTMLBody, 0x3050f24a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f24a-98b5-11cf-bb82-00aa00bdce0b") HTMLBody;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLBody, 0x3050f24a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CBodyElement;
/*****************************************************************************
 * IHTMLFontElement interface
 */
#ifndef __IHTMLFontElement_INTERFACE_DEFINED__
#define __IHTMLFontElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLFontElement, 0x3050f1d9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f1d9-98b5-11cf-bb82-00aa00bdce0b")
IHTMLFontElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_color(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_color(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_face(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_face(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_size(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_size(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLFontElement, 0x3050f1d9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLFontElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLFontElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLFontElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLFontElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLFontElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLFontElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLFontElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLFontElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLFontElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_color)(
        IHTMLFontElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_color)(
        IHTMLFontElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_face)(
        IHTMLFontElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_face)(
        IHTMLFontElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_size)(
        IHTMLFontElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_size)(
        IHTMLFontElement* This,
        VARIANT *p);

    END_INTERFACE
} IHTMLFontElementVtbl;
interface IHTMLFontElement {
    CONST_VTBL IHTMLFontElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLFontElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLFontElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLFontElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLFontElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLFontElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLFontElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLFontElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLFontElement methods ***/
#define IHTMLFontElement_put_color(This,v) (This)->lpVtbl->put_color(This,v)
#define IHTMLFontElement_get_color(This,p) (This)->lpVtbl->get_color(This,p)
#define IHTMLFontElement_put_face(This,v) (This)->lpVtbl->put_face(This,v)
#define IHTMLFontElement_get_face(This,p) (This)->lpVtbl->get_face(This,p)
#define IHTMLFontElement_put_size(This,v) (This)->lpVtbl->put_size(This,v)
#define IHTMLFontElement_get_size(This,p) (This)->lpVtbl->get_size(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLFontElement_QueryInterface(IHTMLFontElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLFontElement_AddRef(IHTMLFontElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLFontElement_Release(IHTMLFontElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLFontElement_GetTypeInfoCount(IHTMLFontElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLFontElement_GetTypeInfo(IHTMLFontElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLFontElement_GetIDsOfNames(IHTMLFontElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLFontElement_Invoke(IHTMLFontElement* 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);
}
/*** IHTMLFontElement methods ***/
static FORCEINLINE HRESULT IHTMLFontElement_put_color(IHTMLFontElement* This,VARIANT v) {
    return This->lpVtbl->put_color(This,v);
}
static FORCEINLINE HRESULT IHTMLFontElement_get_color(IHTMLFontElement* This,VARIANT *p) {
    return This->lpVtbl->get_color(This,p);
}
static FORCEINLINE HRESULT IHTMLFontElement_put_face(IHTMLFontElement* This,BSTR v) {
    return This->lpVtbl->put_face(This,v);
}
static FORCEINLINE HRESULT IHTMLFontElement_get_face(IHTMLFontElement* This,BSTR *p) {
    return This->lpVtbl->get_face(This,p);
}
static FORCEINLINE HRESULT IHTMLFontElement_put_size(IHTMLFontElement* This,VARIANT v) {
    return This->lpVtbl->put_size(This,v);
}
static FORCEINLINE HRESULT IHTMLFontElement_get_size(IHTMLFontElement* This,VARIANT *p) {
    return This->lpVtbl->get_size(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLFontElement_put_color_Proxy(
    IHTMLFontElement* This,
    VARIANT v);
void __RPC_STUB IHTMLFontElement_put_color_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFontElement_get_color_Proxy(
    IHTMLFontElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLFontElement_get_color_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFontElement_put_face_Proxy(
    IHTMLFontElement* This,
    BSTR v);
void __RPC_STUB IHTMLFontElement_put_face_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFontElement_get_face_Proxy(
    IHTMLFontElement* This,
    BSTR *p);
void __RPC_STUB IHTMLFontElement_get_face_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFontElement_put_size_Proxy(
    IHTMLFontElement* This,
    VARIANT v);
void __RPC_STUB IHTMLFontElement_put_size_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFontElement_get_size_Proxy(
    IHTMLFontElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLFontElement_get_size_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLFontElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLFontElement dispinterface
 */
#ifndef __DispHTMLFontElement_DISPINTERFACE_DEFINED__
#define __DispHTMLFontElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLFontElement, 0x3050f512, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f512-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLFontElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLFontElement, 0x3050f512, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLFontElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLFontElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLFontElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLFontElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLFontElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLFontElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLFontElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLFontElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLFontElementVtbl;
interface DispHTMLFontElement {
    CONST_VTBL DispHTMLFontElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLFontElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLFontElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLFontElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLFontElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLFontElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLFontElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLFontElement_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 DispHTMLFontElement_QueryInterface(DispHTMLFontElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLFontElement_AddRef(DispHTMLFontElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLFontElement_Release(DispHTMLFontElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLFontElement_GetTypeInfoCount(DispHTMLFontElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLFontElement_GetTypeInfo(DispHTMLFontElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLFontElement_GetIDsOfNames(DispHTMLFontElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLFontElement_Invoke(DispHTMLFontElement* 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  /* __DispHTMLFontElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLFontElement coclass
 */

DEFINE_GUID(CLSID_HTMLFontElement, 0x3050f27b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f27b-98b5-11cf-bb82-00aa00bdce0b") HTMLFontElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLFontElement, 0x3050f27b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CFontElement;
/*****************************************************************************
 * HTMLAnchorEvents2 dispinterface
 */
#ifndef __HTMLAnchorEvents2_DISPINTERFACE_DEFINED__
#define __HTMLAnchorEvents2_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLAnchorEvents2, 0x3050f610, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f610-98b5-11cf-bb82-00aa00bdce0b")
HTMLAnchorEvents2 : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLAnchorEvents2, 0x3050f610, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLAnchorEvents2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLAnchorEvents2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLAnchorEvents2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLAnchorEvents2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLAnchorEvents2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLAnchorEvents2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLAnchorEvents2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLAnchorEvents2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLAnchorEvents2Vtbl;
interface HTMLAnchorEvents2 {
    CONST_VTBL HTMLAnchorEvents2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLAnchorEvents2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLAnchorEvents2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLAnchorEvents2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLAnchorEvents2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLAnchorEvents2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLAnchorEvents2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLAnchorEvents2_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 HTMLAnchorEvents2_QueryInterface(HTMLAnchorEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLAnchorEvents2_AddRef(HTMLAnchorEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLAnchorEvents2_Release(HTMLAnchorEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLAnchorEvents2_GetTypeInfoCount(HTMLAnchorEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLAnchorEvents2_GetTypeInfo(HTMLAnchorEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLAnchorEvents2_GetIDsOfNames(HTMLAnchorEvents2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLAnchorEvents2_Invoke(HTMLAnchorEvents2* 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  /* __HTMLAnchorEvents2_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLAnchorEvents dispinterface
 */
#ifndef __HTMLAnchorEvents_DISPINTERFACE_DEFINED__
#define __HTMLAnchorEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLAnchorEvents, 0x3050f29d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f29d-98b5-11cf-bb82-00aa00bdce0b")
HTMLAnchorEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLAnchorEvents, 0x3050f29d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLAnchorEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLAnchorEvents* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLAnchorEvents* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLAnchorEvents* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLAnchorEvents* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLAnchorEvents* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLAnchorEvents* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLAnchorEvents* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLAnchorEventsVtbl;
interface HTMLAnchorEvents {
    CONST_VTBL HTMLAnchorEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLAnchorEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLAnchorEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLAnchorEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLAnchorEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLAnchorEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLAnchorEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLAnchorEvents_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 HTMLAnchorEvents_QueryInterface(HTMLAnchorEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLAnchorEvents_AddRef(HTMLAnchorEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLAnchorEvents_Release(HTMLAnchorEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLAnchorEvents_GetTypeInfoCount(HTMLAnchorEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLAnchorEvents_GetTypeInfo(HTMLAnchorEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLAnchorEvents_GetIDsOfNames(HTMLAnchorEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLAnchorEvents_Invoke(HTMLAnchorEvents* 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  /* __HTMLAnchorEvents_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLAnchorElement interface
 */
#ifndef __IHTMLAnchorElement_INTERFACE_DEFINED__
#define __IHTMLAnchorElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLAnchorElement, 0x3050f1da, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f1da-98b5-11cf-bb82-00aa00bdce0b")
IHTMLAnchorElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_href(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_href(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_target(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_target(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_rel(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_rel(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_rev(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_rev(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_urn(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_urn(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Methods(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Methods(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_name(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_host(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_host(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_hostname(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_hostname(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_pathname(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pathname(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_port(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_port(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_protocol(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_protocol(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_search(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_search(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_hash(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_hash(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onblur(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onblur(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onfocus(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onfocus(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_accessKey(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_accessKey(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_protocolLong(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_mimeType(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_nameProp(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_tabIndex(
        short v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_tabIndex(
        short *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE focus(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE blur(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLAnchorElement, 0x3050f1da, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLAnchorElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLAnchorElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLAnchorElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLAnchorElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLAnchorElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLAnchorElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLAnchorElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLAnchorElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLAnchorElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_href)(
        IHTMLAnchorElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_href)(
        IHTMLAnchorElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_target)(
        IHTMLAnchorElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_target)(
        IHTMLAnchorElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_rel)(
        IHTMLAnchorElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_rel)(
        IHTMLAnchorElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_rev)(
        IHTMLAnchorElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_rev)(
        IHTMLAnchorElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_urn)(
        IHTMLAnchorElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_urn)(
        IHTMLAnchorElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_Methods)(
        IHTMLAnchorElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_Methods)(
        IHTMLAnchorElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_name)(
        IHTMLAnchorElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_name)(
        IHTMLAnchorElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_host)(
        IHTMLAnchorElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_host)(
        IHTMLAnchorElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_hostname)(
        IHTMLAnchorElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_hostname)(
        IHTMLAnchorElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_pathname)(
        IHTMLAnchorElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_pathname)(
        IHTMLAnchorElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_port)(
        IHTMLAnchorElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_port)(
        IHTMLAnchorElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_protocol)(
        IHTMLAnchorElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_protocol)(
        IHTMLAnchorElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_search)(
        IHTMLAnchorElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_search)(
        IHTMLAnchorElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_hash)(
        IHTMLAnchorElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_hash)(
        IHTMLAnchorElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_onblur)(
        IHTMLAnchorElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onblur)(
        IHTMLAnchorElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onfocus)(
        IHTMLAnchorElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onfocus)(
        IHTMLAnchorElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_accessKey)(
        IHTMLAnchorElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_accessKey)(
        IHTMLAnchorElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_protocolLong)(
        IHTMLAnchorElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_mimeType)(
        IHTMLAnchorElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_nameProp)(
        IHTMLAnchorElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_tabIndex)(
        IHTMLAnchorElement* This,
        short v);

    HRESULT (STDMETHODCALLTYPE *get_tabIndex)(
        IHTMLAnchorElement* This,
        short *p);

    HRESULT (STDMETHODCALLTYPE *focus)(
        IHTMLAnchorElement* This);

    HRESULT (STDMETHODCALLTYPE *blur)(
        IHTMLAnchorElement* This);

    END_INTERFACE
} IHTMLAnchorElementVtbl;
interface IHTMLAnchorElement {
    CONST_VTBL IHTMLAnchorElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLAnchorElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLAnchorElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLAnchorElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLAnchorElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLAnchorElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLAnchorElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLAnchorElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLAnchorElement methods ***/
#define IHTMLAnchorElement_put_href(This,v) (This)->lpVtbl->put_href(This,v)
#define IHTMLAnchorElement_get_href(This,p) (This)->lpVtbl->get_href(This,p)
#define IHTMLAnchorElement_put_target(This,v) (This)->lpVtbl->put_target(This,v)
#define IHTMLAnchorElement_get_target(This,p) (This)->lpVtbl->get_target(This,p)
#define IHTMLAnchorElement_put_rel(This,v) (This)->lpVtbl->put_rel(This,v)
#define IHTMLAnchorElement_get_rel(This,p) (This)->lpVtbl->get_rel(This,p)
#define IHTMLAnchorElement_put_rev(This,v) (This)->lpVtbl->put_rev(This,v)
#define IHTMLAnchorElement_get_rev(This,p) (This)->lpVtbl->get_rev(This,p)
#define IHTMLAnchorElement_put_urn(This,v) (This)->lpVtbl->put_urn(This,v)
#define IHTMLAnchorElement_get_urn(This,p) (This)->lpVtbl->get_urn(This,p)
#define IHTMLAnchorElement_put_Methods(This,v) (This)->lpVtbl->put_Methods(This,v)
#define IHTMLAnchorElement_get_Methods(This,p) (This)->lpVtbl->get_Methods(This,p)
#define IHTMLAnchorElement_put_name(This,v) (This)->lpVtbl->put_name(This,v)
#define IHTMLAnchorElement_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#define IHTMLAnchorElement_put_host(This,v) (This)->lpVtbl->put_host(This,v)
#define IHTMLAnchorElement_get_host(This,p) (This)->lpVtbl->get_host(This,p)
#define IHTMLAnchorElement_put_hostname(This,v) (This)->lpVtbl->put_hostname(This,v)
#define IHTMLAnchorElement_get_hostname(This,p) (This)->lpVtbl->get_hostname(This,p)
#define IHTMLAnchorElement_put_pathname(This,v) (This)->lpVtbl->put_pathname(This,v)
#define IHTMLAnchorElement_get_pathname(This,p) (This)->lpVtbl->get_pathname(This,p)
#define IHTMLAnchorElement_put_port(This,v) (This)->lpVtbl->put_port(This,v)
#define IHTMLAnchorElement_get_port(This,p) (This)->lpVtbl->get_port(This,p)
#define IHTMLAnchorElement_put_protocol(This,v) (This)->lpVtbl->put_protocol(This,v)
#define IHTMLAnchorElement_get_protocol(This,p) (This)->lpVtbl->get_protocol(This,p)
#define IHTMLAnchorElement_put_search(This,v) (This)->lpVtbl->put_search(This,v)
#define IHTMLAnchorElement_get_search(This,p) (This)->lpVtbl->get_search(This,p)
#define IHTMLAnchorElement_put_hash(This,v) (This)->lpVtbl->put_hash(This,v)
#define IHTMLAnchorElement_get_hash(This,p) (This)->lpVtbl->get_hash(This,p)
#define IHTMLAnchorElement_put_onblur(This,v) (This)->lpVtbl->put_onblur(This,v)
#define IHTMLAnchorElement_get_onblur(This,p) (This)->lpVtbl->get_onblur(This,p)
#define IHTMLAnchorElement_put_onfocus(This,v) (This)->lpVtbl->put_onfocus(This,v)
#define IHTMLAnchorElement_get_onfocus(This,p) (This)->lpVtbl->get_onfocus(This,p)
#define IHTMLAnchorElement_put_accessKey(This,v) (This)->lpVtbl->put_accessKey(This,v)
#define IHTMLAnchorElement_get_accessKey(This,p) (This)->lpVtbl->get_accessKey(This,p)
#define IHTMLAnchorElement_get_protocolLong(This,p) (This)->lpVtbl->get_protocolLong(This,p)
#define IHTMLAnchorElement_get_mimeType(This,p) (This)->lpVtbl->get_mimeType(This,p)
#define IHTMLAnchorElement_get_nameProp(This,p) (This)->lpVtbl->get_nameProp(This,p)
#define IHTMLAnchorElement_put_tabIndex(This,v) (This)->lpVtbl->put_tabIndex(This,v)
#define IHTMLAnchorElement_get_tabIndex(This,p) (This)->lpVtbl->get_tabIndex(This,p)
#define IHTMLAnchorElement_focus(This) (This)->lpVtbl->focus(This)
#define IHTMLAnchorElement_blur(This) (This)->lpVtbl->blur(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLAnchorElement_QueryInterface(IHTMLAnchorElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLAnchorElement_AddRef(IHTMLAnchorElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLAnchorElement_Release(IHTMLAnchorElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLAnchorElement_GetTypeInfoCount(IHTMLAnchorElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_GetTypeInfo(IHTMLAnchorElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_GetIDsOfNames(IHTMLAnchorElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_Invoke(IHTMLAnchorElement* 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);
}
/*** IHTMLAnchorElement methods ***/
static FORCEINLINE HRESULT IHTMLAnchorElement_put_href(IHTMLAnchorElement* This,BSTR v) {
    return This->lpVtbl->put_href(This,v);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_get_href(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_href(This,p);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_put_target(IHTMLAnchorElement* This,BSTR v) {
    return This->lpVtbl->put_target(This,v);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_get_target(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_target(This,p);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_put_rel(IHTMLAnchorElement* This,BSTR v) {
    return This->lpVtbl->put_rel(This,v);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_get_rel(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_rel(This,p);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_put_rev(IHTMLAnchorElement* This,BSTR v) {
    return This->lpVtbl->put_rev(This,v);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_get_rev(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_rev(This,p);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_put_urn(IHTMLAnchorElement* This,BSTR v) {
    return This->lpVtbl->put_urn(This,v);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_get_urn(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_urn(This,p);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_put_Methods(IHTMLAnchorElement* This,BSTR v) {
    return This->lpVtbl->put_Methods(This,v);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_get_Methods(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_Methods(This,p);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_put_name(IHTMLAnchorElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_get_name(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_put_host(IHTMLAnchorElement* This,BSTR v) {
    return This->lpVtbl->put_host(This,v);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_get_host(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_host(This,p);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_put_hostname(IHTMLAnchorElement* This,BSTR v) {
    return This->lpVtbl->put_hostname(This,v);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_get_hostname(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_hostname(This,p);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_put_pathname(IHTMLAnchorElement* This,BSTR v) {
    return This->lpVtbl->put_pathname(This,v);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_get_pathname(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_pathname(This,p);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_put_port(IHTMLAnchorElement* This,BSTR v) {
    return This->lpVtbl->put_port(This,v);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_get_port(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_port(This,p);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_put_protocol(IHTMLAnchorElement* This,BSTR v) {
    return This->lpVtbl->put_protocol(This,v);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_get_protocol(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_protocol(This,p);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_put_search(IHTMLAnchorElement* This,BSTR v) {
    return This->lpVtbl->put_search(This,v);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_get_search(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_search(This,p);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_put_hash(IHTMLAnchorElement* This,BSTR v) {
    return This->lpVtbl->put_hash(This,v);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_get_hash(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_hash(This,p);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_put_onblur(IHTMLAnchorElement* This,VARIANT v) {
    return This->lpVtbl->put_onblur(This,v);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_get_onblur(IHTMLAnchorElement* This,VARIANT *p) {
    return This->lpVtbl->get_onblur(This,p);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_put_onfocus(IHTMLAnchorElement* This,VARIANT v) {
    return This->lpVtbl->put_onfocus(This,v);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_get_onfocus(IHTMLAnchorElement* This,VARIANT *p) {
    return This->lpVtbl->get_onfocus(This,p);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_put_accessKey(IHTMLAnchorElement* This,BSTR v) {
    return This->lpVtbl->put_accessKey(This,v);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_get_accessKey(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_accessKey(This,p);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_get_protocolLong(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_protocolLong(This,p);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_get_mimeType(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_mimeType(This,p);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_get_nameProp(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_nameProp(This,p);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_put_tabIndex(IHTMLAnchorElement* This,short v) {
    return This->lpVtbl->put_tabIndex(This,v);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_get_tabIndex(IHTMLAnchorElement* This,short *p) {
    return This->lpVtbl->get_tabIndex(This,p);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_focus(IHTMLAnchorElement* This) {
    return This->lpVtbl->focus(This);
}
static FORCEINLINE HRESULT IHTMLAnchorElement_blur(IHTMLAnchorElement* This) {
    return This->lpVtbl->blur(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_put_href_Proxy(
    IHTMLAnchorElement* This,
    BSTR v);
void __RPC_STUB IHTMLAnchorElement_put_href_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_get_href_Proxy(
    IHTMLAnchorElement* This,
    BSTR *p);
void __RPC_STUB IHTMLAnchorElement_get_href_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_put_target_Proxy(
    IHTMLAnchorElement* This,
    BSTR v);
void __RPC_STUB IHTMLAnchorElement_put_target_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_get_target_Proxy(
    IHTMLAnchorElement* This,
    BSTR *p);
void __RPC_STUB IHTMLAnchorElement_get_target_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_put_rel_Proxy(
    IHTMLAnchorElement* This,
    BSTR v);
void __RPC_STUB IHTMLAnchorElement_put_rel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_get_rel_Proxy(
    IHTMLAnchorElement* This,
    BSTR *p);
void __RPC_STUB IHTMLAnchorElement_get_rel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_put_rev_Proxy(
    IHTMLAnchorElement* This,
    BSTR v);
void __RPC_STUB IHTMLAnchorElement_put_rev_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_get_rev_Proxy(
    IHTMLAnchorElement* This,
    BSTR *p);
void __RPC_STUB IHTMLAnchorElement_get_rev_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_put_urn_Proxy(
    IHTMLAnchorElement* This,
    BSTR v);
void __RPC_STUB IHTMLAnchorElement_put_urn_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_get_urn_Proxy(
    IHTMLAnchorElement* This,
    BSTR *p);
void __RPC_STUB IHTMLAnchorElement_get_urn_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_put_Methods_Proxy(
    IHTMLAnchorElement* This,
    BSTR v);
void __RPC_STUB IHTMLAnchorElement_put_Methods_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_get_Methods_Proxy(
    IHTMLAnchorElement* This,
    BSTR *p);
void __RPC_STUB IHTMLAnchorElement_get_Methods_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_put_name_Proxy(
    IHTMLAnchorElement* This,
    BSTR v);
void __RPC_STUB IHTMLAnchorElement_put_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_get_name_Proxy(
    IHTMLAnchorElement* This,
    BSTR *p);
void __RPC_STUB IHTMLAnchorElement_get_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_put_host_Proxy(
    IHTMLAnchorElement* This,
    BSTR v);
void __RPC_STUB IHTMLAnchorElement_put_host_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_get_host_Proxy(
    IHTMLAnchorElement* This,
    BSTR *p);
void __RPC_STUB IHTMLAnchorElement_get_host_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_put_hostname_Proxy(
    IHTMLAnchorElement* This,
    BSTR v);
void __RPC_STUB IHTMLAnchorElement_put_hostname_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_get_hostname_Proxy(
    IHTMLAnchorElement* This,
    BSTR *p);
void __RPC_STUB IHTMLAnchorElement_get_hostname_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_put_pathname_Proxy(
    IHTMLAnchorElement* This,
    BSTR v);
void __RPC_STUB IHTMLAnchorElement_put_pathname_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_get_pathname_Proxy(
    IHTMLAnchorElement* This,
    BSTR *p);
void __RPC_STUB IHTMLAnchorElement_get_pathname_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_put_port_Proxy(
    IHTMLAnchorElement* This,
    BSTR v);
void __RPC_STUB IHTMLAnchorElement_put_port_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_get_port_Proxy(
    IHTMLAnchorElement* This,
    BSTR *p);
void __RPC_STUB IHTMLAnchorElement_get_port_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_put_protocol_Proxy(
    IHTMLAnchorElement* This,
    BSTR v);
void __RPC_STUB IHTMLAnchorElement_put_protocol_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_get_protocol_Proxy(
    IHTMLAnchorElement* This,
    BSTR *p);
void __RPC_STUB IHTMLAnchorElement_get_protocol_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_put_search_Proxy(
    IHTMLAnchorElement* This,
    BSTR v);
void __RPC_STUB IHTMLAnchorElement_put_search_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_get_search_Proxy(
    IHTMLAnchorElement* This,
    BSTR *p);
void __RPC_STUB IHTMLAnchorElement_get_search_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_put_hash_Proxy(
    IHTMLAnchorElement* This,
    BSTR v);
void __RPC_STUB IHTMLAnchorElement_put_hash_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_get_hash_Proxy(
    IHTMLAnchorElement* This,
    BSTR *p);
void __RPC_STUB IHTMLAnchorElement_get_hash_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_put_onblur_Proxy(
    IHTMLAnchorElement* This,
    VARIANT v);
void __RPC_STUB IHTMLAnchorElement_put_onblur_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_get_onblur_Proxy(
    IHTMLAnchorElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLAnchorElement_get_onblur_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_put_onfocus_Proxy(
    IHTMLAnchorElement* This,
    VARIANT v);
void __RPC_STUB IHTMLAnchorElement_put_onfocus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_get_onfocus_Proxy(
    IHTMLAnchorElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLAnchorElement_get_onfocus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_put_accessKey_Proxy(
    IHTMLAnchorElement* This,
    BSTR v);
void __RPC_STUB IHTMLAnchorElement_put_accessKey_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_get_accessKey_Proxy(
    IHTMLAnchorElement* This,
    BSTR *p);
void __RPC_STUB IHTMLAnchorElement_get_accessKey_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_get_protocolLong_Proxy(
    IHTMLAnchorElement* This,
    BSTR *p);
void __RPC_STUB IHTMLAnchorElement_get_protocolLong_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_get_mimeType_Proxy(
    IHTMLAnchorElement* This,
    BSTR *p);
void __RPC_STUB IHTMLAnchorElement_get_mimeType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_get_nameProp_Proxy(
    IHTMLAnchorElement* This,
    BSTR *p);
void __RPC_STUB IHTMLAnchorElement_get_nameProp_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_put_tabIndex_Proxy(
    IHTMLAnchorElement* This,
    short v);
void __RPC_STUB IHTMLAnchorElement_put_tabIndex_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_get_tabIndex_Proxy(
    IHTMLAnchorElement* This,
    short *p);
void __RPC_STUB IHTMLAnchorElement_get_tabIndex_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_focus_Proxy(
    IHTMLAnchorElement* This);
void __RPC_STUB IHTMLAnchorElement_focus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement_blur_Proxy(
    IHTMLAnchorElement* This);
void __RPC_STUB IHTMLAnchorElement_blur_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLAnchorElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLAnchorElement2 interface
 */
#ifndef __IHTMLAnchorElement2_INTERFACE_DEFINED__
#define __IHTMLAnchorElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLAnchorElement2, 0x3050f825, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f825-98b5-11cf-bb82-00aa00bdce0b")
IHTMLAnchorElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_charset(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_charset(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_coords(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_coords(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_hreflang(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_hreflang(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_shape(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_shape(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_type(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLAnchorElement2, 0x3050f825, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLAnchorElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLAnchorElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLAnchorElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLAnchorElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLAnchorElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLAnchorElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLAnchorElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLAnchorElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLAnchorElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_charset)(
        IHTMLAnchorElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_charset)(
        IHTMLAnchorElement2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_coords)(
        IHTMLAnchorElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_coords)(
        IHTMLAnchorElement2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_hreflang)(
        IHTMLAnchorElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_hreflang)(
        IHTMLAnchorElement2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_shape)(
        IHTMLAnchorElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_shape)(
        IHTMLAnchorElement2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_type)(
        IHTMLAnchorElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLAnchorElement2* This,
        BSTR *p);

    END_INTERFACE
} IHTMLAnchorElement2Vtbl;
interface IHTMLAnchorElement2 {
    CONST_VTBL IHTMLAnchorElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLAnchorElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLAnchorElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLAnchorElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLAnchorElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLAnchorElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLAnchorElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLAnchorElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLAnchorElement2 methods ***/
#define IHTMLAnchorElement2_put_charset(This,v) (This)->lpVtbl->put_charset(This,v)
#define IHTMLAnchorElement2_get_charset(This,p) (This)->lpVtbl->get_charset(This,p)
#define IHTMLAnchorElement2_put_coords(This,v) (This)->lpVtbl->put_coords(This,v)
#define IHTMLAnchorElement2_get_coords(This,p) (This)->lpVtbl->get_coords(This,p)
#define IHTMLAnchorElement2_put_hreflang(This,v) (This)->lpVtbl->put_hreflang(This,v)
#define IHTMLAnchorElement2_get_hreflang(This,p) (This)->lpVtbl->get_hreflang(This,p)
#define IHTMLAnchorElement2_put_shape(This,v) (This)->lpVtbl->put_shape(This,v)
#define IHTMLAnchorElement2_get_shape(This,p) (This)->lpVtbl->get_shape(This,p)
#define IHTMLAnchorElement2_put_type(This,v) (This)->lpVtbl->put_type(This,v)
#define IHTMLAnchorElement2_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLAnchorElement2_QueryInterface(IHTMLAnchorElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLAnchorElement2_AddRef(IHTMLAnchorElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLAnchorElement2_Release(IHTMLAnchorElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLAnchorElement2_GetTypeInfoCount(IHTMLAnchorElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLAnchorElement2_GetTypeInfo(IHTMLAnchorElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLAnchorElement2_GetIDsOfNames(IHTMLAnchorElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLAnchorElement2_Invoke(IHTMLAnchorElement2* 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);
}
/*** IHTMLAnchorElement2 methods ***/
static FORCEINLINE HRESULT IHTMLAnchorElement2_put_charset(IHTMLAnchorElement2* This,BSTR v) {
    return This->lpVtbl->put_charset(This,v);
}
static FORCEINLINE HRESULT IHTMLAnchorElement2_get_charset(IHTMLAnchorElement2* This,BSTR *p) {
    return This->lpVtbl->get_charset(This,p);
}
static FORCEINLINE HRESULT IHTMLAnchorElement2_put_coords(IHTMLAnchorElement2* This,BSTR v) {
    return This->lpVtbl->put_coords(This,v);
}
static FORCEINLINE HRESULT IHTMLAnchorElement2_get_coords(IHTMLAnchorElement2* This,BSTR *p) {
    return This->lpVtbl->get_coords(This,p);
}
static FORCEINLINE HRESULT IHTMLAnchorElement2_put_hreflang(IHTMLAnchorElement2* This,BSTR v) {
    return This->lpVtbl->put_hreflang(This,v);
}
static FORCEINLINE HRESULT IHTMLAnchorElement2_get_hreflang(IHTMLAnchorElement2* This,BSTR *p) {
    return This->lpVtbl->get_hreflang(This,p);
}
static FORCEINLINE HRESULT IHTMLAnchorElement2_put_shape(IHTMLAnchorElement2* This,BSTR v) {
    return This->lpVtbl->put_shape(This,v);
}
static FORCEINLINE HRESULT IHTMLAnchorElement2_get_shape(IHTMLAnchorElement2* This,BSTR *p) {
    return This->lpVtbl->get_shape(This,p);
}
static FORCEINLINE HRESULT IHTMLAnchorElement2_put_type(IHTMLAnchorElement2* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static FORCEINLINE HRESULT IHTMLAnchorElement2_get_type(IHTMLAnchorElement2* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLAnchorElement2_put_charset_Proxy(
    IHTMLAnchorElement2* This,
    BSTR v);
void __RPC_STUB IHTMLAnchorElement2_put_charset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement2_get_charset_Proxy(
    IHTMLAnchorElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLAnchorElement2_get_charset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement2_put_coords_Proxy(
    IHTMLAnchorElement2* This,
    BSTR v);
void __RPC_STUB IHTMLAnchorElement2_put_coords_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement2_get_coords_Proxy(
    IHTMLAnchorElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLAnchorElement2_get_coords_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement2_put_hreflang_Proxy(
    IHTMLAnchorElement2* This,
    BSTR v);
void __RPC_STUB IHTMLAnchorElement2_put_hreflang_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement2_get_hreflang_Proxy(
    IHTMLAnchorElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLAnchorElement2_get_hreflang_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement2_put_shape_Proxy(
    IHTMLAnchorElement2* This,
    BSTR v);
void __RPC_STUB IHTMLAnchorElement2_put_shape_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement2_get_shape_Proxy(
    IHTMLAnchorElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLAnchorElement2_get_shape_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement2_put_type_Proxy(
    IHTMLAnchorElement2* This,
    BSTR v);
void __RPC_STUB IHTMLAnchorElement2_put_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement2_get_type_Proxy(
    IHTMLAnchorElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLAnchorElement2_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLAnchorElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLAnchorElement3 interface
 */
#ifndef __IHTMLAnchorElement3_INTERFACE_DEFINED__
#define __IHTMLAnchorElement3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLAnchorElement3, 0x3051041d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051041d-98b5-11cf-bb82-00aa00bdce0b")
IHTMLAnchorElement3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_shape(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_shape(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_coords(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_coords(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_href(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_href(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLAnchorElement3, 0x3051041d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLAnchorElement3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLAnchorElement3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLAnchorElement3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLAnchorElement3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLAnchorElement3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLAnchorElement3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLAnchorElement3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLAnchorElement3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLAnchorElement3 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_shape)(
        IHTMLAnchorElement3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_shape)(
        IHTMLAnchorElement3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_coords)(
        IHTMLAnchorElement3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_coords)(
        IHTMLAnchorElement3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_href)(
        IHTMLAnchorElement3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_href)(
        IHTMLAnchorElement3* This,
        BSTR *p);

    END_INTERFACE
} IHTMLAnchorElement3Vtbl;
interface IHTMLAnchorElement3 {
    CONST_VTBL IHTMLAnchorElement3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLAnchorElement3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLAnchorElement3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLAnchorElement3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLAnchorElement3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLAnchorElement3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLAnchorElement3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLAnchorElement3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLAnchorElement3 methods ***/
#define IHTMLAnchorElement3_put_shape(This,v) (This)->lpVtbl->put_shape(This,v)
#define IHTMLAnchorElement3_get_shape(This,p) (This)->lpVtbl->get_shape(This,p)
#define IHTMLAnchorElement3_put_coords(This,v) (This)->lpVtbl->put_coords(This,v)
#define IHTMLAnchorElement3_get_coords(This,p) (This)->lpVtbl->get_coords(This,p)
#define IHTMLAnchorElement3_put_href(This,v) (This)->lpVtbl->put_href(This,v)
#define IHTMLAnchorElement3_get_href(This,p) (This)->lpVtbl->get_href(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLAnchorElement3_QueryInterface(IHTMLAnchorElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLAnchorElement3_AddRef(IHTMLAnchorElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLAnchorElement3_Release(IHTMLAnchorElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLAnchorElement3_GetTypeInfoCount(IHTMLAnchorElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLAnchorElement3_GetTypeInfo(IHTMLAnchorElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLAnchorElement3_GetIDsOfNames(IHTMLAnchorElement3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLAnchorElement3_Invoke(IHTMLAnchorElement3* 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);
}
/*** IHTMLAnchorElement3 methods ***/
static FORCEINLINE HRESULT IHTMLAnchorElement3_put_shape(IHTMLAnchorElement3* This,BSTR v) {
    return This->lpVtbl->put_shape(This,v);
}
static FORCEINLINE HRESULT IHTMLAnchorElement3_get_shape(IHTMLAnchorElement3* This,BSTR *p) {
    return This->lpVtbl->get_shape(This,p);
}
static FORCEINLINE HRESULT IHTMLAnchorElement3_put_coords(IHTMLAnchorElement3* This,BSTR v) {
    return This->lpVtbl->put_coords(This,v);
}
static FORCEINLINE HRESULT IHTMLAnchorElement3_get_coords(IHTMLAnchorElement3* This,BSTR *p) {
    return This->lpVtbl->get_coords(This,p);
}
static FORCEINLINE HRESULT IHTMLAnchorElement3_put_href(IHTMLAnchorElement3* This,BSTR v) {
    return This->lpVtbl->put_href(This,v);
}
static FORCEINLINE HRESULT IHTMLAnchorElement3_get_href(IHTMLAnchorElement3* This,BSTR *p) {
    return This->lpVtbl->get_href(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLAnchorElement3_put_shape_Proxy(
    IHTMLAnchorElement3* This,
    BSTR v);
void __RPC_STUB IHTMLAnchorElement3_put_shape_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement3_get_shape_Proxy(
    IHTMLAnchorElement3* This,
    BSTR *p);
void __RPC_STUB IHTMLAnchorElement3_get_shape_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement3_put_coords_Proxy(
    IHTMLAnchorElement3* This,
    BSTR v);
void __RPC_STUB IHTMLAnchorElement3_put_coords_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement3_get_coords_Proxy(
    IHTMLAnchorElement3* This,
    BSTR *p);
void __RPC_STUB IHTMLAnchorElement3_get_coords_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement3_put_href_Proxy(
    IHTMLAnchorElement3* This,
    BSTR v);
void __RPC_STUB IHTMLAnchorElement3_put_href_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAnchorElement3_get_href_Proxy(
    IHTMLAnchorElement3* This,
    BSTR *p);
void __RPC_STUB IHTMLAnchorElement3_get_href_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLAnchorElement3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLAnchorElement dispinterface
 */
#ifndef __DispHTMLAnchorElement_DISPINTERFACE_DEFINED__
#define __DispHTMLAnchorElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLAnchorElement, 0x3050f502, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f502-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLAnchorElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLAnchorElement, 0x3050f502, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLAnchorElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLAnchorElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLAnchorElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLAnchorElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLAnchorElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLAnchorElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLAnchorElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLAnchorElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLAnchorElementVtbl;
interface DispHTMLAnchorElement {
    CONST_VTBL DispHTMLAnchorElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLAnchorElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLAnchorElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLAnchorElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLAnchorElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLAnchorElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLAnchorElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLAnchorElement_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 DispHTMLAnchorElement_QueryInterface(DispHTMLAnchorElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLAnchorElement_AddRef(DispHTMLAnchorElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLAnchorElement_Release(DispHTMLAnchorElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLAnchorElement_GetTypeInfoCount(DispHTMLAnchorElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLAnchorElement_GetTypeInfo(DispHTMLAnchorElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLAnchorElement_GetIDsOfNames(DispHTMLAnchorElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLAnchorElement_Invoke(DispHTMLAnchorElement* 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  /* __DispHTMLAnchorElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLAnchorElement coclass
 */

DEFINE_GUID(CLSID_HTMLAnchorElement, 0x3050f248, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f248-98b5-11cf-bb82-00aa00bdce0b") HTMLAnchorElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLAnchorElement, 0x3050f248, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CAnchorElement;
/*****************************************************************************
 * HTMLLabelEvents2 dispinterface
 */
#ifndef __HTMLLabelEvents2_DISPINTERFACE_DEFINED__
#define __HTMLLabelEvents2_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLLabelEvents2, 0x3050f61c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f61c-98b5-11cf-bb82-00aa00bdce0b")
HTMLLabelEvents2 : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLLabelEvents2, 0x3050f61c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLLabelEvents2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLLabelEvents2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLLabelEvents2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLLabelEvents2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLLabelEvents2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLLabelEvents2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLLabelEvents2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLLabelEvents2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLLabelEvents2Vtbl;
interface HTMLLabelEvents2 {
    CONST_VTBL HTMLLabelEvents2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLLabelEvents2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLLabelEvents2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLLabelEvents2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLLabelEvents2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLLabelEvents2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLLabelEvents2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLLabelEvents2_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 HTMLLabelEvents2_QueryInterface(HTMLLabelEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLLabelEvents2_AddRef(HTMLLabelEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLLabelEvents2_Release(HTMLLabelEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLLabelEvents2_GetTypeInfoCount(HTMLLabelEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLLabelEvents2_GetTypeInfo(HTMLLabelEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLLabelEvents2_GetIDsOfNames(HTMLLabelEvents2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLLabelEvents2_Invoke(HTMLLabelEvents2* 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  /* __HTMLLabelEvents2_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLLabelEvents dispinterface
 */
#ifndef __HTMLLabelEvents_DISPINTERFACE_DEFINED__
#define __HTMLLabelEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLLabelEvents, 0x3050f329, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f329-98b5-11cf-bb82-00aa00bdce0b")
HTMLLabelEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLLabelEvents, 0x3050f329, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLLabelEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLLabelEvents* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLLabelEvents* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLLabelEvents* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLLabelEvents* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLLabelEvents* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLLabelEvents* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLLabelEvents* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLLabelEventsVtbl;
interface HTMLLabelEvents {
    CONST_VTBL HTMLLabelEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLLabelEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLLabelEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLLabelEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLLabelEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLLabelEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLLabelEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLLabelEvents_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 HTMLLabelEvents_QueryInterface(HTMLLabelEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLLabelEvents_AddRef(HTMLLabelEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLLabelEvents_Release(HTMLLabelEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLLabelEvents_GetTypeInfoCount(HTMLLabelEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLLabelEvents_GetTypeInfo(HTMLLabelEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLLabelEvents_GetIDsOfNames(HTMLLabelEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLLabelEvents_Invoke(HTMLLabelEvents* 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  /* __HTMLLabelEvents_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLLabelElement interface
 */
#ifndef __IHTMLLabelElement_INTERFACE_DEFINED__
#define __IHTMLLabelElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLLabelElement, 0x3050f32a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f32a-98b5-11cf-bb82-00aa00bdce0b")
IHTMLLabelElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_htmlFor(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_htmlFor(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_accessKey(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_accessKey(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLLabelElement, 0x3050f32a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLLabelElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLLabelElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLLabelElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLLabelElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLLabelElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLLabelElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLLabelElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLLabelElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLLabelElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_htmlFor)(
        IHTMLLabelElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_htmlFor)(
        IHTMLLabelElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_accessKey)(
        IHTMLLabelElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_accessKey)(
        IHTMLLabelElement* This,
        BSTR *p);

    END_INTERFACE
} IHTMLLabelElementVtbl;
interface IHTMLLabelElement {
    CONST_VTBL IHTMLLabelElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLLabelElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLLabelElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLLabelElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLLabelElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLLabelElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLLabelElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLLabelElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLLabelElement methods ***/
#define IHTMLLabelElement_put_htmlFor(This,v) (This)->lpVtbl->put_htmlFor(This,v)
#define IHTMLLabelElement_get_htmlFor(This,p) (This)->lpVtbl->get_htmlFor(This,p)
#define IHTMLLabelElement_put_accessKey(This,v) (This)->lpVtbl->put_accessKey(This,v)
#define IHTMLLabelElement_get_accessKey(This,p) (This)->lpVtbl->get_accessKey(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLLabelElement_QueryInterface(IHTMLLabelElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLLabelElement_AddRef(IHTMLLabelElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLLabelElement_Release(IHTMLLabelElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLLabelElement_GetTypeInfoCount(IHTMLLabelElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLLabelElement_GetTypeInfo(IHTMLLabelElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLLabelElement_GetIDsOfNames(IHTMLLabelElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLLabelElement_Invoke(IHTMLLabelElement* 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);
}
/*** IHTMLLabelElement methods ***/
static FORCEINLINE HRESULT IHTMLLabelElement_put_htmlFor(IHTMLLabelElement* This,BSTR v) {
    return This->lpVtbl->put_htmlFor(This,v);
}
static FORCEINLINE HRESULT IHTMLLabelElement_get_htmlFor(IHTMLLabelElement* This,BSTR *p) {
    return This->lpVtbl->get_htmlFor(This,p);
}
static FORCEINLINE HRESULT IHTMLLabelElement_put_accessKey(IHTMLLabelElement* This,BSTR v) {
    return This->lpVtbl->put_accessKey(This,v);
}
static FORCEINLINE HRESULT IHTMLLabelElement_get_accessKey(IHTMLLabelElement* This,BSTR *p) {
    return This->lpVtbl->get_accessKey(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLLabelElement_put_htmlFor_Proxy(
    IHTMLLabelElement* This,
    BSTR v);
void __RPC_STUB IHTMLLabelElement_put_htmlFor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLabelElement_get_htmlFor_Proxy(
    IHTMLLabelElement* This,
    BSTR *p);
void __RPC_STUB IHTMLLabelElement_get_htmlFor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLabelElement_put_accessKey_Proxy(
    IHTMLLabelElement* This,
    BSTR v);
void __RPC_STUB IHTMLLabelElement_put_accessKey_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLabelElement_get_accessKey_Proxy(
    IHTMLLabelElement* This,
    BSTR *p);
void __RPC_STUB IHTMLLabelElement_get_accessKey_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLLabelElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLLabelElement2 interface
 */
#ifndef __IHTMLLabelElement2_INTERFACE_DEFINED__
#define __IHTMLLabelElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLLabelElement2, 0x3050f832, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f832-98b5-11cf-bb82-00aa00bdce0b")
IHTMLLabelElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_form(
        IHTMLFormElement **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLLabelElement2, 0x3050f832, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLLabelElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLLabelElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLLabelElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLLabelElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLLabelElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLLabelElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLLabelElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLLabelElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLLabelElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_form)(
        IHTMLLabelElement2* This,
        IHTMLFormElement **p);

    END_INTERFACE
} IHTMLLabelElement2Vtbl;
interface IHTMLLabelElement2 {
    CONST_VTBL IHTMLLabelElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLLabelElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLLabelElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLLabelElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLLabelElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLLabelElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLLabelElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLLabelElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLLabelElement2 methods ***/
#define IHTMLLabelElement2_get_form(This,p) (This)->lpVtbl->get_form(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLLabelElement2_QueryInterface(IHTMLLabelElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLLabelElement2_AddRef(IHTMLLabelElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLLabelElement2_Release(IHTMLLabelElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLLabelElement2_GetTypeInfoCount(IHTMLLabelElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLLabelElement2_GetTypeInfo(IHTMLLabelElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLLabelElement2_GetIDsOfNames(IHTMLLabelElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLLabelElement2_Invoke(IHTMLLabelElement2* 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);
}
/*** IHTMLLabelElement2 methods ***/
static FORCEINLINE HRESULT IHTMLLabelElement2_get_form(IHTMLLabelElement2* This,IHTMLFormElement **p) {
    return This->lpVtbl->get_form(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLLabelElement2_get_form_Proxy(
    IHTMLLabelElement2* This,
    IHTMLFormElement **p);
void __RPC_STUB IHTMLLabelElement2_get_form_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLLabelElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLLabelElement dispinterface
 */
#ifndef __DispHTMLLabelElement_DISPINTERFACE_DEFINED__
#define __DispHTMLLabelElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLLabelElement, 0x3050f522, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f522-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLLabelElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLLabelElement, 0x3050f522, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLLabelElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLLabelElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLLabelElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLLabelElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLLabelElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLLabelElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLLabelElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLLabelElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLLabelElementVtbl;
interface DispHTMLLabelElement {
    CONST_VTBL DispHTMLLabelElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLLabelElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLLabelElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLLabelElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLLabelElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLLabelElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLLabelElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLLabelElement_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 DispHTMLLabelElement_QueryInterface(DispHTMLLabelElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLLabelElement_AddRef(DispHTMLLabelElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLLabelElement_Release(DispHTMLLabelElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLLabelElement_GetTypeInfoCount(DispHTMLLabelElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLLabelElement_GetTypeInfo(DispHTMLLabelElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLLabelElement_GetIDsOfNames(DispHTMLLabelElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLLabelElement_Invoke(DispHTMLLabelElement* 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  /* __DispHTMLLabelElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLLabelElement coclass
 */

DEFINE_GUID(CLSID_HTMLLabelElement, 0x3050f32b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f32b-98b5-11cf-bb82-00aa00bdce0b") HTMLLabelElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLLabelElement, 0x3050f32b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CLabelElement;
/*****************************************************************************
 * IHTMLListElement interface
 */
#ifndef __IHTMLListElement_INTERFACE_DEFINED__
#define __IHTMLListElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLListElement, 0x3050f20e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f20e-98b5-11cf-bb82-00aa00bdce0b")
IHTMLListElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLListElement, 0x3050f20e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLListElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLListElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLListElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLListElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLListElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLListElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLListElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLListElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} IHTMLListElementVtbl;
interface IHTMLListElement {
    CONST_VTBL IHTMLListElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLListElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLListElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLListElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLListElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLListElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLListElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLListElement_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 IHTMLListElement_QueryInterface(IHTMLListElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLListElement_AddRef(IHTMLListElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLListElement_Release(IHTMLListElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLListElement_GetTypeInfoCount(IHTMLListElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLListElement_GetTypeInfo(IHTMLListElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLListElement_GetIDsOfNames(IHTMLListElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLListElement_Invoke(IHTMLListElement* 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  /* __IHTMLListElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLListElement2 interface
 */
#ifndef __IHTMLListElement2_INTERFACE_DEFINED__
#define __IHTMLListElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLListElement2, 0x3050f822, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f822-98b5-11cf-bb82-00aa00bdce0b")
IHTMLListElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_compact(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_compact(
        VARIANT_BOOL *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLListElement2, 0x3050f822, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLListElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLListElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLListElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLListElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLListElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLListElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLListElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLListElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLListElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_compact)(
        IHTMLListElement2* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_compact)(
        IHTMLListElement2* This,
        VARIANT_BOOL *p);

    END_INTERFACE
} IHTMLListElement2Vtbl;
interface IHTMLListElement2 {
    CONST_VTBL IHTMLListElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLListElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLListElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLListElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLListElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLListElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLListElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLListElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLListElement2 methods ***/
#define IHTMLListElement2_put_compact(This,v) (This)->lpVtbl->put_compact(This,v)
#define IHTMLListElement2_get_compact(This,p) (This)->lpVtbl->get_compact(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLListElement2_QueryInterface(IHTMLListElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLListElement2_AddRef(IHTMLListElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLListElement2_Release(IHTMLListElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLListElement2_GetTypeInfoCount(IHTMLListElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLListElement2_GetTypeInfo(IHTMLListElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLListElement2_GetIDsOfNames(IHTMLListElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLListElement2_Invoke(IHTMLListElement2* 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);
}
/*** IHTMLListElement2 methods ***/
static FORCEINLINE HRESULT IHTMLListElement2_put_compact(IHTMLListElement2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_compact(This,v);
}
static FORCEINLINE HRESULT IHTMLListElement2_get_compact(IHTMLListElement2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_compact(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLListElement2_put_compact_Proxy(
    IHTMLListElement2* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLListElement2_put_compact_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLListElement2_get_compact_Proxy(
    IHTMLListElement2* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLListElement2_get_compact_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLListElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLListElement dispinterface
 */
#ifndef __DispHTMLListElement_DISPINTERFACE_DEFINED__
#define __DispHTMLListElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLListElement, 0x3050f525, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f525-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLListElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLListElement, 0x3050f525, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLListElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLListElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLListElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLListElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLListElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLListElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLListElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLListElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLListElementVtbl;
interface DispHTMLListElement {
    CONST_VTBL DispHTMLListElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLListElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLListElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLListElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLListElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLListElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLListElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLListElement_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 DispHTMLListElement_QueryInterface(DispHTMLListElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLListElement_AddRef(DispHTMLListElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLListElement_Release(DispHTMLListElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLListElement_GetTypeInfoCount(DispHTMLListElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLListElement_GetTypeInfo(DispHTMLListElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLListElement_GetIDsOfNames(DispHTMLListElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLListElement_Invoke(DispHTMLListElement* 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  /* __DispHTMLListElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLListElement coclass
 */

DEFINE_GUID(CLSID_HTMLListElement, 0x3050f272, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f272-98b5-11cf-bb82-00aa00bdce0b") HTMLListElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLListElement, 0x3050f272, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CListElement;
/*****************************************************************************
 * IHTMLUListElement interface
 */
#ifndef __IHTMLUListElement_INTERFACE_DEFINED__
#define __IHTMLUListElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLUListElement, 0x3050f1dd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f1dd-98b5-11cf-bb82-00aa00bdce0b")
IHTMLUListElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_compact(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_compact(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_type(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLUListElement, 0x3050f1dd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLUListElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLUListElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLUListElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLUListElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLUListElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLUListElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLUListElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLUListElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLUListElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_compact)(
        IHTMLUListElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_compact)(
        IHTMLUListElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_type)(
        IHTMLUListElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLUListElement* This,
        BSTR *p);

    END_INTERFACE
} IHTMLUListElementVtbl;
interface IHTMLUListElement {
    CONST_VTBL IHTMLUListElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLUListElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLUListElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLUListElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLUListElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLUListElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLUListElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLUListElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLUListElement methods ***/
#define IHTMLUListElement_put_compact(This,v) (This)->lpVtbl->put_compact(This,v)
#define IHTMLUListElement_get_compact(This,p) (This)->lpVtbl->get_compact(This,p)
#define IHTMLUListElement_put_type(This,v) (This)->lpVtbl->put_type(This,v)
#define IHTMLUListElement_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLUListElement_QueryInterface(IHTMLUListElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLUListElement_AddRef(IHTMLUListElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLUListElement_Release(IHTMLUListElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLUListElement_GetTypeInfoCount(IHTMLUListElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLUListElement_GetTypeInfo(IHTMLUListElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLUListElement_GetIDsOfNames(IHTMLUListElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLUListElement_Invoke(IHTMLUListElement* 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);
}
/*** IHTMLUListElement methods ***/
static FORCEINLINE HRESULT IHTMLUListElement_put_compact(IHTMLUListElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_compact(This,v);
}
static FORCEINLINE HRESULT IHTMLUListElement_get_compact(IHTMLUListElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_compact(This,p);
}
static FORCEINLINE HRESULT IHTMLUListElement_put_type(IHTMLUListElement* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static FORCEINLINE HRESULT IHTMLUListElement_get_type(IHTMLUListElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLUListElement_put_compact_Proxy(
    IHTMLUListElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLUListElement_put_compact_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLUListElement_get_compact_Proxy(
    IHTMLUListElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLUListElement_get_compact_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLUListElement_put_type_Proxy(
    IHTMLUListElement* This,
    BSTR v);
void __RPC_STUB IHTMLUListElement_put_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLUListElement_get_type_Proxy(
    IHTMLUListElement* This,
    BSTR *p);
void __RPC_STUB IHTMLUListElement_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLUListElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLUListElement dispinterface
 */
#ifndef __DispHTMLUListElement_DISPINTERFACE_DEFINED__
#define __DispHTMLUListElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLUListElement, 0x3050f538, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f538-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLUListElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLUListElement, 0x3050f538, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLUListElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLUListElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLUListElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLUListElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLUListElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLUListElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLUListElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLUListElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLUListElementVtbl;
interface DispHTMLUListElement {
    CONST_VTBL DispHTMLUListElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLUListElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLUListElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLUListElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLUListElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLUListElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLUListElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLUListElement_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 DispHTMLUListElement_QueryInterface(DispHTMLUListElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLUListElement_AddRef(DispHTMLUListElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLUListElement_Release(DispHTMLUListElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLUListElement_GetTypeInfoCount(DispHTMLUListElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLUListElement_GetTypeInfo(DispHTMLUListElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLUListElement_GetIDsOfNames(DispHTMLUListElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLUListElement_Invoke(DispHTMLUListElement* 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  /* __DispHTMLUListElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLUListElement coclass
 */

DEFINE_GUID(CLSID_HTMLUListElement, 0x3050f269, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f269-98b5-11cf-bb82-00aa00bdce0b") HTMLUListElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLUListElement, 0x3050f269, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CUListElement;
/*****************************************************************************
 * IHTMLOListElement interface
 */
#ifndef __IHTMLOListElement_INTERFACE_DEFINED__
#define __IHTMLOListElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLOListElement, 0x3050f1de, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f1de-98b5-11cf-bb82-00aa00bdce0b")
IHTMLOListElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_compact(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_compact(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_start(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_start(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_type(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLOListElement, 0x3050f1de, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLOListElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLOListElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLOListElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLOListElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLOListElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLOListElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLOListElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLOListElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLOListElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_compact)(
        IHTMLOListElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_compact)(
        IHTMLOListElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_start)(
        IHTMLOListElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_start)(
        IHTMLOListElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_type)(
        IHTMLOListElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLOListElement* This,
        BSTR *p);

    END_INTERFACE
} IHTMLOListElementVtbl;
interface IHTMLOListElement {
    CONST_VTBL IHTMLOListElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLOListElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLOListElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLOListElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLOListElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLOListElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLOListElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLOListElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLOListElement methods ***/
#define IHTMLOListElement_put_compact(This,v) (This)->lpVtbl->put_compact(This,v)
#define IHTMLOListElement_get_compact(This,p) (This)->lpVtbl->get_compact(This,p)
#define IHTMLOListElement_put_start(This,v) (This)->lpVtbl->put_start(This,v)
#define IHTMLOListElement_get_start(This,p) (This)->lpVtbl->get_start(This,p)
#define IHTMLOListElement_put_type(This,v) (This)->lpVtbl->put_type(This,v)
#define IHTMLOListElement_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLOListElement_QueryInterface(IHTMLOListElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLOListElement_AddRef(IHTMLOListElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLOListElement_Release(IHTMLOListElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLOListElement_GetTypeInfoCount(IHTMLOListElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLOListElement_GetTypeInfo(IHTMLOListElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLOListElement_GetIDsOfNames(IHTMLOListElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLOListElement_Invoke(IHTMLOListElement* 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);
}
/*** IHTMLOListElement methods ***/
static FORCEINLINE HRESULT IHTMLOListElement_put_compact(IHTMLOListElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_compact(This,v);
}
static FORCEINLINE HRESULT IHTMLOListElement_get_compact(IHTMLOListElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_compact(This,p);
}
static FORCEINLINE HRESULT IHTMLOListElement_put_start(IHTMLOListElement* This,LONG v) {
    return This->lpVtbl->put_start(This,v);
}
static FORCEINLINE HRESULT IHTMLOListElement_get_start(IHTMLOListElement* This,LONG *p) {
    return This->lpVtbl->get_start(This,p);
}
static FORCEINLINE HRESULT IHTMLOListElement_put_type(IHTMLOListElement* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static FORCEINLINE HRESULT IHTMLOListElement_get_type(IHTMLOListElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLOListElement_put_compact_Proxy(
    IHTMLOListElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLOListElement_put_compact_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOListElement_get_compact_Proxy(
    IHTMLOListElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLOListElement_get_compact_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOListElement_put_start_Proxy(
    IHTMLOListElement* This,
    LONG v);
void __RPC_STUB IHTMLOListElement_put_start_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOListElement_get_start_Proxy(
    IHTMLOListElement* This,
    LONG *p);
void __RPC_STUB IHTMLOListElement_get_start_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOListElement_put_type_Proxy(
    IHTMLOListElement* This,
    BSTR v);
void __RPC_STUB IHTMLOListElement_put_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOListElement_get_type_Proxy(
    IHTMLOListElement* This,
    BSTR *p);
void __RPC_STUB IHTMLOListElement_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLOListElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLOListElement dispinterface
 */
#ifndef __DispHTMLOListElement_DISPINTERFACE_DEFINED__
#define __DispHTMLOListElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLOListElement, 0x3050f52a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f52a-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLOListElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLOListElement, 0x3050f52a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLOListElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLOListElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLOListElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLOListElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLOListElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLOListElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLOListElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLOListElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLOListElementVtbl;
interface DispHTMLOListElement {
    CONST_VTBL DispHTMLOListElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLOListElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLOListElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLOListElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLOListElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLOListElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLOListElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLOListElement_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 DispHTMLOListElement_QueryInterface(DispHTMLOListElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLOListElement_AddRef(DispHTMLOListElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLOListElement_Release(DispHTMLOListElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLOListElement_GetTypeInfoCount(DispHTMLOListElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLOListElement_GetTypeInfo(DispHTMLOListElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLOListElement_GetIDsOfNames(DispHTMLOListElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLOListElement_Invoke(DispHTMLOListElement* 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  /* __DispHTMLOListElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLOListElement coclass
 */

DEFINE_GUID(CLSID_HTMLOListElement, 0x3050f270, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f270-98b5-11cf-bb82-00aa00bdce0b") HTMLOListElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLOListElement, 0x3050f270, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_COListElement;
/*****************************************************************************
 * IHTMLLIElement interface
 */
#ifndef __IHTMLLIElement_INTERFACE_DEFINED__
#define __IHTMLLIElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLLIElement, 0x3050f1e0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f1e0-98b5-11cf-bb82-00aa00bdce0b")
IHTMLLIElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_type(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_value(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_value(
        LONG *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLLIElement, 0x3050f1e0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLLIElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLLIElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLLIElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLLIElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLLIElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLLIElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLLIElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLLIElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLLIElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_type)(
        IHTMLLIElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLLIElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_value)(
        IHTMLLIElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_value)(
        IHTMLLIElement* This,
        LONG *p);

    END_INTERFACE
} IHTMLLIElementVtbl;
interface IHTMLLIElement {
    CONST_VTBL IHTMLLIElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLLIElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLLIElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLLIElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLLIElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLLIElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLLIElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLLIElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLLIElement methods ***/
#define IHTMLLIElement_put_type(This,v) (This)->lpVtbl->put_type(This,v)
#define IHTMLLIElement_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#define IHTMLLIElement_put_value(This,v) (This)->lpVtbl->put_value(This,v)
#define IHTMLLIElement_get_value(This,p) (This)->lpVtbl->get_value(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLLIElement_QueryInterface(IHTMLLIElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLLIElement_AddRef(IHTMLLIElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLLIElement_Release(IHTMLLIElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLLIElement_GetTypeInfoCount(IHTMLLIElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLLIElement_GetTypeInfo(IHTMLLIElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLLIElement_GetIDsOfNames(IHTMLLIElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLLIElement_Invoke(IHTMLLIElement* 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);
}
/*** IHTMLLIElement methods ***/
static FORCEINLINE HRESULT IHTMLLIElement_put_type(IHTMLLIElement* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static FORCEINLINE HRESULT IHTMLLIElement_get_type(IHTMLLIElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static FORCEINLINE HRESULT IHTMLLIElement_put_value(IHTMLLIElement* This,LONG v) {
    return This->lpVtbl->put_value(This,v);
}
static FORCEINLINE HRESULT IHTMLLIElement_get_value(IHTMLLIElement* This,LONG *p) {
    return This->lpVtbl->get_value(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLLIElement_put_type_Proxy(
    IHTMLLIElement* This,
    BSTR v);
void __RPC_STUB IHTMLLIElement_put_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLIElement_get_type_Proxy(
    IHTMLLIElement* This,
    BSTR *p);
void __RPC_STUB IHTMLLIElement_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLIElement_put_value_Proxy(
    IHTMLLIElement* This,
    LONG v);
void __RPC_STUB IHTMLLIElement_put_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLIElement_get_value_Proxy(
    IHTMLLIElement* This,
    LONG *p);
void __RPC_STUB IHTMLLIElement_get_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLLIElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLLIElement dispinterface
 */
#ifndef __DispHTMLLIElement_DISPINTERFACE_DEFINED__
#define __DispHTMLLIElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLLIElement, 0x3050f523, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f523-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLLIElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLLIElement, 0x3050f523, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLLIElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLLIElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLLIElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLLIElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLLIElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLLIElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLLIElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLLIElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLLIElementVtbl;
interface DispHTMLLIElement {
    CONST_VTBL DispHTMLLIElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLLIElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLLIElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLLIElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLLIElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLLIElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLLIElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLLIElement_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 DispHTMLLIElement_QueryInterface(DispHTMLLIElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLLIElement_AddRef(DispHTMLLIElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLLIElement_Release(DispHTMLLIElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLLIElement_GetTypeInfoCount(DispHTMLLIElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLLIElement_GetTypeInfo(DispHTMLLIElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLLIElement_GetIDsOfNames(DispHTMLLIElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLLIElement_Invoke(DispHTMLLIElement* 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  /* __DispHTMLLIElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLLIElement coclass
 */

DEFINE_GUID(CLSID_HTMLLIElement, 0x3050f273, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f273-98b5-11cf-bb82-00aa00bdce0b") HTMLLIElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLLIElement, 0x3050f273, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CLIElement;
/*****************************************************************************
 * IHTMLBlockElement interface
 */
#ifndef __IHTMLBlockElement_INTERFACE_DEFINED__
#define __IHTMLBlockElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLBlockElement, 0x3050f208, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f208-98b5-11cf-bb82-00aa00bdce0b")
IHTMLBlockElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_clear(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clear(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLBlockElement, 0x3050f208, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLBlockElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLBlockElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLBlockElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLBlockElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLBlockElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLBlockElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLBlockElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLBlockElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLBlockElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_clear)(
        IHTMLBlockElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_clear)(
        IHTMLBlockElement* This,
        BSTR *p);

    END_INTERFACE
} IHTMLBlockElementVtbl;
interface IHTMLBlockElement {
    CONST_VTBL IHTMLBlockElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLBlockElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLBlockElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLBlockElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLBlockElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLBlockElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLBlockElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLBlockElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLBlockElement methods ***/
#define IHTMLBlockElement_put_clear(This,v) (This)->lpVtbl->put_clear(This,v)
#define IHTMLBlockElement_get_clear(This,p) (This)->lpVtbl->get_clear(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLBlockElement_QueryInterface(IHTMLBlockElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLBlockElement_AddRef(IHTMLBlockElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLBlockElement_Release(IHTMLBlockElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLBlockElement_GetTypeInfoCount(IHTMLBlockElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLBlockElement_GetTypeInfo(IHTMLBlockElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLBlockElement_GetIDsOfNames(IHTMLBlockElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLBlockElement_Invoke(IHTMLBlockElement* 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);
}
/*** IHTMLBlockElement methods ***/
static FORCEINLINE HRESULT IHTMLBlockElement_put_clear(IHTMLBlockElement* This,BSTR v) {
    return This->lpVtbl->put_clear(This,v);
}
static FORCEINLINE HRESULT IHTMLBlockElement_get_clear(IHTMLBlockElement* This,BSTR *p) {
    return This->lpVtbl->get_clear(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLBlockElement_put_clear_Proxy(
    IHTMLBlockElement* This,
    BSTR v);
void __RPC_STUB IHTMLBlockElement_put_clear_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBlockElement_get_clear_Proxy(
    IHTMLBlockElement* This,
    BSTR *p);
void __RPC_STUB IHTMLBlockElement_get_clear_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLBlockElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLBlockElement2 interface
 */
#ifndef __IHTMLBlockElement2_INTERFACE_DEFINED__
#define __IHTMLBlockElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLBlockElement2, 0x3050f823, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f823-98b5-11cf-bb82-00aa00bdce0b")
IHTMLBlockElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_cite(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cite(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_width(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_width(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLBlockElement2, 0x3050f823, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLBlockElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLBlockElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLBlockElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLBlockElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLBlockElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLBlockElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLBlockElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLBlockElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLBlockElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_cite)(
        IHTMLBlockElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_cite)(
        IHTMLBlockElement2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_width)(
        IHTMLBlockElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_width)(
        IHTMLBlockElement2* This,
        BSTR *p);

    END_INTERFACE
} IHTMLBlockElement2Vtbl;
interface IHTMLBlockElement2 {
    CONST_VTBL IHTMLBlockElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLBlockElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLBlockElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLBlockElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLBlockElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLBlockElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLBlockElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLBlockElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLBlockElement2 methods ***/
#define IHTMLBlockElement2_put_cite(This,v) (This)->lpVtbl->put_cite(This,v)
#define IHTMLBlockElement2_get_cite(This,p) (This)->lpVtbl->get_cite(This,p)
#define IHTMLBlockElement2_put_width(This,v) (This)->lpVtbl->put_width(This,v)
#define IHTMLBlockElement2_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLBlockElement2_QueryInterface(IHTMLBlockElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLBlockElement2_AddRef(IHTMLBlockElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLBlockElement2_Release(IHTMLBlockElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLBlockElement2_GetTypeInfoCount(IHTMLBlockElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLBlockElement2_GetTypeInfo(IHTMLBlockElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLBlockElement2_GetIDsOfNames(IHTMLBlockElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLBlockElement2_Invoke(IHTMLBlockElement2* 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);
}
/*** IHTMLBlockElement2 methods ***/
static FORCEINLINE HRESULT IHTMLBlockElement2_put_cite(IHTMLBlockElement2* This,BSTR v) {
    return This->lpVtbl->put_cite(This,v);
}
static FORCEINLINE HRESULT IHTMLBlockElement2_get_cite(IHTMLBlockElement2* This,BSTR *p) {
    return This->lpVtbl->get_cite(This,p);
}
static FORCEINLINE HRESULT IHTMLBlockElement2_put_width(IHTMLBlockElement2* This,BSTR v) {
    return This->lpVtbl->put_width(This,v);
}
static FORCEINLINE HRESULT IHTMLBlockElement2_get_width(IHTMLBlockElement2* This,BSTR *p) {
    return This->lpVtbl->get_width(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLBlockElement2_put_cite_Proxy(
    IHTMLBlockElement2* This,
    BSTR v);
void __RPC_STUB IHTMLBlockElement2_put_cite_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBlockElement2_get_cite_Proxy(
    IHTMLBlockElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLBlockElement2_get_cite_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBlockElement2_put_width_Proxy(
    IHTMLBlockElement2* This,
    BSTR v);
void __RPC_STUB IHTMLBlockElement2_put_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBlockElement2_get_width_Proxy(
    IHTMLBlockElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLBlockElement2_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLBlockElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLBlockElement3 interface
 */
#ifndef __IHTMLBlockElement3_INTERFACE_DEFINED__
#define __IHTMLBlockElement3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLBlockElement3, 0x30510494, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510494-98b5-11cf-bb82-00aa00bdce0b")
IHTMLBlockElement3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_cite(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cite(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLBlockElement3, 0x30510494, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLBlockElement3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLBlockElement3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLBlockElement3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLBlockElement3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLBlockElement3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLBlockElement3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLBlockElement3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLBlockElement3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLBlockElement3 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_cite)(
        IHTMLBlockElement3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_cite)(
        IHTMLBlockElement3* This,
        BSTR *p);

    END_INTERFACE
} IHTMLBlockElement3Vtbl;
interface IHTMLBlockElement3 {
    CONST_VTBL IHTMLBlockElement3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLBlockElement3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLBlockElement3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLBlockElement3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLBlockElement3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLBlockElement3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLBlockElement3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLBlockElement3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLBlockElement3 methods ***/
#define IHTMLBlockElement3_put_cite(This,v) (This)->lpVtbl->put_cite(This,v)
#define IHTMLBlockElement3_get_cite(This,p) (This)->lpVtbl->get_cite(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLBlockElement3_QueryInterface(IHTMLBlockElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLBlockElement3_AddRef(IHTMLBlockElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLBlockElement3_Release(IHTMLBlockElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLBlockElement3_GetTypeInfoCount(IHTMLBlockElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLBlockElement3_GetTypeInfo(IHTMLBlockElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLBlockElement3_GetIDsOfNames(IHTMLBlockElement3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLBlockElement3_Invoke(IHTMLBlockElement3* 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);
}
/*** IHTMLBlockElement3 methods ***/
static FORCEINLINE HRESULT IHTMLBlockElement3_put_cite(IHTMLBlockElement3* This,BSTR v) {
    return This->lpVtbl->put_cite(This,v);
}
static FORCEINLINE HRESULT IHTMLBlockElement3_get_cite(IHTMLBlockElement3* This,BSTR *p) {
    return This->lpVtbl->get_cite(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLBlockElement3_put_cite_Proxy(
    IHTMLBlockElement3* This,
    BSTR v);
void __RPC_STUB IHTMLBlockElement3_put_cite_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBlockElement3_get_cite_Proxy(
    IHTMLBlockElement3* This,
    BSTR *p);
void __RPC_STUB IHTMLBlockElement3_get_cite_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLBlockElement3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLBlockElement dispinterface
 */
#ifndef __DispHTMLBlockElement_DISPINTERFACE_DEFINED__
#define __DispHTMLBlockElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLBlockElement, 0x3050f506, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f506-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLBlockElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLBlockElement, 0x3050f506, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLBlockElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLBlockElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLBlockElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLBlockElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLBlockElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLBlockElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLBlockElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLBlockElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLBlockElementVtbl;
interface DispHTMLBlockElement {
    CONST_VTBL DispHTMLBlockElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLBlockElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLBlockElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLBlockElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLBlockElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLBlockElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLBlockElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLBlockElement_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 DispHTMLBlockElement_QueryInterface(DispHTMLBlockElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLBlockElement_AddRef(DispHTMLBlockElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLBlockElement_Release(DispHTMLBlockElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLBlockElement_GetTypeInfoCount(DispHTMLBlockElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLBlockElement_GetTypeInfo(DispHTMLBlockElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLBlockElement_GetIDsOfNames(DispHTMLBlockElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLBlockElement_Invoke(DispHTMLBlockElement* 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  /* __DispHTMLBlockElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLBlockElement coclass
 */

DEFINE_GUID(CLSID_HTMLBlockElement, 0x3050f281, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f281-98b5-11cf-bb82-00aa00bdce0b") HTMLBlockElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLBlockElement, 0x3050f281, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CBlockElement;
/*****************************************************************************
 * IHTMLDivElement interface
 */
#ifndef __IHTMLDivElement_INTERFACE_DEFINED__
#define __IHTMLDivElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDivElement, 0x3050f200, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f200-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDivElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_align(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_align(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_noWrap(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_noWrap(
        VARIANT_BOOL *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDivElement, 0x3050f200, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDivElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLDivElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLDivElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLDivElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLDivElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLDivElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLDivElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLDivElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLDivElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_align)(
        IHTMLDivElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_align)(
        IHTMLDivElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_noWrap)(
        IHTMLDivElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_noWrap)(
        IHTMLDivElement* This,
        VARIANT_BOOL *p);

    END_INTERFACE
} IHTMLDivElementVtbl;
interface IHTMLDivElement {
    CONST_VTBL IHTMLDivElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDivElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDivElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDivElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDivElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDivElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDivElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDivElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDivElement methods ***/
#define IHTMLDivElement_put_align(This,v) (This)->lpVtbl->put_align(This,v)
#define IHTMLDivElement_get_align(This,p) (This)->lpVtbl->get_align(This,p)
#define IHTMLDivElement_put_noWrap(This,v) (This)->lpVtbl->put_noWrap(This,v)
#define IHTMLDivElement_get_noWrap(This,p) (This)->lpVtbl->get_noWrap(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDivElement_QueryInterface(IHTMLDivElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDivElement_AddRef(IHTMLDivElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDivElement_Release(IHTMLDivElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDivElement_GetTypeInfoCount(IHTMLDivElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDivElement_GetTypeInfo(IHTMLDivElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDivElement_GetIDsOfNames(IHTMLDivElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDivElement_Invoke(IHTMLDivElement* 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);
}
/*** IHTMLDivElement methods ***/
static FORCEINLINE HRESULT IHTMLDivElement_put_align(IHTMLDivElement* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static FORCEINLINE HRESULT IHTMLDivElement_get_align(IHTMLDivElement* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
static FORCEINLINE HRESULT IHTMLDivElement_put_noWrap(IHTMLDivElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_noWrap(This,v);
}
static FORCEINLINE HRESULT IHTMLDivElement_get_noWrap(IHTMLDivElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_noWrap(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDivElement_put_align_Proxy(
    IHTMLDivElement* This,
    BSTR v);
void __RPC_STUB IHTMLDivElement_put_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDivElement_get_align_Proxy(
    IHTMLDivElement* This,
    BSTR *p);
void __RPC_STUB IHTMLDivElement_get_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDivElement_put_noWrap_Proxy(
    IHTMLDivElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLDivElement_put_noWrap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDivElement_get_noWrap_Proxy(
    IHTMLDivElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLDivElement_get_noWrap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDivElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLDivElement dispinterface
 */
#ifndef __DispHTMLDivElement_DISPINTERFACE_DEFINED__
#define __DispHTMLDivElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLDivElement, 0x3050f50c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f50c-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLDivElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLDivElement, 0x3050f50c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLDivElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLDivElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLDivElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLDivElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLDivElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLDivElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLDivElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLDivElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLDivElementVtbl;
interface DispHTMLDivElement {
    CONST_VTBL DispHTMLDivElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLDivElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLDivElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLDivElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLDivElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLDivElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLDivElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLDivElement_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 DispHTMLDivElement_QueryInterface(DispHTMLDivElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLDivElement_AddRef(DispHTMLDivElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLDivElement_Release(DispHTMLDivElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLDivElement_GetTypeInfoCount(DispHTMLDivElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLDivElement_GetTypeInfo(DispHTMLDivElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLDivElement_GetIDsOfNames(DispHTMLDivElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLDivElement_Invoke(DispHTMLDivElement* 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  /* __DispHTMLDivElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLDivElement coclass
 */

DEFINE_GUID(CLSID_HTMLDivElement, 0x3050f27e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f27e-98b5-11cf-bb82-00aa00bdce0b") HTMLDivElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLDivElement, 0x3050f27e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDivElement;
/*****************************************************************************
 * IHTMLDDElement interface
 */
#ifndef __IHTMLDDElement_INTERFACE_DEFINED__
#define __IHTMLDDElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDDElement, 0x3050f1f2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f1f2-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDDElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_noWrap(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_noWrap(
        VARIANT_BOOL *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDDElement, 0x3050f1f2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDDElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLDDElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLDDElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLDDElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLDDElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLDDElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLDDElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLDDElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLDDElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_noWrap)(
        IHTMLDDElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_noWrap)(
        IHTMLDDElement* This,
        VARIANT_BOOL *p);

    END_INTERFACE
} IHTMLDDElementVtbl;
interface IHTMLDDElement {
    CONST_VTBL IHTMLDDElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDDElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDDElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDDElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDDElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDDElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDDElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDDElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDDElement methods ***/
#define IHTMLDDElement_put_noWrap(This,v) (This)->lpVtbl->put_noWrap(This,v)
#define IHTMLDDElement_get_noWrap(This,p) (This)->lpVtbl->get_noWrap(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDDElement_QueryInterface(IHTMLDDElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDDElement_AddRef(IHTMLDDElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDDElement_Release(IHTMLDDElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDDElement_GetTypeInfoCount(IHTMLDDElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDDElement_GetTypeInfo(IHTMLDDElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDDElement_GetIDsOfNames(IHTMLDDElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDDElement_Invoke(IHTMLDDElement* 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);
}
/*** IHTMLDDElement methods ***/
static FORCEINLINE HRESULT IHTMLDDElement_put_noWrap(IHTMLDDElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_noWrap(This,v);
}
static FORCEINLINE HRESULT IHTMLDDElement_get_noWrap(IHTMLDDElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_noWrap(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDDElement_put_noWrap_Proxy(
    IHTMLDDElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLDDElement_put_noWrap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDDElement_get_noWrap_Proxy(
    IHTMLDDElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLDDElement_get_noWrap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDDElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLDDElement dispinterface
 */
#ifndef __DispHTMLDDElement_DISPINTERFACE_DEFINED__
#define __DispHTMLDDElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLDDElement, 0x3050f50b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f50b-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLDDElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLDDElement, 0x3050f50b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLDDElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLDDElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLDDElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLDDElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLDDElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLDDElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLDDElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLDDElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLDDElementVtbl;
interface DispHTMLDDElement {
    CONST_VTBL DispHTMLDDElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLDDElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLDDElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLDDElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLDDElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLDDElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLDDElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLDDElement_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 DispHTMLDDElement_QueryInterface(DispHTMLDDElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLDDElement_AddRef(DispHTMLDDElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLDDElement_Release(DispHTMLDDElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLDDElement_GetTypeInfoCount(DispHTMLDDElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLDDElement_GetTypeInfo(DispHTMLDDElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLDDElement_GetIDsOfNames(DispHTMLDDElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLDDElement_Invoke(DispHTMLDDElement* 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  /* __DispHTMLDDElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLDDElement coclass
 */

DEFINE_GUID(CLSID_HTMLDDElement, 0x3050f27f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f27f-98b5-11cf-bb82-00aa00bdce0b") HTMLDDElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLDDElement, 0x3050f27f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDDElement;
/*****************************************************************************
 * IHTMLDTElement interface
 */
#ifndef __IHTMLDTElement_INTERFACE_DEFINED__
#define __IHTMLDTElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDTElement, 0x3050f1f3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f1f3-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDTElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_noWrap(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_noWrap(
        VARIANT_BOOL *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDTElement, 0x3050f1f3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDTElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLDTElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLDTElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLDTElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLDTElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLDTElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLDTElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLDTElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLDTElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_noWrap)(
        IHTMLDTElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_noWrap)(
        IHTMLDTElement* This,
        VARIANT_BOOL *p);

    END_INTERFACE
} IHTMLDTElementVtbl;
interface IHTMLDTElement {
    CONST_VTBL IHTMLDTElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDTElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDTElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDTElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDTElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDTElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDTElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDTElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDTElement methods ***/
#define IHTMLDTElement_put_noWrap(This,v) (This)->lpVtbl->put_noWrap(This,v)
#define IHTMLDTElement_get_noWrap(This,p) (This)->lpVtbl->get_noWrap(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDTElement_QueryInterface(IHTMLDTElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDTElement_AddRef(IHTMLDTElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDTElement_Release(IHTMLDTElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDTElement_GetTypeInfoCount(IHTMLDTElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDTElement_GetTypeInfo(IHTMLDTElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDTElement_GetIDsOfNames(IHTMLDTElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDTElement_Invoke(IHTMLDTElement* 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);
}
/*** IHTMLDTElement methods ***/
static FORCEINLINE HRESULT IHTMLDTElement_put_noWrap(IHTMLDTElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_noWrap(This,v);
}
static FORCEINLINE HRESULT IHTMLDTElement_get_noWrap(IHTMLDTElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_noWrap(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDTElement_put_noWrap_Proxy(
    IHTMLDTElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLDTElement_put_noWrap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDTElement_get_noWrap_Proxy(
    IHTMLDTElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLDTElement_get_noWrap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDTElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLDTElement dispinterface
 */
#ifndef __DispHTMLDTElement_DISPINTERFACE_DEFINED__
#define __DispHTMLDTElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLDTElement, 0x3050f50d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f50d-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLDTElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLDTElement, 0x3050f50d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLDTElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLDTElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLDTElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLDTElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLDTElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLDTElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLDTElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLDTElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLDTElementVtbl;
interface DispHTMLDTElement {
    CONST_VTBL DispHTMLDTElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLDTElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLDTElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLDTElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLDTElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLDTElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLDTElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLDTElement_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 DispHTMLDTElement_QueryInterface(DispHTMLDTElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLDTElement_AddRef(DispHTMLDTElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLDTElement_Release(DispHTMLDTElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLDTElement_GetTypeInfoCount(DispHTMLDTElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLDTElement_GetTypeInfo(DispHTMLDTElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLDTElement_GetIDsOfNames(DispHTMLDTElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLDTElement_Invoke(DispHTMLDTElement* 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  /* __DispHTMLDTElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLDTElement coclass
 */

DEFINE_GUID(CLSID_HTMLDTElement, 0x3050f27c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f27c-98b5-11cf-bb82-00aa00bdce0b") HTMLDTElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLDTElement, 0x3050f27c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDTElement;
/*****************************************************************************
 * IHTMLBRElement interface
 */
#ifndef __IHTMLBRElement_INTERFACE_DEFINED__
#define __IHTMLBRElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLBRElement, 0x3050f1f0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f1f0-98b5-11cf-bb82-00aa00bdce0b")
IHTMLBRElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_clear(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clear(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLBRElement, 0x3050f1f0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLBRElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLBRElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLBRElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLBRElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLBRElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLBRElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLBRElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLBRElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLBRElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_clear)(
        IHTMLBRElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_clear)(
        IHTMLBRElement* This,
        BSTR *p);

    END_INTERFACE
} IHTMLBRElementVtbl;
interface IHTMLBRElement {
    CONST_VTBL IHTMLBRElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLBRElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLBRElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLBRElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLBRElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLBRElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLBRElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLBRElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLBRElement methods ***/
#define IHTMLBRElement_put_clear(This,v) (This)->lpVtbl->put_clear(This,v)
#define IHTMLBRElement_get_clear(This,p) (This)->lpVtbl->get_clear(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLBRElement_QueryInterface(IHTMLBRElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLBRElement_AddRef(IHTMLBRElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLBRElement_Release(IHTMLBRElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLBRElement_GetTypeInfoCount(IHTMLBRElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLBRElement_GetTypeInfo(IHTMLBRElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLBRElement_GetIDsOfNames(IHTMLBRElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLBRElement_Invoke(IHTMLBRElement* 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);
}
/*** IHTMLBRElement methods ***/
static FORCEINLINE HRESULT IHTMLBRElement_put_clear(IHTMLBRElement* This,BSTR v) {
    return This->lpVtbl->put_clear(This,v);
}
static FORCEINLINE HRESULT IHTMLBRElement_get_clear(IHTMLBRElement* This,BSTR *p) {
    return This->lpVtbl->get_clear(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLBRElement_put_clear_Proxy(
    IHTMLBRElement* This,
    BSTR v);
void __RPC_STUB IHTMLBRElement_put_clear_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBRElement_get_clear_Proxy(
    IHTMLBRElement* This,
    BSTR *p);
void __RPC_STUB IHTMLBRElement_get_clear_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLBRElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLBRElement dispinterface
 */
#ifndef __DispHTMLBRElement_DISPINTERFACE_DEFINED__
#define __DispHTMLBRElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLBRElement, 0x3050f53a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f53a-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLBRElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLBRElement, 0x3050f53a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLBRElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLBRElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLBRElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLBRElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLBRElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLBRElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLBRElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLBRElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLBRElementVtbl;
interface DispHTMLBRElement {
    CONST_VTBL DispHTMLBRElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLBRElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLBRElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLBRElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLBRElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLBRElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLBRElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLBRElement_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 DispHTMLBRElement_QueryInterface(DispHTMLBRElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLBRElement_AddRef(DispHTMLBRElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLBRElement_Release(DispHTMLBRElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLBRElement_GetTypeInfoCount(DispHTMLBRElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLBRElement_GetTypeInfo(DispHTMLBRElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLBRElement_GetIDsOfNames(DispHTMLBRElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLBRElement_Invoke(DispHTMLBRElement* 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  /* __DispHTMLBRElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLBRElement coclass
 */

DEFINE_GUID(CLSID_HTMLBRElement, 0x3050f280, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f280-98b5-11cf-bb82-00aa00bdce0b") HTMLBRElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLBRElement, 0x3050f280, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CBRElement;
/*****************************************************************************
 * IHTMLDListElement interface
 */
#ifndef __IHTMLDListElement_INTERFACE_DEFINED__
#define __IHTMLDListElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDListElement, 0x3050f1f1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f1f1-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDListElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_compact(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_compact(
        VARIANT_BOOL *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDListElement, 0x3050f1f1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDListElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLDListElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLDListElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLDListElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLDListElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLDListElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLDListElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLDListElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLDListElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_compact)(
        IHTMLDListElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_compact)(
        IHTMLDListElement* This,
        VARIANT_BOOL *p);

    END_INTERFACE
} IHTMLDListElementVtbl;
interface IHTMLDListElement {
    CONST_VTBL IHTMLDListElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDListElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDListElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDListElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDListElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDListElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDListElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDListElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDListElement methods ***/
#define IHTMLDListElement_put_compact(This,v) (This)->lpVtbl->put_compact(This,v)
#define IHTMLDListElement_get_compact(This,p) (This)->lpVtbl->get_compact(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDListElement_QueryInterface(IHTMLDListElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDListElement_AddRef(IHTMLDListElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDListElement_Release(IHTMLDListElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDListElement_GetTypeInfoCount(IHTMLDListElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDListElement_GetTypeInfo(IHTMLDListElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDListElement_GetIDsOfNames(IHTMLDListElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDListElement_Invoke(IHTMLDListElement* 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);
}
/*** IHTMLDListElement methods ***/
static FORCEINLINE HRESULT IHTMLDListElement_put_compact(IHTMLDListElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_compact(This,v);
}
static FORCEINLINE HRESULT IHTMLDListElement_get_compact(IHTMLDListElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_compact(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDListElement_put_compact_Proxy(
    IHTMLDListElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLDListElement_put_compact_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDListElement_get_compact_Proxy(
    IHTMLDListElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLDListElement_get_compact_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDListElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLDListElement dispinterface
 */
#ifndef __DispHTMLDListElement_DISPINTERFACE_DEFINED__
#define __DispHTMLDListElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLDListElement, 0x3050f53b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f53b-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLDListElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLDListElement, 0x3050f53b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLDListElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLDListElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLDListElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLDListElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLDListElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLDListElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLDListElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLDListElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLDListElementVtbl;
interface DispHTMLDListElement {
    CONST_VTBL DispHTMLDListElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLDListElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLDListElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLDListElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLDListElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLDListElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLDListElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLDListElement_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 DispHTMLDListElement_QueryInterface(DispHTMLDListElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLDListElement_AddRef(DispHTMLDListElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLDListElement_Release(DispHTMLDListElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLDListElement_GetTypeInfoCount(DispHTMLDListElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLDListElement_GetTypeInfo(DispHTMLDListElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLDListElement_GetIDsOfNames(DispHTMLDListElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLDListElement_Invoke(DispHTMLDListElement* 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  /* __DispHTMLDListElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLDListElement coclass
 */

DEFINE_GUID(CLSID_HTMLDListElement, 0x3050f27d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f27d-98b5-11cf-bb82-00aa00bdce0b") HTMLDListElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLDListElement, 0x3050f27d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDListElement;
/*****************************************************************************
 * IHTMLHRElement interface
 */
#ifndef __IHTMLHRElement_INTERFACE_DEFINED__
#define __IHTMLHRElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLHRElement, 0x3050f1f4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f1f4-98b5-11cf-bb82-00aa00bdce0b")
IHTMLHRElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_align(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_align(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_color(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_color(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_noShade(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_noShade(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_width(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_width(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_size(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_size(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLHRElement, 0x3050f1f4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLHRElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLHRElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLHRElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLHRElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLHRElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLHRElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLHRElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLHRElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLHRElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_align)(
        IHTMLHRElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_align)(
        IHTMLHRElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_color)(
        IHTMLHRElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_color)(
        IHTMLHRElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_noShade)(
        IHTMLHRElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_noShade)(
        IHTMLHRElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_width)(
        IHTMLHRElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_width)(
        IHTMLHRElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_size)(
        IHTMLHRElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_size)(
        IHTMLHRElement* This,
        VARIANT *p);

    END_INTERFACE
} IHTMLHRElementVtbl;
interface IHTMLHRElement {
    CONST_VTBL IHTMLHRElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLHRElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLHRElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLHRElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLHRElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLHRElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLHRElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLHRElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLHRElement methods ***/
#define IHTMLHRElement_put_align(This,v) (This)->lpVtbl->put_align(This,v)
#define IHTMLHRElement_get_align(This,p) (This)->lpVtbl->get_align(This,p)
#define IHTMLHRElement_put_color(This,v) (This)->lpVtbl->put_color(This,v)
#define IHTMLHRElement_get_color(This,p) (This)->lpVtbl->get_color(This,p)
#define IHTMLHRElement_put_noShade(This,v) (This)->lpVtbl->put_noShade(This,v)
#define IHTMLHRElement_get_noShade(This,p) (This)->lpVtbl->get_noShade(This,p)
#define IHTMLHRElement_put_width(This,v) (This)->lpVtbl->put_width(This,v)
#define IHTMLHRElement_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#define IHTMLHRElement_put_size(This,v) (This)->lpVtbl->put_size(This,v)
#define IHTMLHRElement_get_size(This,p) (This)->lpVtbl->get_size(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLHRElement_QueryInterface(IHTMLHRElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLHRElement_AddRef(IHTMLHRElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLHRElement_Release(IHTMLHRElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLHRElement_GetTypeInfoCount(IHTMLHRElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLHRElement_GetTypeInfo(IHTMLHRElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLHRElement_GetIDsOfNames(IHTMLHRElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLHRElement_Invoke(IHTMLHRElement* 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);
}
/*** IHTMLHRElement methods ***/
static FORCEINLINE HRESULT IHTMLHRElement_put_align(IHTMLHRElement* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static FORCEINLINE HRESULT IHTMLHRElement_get_align(IHTMLHRElement* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
static FORCEINLINE HRESULT IHTMLHRElement_put_color(IHTMLHRElement* This,VARIANT v) {
    return This->lpVtbl->put_color(This,v);
}
static FORCEINLINE HRESULT IHTMLHRElement_get_color(IHTMLHRElement* This,VARIANT *p) {
    return This->lpVtbl->get_color(This,p);
}
static FORCEINLINE HRESULT IHTMLHRElement_put_noShade(IHTMLHRElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_noShade(This,v);
}
static FORCEINLINE HRESULT IHTMLHRElement_get_noShade(IHTMLHRElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_noShade(This,p);
}
static FORCEINLINE HRESULT IHTMLHRElement_put_width(IHTMLHRElement* This,VARIANT v) {
    return This->lpVtbl->put_width(This,v);
}
static FORCEINLINE HRESULT IHTMLHRElement_get_width(IHTMLHRElement* This,VARIANT *p) {
    return This->lpVtbl->get_width(This,p);
}
static FORCEINLINE HRESULT IHTMLHRElement_put_size(IHTMLHRElement* This,VARIANT v) {
    return This->lpVtbl->put_size(This,v);
}
static FORCEINLINE HRESULT IHTMLHRElement_get_size(IHTMLHRElement* This,VARIANT *p) {
    return This->lpVtbl->get_size(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLHRElement_put_align_Proxy(
    IHTMLHRElement* This,
    BSTR v);
void __RPC_STUB IHTMLHRElement_put_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLHRElement_get_align_Proxy(
    IHTMLHRElement* This,
    BSTR *p);
void __RPC_STUB IHTMLHRElement_get_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLHRElement_put_color_Proxy(
    IHTMLHRElement* This,
    VARIANT v);
void __RPC_STUB IHTMLHRElement_put_color_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLHRElement_get_color_Proxy(
    IHTMLHRElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLHRElement_get_color_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLHRElement_put_noShade_Proxy(
    IHTMLHRElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLHRElement_put_noShade_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLHRElement_get_noShade_Proxy(
    IHTMLHRElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLHRElement_get_noShade_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLHRElement_put_width_Proxy(
    IHTMLHRElement* This,
    VARIANT v);
void __RPC_STUB IHTMLHRElement_put_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLHRElement_get_width_Proxy(
    IHTMLHRElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLHRElement_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLHRElement_put_size_Proxy(
    IHTMLHRElement* This,
    VARIANT v);
void __RPC_STUB IHTMLHRElement_put_size_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLHRElement_get_size_Proxy(
    IHTMLHRElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLHRElement_get_size_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLHRElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLHRElement dispinterface
 */
#ifndef __DispHTMLHRElement_DISPINTERFACE_DEFINED__
#define __DispHTMLHRElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLHRElement, 0x3050f53d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f53d-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLHRElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLHRElement, 0x3050f53d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLHRElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLHRElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLHRElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLHRElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLHRElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLHRElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLHRElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLHRElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLHRElementVtbl;
interface DispHTMLHRElement {
    CONST_VTBL DispHTMLHRElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLHRElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLHRElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLHRElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLHRElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLHRElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLHRElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLHRElement_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 DispHTMLHRElement_QueryInterface(DispHTMLHRElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLHRElement_AddRef(DispHTMLHRElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLHRElement_Release(DispHTMLHRElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLHRElement_GetTypeInfoCount(DispHTMLHRElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLHRElement_GetTypeInfo(DispHTMLHRElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLHRElement_GetIDsOfNames(DispHTMLHRElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLHRElement_Invoke(DispHTMLHRElement* 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  /* __DispHTMLHRElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLHRElement coclass
 */

DEFINE_GUID(CLSID_HTMLHRElement, 0x3050f252, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f252-98b5-11cf-bb82-00aa00bdce0b") HTMLHRElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLHRElement, 0x3050f252, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CHRElement;
/*****************************************************************************
 * IHTMLParaElement interface
 */
#ifndef __IHTMLParaElement_INTERFACE_DEFINED__
#define __IHTMLParaElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLParaElement, 0x3050f1f5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f1f5-98b5-11cf-bb82-00aa00bdce0b")
IHTMLParaElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_align(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_align(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLParaElement, 0x3050f1f5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLParaElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLParaElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLParaElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLParaElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLParaElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLParaElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLParaElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLParaElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLParaElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_align)(
        IHTMLParaElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_align)(
        IHTMLParaElement* This,
        BSTR *p);

    END_INTERFACE
} IHTMLParaElementVtbl;
interface IHTMLParaElement {
    CONST_VTBL IHTMLParaElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLParaElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLParaElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLParaElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLParaElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLParaElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLParaElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLParaElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLParaElement methods ***/
#define IHTMLParaElement_put_align(This,v) (This)->lpVtbl->put_align(This,v)
#define IHTMLParaElement_get_align(This,p) (This)->lpVtbl->get_align(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLParaElement_QueryInterface(IHTMLParaElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLParaElement_AddRef(IHTMLParaElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLParaElement_Release(IHTMLParaElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLParaElement_GetTypeInfoCount(IHTMLParaElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLParaElement_GetTypeInfo(IHTMLParaElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLParaElement_GetIDsOfNames(IHTMLParaElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLParaElement_Invoke(IHTMLParaElement* 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);
}
/*** IHTMLParaElement methods ***/
static FORCEINLINE HRESULT IHTMLParaElement_put_align(IHTMLParaElement* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static FORCEINLINE HRESULT IHTMLParaElement_get_align(IHTMLParaElement* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLParaElement_put_align_Proxy(
    IHTMLParaElement* This,
    BSTR v);
void __RPC_STUB IHTMLParaElement_put_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLParaElement_get_align_Proxy(
    IHTMLParaElement* This,
    BSTR *p);
void __RPC_STUB IHTMLParaElement_get_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLParaElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLParaElement dispinterface
 */
#ifndef __DispHTMLParaElement_DISPINTERFACE_DEFINED__
#define __DispHTMLParaElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLParaElement, 0x3050f52c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f52c-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLParaElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLParaElement, 0x3050f52c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLParaElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLParaElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLParaElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLParaElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLParaElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLParaElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLParaElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLParaElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLParaElementVtbl;
interface DispHTMLParaElement {
    CONST_VTBL DispHTMLParaElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLParaElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLParaElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLParaElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLParaElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLParaElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLParaElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLParaElement_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 DispHTMLParaElement_QueryInterface(DispHTMLParaElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLParaElement_AddRef(DispHTMLParaElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLParaElement_Release(DispHTMLParaElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLParaElement_GetTypeInfoCount(DispHTMLParaElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLParaElement_GetTypeInfo(DispHTMLParaElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLParaElement_GetIDsOfNames(DispHTMLParaElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLParaElement_Invoke(DispHTMLParaElement* 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  /* __DispHTMLParaElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLParaElement coclass
 */

DEFINE_GUID(CLSID_HTMLParaElement, 0x3050f26f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f26f-98b5-11cf-bb82-00aa00bdce0b") HTMLParaElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLParaElement, 0x3050f26f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CParaElement;
/*****************************************************************************
 * IHTMLElementCollection interface
 */
#ifndef __IHTMLElementCollection_INTERFACE_DEFINED__
#define __IHTMLElementCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLElementCollection, 0x3050f21f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f21f-98b5-11cf-bb82-00aa00bdce0b")
IHTMLElementCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE toString(
        BSTR *String) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_length(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__newEnum(
        IUnknown **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE item(
        VARIANT name,
        VARIANT index,
        IDispatch **pdisp) = 0;

    virtual HRESULT STDMETHODCALLTYPE tags(
        VARIANT tagName,
        IDispatch **pdisp) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLElementCollection, 0x3050f21f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLElementCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLElementCollection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLElementCollection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLElementCollection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLElementCollection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLElementCollection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLElementCollection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLElementCollection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLElementCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *toString)(
        IHTMLElementCollection* This,
        BSTR *String);

    HRESULT (STDMETHODCALLTYPE *put_length)(
        IHTMLElementCollection* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLElementCollection* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get__newEnum)(
        IHTMLElementCollection* This,
        IUnknown **p);

    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLElementCollection* This,
        VARIANT name,
        VARIANT index,
        IDispatch **pdisp);

    HRESULT (STDMETHODCALLTYPE *tags)(
        IHTMLElementCollection* This,
        VARIANT tagName,
        IDispatch **pdisp);

    END_INTERFACE
} IHTMLElementCollectionVtbl;
interface IHTMLElementCollection {
    CONST_VTBL IHTMLElementCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLElementCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLElementCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLElementCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLElementCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLElementCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLElementCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLElementCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLElementCollection methods ***/
#define IHTMLElementCollection_toString(This,String) (This)->lpVtbl->toString(This,String)
#define IHTMLElementCollection_put_length(This,v) (This)->lpVtbl->put_length(This,v)
#define IHTMLElementCollection_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLElementCollection_get__newEnum(This,p) (This)->lpVtbl->get__newEnum(This,p)
#define IHTMLElementCollection_item(This,name,index,pdisp) (This)->lpVtbl->item(This,name,index,pdisp)
#define IHTMLElementCollection_tags(This,tagName,pdisp) (This)->lpVtbl->tags(This,tagName,pdisp)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLElementCollection_QueryInterface(IHTMLElementCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLElementCollection_AddRef(IHTMLElementCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLElementCollection_Release(IHTMLElementCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLElementCollection_GetTypeInfoCount(IHTMLElementCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLElementCollection_GetTypeInfo(IHTMLElementCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLElementCollection_GetIDsOfNames(IHTMLElementCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLElementCollection_Invoke(IHTMLElementCollection* 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);
}
/*** IHTMLElementCollection methods ***/
static FORCEINLINE HRESULT IHTMLElementCollection_toString(IHTMLElementCollection* This,BSTR *String) {
    return This->lpVtbl->toString(This,String);
}
static FORCEINLINE HRESULT IHTMLElementCollection_put_length(IHTMLElementCollection* This,LONG v) {
    return This->lpVtbl->put_length(This,v);
}
static FORCEINLINE HRESULT IHTMLElementCollection_get_length(IHTMLElementCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IHTMLElementCollection_get__newEnum(IHTMLElementCollection* This,IUnknown **p) {
    return This->lpVtbl->get__newEnum(This,p);
}
static FORCEINLINE HRESULT IHTMLElementCollection_item(IHTMLElementCollection* This,VARIANT name,VARIANT index,IDispatch **pdisp) {
    return This->lpVtbl->item(This,name,index,pdisp);
}
static FORCEINLINE HRESULT IHTMLElementCollection_tags(IHTMLElementCollection* This,VARIANT tagName,IDispatch **pdisp) {
    return This->lpVtbl->tags(This,tagName,pdisp);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLElementCollection_toString_Proxy(
    IHTMLElementCollection* This,
    BSTR *String);
void __RPC_STUB IHTMLElementCollection_toString_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElementCollection_put_length_Proxy(
    IHTMLElementCollection* This,
    LONG v);
void __RPC_STUB IHTMLElementCollection_put_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElementCollection_get_length_Proxy(
    IHTMLElementCollection* This,
    LONG *p);
void __RPC_STUB IHTMLElementCollection_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElementCollection_get__newEnum_Proxy(
    IHTMLElementCollection* This,
    IUnknown **p);
void __RPC_STUB IHTMLElementCollection_get__newEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElementCollection_item_Proxy(
    IHTMLElementCollection* This,
    VARIANT name,
    VARIANT index,
    IDispatch **pdisp);
void __RPC_STUB IHTMLElementCollection_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElementCollection_tags_Proxy(
    IHTMLElementCollection* This,
    VARIANT tagName,
    IDispatch **pdisp);
void __RPC_STUB IHTMLElementCollection_tags_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLElementCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLElementCollection2 interface
 */
#ifndef __IHTMLElementCollection2_INTERFACE_DEFINED__
#define __IHTMLElementCollection2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLElementCollection2, 0x3050f5ee, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f5ee-98b5-11cf-bb82-00aa00bdce0b")
IHTMLElementCollection2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE urns(
        VARIANT urn,
        IDispatch **pdisp) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLElementCollection2, 0x3050f5ee, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLElementCollection2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLElementCollection2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLElementCollection2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLElementCollection2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLElementCollection2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLElementCollection2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLElementCollection2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLElementCollection2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLElementCollection2 methods ***/
    HRESULT (STDMETHODCALLTYPE *urns)(
        IHTMLElementCollection2* This,
        VARIANT urn,
        IDispatch **pdisp);

    END_INTERFACE
} IHTMLElementCollection2Vtbl;
interface IHTMLElementCollection2 {
    CONST_VTBL IHTMLElementCollection2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLElementCollection2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLElementCollection2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLElementCollection2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLElementCollection2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLElementCollection2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLElementCollection2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLElementCollection2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLElementCollection2 methods ***/
#define IHTMLElementCollection2_urns(This,urn,pdisp) (This)->lpVtbl->urns(This,urn,pdisp)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLElementCollection2_QueryInterface(IHTMLElementCollection2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLElementCollection2_AddRef(IHTMLElementCollection2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLElementCollection2_Release(IHTMLElementCollection2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLElementCollection2_GetTypeInfoCount(IHTMLElementCollection2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLElementCollection2_GetTypeInfo(IHTMLElementCollection2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLElementCollection2_GetIDsOfNames(IHTMLElementCollection2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLElementCollection2_Invoke(IHTMLElementCollection2* 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);
}
/*** IHTMLElementCollection2 methods ***/
static FORCEINLINE HRESULT IHTMLElementCollection2_urns(IHTMLElementCollection2* This,VARIANT urn,IDispatch **pdisp) {
    return This->lpVtbl->urns(This,urn,pdisp);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLElementCollection2_urns_Proxy(
    IHTMLElementCollection2* This,
    VARIANT urn,
    IDispatch **pdisp);
void __RPC_STUB IHTMLElementCollection2_urns_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLElementCollection2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLElementCollection3 interface
 */
#ifndef __IHTMLElementCollection3_INTERFACE_DEFINED__
#define __IHTMLElementCollection3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLElementCollection3, 0x3050f835, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f835-98b5-11cf-bb82-00aa00bdce0b")
IHTMLElementCollection3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE namedItem(
        BSTR name,
        IDispatch **pdisp) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLElementCollection3, 0x3050f835, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLElementCollection3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLElementCollection3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLElementCollection3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLElementCollection3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLElementCollection3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLElementCollection3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLElementCollection3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLElementCollection3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLElementCollection3 methods ***/
    HRESULT (STDMETHODCALLTYPE *namedItem)(
        IHTMLElementCollection3* This,
        BSTR name,
        IDispatch **pdisp);

    END_INTERFACE
} IHTMLElementCollection3Vtbl;
interface IHTMLElementCollection3 {
    CONST_VTBL IHTMLElementCollection3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLElementCollection3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLElementCollection3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLElementCollection3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLElementCollection3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLElementCollection3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLElementCollection3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLElementCollection3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLElementCollection3 methods ***/
#define IHTMLElementCollection3_namedItem(This,name,pdisp) (This)->lpVtbl->namedItem(This,name,pdisp)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLElementCollection3_QueryInterface(IHTMLElementCollection3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLElementCollection3_AddRef(IHTMLElementCollection3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLElementCollection3_Release(IHTMLElementCollection3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLElementCollection3_GetTypeInfoCount(IHTMLElementCollection3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLElementCollection3_GetTypeInfo(IHTMLElementCollection3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLElementCollection3_GetIDsOfNames(IHTMLElementCollection3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLElementCollection3_Invoke(IHTMLElementCollection3* 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);
}
/*** IHTMLElementCollection3 methods ***/
static FORCEINLINE HRESULT IHTMLElementCollection3_namedItem(IHTMLElementCollection3* This,BSTR name,IDispatch **pdisp) {
    return This->lpVtbl->namedItem(This,name,pdisp);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLElementCollection3_namedItem_Proxy(
    IHTMLElementCollection3* This,
    BSTR name,
    IDispatch **pdisp);
void __RPC_STUB IHTMLElementCollection3_namedItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLElementCollection3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLElementCollection4 interface
 */
#ifndef __IHTMLElementCollection4_INTERFACE_DEFINED__
#define __IHTMLElementCollection4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLElementCollection4, 0x30510425, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510425-98b5-11cf-bb82-00aa00bdce0b")
IHTMLElementCollection4 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE item(
        LONG index,
        IHTMLElement2 **pNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE namedItem(
        BSTR name,
        IHTMLElement2 **pNode) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLElementCollection4, 0x30510425, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLElementCollection4Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLElementCollection4* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLElementCollection4* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLElementCollection4* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLElementCollection4* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLElementCollection4* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLElementCollection4* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLElementCollection4* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLElementCollection4 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLElementCollection4* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLElementCollection4* This,
        LONG index,
        IHTMLElement2 **pNode);

    HRESULT (STDMETHODCALLTYPE *namedItem)(
        IHTMLElementCollection4* This,
        BSTR name,
        IHTMLElement2 **pNode);

    END_INTERFACE
} IHTMLElementCollection4Vtbl;
interface IHTMLElementCollection4 {
    CONST_VTBL IHTMLElementCollection4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLElementCollection4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLElementCollection4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLElementCollection4_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLElementCollection4_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLElementCollection4_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLElementCollection4_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLElementCollection4_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLElementCollection4 methods ***/
#define IHTMLElementCollection4_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLElementCollection4_item(This,index,pNode) (This)->lpVtbl->item(This,index,pNode)
#define IHTMLElementCollection4_namedItem(This,name,pNode) (This)->lpVtbl->namedItem(This,name,pNode)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLElementCollection4_QueryInterface(IHTMLElementCollection4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLElementCollection4_AddRef(IHTMLElementCollection4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLElementCollection4_Release(IHTMLElementCollection4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLElementCollection4_GetTypeInfoCount(IHTMLElementCollection4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLElementCollection4_GetTypeInfo(IHTMLElementCollection4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLElementCollection4_GetIDsOfNames(IHTMLElementCollection4* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLElementCollection4_Invoke(IHTMLElementCollection4* 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);
}
/*** IHTMLElementCollection4 methods ***/
static FORCEINLINE HRESULT IHTMLElementCollection4_get_length(IHTMLElementCollection4* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IHTMLElementCollection4_item(IHTMLElementCollection4* This,LONG index,IHTMLElement2 **pNode) {
    return This->lpVtbl->item(This,index,pNode);
}
static FORCEINLINE HRESULT IHTMLElementCollection4_namedItem(IHTMLElementCollection4* This,BSTR name,IHTMLElement2 **pNode) {
    return This->lpVtbl->namedItem(This,name,pNode);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLElementCollection4_get_length_Proxy(
    IHTMLElementCollection4* This,
    LONG *p);
void __RPC_STUB IHTMLElementCollection4_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElementCollection4_item_Proxy(
    IHTMLElementCollection4* This,
    LONG index,
    IHTMLElement2 **pNode);
void __RPC_STUB IHTMLElementCollection4_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLElementCollection4_namedItem_Proxy(
    IHTMLElementCollection4* This,
    BSTR name,
    IHTMLElement2 **pNode);
void __RPC_STUB IHTMLElementCollection4_namedItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLElementCollection4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLElementCollection dispinterface
 */
#ifndef __DispHTMLElementCollection_DISPINTERFACE_DEFINED__
#define __DispHTMLElementCollection_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLElementCollection, 0x3050f56b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f56b-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLElementCollection : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLElementCollection, 0x3050f56b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLElementCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLElementCollection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLElementCollection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLElementCollection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLElementCollection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLElementCollection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLElementCollection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLElementCollection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLElementCollectionVtbl;
interface DispHTMLElementCollection {
    CONST_VTBL DispHTMLElementCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLElementCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLElementCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLElementCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLElementCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLElementCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLElementCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLElementCollection_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 DispHTMLElementCollection_QueryInterface(DispHTMLElementCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLElementCollection_AddRef(DispHTMLElementCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLElementCollection_Release(DispHTMLElementCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLElementCollection_GetTypeInfoCount(DispHTMLElementCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLElementCollection_GetTypeInfo(DispHTMLElementCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLElementCollection_GetIDsOfNames(DispHTMLElementCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLElementCollection_Invoke(DispHTMLElementCollection* 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  /* __DispHTMLElementCollection_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLElementCollection coclass
 */

DEFINE_GUID(CLSID_HTMLElementCollection, 0x3050f4cb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f4cb-98b5-11cf-bb82-00aa00bdce0b") HTMLElementCollection;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLElementCollection, 0x3050f4cb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CElementCollection;
/*****************************************************************************
 * IHTMLHeaderElement interface
 */
#ifndef __IHTMLHeaderElement_INTERFACE_DEFINED__
#define __IHTMLHeaderElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLHeaderElement, 0x3050f1f6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f1f6-98b5-11cf-bb82-00aa00bdce0b")
IHTMLHeaderElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_align(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_align(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLHeaderElement, 0x3050f1f6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLHeaderElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLHeaderElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLHeaderElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLHeaderElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLHeaderElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLHeaderElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLHeaderElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLHeaderElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLHeaderElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_align)(
        IHTMLHeaderElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_align)(
        IHTMLHeaderElement* This,
        BSTR *p);

    END_INTERFACE
} IHTMLHeaderElementVtbl;
interface IHTMLHeaderElement {
    CONST_VTBL IHTMLHeaderElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLHeaderElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLHeaderElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLHeaderElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLHeaderElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLHeaderElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLHeaderElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLHeaderElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLHeaderElement methods ***/
#define IHTMLHeaderElement_put_align(This,v) (This)->lpVtbl->put_align(This,v)
#define IHTMLHeaderElement_get_align(This,p) (This)->lpVtbl->get_align(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLHeaderElement_QueryInterface(IHTMLHeaderElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLHeaderElement_AddRef(IHTMLHeaderElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLHeaderElement_Release(IHTMLHeaderElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLHeaderElement_GetTypeInfoCount(IHTMLHeaderElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLHeaderElement_GetTypeInfo(IHTMLHeaderElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLHeaderElement_GetIDsOfNames(IHTMLHeaderElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLHeaderElement_Invoke(IHTMLHeaderElement* 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);
}
/*** IHTMLHeaderElement methods ***/
static FORCEINLINE HRESULT IHTMLHeaderElement_put_align(IHTMLHeaderElement* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static FORCEINLINE HRESULT IHTMLHeaderElement_get_align(IHTMLHeaderElement* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLHeaderElement_put_align_Proxy(
    IHTMLHeaderElement* This,
    BSTR v);
void __RPC_STUB IHTMLHeaderElement_put_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLHeaderElement_get_align_Proxy(
    IHTMLHeaderElement* This,
    BSTR *p);
void __RPC_STUB IHTMLHeaderElement_get_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLHeaderElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLHeaderElement dispinterface
 */
#ifndef __DispHTMLHeaderElement_DISPINTERFACE_DEFINED__
#define __DispHTMLHeaderElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLHeaderElement, 0x3050f515, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f515-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLHeaderElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLHeaderElement, 0x3050f515, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLHeaderElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLHeaderElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLHeaderElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLHeaderElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLHeaderElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLHeaderElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLHeaderElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLHeaderElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLHeaderElementVtbl;
interface DispHTMLHeaderElement {
    CONST_VTBL DispHTMLHeaderElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLHeaderElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLHeaderElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLHeaderElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLHeaderElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLHeaderElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLHeaderElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLHeaderElement_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 DispHTMLHeaderElement_QueryInterface(DispHTMLHeaderElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLHeaderElement_AddRef(DispHTMLHeaderElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLHeaderElement_Release(DispHTMLHeaderElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLHeaderElement_GetTypeInfoCount(DispHTMLHeaderElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLHeaderElement_GetTypeInfo(DispHTMLHeaderElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLHeaderElement_GetIDsOfNames(DispHTMLHeaderElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLHeaderElement_Invoke(DispHTMLHeaderElement* 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  /* __DispHTMLHeaderElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLHeaderElement coclass
 */

DEFINE_GUID(CLSID_HTMLHeaderElement, 0x3050f27a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f27a-98b5-11cf-bb82-00aa00bdce0b") HTMLHeaderElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLHeaderElement, 0x3050f27a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CHeaderElement;
/*****************************************************************************
 * HTMLSelectElementEvents2 dispinterface
 */
#ifndef __HTMLSelectElementEvents2_DISPINTERFACE_DEFINED__
#define __HTMLSelectElementEvents2_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLSelectElementEvents2, 0x3050f622, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f622-98b5-11cf-bb82-00aa00bdce0b")
HTMLSelectElementEvents2 : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLSelectElementEvents2, 0x3050f622, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLSelectElementEvents2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLSelectElementEvents2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLSelectElementEvents2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLSelectElementEvents2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLSelectElementEvents2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLSelectElementEvents2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLSelectElementEvents2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLSelectElementEvents2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLSelectElementEvents2Vtbl;
interface HTMLSelectElementEvents2 {
    CONST_VTBL HTMLSelectElementEvents2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLSelectElementEvents2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLSelectElementEvents2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLSelectElementEvents2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLSelectElementEvents2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLSelectElementEvents2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLSelectElementEvents2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLSelectElementEvents2_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 HTMLSelectElementEvents2_QueryInterface(HTMLSelectElementEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLSelectElementEvents2_AddRef(HTMLSelectElementEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLSelectElementEvents2_Release(HTMLSelectElementEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLSelectElementEvents2_GetTypeInfoCount(HTMLSelectElementEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLSelectElementEvents2_GetTypeInfo(HTMLSelectElementEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLSelectElementEvents2_GetIDsOfNames(HTMLSelectElementEvents2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLSelectElementEvents2_Invoke(HTMLSelectElementEvents2* 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  /* __HTMLSelectElementEvents2_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLSelectElementEvents dispinterface
 */
#ifndef __HTMLSelectElementEvents_DISPINTERFACE_DEFINED__
#define __HTMLSelectElementEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLSelectElementEvents, 0x3050f302, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f302-98b5-11cf-bb82-00aa00bdce0b")
HTMLSelectElementEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLSelectElementEvents, 0x3050f302, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLSelectElementEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLSelectElementEvents* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLSelectElementEvents* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLSelectElementEvents* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLSelectElementEvents* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLSelectElementEvents* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLSelectElementEvents* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLSelectElementEvents* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLSelectElementEventsVtbl;
interface HTMLSelectElementEvents {
    CONST_VTBL HTMLSelectElementEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLSelectElementEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLSelectElementEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLSelectElementEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLSelectElementEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLSelectElementEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLSelectElementEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLSelectElementEvents_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 HTMLSelectElementEvents_QueryInterface(HTMLSelectElementEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLSelectElementEvents_AddRef(HTMLSelectElementEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLSelectElementEvents_Release(HTMLSelectElementEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLSelectElementEvents_GetTypeInfoCount(HTMLSelectElementEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLSelectElementEvents_GetTypeInfo(HTMLSelectElementEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLSelectElementEvents_GetIDsOfNames(HTMLSelectElementEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLSelectElementEvents_Invoke(HTMLSelectElementEvents* 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  /* __HTMLSelectElementEvents_DISPINTERFACE_DEFINED__ */

typedef enum _htmlSelectType {
    htmlSelectTypeSelectOne = 1,
    htmlSelectTypeSelectMultiple = 2,
    htmlSelectType_Max = 0x7fffffff
} htmlSelectType;
typedef enum _htmlSelectExFlag {
    htmlSelectExFlagNone = 0,
    htmlSelectExFlagHideSelectionInDesign = 0x1,
    htmlSelectExFlag_Max = 0x7fffffff
} htmlSelectExFlag;
#ifndef __IHTMLOptionElement_FWD_DEFINED__
#define __IHTMLOptionElement_FWD_DEFINED__
typedef interface IHTMLOptionElement IHTMLOptionElement;
#endif

/*****************************************************************************
 * IHTMLSelectElementEx interface
 */
#ifndef __IHTMLSelectElementEx_INTERFACE_DEFINED__
#define __IHTMLSelectElementEx_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLSelectElementEx, 0x3050f2d1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f2d1-98b5-11cf-bb82-00aa00bdce0b")
IHTMLSelectElementEx : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ShowDropdown(
        WINBOOL fShow) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSelectExFlags(
        DWORD lFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSelectExFlags(
        DWORD *pFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDropdownOpen(
        WINBOOL *pfOpen) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLSelectElementEx, 0x3050f2d1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLSelectElementExVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLSelectElementEx* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLSelectElementEx* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLSelectElementEx* This);

    /*** IHTMLSelectElementEx methods ***/
    HRESULT (STDMETHODCALLTYPE *ShowDropdown)(
        IHTMLSelectElementEx* This,
        WINBOOL fShow);

    HRESULT (STDMETHODCALLTYPE *SetSelectExFlags)(
        IHTMLSelectElementEx* This,
        DWORD lFlags);

    HRESULT (STDMETHODCALLTYPE *GetSelectExFlags)(
        IHTMLSelectElementEx* This,
        DWORD *pFlags);

    HRESULT (STDMETHODCALLTYPE *GetDropdownOpen)(
        IHTMLSelectElementEx* This,
        WINBOOL *pfOpen);

    END_INTERFACE
} IHTMLSelectElementExVtbl;
interface IHTMLSelectElementEx {
    CONST_VTBL IHTMLSelectElementExVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLSelectElementEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLSelectElementEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLSelectElementEx_Release(This) (This)->lpVtbl->Release(This)
/*** IHTMLSelectElementEx methods ***/
#define IHTMLSelectElementEx_ShowDropdown(This,fShow) (This)->lpVtbl->ShowDropdown(This,fShow)
#define IHTMLSelectElementEx_SetSelectExFlags(This,lFlags) (This)->lpVtbl->SetSelectExFlags(This,lFlags)
#define IHTMLSelectElementEx_GetSelectExFlags(This,pFlags) (This)->lpVtbl->GetSelectExFlags(This,pFlags)
#define IHTMLSelectElementEx_GetDropdownOpen(This,pfOpen) (This)->lpVtbl->GetDropdownOpen(This,pfOpen)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLSelectElementEx_QueryInterface(IHTMLSelectElementEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLSelectElementEx_AddRef(IHTMLSelectElementEx* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLSelectElementEx_Release(IHTMLSelectElementEx* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLSelectElementEx methods ***/
static FORCEINLINE HRESULT IHTMLSelectElementEx_ShowDropdown(IHTMLSelectElementEx* This,WINBOOL fShow) {
    return This->lpVtbl->ShowDropdown(This,fShow);
}
static FORCEINLINE HRESULT IHTMLSelectElementEx_SetSelectExFlags(IHTMLSelectElementEx* This,DWORD lFlags) {
    return This->lpVtbl->SetSelectExFlags(This,lFlags);
}
static FORCEINLINE HRESULT IHTMLSelectElementEx_GetSelectExFlags(IHTMLSelectElementEx* This,DWORD *pFlags) {
    return This->lpVtbl->GetSelectExFlags(This,pFlags);
}
static FORCEINLINE HRESULT IHTMLSelectElementEx_GetDropdownOpen(IHTMLSelectElementEx* This,WINBOOL *pfOpen) {
    return This->lpVtbl->GetDropdownOpen(This,pfOpen);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLSelectElementEx_ShowDropdown_Proxy(
    IHTMLSelectElementEx* This,
    WINBOOL fShow);
void __RPC_STUB IHTMLSelectElementEx_ShowDropdown_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectElementEx_SetSelectExFlags_Proxy(
    IHTMLSelectElementEx* This,
    DWORD lFlags);
void __RPC_STUB IHTMLSelectElementEx_SetSelectExFlags_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectElementEx_GetSelectExFlags_Proxy(
    IHTMLSelectElementEx* This,
    DWORD *pFlags);
void __RPC_STUB IHTMLSelectElementEx_GetSelectExFlags_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectElementEx_GetDropdownOpen_Proxy(
    IHTMLSelectElementEx* This,
    WINBOOL *pfOpen);
void __RPC_STUB IHTMLSelectElementEx_GetDropdownOpen_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLSelectElementEx_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLSelectElement interface
 */
#ifndef __IHTMLSelectElement_INTERFACE_DEFINED__
#define __IHTMLSelectElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLSelectElement, 0x3050f244, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f244-98b5-11cf-bb82-00aa00bdce0b")
IHTMLSelectElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_size(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_size(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_multiple(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_multiple(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_name(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_options(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onchange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onchange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_selectedIndex(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_selectedIndex(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_value(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_value(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_disabled(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_disabled(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_form(
        IHTMLFormElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE add(
        IHTMLElement *element,
        VARIANT before) = 0;

    virtual HRESULT STDMETHODCALLTYPE remove(
        LONG index = -1) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_length(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__newEnum(
        IUnknown **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE item(
        VARIANT name,
        VARIANT index,
        IDispatch **pdisp) = 0;

    virtual HRESULT STDMETHODCALLTYPE tags(
        VARIANT tagName,
        IDispatch **pdisp) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLSelectElement, 0x3050f244, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLSelectElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLSelectElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLSelectElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLSelectElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLSelectElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLSelectElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLSelectElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLSelectElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLSelectElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_size)(
        IHTMLSelectElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_size)(
        IHTMLSelectElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_multiple)(
        IHTMLSelectElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_multiple)(
        IHTMLSelectElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_name)(
        IHTMLSelectElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_name)(
        IHTMLSelectElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_options)(
        IHTMLSelectElement* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *put_onchange)(
        IHTMLSelectElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onchange)(
        IHTMLSelectElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_selectedIndex)(
        IHTMLSelectElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_selectedIndex)(
        IHTMLSelectElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLSelectElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_value)(
        IHTMLSelectElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_value)(
        IHTMLSelectElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_disabled)(
        IHTMLSelectElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_disabled)(
        IHTMLSelectElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_form)(
        IHTMLSelectElement* This,
        IHTMLFormElement **p);

    HRESULT (STDMETHODCALLTYPE *add)(
        IHTMLSelectElement* This,
        IHTMLElement *element,
        VARIANT before);

    HRESULT (STDMETHODCALLTYPE *remove)(
        IHTMLSelectElement* This,
        LONG index);

    HRESULT (STDMETHODCALLTYPE *put_length)(
        IHTMLSelectElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLSelectElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get__newEnum)(
        IHTMLSelectElement* This,
        IUnknown **p);

    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLSelectElement* This,
        VARIANT name,
        VARIANT index,
        IDispatch **pdisp);

    HRESULT (STDMETHODCALLTYPE *tags)(
        IHTMLSelectElement* This,
        VARIANT tagName,
        IDispatch **pdisp);

    END_INTERFACE
} IHTMLSelectElementVtbl;
interface IHTMLSelectElement {
    CONST_VTBL IHTMLSelectElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLSelectElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLSelectElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLSelectElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLSelectElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLSelectElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLSelectElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLSelectElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLSelectElement methods ***/
#define IHTMLSelectElement_put_size(This,v) (This)->lpVtbl->put_size(This,v)
#define IHTMLSelectElement_get_size(This,p) (This)->lpVtbl->get_size(This,p)
#define IHTMLSelectElement_put_multiple(This,v) (This)->lpVtbl->put_multiple(This,v)
#define IHTMLSelectElement_get_multiple(This,p) (This)->lpVtbl->get_multiple(This,p)
#define IHTMLSelectElement_put_name(This,v) (This)->lpVtbl->put_name(This,v)
#define IHTMLSelectElement_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#define IHTMLSelectElement_get_options(This,p) (This)->lpVtbl->get_options(This,p)
#define IHTMLSelectElement_put_onchange(This,v) (This)->lpVtbl->put_onchange(This,v)
#define IHTMLSelectElement_get_onchange(This,p) (This)->lpVtbl->get_onchange(This,p)
#define IHTMLSelectElement_put_selectedIndex(This,v) (This)->lpVtbl->put_selectedIndex(This,v)
#define IHTMLSelectElement_get_selectedIndex(This,p) (This)->lpVtbl->get_selectedIndex(This,p)
#define IHTMLSelectElement_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#define IHTMLSelectElement_put_value(This,v) (This)->lpVtbl->put_value(This,v)
#define IHTMLSelectElement_get_value(This,p) (This)->lpVtbl->get_value(This,p)
#define IHTMLSelectElement_put_disabled(This,v) (This)->lpVtbl->put_disabled(This,v)
#define IHTMLSelectElement_get_disabled(This,p) (This)->lpVtbl->get_disabled(This,p)
#define IHTMLSelectElement_get_form(This,p) (This)->lpVtbl->get_form(This,p)
#define IHTMLSelectElement_add(This,element,before) (This)->lpVtbl->add(This,element,before)
#define IHTMLSelectElement_remove(This,index) (This)->lpVtbl->remove(This,index)
#define IHTMLSelectElement_put_length(This,v) (This)->lpVtbl->put_length(This,v)
#define IHTMLSelectElement_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLSelectElement_get__newEnum(This,p) (This)->lpVtbl->get__newEnum(This,p)
#define IHTMLSelectElement_item(This,name,index,pdisp) (This)->lpVtbl->item(This,name,index,pdisp)
#define IHTMLSelectElement_tags(This,tagName,pdisp) (This)->lpVtbl->tags(This,tagName,pdisp)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLSelectElement_QueryInterface(IHTMLSelectElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLSelectElement_AddRef(IHTMLSelectElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLSelectElement_Release(IHTMLSelectElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLSelectElement_GetTypeInfoCount(IHTMLSelectElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLSelectElement_GetTypeInfo(IHTMLSelectElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLSelectElement_GetIDsOfNames(IHTMLSelectElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLSelectElement_Invoke(IHTMLSelectElement* 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);
}
/*** IHTMLSelectElement methods ***/
static FORCEINLINE HRESULT IHTMLSelectElement_put_size(IHTMLSelectElement* This,LONG v) {
    return This->lpVtbl->put_size(This,v);
}
static FORCEINLINE HRESULT IHTMLSelectElement_get_size(IHTMLSelectElement* This,LONG *p) {
    return This->lpVtbl->get_size(This,p);
}
static FORCEINLINE HRESULT IHTMLSelectElement_put_multiple(IHTMLSelectElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_multiple(This,v);
}
static FORCEINLINE HRESULT IHTMLSelectElement_get_multiple(IHTMLSelectElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_multiple(This,p);
}
static FORCEINLINE HRESULT IHTMLSelectElement_put_name(IHTMLSelectElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static FORCEINLINE HRESULT IHTMLSelectElement_get_name(IHTMLSelectElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static FORCEINLINE HRESULT IHTMLSelectElement_get_options(IHTMLSelectElement* This,IDispatch **p) {
    return This->lpVtbl->get_options(This,p);
}
static FORCEINLINE HRESULT IHTMLSelectElement_put_onchange(IHTMLSelectElement* This,VARIANT v) {
    return This->lpVtbl->put_onchange(This,v);
}
static FORCEINLINE HRESULT IHTMLSelectElement_get_onchange(IHTMLSelectElement* This,VARIANT *p) {
    return This->lpVtbl->get_onchange(This,p);
}
static FORCEINLINE HRESULT IHTMLSelectElement_put_selectedIndex(IHTMLSelectElement* This,LONG v) {
    return This->lpVtbl->put_selectedIndex(This,v);
}
static FORCEINLINE HRESULT IHTMLSelectElement_get_selectedIndex(IHTMLSelectElement* This,LONG *p) {
    return This->lpVtbl->get_selectedIndex(This,p);
}
static FORCEINLINE HRESULT IHTMLSelectElement_get_type(IHTMLSelectElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static FORCEINLINE HRESULT IHTMLSelectElement_put_value(IHTMLSelectElement* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static FORCEINLINE HRESULT IHTMLSelectElement_get_value(IHTMLSelectElement* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
static FORCEINLINE HRESULT IHTMLSelectElement_put_disabled(IHTMLSelectElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_disabled(This,v);
}
static FORCEINLINE HRESULT IHTMLSelectElement_get_disabled(IHTMLSelectElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_disabled(This,p);
}
static FORCEINLINE HRESULT IHTMLSelectElement_get_form(IHTMLSelectElement* This,IHTMLFormElement **p) {
    return This->lpVtbl->get_form(This,p);
}
static FORCEINLINE HRESULT IHTMLSelectElement_add(IHTMLSelectElement* This,IHTMLElement *element,VARIANT before) {
    return This->lpVtbl->add(This,element,before);
}
static FORCEINLINE HRESULT IHTMLSelectElement_remove(IHTMLSelectElement* This,LONG index) {
    return This->lpVtbl->remove(This,index);
}
static FORCEINLINE HRESULT IHTMLSelectElement_put_length(IHTMLSelectElement* This,LONG v) {
    return This->lpVtbl->put_length(This,v);
}
static FORCEINLINE HRESULT IHTMLSelectElement_get_length(IHTMLSelectElement* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IHTMLSelectElement_get__newEnum(IHTMLSelectElement* This,IUnknown **p) {
    return This->lpVtbl->get__newEnum(This,p);
}
static FORCEINLINE HRESULT IHTMLSelectElement_item(IHTMLSelectElement* This,VARIANT name,VARIANT index,IDispatch **pdisp) {
    return This->lpVtbl->item(This,name,index,pdisp);
}
static FORCEINLINE HRESULT IHTMLSelectElement_tags(IHTMLSelectElement* This,VARIANT tagName,IDispatch **pdisp) {
    return This->lpVtbl->tags(This,tagName,pdisp);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLSelectElement_put_size_Proxy(
    IHTMLSelectElement* This,
    LONG v);
void __RPC_STUB IHTMLSelectElement_put_size_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectElement_get_size_Proxy(
    IHTMLSelectElement* This,
    LONG *p);
void __RPC_STUB IHTMLSelectElement_get_size_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectElement_put_multiple_Proxy(
    IHTMLSelectElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLSelectElement_put_multiple_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectElement_get_multiple_Proxy(
    IHTMLSelectElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLSelectElement_get_multiple_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectElement_put_name_Proxy(
    IHTMLSelectElement* This,
    BSTR v);
void __RPC_STUB IHTMLSelectElement_put_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectElement_get_name_Proxy(
    IHTMLSelectElement* This,
    BSTR *p);
void __RPC_STUB IHTMLSelectElement_get_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectElement_get_options_Proxy(
    IHTMLSelectElement* This,
    IDispatch **p);
void __RPC_STUB IHTMLSelectElement_get_options_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectElement_put_onchange_Proxy(
    IHTMLSelectElement* This,
    VARIANT v);
void __RPC_STUB IHTMLSelectElement_put_onchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectElement_get_onchange_Proxy(
    IHTMLSelectElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLSelectElement_get_onchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectElement_put_selectedIndex_Proxy(
    IHTMLSelectElement* This,
    LONG v);
void __RPC_STUB IHTMLSelectElement_put_selectedIndex_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectElement_get_selectedIndex_Proxy(
    IHTMLSelectElement* This,
    LONG *p);
void __RPC_STUB IHTMLSelectElement_get_selectedIndex_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectElement_get_type_Proxy(
    IHTMLSelectElement* This,
    BSTR *p);
void __RPC_STUB IHTMLSelectElement_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectElement_put_value_Proxy(
    IHTMLSelectElement* This,
    BSTR v);
void __RPC_STUB IHTMLSelectElement_put_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectElement_get_value_Proxy(
    IHTMLSelectElement* This,
    BSTR *p);
void __RPC_STUB IHTMLSelectElement_get_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectElement_put_disabled_Proxy(
    IHTMLSelectElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLSelectElement_put_disabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectElement_get_disabled_Proxy(
    IHTMLSelectElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLSelectElement_get_disabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectElement_get_form_Proxy(
    IHTMLSelectElement* This,
    IHTMLFormElement **p);
void __RPC_STUB IHTMLSelectElement_get_form_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectElement_add_Proxy(
    IHTMLSelectElement* This,
    IHTMLElement *element,
    VARIANT before);
void __RPC_STUB IHTMLSelectElement_add_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectElement_remove_Proxy(
    IHTMLSelectElement* This,
    LONG index);
void __RPC_STUB IHTMLSelectElement_remove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectElement_put_length_Proxy(
    IHTMLSelectElement* This,
    LONG v);
void __RPC_STUB IHTMLSelectElement_put_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectElement_get_length_Proxy(
    IHTMLSelectElement* This,
    LONG *p);
void __RPC_STUB IHTMLSelectElement_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectElement_get__newEnum_Proxy(
    IHTMLSelectElement* This,
    IUnknown **p);
void __RPC_STUB IHTMLSelectElement_get__newEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectElement_item_Proxy(
    IHTMLSelectElement* This,
    VARIANT name,
    VARIANT index,
    IDispatch **pdisp);
void __RPC_STUB IHTMLSelectElement_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectElement_tags_Proxy(
    IHTMLSelectElement* This,
    VARIANT tagName,
    IDispatch **pdisp);
void __RPC_STUB IHTMLSelectElement_tags_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLSelectElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLSelectElement2 interface
 */
#ifndef __IHTMLSelectElement2_INTERFACE_DEFINED__
#define __IHTMLSelectElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLSelectElement2, 0x3050f5ed, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f5ed-98b5-11cf-bb82-00aa00bdce0b")
IHTMLSelectElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE urns(
        VARIANT urn,
        IDispatch **pdisp) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLSelectElement2, 0x3050f5ed, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLSelectElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLSelectElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLSelectElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLSelectElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLSelectElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLSelectElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLSelectElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLSelectElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLSelectElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *urns)(
        IHTMLSelectElement2* This,
        VARIANT urn,
        IDispatch **pdisp);

    END_INTERFACE
} IHTMLSelectElement2Vtbl;
interface IHTMLSelectElement2 {
    CONST_VTBL IHTMLSelectElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLSelectElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLSelectElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLSelectElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLSelectElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLSelectElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLSelectElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLSelectElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLSelectElement2 methods ***/
#define IHTMLSelectElement2_urns(This,urn,pdisp) (This)->lpVtbl->urns(This,urn,pdisp)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLSelectElement2_QueryInterface(IHTMLSelectElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLSelectElement2_AddRef(IHTMLSelectElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLSelectElement2_Release(IHTMLSelectElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLSelectElement2_GetTypeInfoCount(IHTMLSelectElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLSelectElement2_GetTypeInfo(IHTMLSelectElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLSelectElement2_GetIDsOfNames(IHTMLSelectElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLSelectElement2_Invoke(IHTMLSelectElement2* 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);
}
/*** IHTMLSelectElement2 methods ***/
static FORCEINLINE HRESULT IHTMLSelectElement2_urns(IHTMLSelectElement2* This,VARIANT urn,IDispatch **pdisp) {
    return This->lpVtbl->urns(This,urn,pdisp);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLSelectElement2_urns_Proxy(
    IHTMLSelectElement2* This,
    VARIANT urn,
    IDispatch **pdisp);
void __RPC_STUB IHTMLSelectElement2_urns_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLSelectElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLSelectElement4 interface
 */
#ifndef __IHTMLSelectElement4_INTERFACE_DEFINED__
#define __IHTMLSelectElement4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLSelectElement4, 0x3050f838, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f838-98b5-11cf-bb82-00aa00bdce0b")
IHTMLSelectElement4 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE namedItem(
        BSTR name,
        IDispatch **pdisp) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLSelectElement4, 0x3050f838, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLSelectElement4Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLSelectElement4* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLSelectElement4* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLSelectElement4* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLSelectElement4* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLSelectElement4* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLSelectElement4* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLSelectElement4* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLSelectElement4 methods ***/
    HRESULT (STDMETHODCALLTYPE *namedItem)(
        IHTMLSelectElement4* This,
        BSTR name,
        IDispatch **pdisp);

    END_INTERFACE
} IHTMLSelectElement4Vtbl;
interface IHTMLSelectElement4 {
    CONST_VTBL IHTMLSelectElement4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLSelectElement4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLSelectElement4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLSelectElement4_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLSelectElement4_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLSelectElement4_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLSelectElement4_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLSelectElement4_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLSelectElement4 methods ***/
#define IHTMLSelectElement4_namedItem(This,name,pdisp) (This)->lpVtbl->namedItem(This,name,pdisp)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLSelectElement4_QueryInterface(IHTMLSelectElement4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLSelectElement4_AddRef(IHTMLSelectElement4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLSelectElement4_Release(IHTMLSelectElement4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLSelectElement4_GetTypeInfoCount(IHTMLSelectElement4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLSelectElement4_GetTypeInfo(IHTMLSelectElement4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLSelectElement4_GetIDsOfNames(IHTMLSelectElement4* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLSelectElement4_Invoke(IHTMLSelectElement4* 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);
}
/*** IHTMLSelectElement4 methods ***/
static FORCEINLINE HRESULT IHTMLSelectElement4_namedItem(IHTMLSelectElement4* This,BSTR name,IDispatch **pdisp) {
    return This->lpVtbl->namedItem(This,name,pdisp);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLSelectElement4_namedItem_Proxy(
    IHTMLSelectElement4* This,
    BSTR name,
    IDispatch **pdisp);
void __RPC_STUB IHTMLSelectElement4_namedItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLSelectElement4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLSelectElement5 interface
 */
#ifndef __IHTMLSelectElement5_INTERFACE_DEFINED__
#define __IHTMLSelectElement5_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLSelectElement5, 0x3051049d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051049d-98b5-11cf-bb82-00aa00bdce0b")
IHTMLSelectElement5 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE add(
        IHTMLOptionElement *pElem,
        VARIANT *pvarBefore) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLSelectElement5, 0x3051049d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLSelectElement5Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLSelectElement5* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLSelectElement5* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLSelectElement5* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLSelectElement5* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLSelectElement5* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLSelectElement5* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLSelectElement5* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLSelectElement5 methods ***/
    HRESULT (STDMETHODCALLTYPE *add)(
        IHTMLSelectElement5* This,
        IHTMLOptionElement *pElem,
        VARIANT *pvarBefore);

    END_INTERFACE
} IHTMLSelectElement5Vtbl;
interface IHTMLSelectElement5 {
    CONST_VTBL IHTMLSelectElement5Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLSelectElement5_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLSelectElement5_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLSelectElement5_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLSelectElement5_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLSelectElement5_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLSelectElement5_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLSelectElement5_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLSelectElement5 methods ***/
#define IHTMLSelectElement5_add(This,pElem,pvarBefore) (This)->lpVtbl->add(This,pElem,pvarBefore)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLSelectElement5_QueryInterface(IHTMLSelectElement5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLSelectElement5_AddRef(IHTMLSelectElement5* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLSelectElement5_Release(IHTMLSelectElement5* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLSelectElement5_GetTypeInfoCount(IHTMLSelectElement5* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLSelectElement5_GetTypeInfo(IHTMLSelectElement5* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLSelectElement5_GetIDsOfNames(IHTMLSelectElement5* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLSelectElement5_Invoke(IHTMLSelectElement5* 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);
}
/*** IHTMLSelectElement5 methods ***/
static FORCEINLINE HRESULT IHTMLSelectElement5_add(IHTMLSelectElement5* This,IHTMLOptionElement *pElem,VARIANT *pvarBefore) {
    return This->lpVtbl->add(This,pElem,pvarBefore);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLSelectElement5_add_Proxy(
    IHTMLSelectElement5* This,
    IHTMLOptionElement *pElem,
    VARIANT *pvarBefore);
void __RPC_STUB IHTMLSelectElement5_add_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLSelectElement5_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLSelectElement6 interface
 */
#ifndef __IHTMLSelectElement6_INTERFACE_DEFINED__
#define __IHTMLSelectElement6_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLSelectElement6, 0x30510760, 0x98b6, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510760-98b6-11cf-bb82-00aa00bdce0b")
IHTMLSelectElement6 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE add(
        IHTMLOptionElement *pElem,
        VARIANT *pvarBefore) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_value(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_value(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLSelectElement6, 0x30510760, 0x98b6, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLSelectElement6Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLSelectElement6* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLSelectElement6* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLSelectElement6* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLSelectElement6* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLSelectElement6* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLSelectElement6* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLSelectElement6* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLSelectElement6 methods ***/
    HRESULT (STDMETHODCALLTYPE *add)(
        IHTMLSelectElement6* This,
        IHTMLOptionElement *pElem,
        VARIANT *pvarBefore);

    HRESULT (STDMETHODCALLTYPE *put_value)(
        IHTMLSelectElement6* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_value)(
        IHTMLSelectElement6* This,
        BSTR *p);

    END_INTERFACE
} IHTMLSelectElement6Vtbl;
interface IHTMLSelectElement6 {
    CONST_VTBL IHTMLSelectElement6Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLSelectElement6_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLSelectElement6_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLSelectElement6_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLSelectElement6_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLSelectElement6_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLSelectElement6_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLSelectElement6_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLSelectElement6 methods ***/
#define IHTMLSelectElement6_add(This,pElem,pvarBefore) (This)->lpVtbl->add(This,pElem,pvarBefore)
#define IHTMLSelectElement6_put_value(This,v) (This)->lpVtbl->put_value(This,v)
#define IHTMLSelectElement6_get_value(This,p) (This)->lpVtbl->get_value(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLSelectElement6_QueryInterface(IHTMLSelectElement6* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLSelectElement6_AddRef(IHTMLSelectElement6* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLSelectElement6_Release(IHTMLSelectElement6* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLSelectElement6_GetTypeInfoCount(IHTMLSelectElement6* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLSelectElement6_GetTypeInfo(IHTMLSelectElement6* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLSelectElement6_GetIDsOfNames(IHTMLSelectElement6* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLSelectElement6_Invoke(IHTMLSelectElement6* 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);
}
/*** IHTMLSelectElement6 methods ***/
static FORCEINLINE HRESULT IHTMLSelectElement6_add(IHTMLSelectElement6* This,IHTMLOptionElement *pElem,VARIANT *pvarBefore) {
    return This->lpVtbl->add(This,pElem,pvarBefore);
}
static FORCEINLINE HRESULT IHTMLSelectElement6_put_value(IHTMLSelectElement6* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static FORCEINLINE HRESULT IHTMLSelectElement6_get_value(IHTMLSelectElement6* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLSelectElement6_add_Proxy(
    IHTMLSelectElement6* This,
    IHTMLOptionElement *pElem,
    VARIANT *pvarBefore);
void __RPC_STUB IHTMLSelectElement6_add_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectElement6_put_value_Proxy(
    IHTMLSelectElement6* This,
    BSTR v);
void __RPC_STUB IHTMLSelectElement6_put_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectElement6_get_value_Proxy(
    IHTMLSelectElement6* This,
    BSTR *p);
void __RPC_STUB IHTMLSelectElement6_get_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLSelectElement6_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLSelectElement dispinterface
 */
#ifndef __DispHTMLSelectElement_DISPINTERFACE_DEFINED__
#define __DispHTMLSelectElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLSelectElement, 0x3050f531, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f531-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLSelectElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLSelectElement, 0x3050f531, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLSelectElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLSelectElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLSelectElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLSelectElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLSelectElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLSelectElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLSelectElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLSelectElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLSelectElementVtbl;
interface DispHTMLSelectElement {
    CONST_VTBL DispHTMLSelectElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLSelectElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLSelectElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLSelectElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLSelectElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLSelectElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLSelectElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLSelectElement_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 DispHTMLSelectElement_QueryInterface(DispHTMLSelectElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLSelectElement_AddRef(DispHTMLSelectElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLSelectElement_Release(DispHTMLSelectElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLSelectElement_GetTypeInfoCount(DispHTMLSelectElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLSelectElement_GetTypeInfo(DispHTMLSelectElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLSelectElement_GetIDsOfNames(DispHTMLSelectElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLSelectElement_Invoke(DispHTMLSelectElement* 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  /* __DispHTMLSelectElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLSelectElement coclass
 */

DEFINE_GUID(CLSID_HTMLSelectElement, 0x3050f245, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f245-98b5-11cf-bb82-00aa00bdce0b") HTMLSelectElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLSelectElement, 0x3050f245, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSelectElement;
/*****************************************************************************
 * DispHTMLWndSelectElement dispinterface
 */
#ifndef __DispHTMLWndSelectElement_DISPINTERFACE_DEFINED__
#define __DispHTMLWndSelectElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLWndSelectElement, 0x3050f597, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f597-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLWndSelectElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLWndSelectElement, 0x3050f597, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLWndSelectElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLWndSelectElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLWndSelectElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLWndSelectElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLWndSelectElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLWndSelectElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLWndSelectElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLWndSelectElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLWndSelectElementVtbl;
interface DispHTMLWndSelectElement {
    CONST_VTBL DispHTMLWndSelectElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLWndSelectElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLWndSelectElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLWndSelectElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLWndSelectElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLWndSelectElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLWndSelectElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLWndSelectElement_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 DispHTMLWndSelectElement_QueryInterface(DispHTMLWndSelectElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLWndSelectElement_AddRef(DispHTMLWndSelectElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLWndSelectElement_Release(DispHTMLWndSelectElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLWndSelectElement_GetTypeInfoCount(DispHTMLWndSelectElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLWndSelectElement_GetTypeInfo(DispHTMLWndSelectElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLWndSelectElement_GetIDsOfNames(DispHTMLWndSelectElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLWndSelectElement_Invoke(DispHTMLWndSelectElement* 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  /* __DispHTMLWndSelectElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLWndSelectElement coclass
 */

DEFINE_GUID(CLSID_HTMLWndSelectElement, 0x3050f2cf, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f2cf-98b5-11cf-bb82-00aa00bdce0b") HTMLWndSelectElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLWndSelectElement, 0x3050f2cf, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CWndSelectElement;
typedef enum _htmlSelection {
    htmlSelectionNone = 0,
    htmlSelectionText = 1,
    htmlSelectionControl = 2,
    htmlSelectionTable = 3,
    htmlSelection_Max = 0x7fffffff
} htmlSelection;
/*****************************************************************************
 * IHTMLSelectionObject interface
 */
#ifndef __IHTMLSelectionObject_INTERFACE_DEFINED__
#define __IHTMLSelectionObject_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLSelectionObject, 0x3050f25a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f25a-98b5-11cf-bb82-00aa00bdce0b")
IHTMLSelectionObject : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE createRange(
        IDispatch **range) = 0;

    virtual HRESULT STDMETHODCALLTYPE empty(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE clear(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLSelectionObject, 0x3050f25a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLSelectionObjectVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLSelectionObject* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLSelectionObject* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLSelectionObject* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLSelectionObject* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLSelectionObject* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLSelectionObject* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLSelectionObject* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLSelectionObject methods ***/
    HRESULT (STDMETHODCALLTYPE *createRange)(
        IHTMLSelectionObject* This,
        IDispatch **range);

    HRESULT (STDMETHODCALLTYPE *empty)(
        IHTMLSelectionObject* This);

    HRESULT (STDMETHODCALLTYPE *clear)(
        IHTMLSelectionObject* This);

    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLSelectionObject* This,
        BSTR *p);

    END_INTERFACE
} IHTMLSelectionObjectVtbl;
interface IHTMLSelectionObject {
    CONST_VTBL IHTMLSelectionObjectVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLSelectionObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLSelectionObject_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLSelectionObject_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLSelectionObject_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLSelectionObject_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLSelectionObject_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLSelectionObject_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLSelectionObject methods ***/
#define IHTMLSelectionObject_createRange(This,range) (This)->lpVtbl->createRange(This,range)
#define IHTMLSelectionObject_empty(This) (This)->lpVtbl->empty(This)
#define IHTMLSelectionObject_clear(This) (This)->lpVtbl->clear(This)
#define IHTMLSelectionObject_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLSelectionObject_QueryInterface(IHTMLSelectionObject* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLSelectionObject_AddRef(IHTMLSelectionObject* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLSelectionObject_Release(IHTMLSelectionObject* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLSelectionObject_GetTypeInfoCount(IHTMLSelectionObject* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLSelectionObject_GetTypeInfo(IHTMLSelectionObject* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLSelectionObject_GetIDsOfNames(IHTMLSelectionObject* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLSelectionObject_Invoke(IHTMLSelectionObject* 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);
}
/*** IHTMLSelectionObject methods ***/
static FORCEINLINE HRESULT IHTMLSelectionObject_createRange(IHTMLSelectionObject* This,IDispatch **range) {
    return This->lpVtbl->createRange(This,range);
}
static FORCEINLINE HRESULT IHTMLSelectionObject_empty(IHTMLSelectionObject* This) {
    return This->lpVtbl->empty(This);
}
static FORCEINLINE HRESULT IHTMLSelectionObject_clear(IHTMLSelectionObject* This) {
    return This->lpVtbl->clear(This);
}
static FORCEINLINE HRESULT IHTMLSelectionObject_get_type(IHTMLSelectionObject* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLSelectionObject_createRange_Proxy(
    IHTMLSelectionObject* This,
    IDispatch **range);
void __RPC_STUB IHTMLSelectionObject_createRange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectionObject_empty_Proxy(
    IHTMLSelectionObject* This);
void __RPC_STUB IHTMLSelectionObject_empty_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectionObject_clear_Proxy(
    IHTMLSelectionObject* This);
void __RPC_STUB IHTMLSelectionObject_clear_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectionObject_get_type_Proxy(
    IHTMLSelectionObject* This,
    BSTR *p);
void __RPC_STUB IHTMLSelectionObject_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLSelectionObject_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLSelectionObject2 interface
 */
#ifndef __IHTMLSelectionObject2_INTERFACE_DEFINED__
#define __IHTMLSelectionObject2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLSelectionObject2, 0x3050f7ec, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f7ec-98b5-11cf-bb82-00aa00bdce0b")
IHTMLSelectionObject2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE createRangeCollection(
        IDispatch **rangeCollection) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_typeDetail(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLSelectionObject2, 0x3050f7ec, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLSelectionObject2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLSelectionObject2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLSelectionObject2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLSelectionObject2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLSelectionObject2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLSelectionObject2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLSelectionObject2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLSelectionObject2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLSelectionObject2 methods ***/
    HRESULT (STDMETHODCALLTYPE *createRangeCollection)(
        IHTMLSelectionObject2* This,
        IDispatch **rangeCollection);

    HRESULT (STDMETHODCALLTYPE *get_typeDetail)(
        IHTMLSelectionObject2* This,
        BSTR *p);

    END_INTERFACE
} IHTMLSelectionObject2Vtbl;
interface IHTMLSelectionObject2 {
    CONST_VTBL IHTMLSelectionObject2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLSelectionObject2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLSelectionObject2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLSelectionObject2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLSelectionObject2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLSelectionObject2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLSelectionObject2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLSelectionObject2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLSelectionObject2 methods ***/
#define IHTMLSelectionObject2_createRangeCollection(This,rangeCollection) (This)->lpVtbl->createRangeCollection(This,rangeCollection)
#define IHTMLSelectionObject2_get_typeDetail(This,p) (This)->lpVtbl->get_typeDetail(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLSelectionObject2_QueryInterface(IHTMLSelectionObject2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLSelectionObject2_AddRef(IHTMLSelectionObject2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLSelectionObject2_Release(IHTMLSelectionObject2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLSelectionObject2_GetTypeInfoCount(IHTMLSelectionObject2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLSelectionObject2_GetTypeInfo(IHTMLSelectionObject2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLSelectionObject2_GetIDsOfNames(IHTMLSelectionObject2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLSelectionObject2_Invoke(IHTMLSelectionObject2* 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);
}
/*** IHTMLSelectionObject2 methods ***/
static FORCEINLINE HRESULT IHTMLSelectionObject2_createRangeCollection(IHTMLSelectionObject2* This,IDispatch **rangeCollection) {
    return This->lpVtbl->createRangeCollection(This,rangeCollection);
}
static FORCEINLINE HRESULT IHTMLSelectionObject2_get_typeDetail(IHTMLSelectionObject2* This,BSTR *p) {
    return This->lpVtbl->get_typeDetail(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLSelectionObject2_createRangeCollection_Proxy(
    IHTMLSelectionObject2* This,
    IDispatch **rangeCollection);
void __RPC_STUB IHTMLSelectionObject2_createRangeCollection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelectionObject2_get_typeDetail_Proxy(
    IHTMLSelectionObject2* This,
    BSTR *p);
void __RPC_STUB IHTMLSelectionObject2_get_typeDetail_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLSelectionObject2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLSelection interface
 */
#ifndef __IHTMLSelection_INTERFACE_DEFINED__
#define __IHTMLSelection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLSelection, 0x305104b6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104b6-98b5-11cf-bb82-00aa00bdce0b")
IHTMLSelection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_anchorNode(
        IHTMLDOMNode **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_anchorOffset(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_focusNode(
        IHTMLDOMNode **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_focusOffset(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_isCollapsed(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE collapse(
        IDispatch *parentNode,
        LONG offfset) = 0;

    virtual HRESULT STDMETHODCALLTYPE collapseToStart(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE collapseToEnd(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE selectAllChildren(
        IDispatch *parentNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE deleteFromDocument(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_rangeCount(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE getRangeAt(
        LONG index,
        IHTMLDOMRange **ppRange) = 0;

    virtual HRESULT STDMETHODCALLTYPE addRange(
        IDispatch *range) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeRange(
        IDispatch *range) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeAllRanges(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE toString(
        BSTR *pSelectionString) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLSelection, 0x305104b6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLSelectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLSelection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLSelection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLSelection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLSelection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLSelection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLSelection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLSelection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLSelection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_anchorNode)(
        IHTMLSelection* This,
        IHTMLDOMNode **p);

    HRESULT (STDMETHODCALLTYPE *get_anchorOffset)(
        IHTMLSelection* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_focusNode)(
        IHTMLSelection* This,
        IHTMLDOMNode **p);

    HRESULT (STDMETHODCALLTYPE *get_focusOffset)(
        IHTMLSelection* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_isCollapsed)(
        IHTMLSelection* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *collapse)(
        IHTMLSelection* This,
        IDispatch *parentNode,
        LONG offfset);

    HRESULT (STDMETHODCALLTYPE *collapseToStart)(
        IHTMLSelection* This);

    HRESULT (STDMETHODCALLTYPE *collapseToEnd)(
        IHTMLSelection* This);

    HRESULT (STDMETHODCALLTYPE *selectAllChildren)(
        IHTMLSelection* This,
        IDispatch *parentNode);

    HRESULT (STDMETHODCALLTYPE *deleteFromDocument)(
        IHTMLSelection* This);

    HRESULT (STDMETHODCALLTYPE *get_rangeCount)(
        IHTMLSelection* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *getRangeAt)(
        IHTMLSelection* This,
        LONG index,
        IHTMLDOMRange **ppRange);

    HRESULT (STDMETHODCALLTYPE *addRange)(
        IHTMLSelection* This,
        IDispatch *range);

    HRESULT (STDMETHODCALLTYPE *removeRange)(
        IHTMLSelection* This,
        IDispatch *range);

    HRESULT (STDMETHODCALLTYPE *removeAllRanges)(
        IHTMLSelection* This);

    HRESULT (STDMETHODCALLTYPE *toString)(
        IHTMLSelection* This,
        BSTR *pSelectionString);

    END_INTERFACE
} IHTMLSelectionVtbl;
interface IHTMLSelection {
    CONST_VTBL IHTMLSelectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLSelection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLSelection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLSelection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLSelection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLSelection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLSelection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLSelection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLSelection methods ***/
#define IHTMLSelection_get_anchorNode(This,p) (This)->lpVtbl->get_anchorNode(This,p)
#define IHTMLSelection_get_anchorOffset(This,p) (This)->lpVtbl->get_anchorOffset(This,p)
#define IHTMLSelection_get_focusNode(This,p) (This)->lpVtbl->get_focusNode(This,p)
#define IHTMLSelection_get_focusOffset(This,p) (This)->lpVtbl->get_focusOffset(This,p)
#define IHTMLSelection_get_isCollapsed(This,p) (This)->lpVtbl->get_isCollapsed(This,p)
#define IHTMLSelection_collapse(This,parentNode,offfset) (This)->lpVtbl->collapse(This,parentNode,offfset)
#define IHTMLSelection_collapseToStart(This) (This)->lpVtbl->collapseToStart(This)
#define IHTMLSelection_collapseToEnd(This) (This)->lpVtbl->collapseToEnd(This)
#define IHTMLSelection_selectAllChildren(This,parentNode) (This)->lpVtbl->selectAllChildren(This,parentNode)
#define IHTMLSelection_deleteFromDocument(This) (This)->lpVtbl->deleteFromDocument(This)
#define IHTMLSelection_get_rangeCount(This,p) (This)->lpVtbl->get_rangeCount(This,p)
#define IHTMLSelection_getRangeAt(This,index,ppRange) (This)->lpVtbl->getRangeAt(This,index,ppRange)
#define IHTMLSelection_addRange(This,range) (This)->lpVtbl->addRange(This,range)
#define IHTMLSelection_removeRange(This,range) (This)->lpVtbl->removeRange(This,range)
#define IHTMLSelection_removeAllRanges(This) (This)->lpVtbl->removeAllRanges(This)
#define IHTMLSelection_toString(This,pSelectionString) (This)->lpVtbl->toString(This,pSelectionString)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLSelection_QueryInterface(IHTMLSelection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLSelection_AddRef(IHTMLSelection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLSelection_Release(IHTMLSelection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLSelection_GetTypeInfoCount(IHTMLSelection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLSelection_GetTypeInfo(IHTMLSelection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLSelection_GetIDsOfNames(IHTMLSelection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLSelection_Invoke(IHTMLSelection* 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);
}
/*** IHTMLSelection methods ***/
static FORCEINLINE HRESULT IHTMLSelection_get_anchorNode(IHTMLSelection* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_anchorNode(This,p);
}
static FORCEINLINE HRESULT IHTMLSelection_get_anchorOffset(IHTMLSelection* This,LONG *p) {
    return This->lpVtbl->get_anchorOffset(This,p);
}
static FORCEINLINE HRESULT IHTMLSelection_get_focusNode(IHTMLSelection* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_focusNode(This,p);
}
static FORCEINLINE HRESULT IHTMLSelection_get_focusOffset(IHTMLSelection* This,LONG *p) {
    return This->lpVtbl->get_focusOffset(This,p);
}
static FORCEINLINE HRESULT IHTMLSelection_get_isCollapsed(IHTMLSelection* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_isCollapsed(This,p);
}
static FORCEINLINE HRESULT IHTMLSelection_collapse(IHTMLSelection* This,IDispatch *parentNode,LONG offfset) {
    return This->lpVtbl->collapse(This,parentNode,offfset);
}
static FORCEINLINE HRESULT IHTMLSelection_collapseToStart(IHTMLSelection* This) {
    return This->lpVtbl->collapseToStart(This);
}
static FORCEINLINE HRESULT IHTMLSelection_collapseToEnd(IHTMLSelection* This) {
    return This->lpVtbl->collapseToEnd(This);
}
static FORCEINLINE HRESULT IHTMLSelection_selectAllChildren(IHTMLSelection* This,IDispatch *parentNode) {
    return This->lpVtbl->selectAllChildren(This,parentNode);
}
static FORCEINLINE HRESULT IHTMLSelection_deleteFromDocument(IHTMLSelection* This) {
    return This->lpVtbl->deleteFromDocument(This);
}
static FORCEINLINE HRESULT IHTMLSelection_get_rangeCount(IHTMLSelection* This,LONG *p) {
    return This->lpVtbl->get_rangeCount(This,p);
}
static FORCEINLINE HRESULT IHTMLSelection_getRangeAt(IHTMLSelection* This,LONG index,IHTMLDOMRange **ppRange) {
    return This->lpVtbl->getRangeAt(This,index,ppRange);
}
static FORCEINLINE HRESULT IHTMLSelection_addRange(IHTMLSelection* This,IDispatch *range) {
    return This->lpVtbl->addRange(This,range);
}
static FORCEINLINE HRESULT IHTMLSelection_removeRange(IHTMLSelection* This,IDispatch *range) {
    return This->lpVtbl->removeRange(This,range);
}
static FORCEINLINE HRESULT IHTMLSelection_removeAllRanges(IHTMLSelection* This) {
    return This->lpVtbl->removeAllRanges(This);
}
static FORCEINLINE HRESULT IHTMLSelection_toString(IHTMLSelection* This,BSTR *pSelectionString) {
    return This->lpVtbl->toString(This,pSelectionString);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLSelection_get_anchorNode_Proxy(
    IHTMLSelection* This,
    IHTMLDOMNode **p);
void __RPC_STUB IHTMLSelection_get_anchorNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelection_get_anchorOffset_Proxy(
    IHTMLSelection* This,
    LONG *p);
void __RPC_STUB IHTMLSelection_get_anchorOffset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelection_get_focusNode_Proxy(
    IHTMLSelection* This,
    IHTMLDOMNode **p);
void __RPC_STUB IHTMLSelection_get_focusNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelection_get_focusOffset_Proxy(
    IHTMLSelection* This,
    LONG *p);
void __RPC_STUB IHTMLSelection_get_focusOffset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelection_get_isCollapsed_Proxy(
    IHTMLSelection* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLSelection_get_isCollapsed_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelection_collapse_Proxy(
    IHTMLSelection* This,
    IDispatch *parentNode,
    LONG offfset);
void __RPC_STUB IHTMLSelection_collapse_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelection_collapseToStart_Proxy(
    IHTMLSelection* This);
void __RPC_STUB IHTMLSelection_collapseToStart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelection_collapseToEnd_Proxy(
    IHTMLSelection* This);
void __RPC_STUB IHTMLSelection_collapseToEnd_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelection_selectAllChildren_Proxy(
    IHTMLSelection* This,
    IDispatch *parentNode);
void __RPC_STUB IHTMLSelection_selectAllChildren_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelection_deleteFromDocument_Proxy(
    IHTMLSelection* This);
void __RPC_STUB IHTMLSelection_deleteFromDocument_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelection_get_rangeCount_Proxy(
    IHTMLSelection* This,
    LONG *p);
void __RPC_STUB IHTMLSelection_get_rangeCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelection_getRangeAt_Proxy(
    IHTMLSelection* This,
    LONG index,
    IHTMLDOMRange **ppRange);
void __RPC_STUB IHTMLSelection_getRangeAt_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelection_addRange_Proxy(
    IHTMLSelection* This,
    IDispatch *range);
void __RPC_STUB IHTMLSelection_addRange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelection_removeRange_Proxy(
    IHTMLSelection* This,
    IDispatch *range);
void __RPC_STUB IHTMLSelection_removeRange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelection_removeAllRanges_Proxy(
    IHTMLSelection* This);
void __RPC_STUB IHTMLSelection_removeAllRanges_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSelection_toString_Proxy(
    IHTMLSelection* This,
    BSTR *pSelectionString);
void __RPC_STUB IHTMLSelection_toString_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLSelection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLOptionElement interface
 */
#ifndef __IHTMLOptionElement_INTERFACE_DEFINED__
#define __IHTMLOptionElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLOptionElement, 0x3050f211, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f211-98b5-11cf-bb82-00aa00bdce0b")
IHTMLOptionElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_selected(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_selected(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_value(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_value(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_defaultSelected(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_defaultSelected(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_index(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_index(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_text(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_text(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_form(
        IHTMLFormElement **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLOptionElement, 0x3050f211, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLOptionElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLOptionElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLOptionElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLOptionElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLOptionElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLOptionElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLOptionElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLOptionElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLOptionElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_selected)(
        IHTMLOptionElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_selected)(
        IHTMLOptionElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_value)(
        IHTMLOptionElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_value)(
        IHTMLOptionElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_defaultSelected)(
        IHTMLOptionElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_defaultSelected)(
        IHTMLOptionElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_index)(
        IHTMLOptionElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_index)(
        IHTMLOptionElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_text)(
        IHTMLOptionElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_text)(
        IHTMLOptionElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_form)(
        IHTMLOptionElement* This,
        IHTMLFormElement **p);

    END_INTERFACE
} IHTMLOptionElementVtbl;
interface IHTMLOptionElement {
    CONST_VTBL IHTMLOptionElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLOptionElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLOptionElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLOptionElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLOptionElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLOptionElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLOptionElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLOptionElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLOptionElement methods ***/
#define IHTMLOptionElement_put_selected(This,v) (This)->lpVtbl->put_selected(This,v)
#define IHTMLOptionElement_get_selected(This,p) (This)->lpVtbl->get_selected(This,p)
#define IHTMLOptionElement_put_value(This,v) (This)->lpVtbl->put_value(This,v)
#define IHTMLOptionElement_get_value(This,p) (This)->lpVtbl->get_value(This,p)
#define IHTMLOptionElement_put_defaultSelected(This,v) (This)->lpVtbl->put_defaultSelected(This,v)
#define IHTMLOptionElement_get_defaultSelected(This,p) (This)->lpVtbl->get_defaultSelected(This,p)
#define IHTMLOptionElement_put_index(This,v) (This)->lpVtbl->put_index(This,v)
#define IHTMLOptionElement_get_index(This,p) (This)->lpVtbl->get_index(This,p)
#define IHTMLOptionElement_put_text(This,v) (This)->lpVtbl->put_text(This,v)
#define IHTMLOptionElement_get_text(This,p) (This)->lpVtbl->get_text(This,p)
#define IHTMLOptionElement_get_form(This,p) (This)->lpVtbl->get_form(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLOptionElement_QueryInterface(IHTMLOptionElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLOptionElement_AddRef(IHTMLOptionElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLOptionElement_Release(IHTMLOptionElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLOptionElement_GetTypeInfoCount(IHTMLOptionElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLOptionElement_GetTypeInfo(IHTMLOptionElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLOptionElement_GetIDsOfNames(IHTMLOptionElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLOptionElement_Invoke(IHTMLOptionElement* 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);
}
/*** IHTMLOptionElement methods ***/
static FORCEINLINE HRESULT IHTMLOptionElement_put_selected(IHTMLOptionElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_selected(This,v);
}
static FORCEINLINE HRESULT IHTMLOptionElement_get_selected(IHTMLOptionElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_selected(This,p);
}
static FORCEINLINE HRESULT IHTMLOptionElement_put_value(IHTMLOptionElement* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static FORCEINLINE HRESULT IHTMLOptionElement_get_value(IHTMLOptionElement* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
static FORCEINLINE HRESULT IHTMLOptionElement_put_defaultSelected(IHTMLOptionElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_defaultSelected(This,v);
}
static FORCEINLINE HRESULT IHTMLOptionElement_get_defaultSelected(IHTMLOptionElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_defaultSelected(This,p);
}
static FORCEINLINE HRESULT IHTMLOptionElement_put_index(IHTMLOptionElement* This,LONG v) {
    return This->lpVtbl->put_index(This,v);
}
static FORCEINLINE HRESULT IHTMLOptionElement_get_index(IHTMLOptionElement* This,LONG *p) {
    return This->lpVtbl->get_index(This,p);
}
static FORCEINLINE HRESULT IHTMLOptionElement_put_text(IHTMLOptionElement* This,BSTR v) {
    return This->lpVtbl->put_text(This,v);
}
static FORCEINLINE HRESULT IHTMLOptionElement_get_text(IHTMLOptionElement* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static FORCEINLINE HRESULT IHTMLOptionElement_get_form(IHTMLOptionElement* This,IHTMLFormElement **p) {
    return This->lpVtbl->get_form(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLOptionElement_put_selected_Proxy(
    IHTMLOptionElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLOptionElement_put_selected_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionElement_get_selected_Proxy(
    IHTMLOptionElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLOptionElement_get_selected_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionElement_put_value_Proxy(
    IHTMLOptionElement* This,
    BSTR v);
void __RPC_STUB IHTMLOptionElement_put_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionElement_get_value_Proxy(
    IHTMLOptionElement* This,
    BSTR *p);
void __RPC_STUB IHTMLOptionElement_get_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionElement_put_defaultSelected_Proxy(
    IHTMLOptionElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLOptionElement_put_defaultSelected_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionElement_get_defaultSelected_Proxy(
    IHTMLOptionElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLOptionElement_get_defaultSelected_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionElement_put_index_Proxy(
    IHTMLOptionElement* This,
    LONG v);
void __RPC_STUB IHTMLOptionElement_put_index_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionElement_get_index_Proxy(
    IHTMLOptionElement* This,
    LONG *p);
void __RPC_STUB IHTMLOptionElement_get_index_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionElement_put_text_Proxy(
    IHTMLOptionElement* This,
    BSTR v);
void __RPC_STUB IHTMLOptionElement_put_text_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionElement_get_text_Proxy(
    IHTMLOptionElement* This,
    BSTR *p);
void __RPC_STUB IHTMLOptionElement_get_text_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionElement_get_form_Proxy(
    IHTMLOptionElement* This,
    IHTMLFormElement **p);
void __RPC_STUB IHTMLOptionElement_get_form_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLOptionElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLOptionElement3 interface
 */
#ifndef __IHTMLOptionElement3_INTERFACE_DEFINED__
#define __IHTMLOptionElement3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLOptionElement3, 0x3050f820, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f820-98b5-11cf-bb82-00aa00bdce0b")
IHTMLOptionElement3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_label(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_label(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLOptionElement3, 0x3050f820, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLOptionElement3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLOptionElement3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLOptionElement3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLOptionElement3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLOptionElement3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLOptionElement3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLOptionElement3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLOptionElement3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLOptionElement3 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_label)(
        IHTMLOptionElement3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_label)(
        IHTMLOptionElement3* This,
        BSTR *p);

    END_INTERFACE
} IHTMLOptionElement3Vtbl;
interface IHTMLOptionElement3 {
    CONST_VTBL IHTMLOptionElement3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLOptionElement3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLOptionElement3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLOptionElement3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLOptionElement3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLOptionElement3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLOptionElement3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLOptionElement3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLOptionElement3 methods ***/
#define IHTMLOptionElement3_put_label(This,v) (This)->lpVtbl->put_label(This,v)
#define IHTMLOptionElement3_get_label(This,p) (This)->lpVtbl->get_label(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLOptionElement3_QueryInterface(IHTMLOptionElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLOptionElement3_AddRef(IHTMLOptionElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLOptionElement3_Release(IHTMLOptionElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLOptionElement3_GetTypeInfoCount(IHTMLOptionElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLOptionElement3_GetTypeInfo(IHTMLOptionElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLOptionElement3_GetIDsOfNames(IHTMLOptionElement3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLOptionElement3_Invoke(IHTMLOptionElement3* 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);
}
/*** IHTMLOptionElement3 methods ***/
static FORCEINLINE HRESULT IHTMLOptionElement3_put_label(IHTMLOptionElement3* This,BSTR v) {
    return This->lpVtbl->put_label(This,v);
}
static FORCEINLINE HRESULT IHTMLOptionElement3_get_label(IHTMLOptionElement3* This,BSTR *p) {
    return This->lpVtbl->get_label(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLOptionElement3_put_label_Proxy(
    IHTMLOptionElement3* This,
    BSTR v);
void __RPC_STUB IHTMLOptionElement3_put_label_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionElement3_get_label_Proxy(
    IHTMLOptionElement3* This,
    BSTR *p);
void __RPC_STUB IHTMLOptionElement3_get_label_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLOptionElement3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLOptionElement4 interface
 */
#ifndef __IHTMLOptionElement4_INTERFACE_DEFINED__
#define __IHTMLOptionElement4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLOptionElement4, 0x305107b4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305107b4-98b5-11cf-bb82-00aa00bdce0b")
IHTMLOptionElement4 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_value(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_value(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLOptionElement4, 0x305107b4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLOptionElement4Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLOptionElement4* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLOptionElement4* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLOptionElement4* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLOptionElement4* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLOptionElement4* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLOptionElement4* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLOptionElement4* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLOptionElement4 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_value)(
        IHTMLOptionElement4* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_value)(
        IHTMLOptionElement4* This,
        BSTR *p);

    END_INTERFACE
} IHTMLOptionElement4Vtbl;
interface IHTMLOptionElement4 {
    CONST_VTBL IHTMLOptionElement4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLOptionElement4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLOptionElement4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLOptionElement4_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLOptionElement4_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLOptionElement4_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLOptionElement4_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLOptionElement4_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLOptionElement4 methods ***/
#define IHTMLOptionElement4_put_value(This,v) (This)->lpVtbl->put_value(This,v)
#define IHTMLOptionElement4_get_value(This,p) (This)->lpVtbl->get_value(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLOptionElement4_QueryInterface(IHTMLOptionElement4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLOptionElement4_AddRef(IHTMLOptionElement4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLOptionElement4_Release(IHTMLOptionElement4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLOptionElement4_GetTypeInfoCount(IHTMLOptionElement4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLOptionElement4_GetTypeInfo(IHTMLOptionElement4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLOptionElement4_GetIDsOfNames(IHTMLOptionElement4* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLOptionElement4_Invoke(IHTMLOptionElement4* 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);
}
/*** IHTMLOptionElement4 methods ***/
static FORCEINLINE HRESULT IHTMLOptionElement4_put_value(IHTMLOptionElement4* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static FORCEINLINE HRESULT IHTMLOptionElement4_get_value(IHTMLOptionElement4* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLOptionElement4_put_value_Proxy(
    IHTMLOptionElement4* This,
    BSTR v);
void __RPC_STUB IHTMLOptionElement4_put_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionElement4_get_value_Proxy(
    IHTMLOptionElement4* This,
    BSTR *p);
void __RPC_STUB IHTMLOptionElement4_get_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLOptionElement4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLOptionElementFactory interface
 */
#ifndef __IHTMLOptionElementFactory_INTERFACE_DEFINED__
#define __IHTMLOptionElementFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLOptionElementFactory, 0x3050f38c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f38c-98b5-11cf-bb82-00aa00bdce0b")
IHTMLOptionElementFactory : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE create(
        VARIANT text,
        VARIANT value,
        VARIANT defaultselected,
        VARIANT selected,
        IHTMLOptionElement **a) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLOptionElementFactory, 0x3050f38c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLOptionElementFactoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLOptionElementFactory* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLOptionElementFactory* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLOptionElementFactory* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLOptionElementFactory* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLOptionElementFactory* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLOptionElementFactory* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLOptionElementFactory* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLOptionElementFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *create)(
        IHTMLOptionElementFactory* This,
        VARIANT text,
        VARIANT value,
        VARIANT defaultselected,
        VARIANT selected,
        IHTMLOptionElement **a);

    END_INTERFACE
} IHTMLOptionElementFactoryVtbl;
interface IHTMLOptionElementFactory {
    CONST_VTBL IHTMLOptionElementFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLOptionElementFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLOptionElementFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLOptionElementFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLOptionElementFactory_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLOptionElementFactory_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLOptionElementFactory_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLOptionElementFactory_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLOptionElementFactory methods ***/
#define IHTMLOptionElementFactory_create(This,text,value,defaultselected,selected,a) (This)->lpVtbl->create(This,text,value,defaultselected,selected,a)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLOptionElementFactory_QueryInterface(IHTMLOptionElementFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLOptionElementFactory_AddRef(IHTMLOptionElementFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLOptionElementFactory_Release(IHTMLOptionElementFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLOptionElementFactory_GetTypeInfoCount(IHTMLOptionElementFactory* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLOptionElementFactory_GetTypeInfo(IHTMLOptionElementFactory* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLOptionElementFactory_GetIDsOfNames(IHTMLOptionElementFactory* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLOptionElementFactory_Invoke(IHTMLOptionElementFactory* 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);
}
/*** IHTMLOptionElementFactory methods ***/
static FORCEINLINE HRESULT IHTMLOptionElementFactory_create(IHTMLOptionElementFactory* This,VARIANT text,VARIANT value,VARIANT defaultselected,VARIANT selected,IHTMLOptionElement **a) {
    return This->lpVtbl->create(This,text,value,defaultselected,selected,a);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLOptionElementFactory_create_Proxy(
    IHTMLOptionElementFactory* This,
    VARIANT text,
    VARIANT value,
    VARIANT defaultselected,
    VARIANT selected,
    IHTMLOptionElement **a);
void __RPC_STUB IHTMLOptionElementFactory_create_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLOptionElementFactory_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLOptionElement dispinterface
 */
#ifndef __DispHTMLOptionElement_DISPINTERFACE_DEFINED__
#define __DispHTMLOptionElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLOptionElement, 0x3050f52b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f52b-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLOptionElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLOptionElement, 0x3050f52b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLOptionElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLOptionElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLOptionElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLOptionElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLOptionElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLOptionElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLOptionElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLOptionElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLOptionElementVtbl;
interface DispHTMLOptionElement {
    CONST_VTBL DispHTMLOptionElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLOptionElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLOptionElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLOptionElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLOptionElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLOptionElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLOptionElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLOptionElement_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 DispHTMLOptionElement_QueryInterface(DispHTMLOptionElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLOptionElement_AddRef(DispHTMLOptionElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLOptionElement_Release(DispHTMLOptionElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLOptionElement_GetTypeInfoCount(DispHTMLOptionElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLOptionElement_GetTypeInfo(DispHTMLOptionElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLOptionElement_GetIDsOfNames(DispHTMLOptionElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLOptionElement_Invoke(DispHTMLOptionElement* 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  /* __DispHTMLOptionElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLOptionElement coclass
 */

DEFINE_GUID(CLSID_HTMLOptionElement, 0x3050f24d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f24d-98b5-11cf-bb82-00aa00bdce0b") HTMLOptionElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLOptionElement, 0x3050f24d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_COptionElement;
/*****************************************************************************
 * HTMLOptionElementFactory coclass
 */

DEFINE_GUID(CLSID_HTMLOptionElementFactory, 0x3050f38d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f38d-98b5-11cf-bb82-00aa00bdce0b") HTMLOptionElementFactory;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLOptionElementFactory, 0x3050f38d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_COptionElementFactory;
/*****************************************************************************
 * DispHTMLWndOptionElement dispinterface
 */
#ifndef __DispHTMLWndOptionElement_DISPINTERFACE_DEFINED__
#define __DispHTMLWndOptionElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLWndOptionElement, 0x3050f598, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f598-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLWndOptionElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLWndOptionElement, 0x3050f598, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLWndOptionElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLWndOptionElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLWndOptionElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLWndOptionElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLWndOptionElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLWndOptionElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLWndOptionElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLWndOptionElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLWndOptionElementVtbl;
interface DispHTMLWndOptionElement {
    CONST_VTBL DispHTMLWndOptionElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLWndOptionElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLWndOptionElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLWndOptionElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLWndOptionElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLWndOptionElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLWndOptionElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLWndOptionElement_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 DispHTMLWndOptionElement_QueryInterface(DispHTMLWndOptionElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLWndOptionElement_AddRef(DispHTMLWndOptionElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLWndOptionElement_Release(DispHTMLWndOptionElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLWndOptionElement_GetTypeInfoCount(DispHTMLWndOptionElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLWndOptionElement_GetTypeInfo(DispHTMLWndOptionElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLWndOptionElement_GetIDsOfNames(DispHTMLWndOptionElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLWndOptionElement_Invoke(DispHTMLWndOptionElement* 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  /* __DispHTMLWndOptionElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLWndOptionElement coclass
 */

DEFINE_GUID(CLSID_HTMLWndOptionElement, 0x3050f2d0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f2d0-98b5-11cf-bb82-00aa00bdce0b") HTMLWndOptionElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLWndOptionElement, 0x3050f2d0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CWndOptionElement;
/*****************************************************************************
 * HTMLButtonElementEvents2 dispinterface
 */
#ifndef __HTMLButtonElementEvents2_DISPINTERFACE_DEFINED__
#define __HTMLButtonElementEvents2_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLButtonElementEvents2, 0x3050f617, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f617-98b5-11cf-bb82-00aa00bdce0b")
HTMLButtonElementEvents2 : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLButtonElementEvents2, 0x3050f617, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLButtonElementEvents2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLButtonElementEvents2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLButtonElementEvents2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLButtonElementEvents2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLButtonElementEvents2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLButtonElementEvents2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLButtonElementEvents2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLButtonElementEvents2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLButtonElementEvents2Vtbl;
interface HTMLButtonElementEvents2 {
    CONST_VTBL HTMLButtonElementEvents2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLButtonElementEvents2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLButtonElementEvents2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLButtonElementEvents2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLButtonElementEvents2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLButtonElementEvents2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLButtonElementEvents2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLButtonElementEvents2_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 HTMLButtonElementEvents2_QueryInterface(HTMLButtonElementEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLButtonElementEvents2_AddRef(HTMLButtonElementEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLButtonElementEvents2_Release(HTMLButtonElementEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLButtonElementEvents2_GetTypeInfoCount(HTMLButtonElementEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLButtonElementEvents2_GetTypeInfo(HTMLButtonElementEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLButtonElementEvents2_GetIDsOfNames(HTMLButtonElementEvents2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLButtonElementEvents2_Invoke(HTMLButtonElementEvents2* 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  /* __HTMLButtonElementEvents2_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLButtonElementEvents dispinterface
 */
#ifndef __HTMLButtonElementEvents_DISPINTERFACE_DEFINED__
#define __HTMLButtonElementEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLButtonElementEvents, 0x3050f2b3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f2b3-98b5-11cf-bb82-00aa00bdce0b")
HTMLButtonElementEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLButtonElementEvents, 0x3050f2b3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLButtonElementEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLButtonElementEvents* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLButtonElementEvents* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLButtonElementEvents* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLButtonElementEvents* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLButtonElementEvents* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLButtonElementEvents* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLButtonElementEvents* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLButtonElementEventsVtbl;
interface HTMLButtonElementEvents {
    CONST_VTBL HTMLButtonElementEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLButtonElementEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLButtonElementEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLButtonElementEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLButtonElementEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLButtonElementEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLButtonElementEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLButtonElementEvents_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 HTMLButtonElementEvents_QueryInterface(HTMLButtonElementEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLButtonElementEvents_AddRef(HTMLButtonElementEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLButtonElementEvents_Release(HTMLButtonElementEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLButtonElementEvents_GetTypeInfoCount(HTMLButtonElementEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLButtonElementEvents_GetTypeInfo(HTMLButtonElementEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLButtonElementEvents_GetIDsOfNames(HTMLButtonElementEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLButtonElementEvents_Invoke(HTMLButtonElementEvents* 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  /* __HTMLButtonElementEvents_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLInputTextElementEvents2 dispinterface
 */
#ifndef __HTMLInputTextElementEvents2_DISPINTERFACE_DEFINED__
#define __HTMLInputTextElementEvents2_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLInputTextElementEvents2, 0x3050f618, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f618-98b5-11cf-bb82-00aa00bdce0b")
HTMLInputTextElementEvents2 : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLInputTextElementEvents2, 0x3050f618, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLInputTextElementEvents2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLInputTextElementEvents2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLInputTextElementEvents2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLInputTextElementEvents2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLInputTextElementEvents2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLInputTextElementEvents2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLInputTextElementEvents2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLInputTextElementEvents2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLInputTextElementEvents2Vtbl;
interface HTMLInputTextElementEvents2 {
    CONST_VTBL HTMLInputTextElementEvents2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLInputTextElementEvents2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLInputTextElementEvents2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLInputTextElementEvents2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLInputTextElementEvents2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLInputTextElementEvents2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLInputTextElementEvents2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLInputTextElementEvents2_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 HTMLInputTextElementEvents2_QueryInterface(HTMLInputTextElementEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLInputTextElementEvents2_AddRef(HTMLInputTextElementEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLInputTextElementEvents2_Release(HTMLInputTextElementEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLInputTextElementEvents2_GetTypeInfoCount(HTMLInputTextElementEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLInputTextElementEvents2_GetTypeInfo(HTMLInputTextElementEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLInputTextElementEvents2_GetIDsOfNames(HTMLInputTextElementEvents2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLInputTextElementEvents2_Invoke(HTMLInputTextElementEvents2* 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  /* __HTMLInputTextElementEvents2_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLOptionButtonElementEvents2 dispinterface
 */
#ifndef __HTMLOptionButtonElementEvents2_DISPINTERFACE_DEFINED__
#define __HTMLOptionButtonElementEvents2_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLOptionButtonElementEvents2, 0x3050f619, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f619-98b5-11cf-bb82-00aa00bdce0b")
HTMLOptionButtonElementEvents2 : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLOptionButtonElementEvents2, 0x3050f619, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLOptionButtonElementEvents2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLOptionButtonElementEvents2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLOptionButtonElementEvents2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLOptionButtonElementEvents2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLOptionButtonElementEvents2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLOptionButtonElementEvents2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLOptionButtonElementEvents2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLOptionButtonElementEvents2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLOptionButtonElementEvents2Vtbl;
interface HTMLOptionButtonElementEvents2 {
    CONST_VTBL HTMLOptionButtonElementEvents2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLOptionButtonElementEvents2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLOptionButtonElementEvents2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLOptionButtonElementEvents2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLOptionButtonElementEvents2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLOptionButtonElementEvents2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLOptionButtonElementEvents2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLOptionButtonElementEvents2_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 HTMLOptionButtonElementEvents2_QueryInterface(HTMLOptionButtonElementEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLOptionButtonElementEvents2_AddRef(HTMLOptionButtonElementEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLOptionButtonElementEvents2_Release(HTMLOptionButtonElementEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLOptionButtonElementEvents2_GetTypeInfoCount(HTMLOptionButtonElementEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLOptionButtonElementEvents2_GetTypeInfo(HTMLOptionButtonElementEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLOptionButtonElementEvents2_GetIDsOfNames(HTMLOptionButtonElementEvents2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLOptionButtonElementEvents2_Invoke(HTMLOptionButtonElementEvents2* 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  /* __HTMLOptionButtonElementEvents2_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLInputFileElementEvents2 dispinterface
 */
#ifndef __HTMLInputFileElementEvents2_DISPINTERFACE_DEFINED__
#define __HTMLInputFileElementEvents2_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLInputFileElementEvents2, 0x3050f61a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f61a-98b5-11cf-bb82-00aa00bdce0b")
HTMLInputFileElementEvents2 : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLInputFileElementEvents2, 0x3050f61a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLInputFileElementEvents2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLInputFileElementEvents2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLInputFileElementEvents2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLInputFileElementEvents2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLInputFileElementEvents2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLInputFileElementEvents2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLInputFileElementEvents2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLInputFileElementEvents2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLInputFileElementEvents2Vtbl;
interface HTMLInputFileElementEvents2 {
    CONST_VTBL HTMLInputFileElementEvents2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLInputFileElementEvents2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLInputFileElementEvents2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLInputFileElementEvents2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLInputFileElementEvents2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLInputFileElementEvents2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLInputFileElementEvents2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLInputFileElementEvents2_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 HTMLInputFileElementEvents2_QueryInterface(HTMLInputFileElementEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLInputFileElementEvents2_AddRef(HTMLInputFileElementEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLInputFileElementEvents2_Release(HTMLInputFileElementEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLInputFileElementEvents2_GetTypeInfoCount(HTMLInputFileElementEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLInputFileElementEvents2_GetTypeInfo(HTMLInputFileElementEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLInputFileElementEvents2_GetIDsOfNames(HTMLInputFileElementEvents2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLInputFileElementEvents2_Invoke(HTMLInputFileElementEvents2* 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  /* __HTMLInputFileElementEvents2_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLInputImageEvents2 dispinterface
 */
#ifndef __HTMLInputImageEvents2_DISPINTERFACE_DEFINED__
#define __HTMLInputImageEvents2_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLInputImageEvents2, 0x3050f61b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f61b-98b5-11cf-bb82-00aa00bdce0b")
HTMLInputImageEvents2 : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLInputImageEvents2, 0x3050f61b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLInputImageEvents2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLInputImageEvents2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLInputImageEvents2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLInputImageEvents2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLInputImageEvents2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLInputImageEvents2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLInputImageEvents2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLInputImageEvents2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLInputImageEvents2Vtbl;
interface HTMLInputImageEvents2 {
    CONST_VTBL HTMLInputImageEvents2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLInputImageEvents2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLInputImageEvents2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLInputImageEvents2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLInputImageEvents2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLInputImageEvents2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLInputImageEvents2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLInputImageEvents2_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 HTMLInputImageEvents2_QueryInterface(HTMLInputImageEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLInputImageEvents2_AddRef(HTMLInputImageEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLInputImageEvents2_Release(HTMLInputImageEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLInputImageEvents2_GetTypeInfoCount(HTMLInputImageEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLInputImageEvents2_GetTypeInfo(HTMLInputImageEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLInputImageEvents2_GetIDsOfNames(HTMLInputImageEvents2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLInputImageEvents2_Invoke(HTMLInputImageEvents2* 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  /* __HTMLInputImageEvents2_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLInputTextElementEvents dispinterface
 */
#ifndef __HTMLInputTextElementEvents_DISPINTERFACE_DEFINED__
#define __HTMLInputTextElementEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLInputTextElementEvents, 0x3050f2a7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f2a7-98b5-11cf-bb82-00aa00bdce0b")
HTMLInputTextElementEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLInputTextElementEvents, 0x3050f2a7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLInputTextElementEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLInputTextElementEvents* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLInputTextElementEvents* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLInputTextElementEvents* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLInputTextElementEvents* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLInputTextElementEvents* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLInputTextElementEvents* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLInputTextElementEvents* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLInputTextElementEventsVtbl;
interface HTMLInputTextElementEvents {
    CONST_VTBL HTMLInputTextElementEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLInputTextElementEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLInputTextElementEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLInputTextElementEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLInputTextElementEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLInputTextElementEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLInputTextElementEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLInputTextElementEvents_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 HTMLInputTextElementEvents_QueryInterface(HTMLInputTextElementEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLInputTextElementEvents_AddRef(HTMLInputTextElementEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLInputTextElementEvents_Release(HTMLInputTextElementEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLInputTextElementEvents_GetTypeInfoCount(HTMLInputTextElementEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLInputTextElementEvents_GetTypeInfo(HTMLInputTextElementEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLInputTextElementEvents_GetIDsOfNames(HTMLInputTextElementEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLInputTextElementEvents_Invoke(HTMLInputTextElementEvents* 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  /* __HTMLInputTextElementEvents_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLOptionButtonElementEvents dispinterface
 */
#ifndef __HTMLOptionButtonElementEvents_DISPINTERFACE_DEFINED__
#define __HTMLOptionButtonElementEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLOptionButtonElementEvents, 0x3050f2bd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f2bd-98b5-11cf-bb82-00aa00bdce0b")
HTMLOptionButtonElementEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLOptionButtonElementEvents, 0x3050f2bd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLOptionButtonElementEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLOptionButtonElementEvents* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLOptionButtonElementEvents* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLOptionButtonElementEvents* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLOptionButtonElementEvents* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLOptionButtonElementEvents* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLOptionButtonElementEvents* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLOptionButtonElementEvents* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLOptionButtonElementEventsVtbl;
interface HTMLOptionButtonElementEvents {
    CONST_VTBL HTMLOptionButtonElementEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLOptionButtonElementEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLOptionButtonElementEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLOptionButtonElementEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLOptionButtonElementEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLOptionButtonElementEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLOptionButtonElementEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLOptionButtonElementEvents_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 HTMLOptionButtonElementEvents_QueryInterface(HTMLOptionButtonElementEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLOptionButtonElementEvents_AddRef(HTMLOptionButtonElementEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLOptionButtonElementEvents_Release(HTMLOptionButtonElementEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLOptionButtonElementEvents_GetTypeInfoCount(HTMLOptionButtonElementEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLOptionButtonElementEvents_GetTypeInfo(HTMLOptionButtonElementEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLOptionButtonElementEvents_GetIDsOfNames(HTMLOptionButtonElementEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLOptionButtonElementEvents_Invoke(HTMLOptionButtonElementEvents* 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  /* __HTMLOptionButtonElementEvents_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLInputFileElementEvents dispinterface
 */
#ifndef __HTMLInputFileElementEvents_DISPINTERFACE_DEFINED__
#define __HTMLInputFileElementEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLInputFileElementEvents, 0x3050f2af, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f2af-98b5-11cf-bb82-00aa00bdce0b")
HTMLInputFileElementEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLInputFileElementEvents, 0x3050f2af, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLInputFileElementEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLInputFileElementEvents* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLInputFileElementEvents* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLInputFileElementEvents* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLInputFileElementEvents* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLInputFileElementEvents* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLInputFileElementEvents* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLInputFileElementEvents* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLInputFileElementEventsVtbl;
interface HTMLInputFileElementEvents {
    CONST_VTBL HTMLInputFileElementEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLInputFileElementEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLInputFileElementEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLInputFileElementEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLInputFileElementEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLInputFileElementEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLInputFileElementEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLInputFileElementEvents_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 HTMLInputFileElementEvents_QueryInterface(HTMLInputFileElementEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLInputFileElementEvents_AddRef(HTMLInputFileElementEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLInputFileElementEvents_Release(HTMLInputFileElementEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLInputFileElementEvents_GetTypeInfoCount(HTMLInputFileElementEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLInputFileElementEvents_GetTypeInfo(HTMLInputFileElementEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLInputFileElementEvents_GetIDsOfNames(HTMLInputFileElementEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLInputFileElementEvents_Invoke(HTMLInputFileElementEvents* 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  /* __HTMLInputFileElementEvents_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLInputImageEvents dispinterface
 */
#ifndef __HTMLInputImageEvents_DISPINTERFACE_DEFINED__
#define __HTMLInputImageEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLInputImageEvents, 0x3050f2c3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f2c3-98b5-11cf-bb82-00aa00bdce0b")
HTMLInputImageEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLInputImageEvents, 0x3050f2c3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLInputImageEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLInputImageEvents* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLInputImageEvents* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLInputImageEvents* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLInputImageEvents* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLInputImageEvents* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLInputImageEvents* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLInputImageEvents* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLInputImageEventsVtbl;
interface HTMLInputImageEvents {
    CONST_VTBL HTMLInputImageEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLInputImageEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLInputImageEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLInputImageEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLInputImageEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLInputImageEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLInputImageEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLInputImageEvents_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 HTMLInputImageEvents_QueryInterface(HTMLInputImageEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLInputImageEvents_AddRef(HTMLInputImageEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLInputImageEvents_Release(HTMLInputImageEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLInputImageEvents_GetTypeInfoCount(HTMLInputImageEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLInputImageEvents_GetTypeInfo(HTMLInputImageEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLInputImageEvents_GetIDsOfNames(HTMLInputImageEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLInputImageEvents_Invoke(HTMLInputImageEvents* 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  /* __HTMLInputImageEvents_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLInputElement interface
 */
#ifndef __IHTMLInputElement_INTERFACE_DEFINED__
#define __IHTMLInputElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLInputElement, 0x3050f5d2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f5d2-98b5-11cf-bb82-00aa00bdce0b")
IHTMLInputElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_type(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_value(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_value(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_name(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_status(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_status(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_disabled(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_disabled(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_form(
        IHTMLFormElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_size(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_size(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_maxLength(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_maxLength(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE select(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onchange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onchange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onselect(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onselect(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_defaultValue(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_defaultValue(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_readOnly(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_readOnly(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE createTextRange(
        IHTMLTxtRange **range) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_indeterminate(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_indeterminate(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_defaultChecked(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_defaultChecked(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_checked(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_checked(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_border(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_border(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_vspace(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_vspace(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_hspace(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_hspace(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_alt(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_alt(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_src(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_src(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_lowsrc(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_lowsrc(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_vrml(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_vrml(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_dynsrc(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_dynsrc(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_readyState(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_complete(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_loop(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_loop(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_align(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_align(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onload(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onload(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onerror(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onerror(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onabort(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onabort(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_width(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_width(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_height(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_height(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_start(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_start(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLInputElement, 0x3050f5d2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLInputElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLInputElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLInputElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLInputElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLInputElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLInputElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLInputElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLInputElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLInputElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_type)(
        IHTMLInputElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLInputElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_value)(
        IHTMLInputElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_value)(
        IHTMLInputElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_name)(
        IHTMLInputElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_name)(
        IHTMLInputElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_status)(
        IHTMLInputElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_status)(
        IHTMLInputElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_disabled)(
        IHTMLInputElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_disabled)(
        IHTMLInputElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_form)(
        IHTMLInputElement* This,
        IHTMLFormElement **p);

    HRESULT (STDMETHODCALLTYPE *put_size)(
        IHTMLInputElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_size)(
        IHTMLInputElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_maxLength)(
        IHTMLInputElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_maxLength)(
        IHTMLInputElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *select)(
        IHTMLInputElement* This);

    HRESULT (STDMETHODCALLTYPE *put_onchange)(
        IHTMLInputElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onchange)(
        IHTMLInputElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onselect)(
        IHTMLInputElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onselect)(
        IHTMLInputElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_defaultValue)(
        IHTMLInputElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_defaultValue)(
        IHTMLInputElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_readOnly)(
        IHTMLInputElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_readOnly)(
        IHTMLInputElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *createTextRange)(
        IHTMLInputElement* This,
        IHTMLTxtRange **range);

    HRESULT (STDMETHODCALLTYPE *put_indeterminate)(
        IHTMLInputElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_indeterminate)(
        IHTMLInputElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_defaultChecked)(
        IHTMLInputElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_defaultChecked)(
        IHTMLInputElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_checked)(
        IHTMLInputElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_checked)(
        IHTMLInputElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_border)(
        IHTMLInputElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_border)(
        IHTMLInputElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_vspace)(
        IHTMLInputElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_vspace)(
        IHTMLInputElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_hspace)(
        IHTMLInputElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_hspace)(
        IHTMLInputElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_alt)(
        IHTMLInputElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_alt)(
        IHTMLInputElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_src)(
        IHTMLInputElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_src)(
        IHTMLInputElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_lowsrc)(
        IHTMLInputElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_lowsrc)(
        IHTMLInputElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_vrml)(
        IHTMLInputElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_vrml)(
        IHTMLInputElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_dynsrc)(
        IHTMLInputElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_dynsrc)(
        IHTMLInputElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_readyState)(
        IHTMLInputElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_complete)(
        IHTMLInputElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_loop)(
        IHTMLInputElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_loop)(
        IHTMLInputElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_align)(
        IHTMLInputElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_align)(
        IHTMLInputElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_onload)(
        IHTMLInputElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onload)(
        IHTMLInputElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onerror)(
        IHTMLInputElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onerror)(
        IHTMLInputElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onabort)(
        IHTMLInputElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onabort)(
        IHTMLInputElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_width)(
        IHTMLInputElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_width)(
        IHTMLInputElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_height)(
        IHTMLInputElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_height)(
        IHTMLInputElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_start)(
        IHTMLInputElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_start)(
        IHTMLInputElement* This,
        BSTR *p);

    END_INTERFACE
} IHTMLInputElementVtbl;
interface IHTMLInputElement {
    CONST_VTBL IHTMLInputElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLInputElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLInputElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLInputElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLInputElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLInputElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLInputElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLInputElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLInputElement methods ***/
#define IHTMLInputElement_put_type(This,v) (This)->lpVtbl->put_type(This,v)
#define IHTMLInputElement_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#define IHTMLInputElement_put_value(This,v) (This)->lpVtbl->put_value(This,v)
#define IHTMLInputElement_get_value(This,p) (This)->lpVtbl->get_value(This,p)
#define IHTMLInputElement_put_name(This,v) (This)->lpVtbl->put_name(This,v)
#define IHTMLInputElement_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#define IHTMLInputElement_put_status(This,v) (This)->lpVtbl->put_status(This,v)
#define IHTMLInputElement_get_status(This,p) (This)->lpVtbl->get_status(This,p)
#define IHTMLInputElement_put_disabled(This,v) (This)->lpVtbl->put_disabled(This,v)
#define IHTMLInputElement_get_disabled(This,p) (This)->lpVtbl->get_disabled(This,p)
#define IHTMLInputElement_get_form(This,p) (This)->lpVtbl->get_form(This,p)
#define IHTMLInputElement_put_size(This,v) (This)->lpVtbl->put_size(This,v)
#define IHTMLInputElement_get_size(This,p) (This)->lpVtbl->get_size(This,p)
#define IHTMLInputElement_put_maxLength(This,v) (This)->lpVtbl->put_maxLength(This,v)
#define IHTMLInputElement_get_maxLength(This,p) (This)->lpVtbl->get_maxLength(This,p)
#define IHTMLInputElement_select(This) (This)->lpVtbl->select(This)
#define IHTMLInputElement_put_onchange(This,v) (This)->lpVtbl->put_onchange(This,v)
#define IHTMLInputElement_get_onchange(This,p) (This)->lpVtbl->get_onchange(This,p)
#define IHTMLInputElement_put_onselect(This,v) (This)->lpVtbl->put_onselect(This,v)
#define IHTMLInputElement_get_onselect(This,p) (This)->lpVtbl->get_onselect(This,p)
#define IHTMLInputElement_put_defaultValue(This,v) (This)->lpVtbl->put_defaultValue(This,v)
#define IHTMLInputElement_get_defaultValue(This,p) (This)->lpVtbl->get_defaultValue(This,p)
#define IHTMLInputElement_put_readOnly(This,v) (This)->lpVtbl->put_readOnly(This,v)
#define IHTMLInputElement_get_readOnly(This,p) (This)->lpVtbl->get_readOnly(This,p)
#define IHTMLInputElement_createTextRange(This,range) (This)->lpVtbl->createTextRange(This,range)
#define IHTMLInputElement_put_indeterminate(This,v) (This)->lpVtbl->put_indeterminate(This,v)
#define IHTMLInputElement_get_indeterminate(This,p) (This)->lpVtbl->get_indeterminate(This,p)
#define IHTMLInputElement_put_defaultChecked(This,v) (This)->lpVtbl->put_defaultChecked(This,v)
#define IHTMLInputElement_get_defaultChecked(This,p) (This)->lpVtbl->get_defaultChecked(This,p)
#define IHTMLInputElement_put_checked(This,v) (This)->lpVtbl->put_checked(This,v)
#define IHTMLInputElement_get_checked(This,p) (This)->lpVtbl->get_checked(This,p)
#define IHTMLInputElement_put_border(This,v) (This)->lpVtbl->put_border(This,v)
#define IHTMLInputElement_get_border(This,p) (This)->lpVtbl->get_border(This,p)
#define IHTMLInputElement_put_vspace(This,v) (This)->lpVtbl->put_vspace(This,v)
#define IHTMLInputElement_get_vspace(This,p) (This)->lpVtbl->get_vspace(This,p)
#define IHTMLInputElement_put_hspace(This,v) (This)->lpVtbl->put_hspace(This,v)
#define IHTMLInputElement_get_hspace(This,p) (This)->lpVtbl->get_hspace(This,p)
#define IHTMLInputElement_put_alt(This,v) (This)->lpVtbl->put_alt(This,v)
#define IHTMLInputElement_get_alt(This,p) (This)->lpVtbl->get_alt(This,p)
#define IHTMLInputElement_put_src(This,v) (This)->lpVtbl->put_src(This,v)
#define IHTMLInputElement_get_src(This,p) (This)->lpVtbl->get_src(This,p)
#define IHTMLInputElement_put_lowsrc(This,v) (This)->lpVtbl->put_lowsrc(This,v)
#define IHTMLInputElement_get_lowsrc(This,p) (This)->lpVtbl->get_lowsrc(This,p)
#define IHTMLInputElement_put_vrml(This,v) (This)->lpVtbl->put_vrml(This,v)
#define IHTMLInputElement_get_vrml(This,p) (This)->lpVtbl->get_vrml(This,p)
#define IHTMLInputElement_put_dynsrc(This,v) (This)->lpVtbl->put_dynsrc(This,v)
#define IHTMLInputElement_get_dynsrc(This,p) (This)->lpVtbl->get_dynsrc(This,p)
#define IHTMLInputElement_get_readyState(This,p) (This)->lpVtbl->get_readyState(This,p)
#define IHTMLInputElement_get_complete(This,p) (This)->lpVtbl->get_complete(This,p)
#define IHTMLInputElement_put_loop(This,v) (This)->lpVtbl->put_loop(This,v)
#define IHTMLInputElement_get_loop(This,p) (This)->lpVtbl->get_loop(This,p)
#define IHTMLInputElement_put_align(This,v) (This)->lpVtbl->put_align(This,v)
#define IHTMLInputElement_get_align(This,p) (This)->lpVtbl->get_align(This,p)
#define IHTMLInputElement_put_onload(This,v) (This)->lpVtbl->put_onload(This,v)
#define IHTMLInputElement_get_onload(This,p) (This)->lpVtbl->get_onload(This,p)
#define IHTMLInputElement_put_onerror(This,v) (This)->lpVtbl->put_onerror(This,v)
#define IHTMLInputElement_get_onerror(This,p) (This)->lpVtbl->get_onerror(This,p)
#define IHTMLInputElement_put_onabort(This,v) (This)->lpVtbl->put_onabort(This,v)
#define IHTMLInputElement_get_onabort(This,p) (This)->lpVtbl->get_onabort(This,p)
#define IHTMLInputElement_put_width(This,v) (This)->lpVtbl->put_width(This,v)
#define IHTMLInputElement_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#define IHTMLInputElement_put_height(This,v) (This)->lpVtbl->put_height(This,v)
#define IHTMLInputElement_get_height(This,p) (This)->lpVtbl->get_height(This,p)
#define IHTMLInputElement_put_start(This,v) (This)->lpVtbl->put_start(This,v)
#define IHTMLInputElement_get_start(This,p) (This)->lpVtbl->get_start(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLInputElement_QueryInterface(IHTMLInputElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLInputElement_AddRef(IHTMLInputElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLInputElement_Release(IHTMLInputElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLInputElement_GetTypeInfoCount(IHTMLInputElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLInputElement_GetTypeInfo(IHTMLInputElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLInputElement_GetIDsOfNames(IHTMLInputElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLInputElement_Invoke(IHTMLInputElement* 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);
}
/*** IHTMLInputElement methods ***/
static FORCEINLINE HRESULT IHTMLInputElement_put_type(IHTMLInputElement* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_type(IHTMLInputElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_put_value(IHTMLInputElement* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_value(IHTMLInputElement* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_put_name(IHTMLInputElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_name(IHTMLInputElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_put_status(IHTMLInputElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_status(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_status(IHTMLInputElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_status(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_put_disabled(IHTMLInputElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_disabled(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_disabled(IHTMLInputElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_disabled(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_form(IHTMLInputElement* This,IHTMLFormElement **p) {
    return This->lpVtbl->get_form(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_put_size(IHTMLInputElement* This,LONG v) {
    return This->lpVtbl->put_size(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_size(IHTMLInputElement* This,LONG *p) {
    return This->lpVtbl->get_size(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_put_maxLength(IHTMLInputElement* This,LONG v) {
    return This->lpVtbl->put_maxLength(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_maxLength(IHTMLInputElement* This,LONG *p) {
    return This->lpVtbl->get_maxLength(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_select(IHTMLInputElement* This) {
    return This->lpVtbl->select(This);
}
static FORCEINLINE HRESULT IHTMLInputElement_put_onchange(IHTMLInputElement* This,VARIANT v) {
    return This->lpVtbl->put_onchange(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_onchange(IHTMLInputElement* This,VARIANT *p) {
    return This->lpVtbl->get_onchange(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_put_onselect(IHTMLInputElement* This,VARIANT v) {
    return This->lpVtbl->put_onselect(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_onselect(IHTMLInputElement* This,VARIANT *p) {
    return This->lpVtbl->get_onselect(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_put_defaultValue(IHTMLInputElement* This,BSTR v) {
    return This->lpVtbl->put_defaultValue(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_defaultValue(IHTMLInputElement* This,BSTR *p) {
    return This->lpVtbl->get_defaultValue(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_put_readOnly(IHTMLInputElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_readOnly(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_readOnly(IHTMLInputElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_readOnly(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_createTextRange(IHTMLInputElement* This,IHTMLTxtRange **range) {
    return This->lpVtbl->createTextRange(This,range);
}
static FORCEINLINE HRESULT IHTMLInputElement_put_indeterminate(IHTMLInputElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_indeterminate(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_indeterminate(IHTMLInputElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_indeterminate(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_put_defaultChecked(IHTMLInputElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_defaultChecked(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_defaultChecked(IHTMLInputElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_defaultChecked(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_put_checked(IHTMLInputElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_checked(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_checked(IHTMLInputElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_checked(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_put_border(IHTMLInputElement* This,VARIANT v) {
    return This->lpVtbl->put_border(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_border(IHTMLInputElement* This,VARIANT *p) {
    return This->lpVtbl->get_border(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_put_vspace(IHTMLInputElement* This,LONG v) {
    return This->lpVtbl->put_vspace(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_vspace(IHTMLInputElement* This,LONG *p) {
    return This->lpVtbl->get_vspace(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_put_hspace(IHTMLInputElement* This,LONG v) {
    return This->lpVtbl->put_hspace(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_hspace(IHTMLInputElement* This,LONG *p) {
    return This->lpVtbl->get_hspace(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_put_alt(IHTMLInputElement* This,BSTR v) {
    return This->lpVtbl->put_alt(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_alt(IHTMLInputElement* This,BSTR *p) {
    return This->lpVtbl->get_alt(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_put_src(IHTMLInputElement* This,BSTR v) {
    return This->lpVtbl->put_src(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_src(IHTMLInputElement* This,BSTR *p) {
    return This->lpVtbl->get_src(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_put_lowsrc(IHTMLInputElement* This,BSTR v) {
    return This->lpVtbl->put_lowsrc(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_lowsrc(IHTMLInputElement* This,BSTR *p) {
    return This->lpVtbl->get_lowsrc(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_put_vrml(IHTMLInputElement* This,BSTR v) {
    return This->lpVtbl->put_vrml(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_vrml(IHTMLInputElement* This,BSTR *p) {
    return This->lpVtbl->get_vrml(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_put_dynsrc(IHTMLInputElement* This,BSTR v) {
    return This->lpVtbl->put_dynsrc(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_dynsrc(IHTMLInputElement* This,BSTR *p) {
    return This->lpVtbl->get_dynsrc(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_readyState(IHTMLInputElement* This,BSTR *p) {
    return This->lpVtbl->get_readyState(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_complete(IHTMLInputElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_complete(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_put_loop(IHTMLInputElement* This,VARIANT v) {
    return This->lpVtbl->put_loop(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_loop(IHTMLInputElement* This,VARIANT *p) {
    return This->lpVtbl->get_loop(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_put_align(IHTMLInputElement* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_align(IHTMLInputElement* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_put_onload(IHTMLInputElement* This,VARIANT v) {
    return This->lpVtbl->put_onload(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_onload(IHTMLInputElement* This,VARIANT *p) {
    return This->lpVtbl->get_onload(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_put_onerror(IHTMLInputElement* This,VARIANT v) {
    return This->lpVtbl->put_onerror(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_onerror(IHTMLInputElement* This,VARIANT *p) {
    return This->lpVtbl->get_onerror(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_put_onabort(IHTMLInputElement* This,VARIANT v) {
    return This->lpVtbl->put_onabort(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_onabort(IHTMLInputElement* This,VARIANT *p) {
    return This->lpVtbl->get_onabort(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_put_width(IHTMLInputElement* This,LONG v) {
    return This->lpVtbl->put_width(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_width(IHTMLInputElement* This,LONG *p) {
    return This->lpVtbl->get_width(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_put_height(IHTMLInputElement* This,LONG v) {
    return This->lpVtbl->put_height(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_height(IHTMLInputElement* This,LONG *p) {
    return This->lpVtbl->get_height(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement_put_start(IHTMLInputElement* This,BSTR v) {
    return This->lpVtbl->put_start(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement_get_start(IHTMLInputElement* This,BSTR *p) {
    return This->lpVtbl->get_start(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLInputElement_put_type_Proxy(
    IHTMLInputElement* This,
    BSTR v);
void __RPC_STUB IHTMLInputElement_put_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_type_Proxy(
    IHTMLInputElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputElement_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_put_value_Proxy(
    IHTMLInputElement* This,
    BSTR v);
void __RPC_STUB IHTMLInputElement_put_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_value_Proxy(
    IHTMLInputElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputElement_get_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_put_name_Proxy(
    IHTMLInputElement* This,
    BSTR v);
void __RPC_STUB IHTMLInputElement_put_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_name_Proxy(
    IHTMLInputElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputElement_get_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_put_status_Proxy(
    IHTMLInputElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLInputElement_put_status_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_status_Proxy(
    IHTMLInputElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLInputElement_get_status_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_put_disabled_Proxy(
    IHTMLInputElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLInputElement_put_disabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_disabled_Proxy(
    IHTMLInputElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLInputElement_get_disabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_form_Proxy(
    IHTMLInputElement* This,
    IHTMLFormElement **p);
void __RPC_STUB IHTMLInputElement_get_form_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_put_size_Proxy(
    IHTMLInputElement* This,
    LONG v);
void __RPC_STUB IHTMLInputElement_put_size_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_size_Proxy(
    IHTMLInputElement* This,
    LONG *p);
void __RPC_STUB IHTMLInputElement_get_size_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_put_maxLength_Proxy(
    IHTMLInputElement* This,
    LONG v);
void __RPC_STUB IHTMLInputElement_put_maxLength_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_maxLength_Proxy(
    IHTMLInputElement* This,
    LONG *p);
void __RPC_STUB IHTMLInputElement_get_maxLength_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_select_Proxy(
    IHTMLInputElement* This);
void __RPC_STUB IHTMLInputElement_select_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_put_onchange_Proxy(
    IHTMLInputElement* This,
    VARIANT v);
void __RPC_STUB IHTMLInputElement_put_onchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_onchange_Proxy(
    IHTMLInputElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLInputElement_get_onchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_put_onselect_Proxy(
    IHTMLInputElement* This,
    VARIANT v);
void __RPC_STUB IHTMLInputElement_put_onselect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_onselect_Proxy(
    IHTMLInputElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLInputElement_get_onselect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_put_defaultValue_Proxy(
    IHTMLInputElement* This,
    BSTR v);
void __RPC_STUB IHTMLInputElement_put_defaultValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_defaultValue_Proxy(
    IHTMLInputElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputElement_get_defaultValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_put_readOnly_Proxy(
    IHTMLInputElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLInputElement_put_readOnly_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_readOnly_Proxy(
    IHTMLInputElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLInputElement_get_readOnly_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_createTextRange_Proxy(
    IHTMLInputElement* This,
    IHTMLTxtRange **range);
void __RPC_STUB IHTMLInputElement_createTextRange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_put_indeterminate_Proxy(
    IHTMLInputElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLInputElement_put_indeterminate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_indeterminate_Proxy(
    IHTMLInputElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLInputElement_get_indeterminate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_put_defaultChecked_Proxy(
    IHTMLInputElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLInputElement_put_defaultChecked_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_defaultChecked_Proxy(
    IHTMLInputElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLInputElement_get_defaultChecked_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_put_checked_Proxy(
    IHTMLInputElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLInputElement_put_checked_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_checked_Proxy(
    IHTMLInputElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLInputElement_get_checked_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_put_border_Proxy(
    IHTMLInputElement* This,
    VARIANT v);
void __RPC_STUB IHTMLInputElement_put_border_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_border_Proxy(
    IHTMLInputElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLInputElement_get_border_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_put_vspace_Proxy(
    IHTMLInputElement* This,
    LONG v);
void __RPC_STUB IHTMLInputElement_put_vspace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_vspace_Proxy(
    IHTMLInputElement* This,
    LONG *p);
void __RPC_STUB IHTMLInputElement_get_vspace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_put_hspace_Proxy(
    IHTMLInputElement* This,
    LONG v);
void __RPC_STUB IHTMLInputElement_put_hspace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_hspace_Proxy(
    IHTMLInputElement* This,
    LONG *p);
void __RPC_STUB IHTMLInputElement_get_hspace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_put_alt_Proxy(
    IHTMLInputElement* This,
    BSTR v);
void __RPC_STUB IHTMLInputElement_put_alt_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_alt_Proxy(
    IHTMLInputElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputElement_get_alt_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_put_src_Proxy(
    IHTMLInputElement* This,
    BSTR v);
void __RPC_STUB IHTMLInputElement_put_src_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_src_Proxy(
    IHTMLInputElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputElement_get_src_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_put_lowsrc_Proxy(
    IHTMLInputElement* This,
    BSTR v);
void __RPC_STUB IHTMLInputElement_put_lowsrc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_lowsrc_Proxy(
    IHTMLInputElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputElement_get_lowsrc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_put_vrml_Proxy(
    IHTMLInputElement* This,
    BSTR v);
void __RPC_STUB IHTMLInputElement_put_vrml_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_vrml_Proxy(
    IHTMLInputElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputElement_get_vrml_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_put_dynsrc_Proxy(
    IHTMLInputElement* This,
    BSTR v);
void __RPC_STUB IHTMLInputElement_put_dynsrc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_dynsrc_Proxy(
    IHTMLInputElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputElement_get_dynsrc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_readyState_Proxy(
    IHTMLInputElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputElement_get_readyState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_complete_Proxy(
    IHTMLInputElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLInputElement_get_complete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_put_loop_Proxy(
    IHTMLInputElement* This,
    VARIANT v);
void __RPC_STUB IHTMLInputElement_put_loop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_loop_Proxy(
    IHTMLInputElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLInputElement_get_loop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_put_align_Proxy(
    IHTMLInputElement* This,
    BSTR v);
void __RPC_STUB IHTMLInputElement_put_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_align_Proxy(
    IHTMLInputElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputElement_get_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_put_onload_Proxy(
    IHTMLInputElement* This,
    VARIANT v);
void __RPC_STUB IHTMLInputElement_put_onload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_onload_Proxy(
    IHTMLInputElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLInputElement_get_onload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_put_onerror_Proxy(
    IHTMLInputElement* This,
    VARIANT v);
void __RPC_STUB IHTMLInputElement_put_onerror_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_onerror_Proxy(
    IHTMLInputElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLInputElement_get_onerror_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_put_onabort_Proxy(
    IHTMLInputElement* This,
    VARIANT v);
void __RPC_STUB IHTMLInputElement_put_onabort_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_onabort_Proxy(
    IHTMLInputElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLInputElement_get_onabort_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_put_width_Proxy(
    IHTMLInputElement* This,
    LONG v);
void __RPC_STUB IHTMLInputElement_put_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_width_Proxy(
    IHTMLInputElement* This,
    LONG *p);
void __RPC_STUB IHTMLInputElement_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_put_height_Proxy(
    IHTMLInputElement* This,
    LONG v);
void __RPC_STUB IHTMLInputElement_put_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_height_Proxy(
    IHTMLInputElement* This,
    LONG *p);
void __RPC_STUB IHTMLInputElement_get_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_put_start_Proxy(
    IHTMLInputElement* This,
    BSTR v);
void __RPC_STUB IHTMLInputElement_put_start_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement_get_start_Proxy(
    IHTMLInputElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputElement_get_start_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLInputElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLInputElement2 interface
 */
#ifndef __IHTMLInputElement2_INTERFACE_DEFINED__
#define __IHTMLInputElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLInputElement2, 0x3050f821, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f821-98b5-11cf-bb82-00aa00bdce0b")
IHTMLInputElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_accept(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_accept(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_useMap(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_useMap(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLInputElement2, 0x3050f821, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLInputElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLInputElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLInputElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLInputElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLInputElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLInputElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLInputElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLInputElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLInputElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_accept)(
        IHTMLInputElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_accept)(
        IHTMLInputElement2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_useMap)(
        IHTMLInputElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_useMap)(
        IHTMLInputElement2* This,
        BSTR *p);

    END_INTERFACE
} IHTMLInputElement2Vtbl;
interface IHTMLInputElement2 {
    CONST_VTBL IHTMLInputElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLInputElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLInputElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLInputElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLInputElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLInputElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLInputElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLInputElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLInputElement2 methods ***/
#define IHTMLInputElement2_put_accept(This,v) (This)->lpVtbl->put_accept(This,v)
#define IHTMLInputElement2_get_accept(This,p) (This)->lpVtbl->get_accept(This,p)
#define IHTMLInputElement2_put_useMap(This,v) (This)->lpVtbl->put_useMap(This,v)
#define IHTMLInputElement2_get_useMap(This,p) (This)->lpVtbl->get_useMap(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLInputElement2_QueryInterface(IHTMLInputElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLInputElement2_AddRef(IHTMLInputElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLInputElement2_Release(IHTMLInputElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLInputElement2_GetTypeInfoCount(IHTMLInputElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLInputElement2_GetTypeInfo(IHTMLInputElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLInputElement2_GetIDsOfNames(IHTMLInputElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLInputElement2_Invoke(IHTMLInputElement2* 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);
}
/*** IHTMLInputElement2 methods ***/
static FORCEINLINE HRESULT IHTMLInputElement2_put_accept(IHTMLInputElement2* This,BSTR v) {
    return This->lpVtbl->put_accept(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement2_get_accept(IHTMLInputElement2* This,BSTR *p) {
    return This->lpVtbl->get_accept(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement2_put_useMap(IHTMLInputElement2* This,BSTR v) {
    return This->lpVtbl->put_useMap(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement2_get_useMap(IHTMLInputElement2* This,BSTR *p) {
    return This->lpVtbl->get_useMap(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLInputElement2_put_accept_Proxy(
    IHTMLInputElement2* This,
    BSTR v);
void __RPC_STUB IHTMLInputElement2_put_accept_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement2_get_accept_Proxy(
    IHTMLInputElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLInputElement2_get_accept_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement2_put_useMap_Proxy(
    IHTMLInputElement2* This,
    BSTR v);
void __RPC_STUB IHTMLInputElement2_put_useMap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement2_get_useMap_Proxy(
    IHTMLInputElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLInputElement2_get_useMap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLInputElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLInputElement3 interface
 */
#ifndef __IHTMLInputElement3_INTERFACE_DEFINED__
#define __IHTMLInputElement3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLInputElement3, 0x30510435, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510435-98b5-11cf-bb82-00aa00bdce0b")
IHTMLInputElement3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_src(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_src(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_lowsrc(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_lowsrc(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_vrml(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_vrml(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_dynsrc(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_dynsrc(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLInputElement3, 0x30510435, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLInputElement3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLInputElement3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLInputElement3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLInputElement3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLInputElement3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLInputElement3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLInputElement3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLInputElement3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLInputElement3 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_src)(
        IHTMLInputElement3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_src)(
        IHTMLInputElement3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_lowsrc)(
        IHTMLInputElement3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_lowsrc)(
        IHTMLInputElement3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_vrml)(
        IHTMLInputElement3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_vrml)(
        IHTMLInputElement3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_dynsrc)(
        IHTMLInputElement3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_dynsrc)(
        IHTMLInputElement3* This,
        BSTR *p);

    END_INTERFACE
} IHTMLInputElement3Vtbl;
interface IHTMLInputElement3 {
    CONST_VTBL IHTMLInputElement3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLInputElement3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLInputElement3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLInputElement3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLInputElement3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLInputElement3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLInputElement3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLInputElement3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLInputElement3 methods ***/
#define IHTMLInputElement3_put_src(This,v) (This)->lpVtbl->put_src(This,v)
#define IHTMLInputElement3_get_src(This,p) (This)->lpVtbl->get_src(This,p)
#define IHTMLInputElement3_put_lowsrc(This,v) (This)->lpVtbl->put_lowsrc(This,v)
#define IHTMLInputElement3_get_lowsrc(This,p) (This)->lpVtbl->get_lowsrc(This,p)
#define IHTMLInputElement3_put_vrml(This,v) (This)->lpVtbl->put_vrml(This,v)
#define IHTMLInputElement3_get_vrml(This,p) (This)->lpVtbl->get_vrml(This,p)
#define IHTMLInputElement3_put_dynsrc(This,v) (This)->lpVtbl->put_dynsrc(This,v)
#define IHTMLInputElement3_get_dynsrc(This,p) (This)->lpVtbl->get_dynsrc(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLInputElement3_QueryInterface(IHTMLInputElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLInputElement3_AddRef(IHTMLInputElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLInputElement3_Release(IHTMLInputElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLInputElement3_GetTypeInfoCount(IHTMLInputElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLInputElement3_GetTypeInfo(IHTMLInputElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLInputElement3_GetIDsOfNames(IHTMLInputElement3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLInputElement3_Invoke(IHTMLInputElement3* 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);
}
/*** IHTMLInputElement3 methods ***/
static FORCEINLINE HRESULT IHTMLInputElement3_put_src(IHTMLInputElement3* This,BSTR v) {
    return This->lpVtbl->put_src(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement3_get_src(IHTMLInputElement3* This,BSTR *p) {
    return This->lpVtbl->get_src(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement3_put_lowsrc(IHTMLInputElement3* This,BSTR v) {
    return This->lpVtbl->put_lowsrc(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement3_get_lowsrc(IHTMLInputElement3* This,BSTR *p) {
    return This->lpVtbl->get_lowsrc(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement3_put_vrml(IHTMLInputElement3* This,BSTR v) {
    return This->lpVtbl->put_vrml(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement3_get_vrml(IHTMLInputElement3* This,BSTR *p) {
    return This->lpVtbl->get_vrml(This,p);
}
static FORCEINLINE HRESULT IHTMLInputElement3_put_dynsrc(IHTMLInputElement3* This,BSTR v) {
    return This->lpVtbl->put_dynsrc(This,v);
}
static FORCEINLINE HRESULT IHTMLInputElement3_get_dynsrc(IHTMLInputElement3* This,BSTR *p) {
    return This->lpVtbl->get_dynsrc(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLInputElement3_put_src_Proxy(
    IHTMLInputElement3* This,
    BSTR v);
void __RPC_STUB IHTMLInputElement3_put_src_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement3_get_src_Proxy(
    IHTMLInputElement3* This,
    BSTR *p);
void __RPC_STUB IHTMLInputElement3_get_src_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement3_put_lowsrc_Proxy(
    IHTMLInputElement3* This,
    BSTR v);
void __RPC_STUB IHTMLInputElement3_put_lowsrc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement3_get_lowsrc_Proxy(
    IHTMLInputElement3* This,
    BSTR *p);
void __RPC_STUB IHTMLInputElement3_get_lowsrc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement3_put_vrml_Proxy(
    IHTMLInputElement3* This,
    BSTR v);
void __RPC_STUB IHTMLInputElement3_put_vrml_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement3_get_vrml_Proxy(
    IHTMLInputElement3* This,
    BSTR *p);
void __RPC_STUB IHTMLInputElement3_get_vrml_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement3_put_dynsrc_Proxy(
    IHTMLInputElement3* This,
    BSTR v);
void __RPC_STUB IHTMLInputElement3_put_dynsrc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputElement3_get_dynsrc_Proxy(
    IHTMLInputElement3* This,
    BSTR *p);
void __RPC_STUB IHTMLInputElement3_get_dynsrc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLInputElement3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLInputButtonElement interface
 */
#ifndef __IHTMLInputButtonElement_INTERFACE_DEFINED__
#define __IHTMLInputButtonElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLInputButtonElement, 0x3050f2b2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f2b2-98b5-11cf-bb82-00aa00bdce0b")
IHTMLInputButtonElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_value(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_value(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_name(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_status(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_status(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_disabled(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_disabled(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_form(
        IHTMLFormElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE createTextRange(
        IHTMLTxtRange **range) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLInputButtonElement, 0x3050f2b2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLInputButtonElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLInputButtonElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLInputButtonElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLInputButtonElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLInputButtonElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLInputButtonElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLInputButtonElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLInputButtonElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLInputButtonElement methods ***/
    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLInputButtonElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_value)(
        IHTMLInputButtonElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_value)(
        IHTMLInputButtonElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_name)(
        IHTMLInputButtonElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_name)(
        IHTMLInputButtonElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_status)(
        IHTMLInputButtonElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_status)(
        IHTMLInputButtonElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_disabled)(
        IHTMLInputButtonElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_disabled)(
        IHTMLInputButtonElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_form)(
        IHTMLInputButtonElement* This,
        IHTMLFormElement **p);

    HRESULT (STDMETHODCALLTYPE *createTextRange)(
        IHTMLInputButtonElement* This,
        IHTMLTxtRange **range);

    END_INTERFACE
} IHTMLInputButtonElementVtbl;
interface IHTMLInputButtonElement {
    CONST_VTBL IHTMLInputButtonElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLInputButtonElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLInputButtonElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLInputButtonElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLInputButtonElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLInputButtonElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLInputButtonElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLInputButtonElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLInputButtonElement methods ***/
#define IHTMLInputButtonElement_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#define IHTMLInputButtonElement_put_value(This,v) (This)->lpVtbl->put_value(This,v)
#define IHTMLInputButtonElement_get_value(This,p) (This)->lpVtbl->get_value(This,p)
#define IHTMLInputButtonElement_put_name(This,v) (This)->lpVtbl->put_name(This,v)
#define IHTMLInputButtonElement_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#define IHTMLInputButtonElement_put_status(This,v) (This)->lpVtbl->put_status(This,v)
#define IHTMLInputButtonElement_get_status(This,p) (This)->lpVtbl->get_status(This,p)
#define IHTMLInputButtonElement_put_disabled(This,v) (This)->lpVtbl->put_disabled(This,v)
#define IHTMLInputButtonElement_get_disabled(This,p) (This)->lpVtbl->get_disabled(This,p)
#define IHTMLInputButtonElement_get_form(This,p) (This)->lpVtbl->get_form(This,p)
#define IHTMLInputButtonElement_createTextRange(This,range) (This)->lpVtbl->createTextRange(This,range)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLInputButtonElement_QueryInterface(IHTMLInputButtonElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLInputButtonElement_AddRef(IHTMLInputButtonElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLInputButtonElement_Release(IHTMLInputButtonElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLInputButtonElement_GetTypeInfoCount(IHTMLInputButtonElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLInputButtonElement_GetTypeInfo(IHTMLInputButtonElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLInputButtonElement_GetIDsOfNames(IHTMLInputButtonElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLInputButtonElement_Invoke(IHTMLInputButtonElement* 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);
}
/*** IHTMLInputButtonElement methods ***/
static FORCEINLINE HRESULT IHTMLInputButtonElement_get_type(IHTMLInputButtonElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static FORCEINLINE HRESULT IHTMLInputButtonElement_put_value(IHTMLInputButtonElement* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static FORCEINLINE HRESULT IHTMLInputButtonElement_get_value(IHTMLInputButtonElement* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
static FORCEINLINE HRESULT IHTMLInputButtonElement_put_name(IHTMLInputButtonElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static FORCEINLINE HRESULT IHTMLInputButtonElement_get_name(IHTMLInputButtonElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static FORCEINLINE HRESULT IHTMLInputButtonElement_put_status(IHTMLInputButtonElement* This,VARIANT v) {
    return This->lpVtbl->put_status(This,v);
}
static FORCEINLINE HRESULT IHTMLInputButtonElement_get_status(IHTMLInputButtonElement* This,VARIANT *p) {
    return This->lpVtbl->get_status(This,p);
}
static FORCEINLINE HRESULT IHTMLInputButtonElement_put_disabled(IHTMLInputButtonElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_disabled(This,v);
}
static FORCEINLINE HRESULT IHTMLInputButtonElement_get_disabled(IHTMLInputButtonElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_disabled(This,p);
}
static FORCEINLINE HRESULT IHTMLInputButtonElement_get_form(IHTMLInputButtonElement* This,IHTMLFormElement **p) {
    return This->lpVtbl->get_form(This,p);
}
static FORCEINLINE HRESULT IHTMLInputButtonElement_createTextRange(IHTMLInputButtonElement* This,IHTMLTxtRange **range) {
    return This->lpVtbl->createTextRange(This,range);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLInputButtonElement_get_type_Proxy(
    IHTMLInputButtonElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputButtonElement_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputButtonElement_put_value_Proxy(
    IHTMLInputButtonElement* This,
    BSTR v);
void __RPC_STUB IHTMLInputButtonElement_put_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputButtonElement_get_value_Proxy(
    IHTMLInputButtonElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputButtonElement_get_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputButtonElement_put_name_Proxy(
    IHTMLInputButtonElement* This,
    BSTR v);
void __RPC_STUB IHTMLInputButtonElement_put_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputButtonElement_get_name_Proxy(
    IHTMLInputButtonElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputButtonElement_get_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputButtonElement_put_status_Proxy(
    IHTMLInputButtonElement* This,
    VARIANT v);
void __RPC_STUB IHTMLInputButtonElement_put_status_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputButtonElement_get_status_Proxy(
    IHTMLInputButtonElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLInputButtonElement_get_status_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputButtonElement_put_disabled_Proxy(
    IHTMLInputButtonElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLInputButtonElement_put_disabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputButtonElement_get_disabled_Proxy(
    IHTMLInputButtonElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLInputButtonElement_get_disabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputButtonElement_get_form_Proxy(
    IHTMLInputButtonElement* This,
    IHTMLFormElement **p);
void __RPC_STUB IHTMLInputButtonElement_get_form_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputButtonElement_createTextRange_Proxy(
    IHTMLInputButtonElement* This,
    IHTMLTxtRange **range);
void __RPC_STUB IHTMLInputButtonElement_createTextRange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLInputButtonElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLInputHiddenElement interface
 */
#ifndef __IHTMLInputHiddenElement_INTERFACE_DEFINED__
#define __IHTMLInputHiddenElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLInputHiddenElement, 0x3050f2a4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f2a4-98b5-11cf-bb82-00aa00bdce0b")
IHTMLInputHiddenElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_value(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_value(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_name(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_status(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_status(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_disabled(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_disabled(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_form(
        IHTMLFormElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE createTextRange(
        IHTMLTxtRange **range) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLInputHiddenElement, 0x3050f2a4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLInputHiddenElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLInputHiddenElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLInputHiddenElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLInputHiddenElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLInputHiddenElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLInputHiddenElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLInputHiddenElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLInputHiddenElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLInputHiddenElement methods ***/
    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLInputHiddenElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_value)(
        IHTMLInputHiddenElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_value)(
        IHTMLInputHiddenElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_name)(
        IHTMLInputHiddenElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_name)(
        IHTMLInputHiddenElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_status)(
        IHTMLInputHiddenElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_status)(
        IHTMLInputHiddenElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_disabled)(
        IHTMLInputHiddenElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_disabled)(
        IHTMLInputHiddenElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_form)(
        IHTMLInputHiddenElement* This,
        IHTMLFormElement **p);

    HRESULT (STDMETHODCALLTYPE *createTextRange)(
        IHTMLInputHiddenElement* This,
        IHTMLTxtRange **range);

    END_INTERFACE
} IHTMLInputHiddenElementVtbl;
interface IHTMLInputHiddenElement {
    CONST_VTBL IHTMLInputHiddenElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLInputHiddenElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLInputHiddenElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLInputHiddenElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLInputHiddenElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLInputHiddenElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLInputHiddenElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLInputHiddenElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLInputHiddenElement methods ***/
#define IHTMLInputHiddenElement_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#define IHTMLInputHiddenElement_put_value(This,v) (This)->lpVtbl->put_value(This,v)
#define IHTMLInputHiddenElement_get_value(This,p) (This)->lpVtbl->get_value(This,p)
#define IHTMLInputHiddenElement_put_name(This,v) (This)->lpVtbl->put_name(This,v)
#define IHTMLInputHiddenElement_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#define IHTMLInputHiddenElement_put_status(This,v) (This)->lpVtbl->put_status(This,v)
#define IHTMLInputHiddenElement_get_status(This,p) (This)->lpVtbl->get_status(This,p)
#define IHTMLInputHiddenElement_put_disabled(This,v) (This)->lpVtbl->put_disabled(This,v)
#define IHTMLInputHiddenElement_get_disabled(This,p) (This)->lpVtbl->get_disabled(This,p)
#define IHTMLInputHiddenElement_get_form(This,p) (This)->lpVtbl->get_form(This,p)
#define IHTMLInputHiddenElement_createTextRange(This,range) (This)->lpVtbl->createTextRange(This,range)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLInputHiddenElement_QueryInterface(IHTMLInputHiddenElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLInputHiddenElement_AddRef(IHTMLInputHiddenElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLInputHiddenElement_Release(IHTMLInputHiddenElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLInputHiddenElement_GetTypeInfoCount(IHTMLInputHiddenElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLInputHiddenElement_GetTypeInfo(IHTMLInputHiddenElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLInputHiddenElement_GetIDsOfNames(IHTMLInputHiddenElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLInputHiddenElement_Invoke(IHTMLInputHiddenElement* 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);
}
/*** IHTMLInputHiddenElement methods ***/
static FORCEINLINE HRESULT IHTMLInputHiddenElement_get_type(IHTMLInputHiddenElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static FORCEINLINE HRESULT IHTMLInputHiddenElement_put_value(IHTMLInputHiddenElement* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static FORCEINLINE HRESULT IHTMLInputHiddenElement_get_value(IHTMLInputHiddenElement* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
static FORCEINLINE HRESULT IHTMLInputHiddenElement_put_name(IHTMLInputHiddenElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static FORCEINLINE HRESULT IHTMLInputHiddenElement_get_name(IHTMLInputHiddenElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static FORCEINLINE HRESULT IHTMLInputHiddenElement_put_status(IHTMLInputHiddenElement* This,VARIANT v) {
    return This->lpVtbl->put_status(This,v);
}
static FORCEINLINE HRESULT IHTMLInputHiddenElement_get_status(IHTMLInputHiddenElement* This,VARIANT *p) {
    return This->lpVtbl->get_status(This,p);
}
static FORCEINLINE HRESULT IHTMLInputHiddenElement_put_disabled(IHTMLInputHiddenElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_disabled(This,v);
}
static FORCEINLINE HRESULT IHTMLInputHiddenElement_get_disabled(IHTMLInputHiddenElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_disabled(This,p);
}
static FORCEINLINE HRESULT IHTMLInputHiddenElement_get_form(IHTMLInputHiddenElement* This,IHTMLFormElement **p) {
    return This->lpVtbl->get_form(This,p);
}
static FORCEINLINE HRESULT IHTMLInputHiddenElement_createTextRange(IHTMLInputHiddenElement* This,IHTMLTxtRange **range) {
    return This->lpVtbl->createTextRange(This,range);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLInputHiddenElement_get_type_Proxy(
    IHTMLInputHiddenElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputHiddenElement_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputHiddenElement_put_value_Proxy(
    IHTMLInputHiddenElement* This,
    BSTR v);
void __RPC_STUB IHTMLInputHiddenElement_put_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputHiddenElement_get_value_Proxy(
    IHTMLInputHiddenElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputHiddenElement_get_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputHiddenElement_put_name_Proxy(
    IHTMLInputHiddenElement* This,
    BSTR v);
void __RPC_STUB IHTMLInputHiddenElement_put_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputHiddenElement_get_name_Proxy(
    IHTMLInputHiddenElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputHiddenElement_get_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputHiddenElement_put_status_Proxy(
    IHTMLInputHiddenElement* This,
    VARIANT v);
void __RPC_STUB IHTMLInputHiddenElement_put_status_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputHiddenElement_get_status_Proxy(
    IHTMLInputHiddenElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLInputHiddenElement_get_status_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputHiddenElement_put_disabled_Proxy(
    IHTMLInputHiddenElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLInputHiddenElement_put_disabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputHiddenElement_get_disabled_Proxy(
    IHTMLInputHiddenElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLInputHiddenElement_get_disabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputHiddenElement_get_form_Proxy(
    IHTMLInputHiddenElement* This,
    IHTMLFormElement **p);
void __RPC_STUB IHTMLInputHiddenElement_get_form_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputHiddenElement_createTextRange_Proxy(
    IHTMLInputHiddenElement* This,
    IHTMLTxtRange **range);
void __RPC_STUB IHTMLInputHiddenElement_createTextRange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLInputHiddenElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLInputTextElement interface
 */
#ifndef __IHTMLInputTextElement_INTERFACE_DEFINED__
#define __IHTMLInputTextElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLInputTextElement, 0x3050f2a6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f2a6-98b5-11cf-bb82-00aa00bdce0b")
IHTMLInputTextElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_value(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_value(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_name(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_status(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_status(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_disabled(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_disabled(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_form(
        IHTMLFormElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_defaultValue(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_defaultValue(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_size(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_size(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_maxLength(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_maxLength(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE select(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onchange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onchange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onselect(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onselect(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_readOnly(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_readOnly(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE createTextRange(
        IHTMLTxtRange **range) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLInputTextElement, 0x3050f2a6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLInputTextElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLInputTextElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLInputTextElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLInputTextElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLInputTextElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLInputTextElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLInputTextElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLInputTextElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLInputTextElement methods ***/
    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLInputTextElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_value)(
        IHTMLInputTextElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_value)(
        IHTMLInputTextElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_name)(
        IHTMLInputTextElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_name)(
        IHTMLInputTextElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_status)(
        IHTMLInputTextElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_status)(
        IHTMLInputTextElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_disabled)(
        IHTMLInputTextElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_disabled)(
        IHTMLInputTextElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_form)(
        IHTMLInputTextElement* This,
        IHTMLFormElement **p);

    HRESULT (STDMETHODCALLTYPE *put_defaultValue)(
        IHTMLInputTextElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_defaultValue)(
        IHTMLInputTextElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_size)(
        IHTMLInputTextElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_size)(
        IHTMLInputTextElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_maxLength)(
        IHTMLInputTextElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_maxLength)(
        IHTMLInputTextElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *select)(
        IHTMLInputTextElement* This);

    HRESULT (STDMETHODCALLTYPE *put_onchange)(
        IHTMLInputTextElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onchange)(
        IHTMLInputTextElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onselect)(
        IHTMLInputTextElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onselect)(
        IHTMLInputTextElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_readOnly)(
        IHTMLInputTextElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_readOnly)(
        IHTMLInputTextElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *createTextRange)(
        IHTMLInputTextElement* This,
        IHTMLTxtRange **range);

    END_INTERFACE
} IHTMLInputTextElementVtbl;
interface IHTMLInputTextElement {
    CONST_VTBL IHTMLInputTextElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLInputTextElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLInputTextElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLInputTextElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLInputTextElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLInputTextElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLInputTextElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLInputTextElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLInputTextElement methods ***/
#define IHTMLInputTextElement_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#define IHTMLInputTextElement_put_value(This,v) (This)->lpVtbl->put_value(This,v)
#define IHTMLInputTextElement_get_value(This,p) (This)->lpVtbl->get_value(This,p)
#define IHTMLInputTextElement_put_name(This,v) (This)->lpVtbl->put_name(This,v)
#define IHTMLInputTextElement_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#define IHTMLInputTextElement_put_status(This,v) (This)->lpVtbl->put_status(This,v)
#define IHTMLInputTextElement_get_status(This,p) (This)->lpVtbl->get_status(This,p)
#define IHTMLInputTextElement_put_disabled(This,v) (This)->lpVtbl->put_disabled(This,v)
#define IHTMLInputTextElement_get_disabled(This,p) (This)->lpVtbl->get_disabled(This,p)
#define IHTMLInputTextElement_get_form(This,p) (This)->lpVtbl->get_form(This,p)
#define IHTMLInputTextElement_put_defaultValue(This,v) (This)->lpVtbl->put_defaultValue(This,v)
#define IHTMLInputTextElement_get_defaultValue(This,p) (This)->lpVtbl->get_defaultValue(This,p)
#define IHTMLInputTextElement_put_size(This,v) (This)->lpVtbl->put_size(This,v)
#define IHTMLInputTextElement_get_size(This,p) (This)->lpVtbl->get_size(This,p)
#define IHTMLInputTextElement_put_maxLength(This,v) (This)->lpVtbl->put_maxLength(This,v)
#define IHTMLInputTextElement_get_maxLength(This,p) (This)->lpVtbl->get_maxLength(This,p)
#define IHTMLInputTextElement_select(This) (This)->lpVtbl->select(This)
#define IHTMLInputTextElement_put_onchange(This,v) (This)->lpVtbl->put_onchange(This,v)
#define IHTMLInputTextElement_get_onchange(This,p) (This)->lpVtbl->get_onchange(This,p)
#define IHTMLInputTextElement_put_onselect(This,v) (This)->lpVtbl->put_onselect(This,v)
#define IHTMLInputTextElement_get_onselect(This,p) (This)->lpVtbl->get_onselect(This,p)
#define IHTMLInputTextElement_put_readOnly(This,v) (This)->lpVtbl->put_readOnly(This,v)
#define IHTMLInputTextElement_get_readOnly(This,p) (This)->lpVtbl->get_readOnly(This,p)
#define IHTMLInputTextElement_createTextRange(This,range) (This)->lpVtbl->createTextRange(This,range)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLInputTextElement_QueryInterface(IHTMLInputTextElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLInputTextElement_AddRef(IHTMLInputTextElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLInputTextElement_Release(IHTMLInputTextElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLInputTextElement_GetTypeInfoCount(IHTMLInputTextElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLInputTextElement_GetTypeInfo(IHTMLInputTextElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLInputTextElement_GetIDsOfNames(IHTMLInputTextElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLInputTextElement_Invoke(IHTMLInputTextElement* 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);
}
/*** IHTMLInputTextElement methods ***/
static FORCEINLINE HRESULT IHTMLInputTextElement_get_type(IHTMLInputTextElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static FORCEINLINE HRESULT IHTMLInputTextElement_put_value(IHTMLInputTextElement* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static FORCEINLINE HRESULT IHTMLInputTextElement_get_value(IHTMLInputTextElement* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
static FORCEINLINE HRESULT IHTMLInputTextElement_put_name(IHTMLInputTextElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static FORCEINLINE HRESULT IHTMLInputTextElement_get_name(IHTMLInputTextElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static FORCEINLINE HRESULT IHTMLInputTextElement_put_status(IHTMLInputTextElement* This,VARIANT v) {
    return This->lpVtbl->put_status(This,v);
}
static FORCEINLINE HRESULT IHTMLInputTextElement_get_status(IHTMLInputTextElement* This,VARIANT *p) {
    return This->lpVtbl->get_status(This,p);
}
static FORCEINLINE HRESULT IHTMLInputTextElement_put_disabled(IHTMLInputTextElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_disabled(This,v);
}
static FORCEINLINE HRESULT IHTMLInputTextElement_get_disabled(IHTMLInputTextElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_disabled(This,p);
}
static FORCEINLINE HRESULT IHTMLInputTextElement_get_form(IHTMLInputTextElement* This,IHTMLFormElement **p) {
    return This->lpVtbl->get_form(This,p);
}
static FORCEINLINE HRESULT IHTMLInputTextElement_put_defaultValue(IHTMLInputTextElement* This,BSTR v) {
    return This->lpVtbl->put_defaultValue(This,v);
}
static FORCEINLINE HRESULT IHTMLInputTextElement_get_defaultValue(IHTMLInputTextElement* This,BSTR *p) {
    return This->lpVtbl->get_defaultValue(This,p);
}
static FORCEINLINE HRESULT IHTMLInputTextElement_put_size(IHTMLInputTextElement* This,LONG v) {
    return This->lpVtbl->put_size(This,v);
}
static FORCEINLINE HRESULT IHTMLInputTextElement_get_size(IHTMLInputTextElement* This,LONG *p) {
    return This->lpVtbl->get_size(This,p);
}
static FORCEINLINE HRESULT IHTMLInputTextElement_put_maxLength(IHTMLInputTextElement* This,LONG v) {
    return This->lpVtbl->put_maxLength(This,v);
}
static FORCEINLINE HRESULT IHTMLInputTextElement_get_maxLength(IHTMLInputTextElement* This,LONG *p) {
    return This->lpVtbl->get_maxLength(This,p);
}
static FORCEINLINE HRESULT IHTMLInputTextElement_select(IHTMLInputTextElement* This) {
    return This->lpVtbl->select(This);
}
static FORCEINLINE HRESULT IHTMLInputTextElement_put_onchange(IHTMLInputTextElement* This,VARIANT v) {
    return This->lpVtbl->put_onchange(This,v);
}
static FORCEINLINE HRESULT IHTMLInputTextElement_get_onchange(IHTMLInputTextElement* This,VARIANT *p) {
    return This->lpVtbl->get_onchange(This,p);
}
static FORCEINLINE HRESULT IHTMLInputTextElement_put_onselect(IHTMLInputTextElement* This,VARIANT v) {
    return This->lpVtbl->put_onselect(This,v);
}
static FORCEINLINE HRESULT IHTMLInputTextElement_get_onselect(IHTMLInputTextElement* This,VARIANT *p) {
    return This->lpVtbl->get_onselect(This,p);
}
static FORCEINLINE HRESULT IHTMLInputTextElement_put_readOnly(IHTMLInputTextElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_readOnly(This,v);
}
static FORCEINLINE HRESULT IHTMLInputTextElement_get_readOnly(IHTMLInputTextElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_readOnly(This,p);
}
static FORCEINLINE HRESULT IHTMLInputTextElement_createTextRange(IHTMLInputTextElement* This,IHTMLTxtRange **range) {
    return This->lpVtbl->createTextRange(This,range);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLInputTextElement_get_type_Proxy(
    IHTMLInputTextElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputTextElement_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputTextElement_put_value_Proxy(
    IHTMLInputTextElement* This,
    BSTR v);
void __RPC_STUB IHTMLInputTextElement_put_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputTextElement_get_value_Proxy(
    IHTMLInputTextElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputTextElement_get_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputTextElement_put_name_Proxy(
    IHTMLInputTextElement* This,
    BSTR v);
void __RPC_STUB IHTMLInputTextElement_put_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputTextElement_get_name_Proxy(
    IHTMLInputTextElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputTextElement_get_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputTextElement_put_status_Proxy(
    IHTMLInputTextElement* This,
    VARIANT v);
void __RPC_STUB IHTMLInputTextElement_put_status_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputTextElement_get_status_Proxy(
    IHTMLInputTextElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLInputTextElement_get_status_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputTextElement_put_disabled_Proxy(
    IHTMLInputTextElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLInputTextElement_put_disabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputTextElement_get_disabled_Proxy(
    IHTMLInputTextElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLInputTextElement_get_disabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputTextElement_get_form_Proxy(
    IHTMLInputTextElement* This,
    IHTMLFormElement **p);
void __RPC_STUB IHTMLInputTextElement_get_form_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputTextElement_put_defaultValue_Proxy(
    IHTMLInputTextElement* This,
    BSTR v);
void __RPC_STUB IHTMLInputTextElement_put_defaultValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputTextElement_get_defaultValue_Proxy(
    IHTMLInputTextElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputTextElement_get_defaultValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputTextElement_put_size_Proxy(
    IHTMLInputTextElement* This,
    LONG v);
void __RPC_STUB IHTMLInputTextElement_put_size_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputTextElement_get_size_Proxy(
    IHTMLInputTextElement* This,
    LONG *p);
void __RPC_STUB IHTMLInputTextElement_get_size_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputTextElement_put_maxLength_Proxy(
    IHTMLInputTextElement* This,
    LONG v);
void __RPC_STUB IHTMLInputTextElement_put_maxLength_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputTextElement_get_maxLength_Proxy(
    IHTMLInputTextElement* This,
    LONG *p);
void __RPC_STUB IHTMLInputTextElement_get_maxLength_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputTextElement_select_Proxy(
    IHTMLInputTextElement* This);
void __RPC_STUB IHTMLInputTextElement_select_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputTextElement_put_onchange_Proxy(
    IHTMLInputTextElement* This,
    VARIANT v);
void __RPC_STUB IHTMLInputTextElement_put_onchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputTextElement_get_onchange_Proxy(
    IHTMLInputTextElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLInputTextElement_get_onchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputTextElement_put_onselect_Proxy(
    IHTMLInputTextElement* This,
    VARIANT v);
void __RPC_STUB IHTMLInputTextElement_put_onselect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputTextElement_get_onselect_Proxy(
    IHTMLInputTextElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLInputTextElement_get_onselect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputTextElement_put_readOnly_Proxy(
    IHTMLInputTextElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLInputTextElement_put_readOnly_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputTextElement_get_readOnly_Proxy(
    IHTMLInputTextElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLInputTextElement_get_readOnly_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputTextElement_createTextRange_Proxy(
    IHTMLInputTextElement* This,
    IHTMLTxtRange **range);
void __RPC_STUB IHTMLInputTextElement_createTextRange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLInputTextElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLInputTextElement2 interface
 */
#ifndef __IHTMLInputTextElement2_INTERFACE_DEFINED__
#define __IHTMLInputTextElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLInputTextElement2, 0x3050f2d2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f2d2-98b5-11cf-bb82-00aa00bdce0b")
IHTMLInputTextElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_selectionStart(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_selectionStart(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_selectionEnd(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_selectionEnd(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE setSelectionRange(
        LONG start,
        LONG end) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLInputTextElement2, 0x3050f2d2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLInputTextElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLInputTextElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLInputTextElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLInputTextElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLInputTextElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLInputTextElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLInputTextElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLInputTextElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLInputTextElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_selectionStart)(
        IHTMLInputTextElement2* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_selectionStart)(
        IHTMLInputTextElement2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_selectionEnd)(
        IHTMLInputTextElement2* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_selectionEnd)(
        IHTMLInputTextElement2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *setSelectionRange)(
        IHTMLInputTextElement2* This,
        LONG start,
        LONG end);

    END_INTERFACE
} IHTMLInputTextElement2Vtbl;
interface IHTMLInputTextElement2 {
    CONST_VTBL IHTMLInputTextElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLInputTextElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLInputTextElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLInputTextElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLInputTextElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLInputTextElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLInputTextElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLInputTextElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLInputTextElement2 methods ***/
#define IHTMLInputTextElement2_put_selectionStart(This,v) (This)->lpVtbl->put_selectionStart(This,v)
#define IHTMLInputTextElement2_get_selectionStart(This,p) (This)->lpVtbl->get_selectionStart(This,p)
#define IHTMLInputTextElement2_put_selectionEnd(This,v) (This)->lpVtbl->put_selectionEnd(This,v)
#define IHTMLInputTextElement2_get_selectionEnd(This,p) (This)->lpVtbl->get_selectionEnd(This,p)
#define IHTMLInputTextElement2_setSelectionRange(This,start,end) (This)->lpVtbl->setSelectionRange(This,start,end)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLInputTextElement2_QueryInterface(IHTMLInputTextElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLInputTextElement2_AddRef(IHTMLInputTextElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLInputTextElement2_Release(IHTMLInputTextElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLInputTextElement2_GetTypeInfoCount(IHTMLInputTextElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLInputTextElement2_GetTypeInfo(IHTMLInputTextElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLInputTextElement2_GetIDsOfNames(IHTMLInputTextElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLInputTextElement2_Invoke(IHTMLInputTextElement2* 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);
}
/*** IHTMLInputTextElement2 methods ***/
static FORCEINLINE HRESULT IHTMLInputTextElement2_put_selectionStart(IHTMLInputTextElement2* This,LONG v) {
    return This->lpVtbl->put_selectionStart(This,v);
}
static FORCEINLINE HRESULT IHTMLInputTextElement2_get_selectionStart(IHTMLInputTextElement2* This,LONG *p) {
    return This->lpVtbl->get_selectionStart(This,p);
}
static FORCEINLINE HRESULT IHTMLInputTextElement2_put_selectionEnd(IHTMLInputTextElement2* This,LONG v) {
    return This->lpVtbl->put_selectionEnd(This,v);
}
static FORCEINLINE HRESULT IHTMLInputTextElement2_get_selectionEnd(IHTMLInputTextElement2* This,LONG *p) {
    return This->lpVtbl->get_selectionEnd(This,p);
}
static FORCEINLINE HRESULT IHTMLInputTextElement2_setSelectionRange(IHTMLInputTextElement2* This,LONG start,LONG end) {
    return This->lpVtbl->setSelectionRange(This,start,end);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLInputTextElement2_put_selectionStart_Proxy(
    IHTMLInputTextElement2* This,
    LONG v);
void __RPC_STUB IHTMLInputTextElement2_put_selectionStart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputTextElement2_get_selectionStart_Proxy(
    IHTMLInputTextElement2* This,
    LONG *p);
void __RPC_STUB IHTMLInputTextElement2_get_selectionStart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputTextElement2_put_selectionEnd_Proxy(
    IHTMLInputTextElement2* This,
    LONG v);
void __RPC_STUB IHTMLInputTextElement2_put_selectionEnd_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputTextElement2_get_selectionEnd_Proxy(
    IHTMLInputTextElement2* This,
    LONG *p);
void __RPC_STUB IHTMLInputTextElement2_get_selectionEnd_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputTextElement2_setSelectionRange_Proxy(
    IHTMLInputTextElement2* This,
    LONG start,
    LONG end);
void __RPC_STUB IHTMLInputTextElement2_setSelectionRange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLInputTextElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLInputFileElement interface
 */
#ifndef __IHTMLInputFileElement_INTERFACE_DEFINED__
#define __IHTMLInputFileElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLInputFileElement, 0x3050f2ad, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f2ad-98b5-11cf-bb82-00aa00bdce0b")
IHTMLInputFileElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_name(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_status(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_status(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_disabled(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_disabled(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_form(
        IHTMLFormElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_size(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_size(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_maxLength(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_maxLength(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE select(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onchange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onchange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onselect(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onselect(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_value(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_value(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLInputFileElement, 0x3050f2ad, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLInputFileElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLInputFileElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLInputFileElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLInputFileElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLInputFileElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLInputFileElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLInputFileElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLInputFileElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLInputFileElement methods ***/
    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLInputFileElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_name)(
        IHTMLInputFileElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_name)(
        IHTMLInputFileElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_status)(
        IHTMLInputFileElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_status)(
        IHTMLInputFileElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_disabled)(
        IHTMLInputFileElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_disabled)(
        IHTMLInputFileElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_form)(
        IHTMLInputFileElement* This,
        IHTMLFormElement **p);

    HRESULT (STDMETHODCALLTYPE *put_size)(
        IHTMLInputFileElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_size)(
        IHTMLInputFileElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_maxLength)(
        IHTMLInputFileElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_maxLength)(
        IHTMLInputFileElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *select)(
        IHTMLInputFileElement* This);

    HRESULT (STDMETHODCALLTYPE *put_onchange)(
        IHTMLInputFileElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onchange)(
        IHTMLInputFileElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onselect)(
        IHTMLInputFileElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onselect)(
        IHTMLInputFileElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_value)(
        IHTMLInputFileElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_value)(
        IHTMLInputFileElement* This,
        BSTR *p);

    END_INTERFACE
} IHTMLInputFileElementVtbl;
interface IHTMLInputFileElement {
    CONST_VTBL IHTMLInputFileElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLInputFileElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLInputFileElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLInputFileElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLInputFileElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLInputFileElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLInputFileElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLInputFileElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLInputFileElement methods ***/
#define IHTMLInputFileElement_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#define IHTMLInputFileElement_put_name(This,v) (This)->lpVtbl->put_name(This,v)
#define IHTMLInputFileElement_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#define IHTMLInputFileElement_put_status(This,v) (This)->lpVtbl->put_status(This,v)
#define IHTMLInputFileElement_get_status(This,p) (This)->lpVtbl->get_status(This,p)
#define IHTMLInputFileElement_put_disabled(This,v) (This)->lpVtbl->put_disabled(This,v)
#define IHTMLInputFileElement_get_disabled(This,p) (This)->lpVtbl->get_disabled(This,p)
#define IHTMLInputFileElement_get_form(This,p) (This)->lpVtbl->get_form(This,p)
#define IHTMLInputFileElement_put_size(This,v) (This)->lpVtbl->put_size(This,v)
#define IHTMLInputFileElement_get_size(This,p) (This)->lpVtbl->get_size(This,p)
#define IHTMLInputFileElement_put_maxLength(This,v) (This)->lpVtbl->put_maxLength(This,v)
#define IHTMLInputFileElement_get_maxLength(This,p) (This)->lpVtbl->get_maxLength(This,p)
#define IHTMLInputFileElement_select(This) (This)->lpVtbl->select(This)
#define IHTMLInputFileElement_put_onchange(This,v) (This)->lpVtbl->put_onchange(This,v)
#define IHTMLInputFileElement_get_onchange(This,p) (This)->lpVtbl->get_onchange(This,p)
#define IHTMLInputFileElement_put_onselect(This,v) (This)->lpVtbl->put_onselect(This,v)
#define IHTMLInputFileElement_get_onselect(This,p) (This)->lpVtbl->get_onselect(This,p)
#define IHTMLInputFileElement_put_value(This,v) (This)->lpVtbl->put_value(This,v)
#define IHTMLInputFileElement_get_value(This,p) (This)->lpVtbl->get_value(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLInputFileElement_QueryInterface(IHTMLInputFileElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLInputFileElement_AddRef(IHTMLInputFileElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLInputFileElement_Release(IHTMLInputFileElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLInputFileElement_GetTypeInfoCount(IHTMLInputFileElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLInputFileElement_GetTypeInfo(IHTMLInputFileElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLInputFileElement_GetIDsOfNames(IHTMLInputFileElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLInputFileElement_Invoke(IHTMLInputFileElement* 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);
}
/*** IHTMLInputFileElement methods ***/
static FORCEINLINE HRESULT IHTMLInputFileElement_get_type(IHTMLInputFileElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static FORCEINLINE HRESULT IHTMLInputFileElement_put_name(IHTMLInputFileElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static FORCEINLINE HRESULT IHTMLInputFileElement_get_name(IHTMLInputFileElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static FORCEINLINE HRESULT IHTMLInputFileElement_put_status(IHTMLInputFileElement* This,VARIANT v) {
    return This->lpVtbl->put_status(This,v);
}
static FORCEINLINE HRESULT IHTMLInputFileElement_get_status(IHTMLInputFileElement* This,VARIANT *p) {
    return This->lpVtbl->get_status(This,p);
}
static FORCEINLINE HRESULT IHTMLInputFileElement_put_disabled(IHTMLInputFileElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_disabled(This,v);
}
static FORCEINLINE HRESULT IHTMLInputFileElement_get_disabled(IHTMLInputFileElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_disabled(This,p);
}
static FORCEINLINE HRESULT IHTMLInputFileElement_get_form(IHTMLInputFileElement* This,IHTMLFormElement **p) {
    return This->lpVtbl->get_form(This,p);
}
static FORCEINLINE HRESULT IHTMLInputFileElement_put_size(IHTMLInputFileElement* This,LONG v) {
    return This->lpVtbl->put_size(This,v);
}
static FORCEINLINE HRESULT IHTMLInputFileElement_get_size(IHTMLInputFileElement* This,LONG *p) {
    return This->lpVtbl->get_size(This,p);
}
static FORCEINLINE HRESULT IHTMLInputFileElement_put_maxLength(IHTMLInputFileElement* This,LONG v) {
    return This->lpVtbl->put_maxLength(This,v);
}
static FORCEINLINE HRESULT IHTMLInputFileElement_get_maxLength(IHTMLInputFileElement* This,LONG *p) {
    return This->lpVtbl->get_maxLength(This,p);
}
static FORCEINLINE HRESULT IHTMLInputFileElement_select(IHTMLInputFileElement* This) {
    return This->lpVtbl->select(This);
}
static FORCEINLINE HRESULT IHTMLInputFileElement_put_onchange(IHTMLInputFileElement* This,VARIANT v) {
    return This->lpVtbl->put_onchange(This,v);
}
static FORCEINLINE HRESULT IHTMLInputFileElement_get_onchange(IHTMLInputFileElement* This,VARIANT *p) {
    return This->lpVtbl->get_onchange(This,p);
}
static FORCEINLINE HRESULT IHTMLInputFileElement_put_onselect(IHTMLInputFileElement* This,VARIANT v) {
    return This->lpVtbl->put_onselect(This,v);
}
static FORCEINLINE HRESULT IHTMLInputFileElement_get_onselect(IHTMLInputFileElement* This,VARIANT *p) {
    return This->lpVtbl->get_onselect(This,p);
}
static FORCEINLINE HRESULT IHTMLInputFileElement_put_value(IHTMLInputFileElement* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static FORCEINLINE HRESULT IHTMLInputFileElement_get_value(IHTMLInputFileElement* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLInputFileElement_get_type_Proxy(
    IHTMLInputFileElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputFileElement_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputFileElement_put_name_Proxy(
    IHTMLInputFileElement* This,
    BSTR v);
void __RPC_STUB IHTMLInputFileElement_put_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputFileElement_get_name_Proxy(
    IHTMLInputFileElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputFileElement_get_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputFileElement_put_status_Proxy(
    IHTMLInputFileElement* This,
    VARIANT v);
void __RPC_STUB IHTMLInputFileElement_put_status_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputFileElement_get_status_Proxy(
    IHTMLInputFileElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLInputFileElement_get_status_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputFileElement_put_disabled_Proxy(
    IHTMLInputFileElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLInputFileElement_put_disabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputFileElement_get_disabled_Proxy(
    IHTMLInputFileElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLInputFileElement_get_disabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputFileElement_get_form_Proxy(
    IHTMLInputFileElement* This,
    IHTMLFormElement **p);
void __RPC_STUB IHTMLInputFileElement_get_form_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputFileElement_put_size_Proxy(
    IHTMLInputFileElement* This,
    LONG v);
void __RPC_STUB IHTMLInputFileElement_put_size_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputFileElement_get_size_Proxy(
    IHTMLInputFileElement* This,
    LONG *p);
void __RPC_STUB IHTMLInputFileElement_get_size_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputFileElement_put_maxLength_Proxy(
    IHTMLInputFileElement* This,
    LONG v);
void __RPC_STUB IHTMLInputFileElement_put_maxLength_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputFileElement_get_maxLength_Proxy(
    IHTMLInputFileElement* This,
    LONG *p);
void __RPC_STUB IHTMLInputFileElement_get_maxLength_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputFileElement_select_Proxy(
    IHTMLInputFileElement* This);
void __RPC_STUB IHTMLInputFileElement_select_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputFileElement_put_onchange_Proxy(
    IHTMLInputFileElement* This,
    VARIANT v);
void __RPC_STUB IHTMLInputFileElement_put_onchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputFileElement_get_onchange_Proxy(
    IHTMLInputFileElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLInputFileElement_get_onchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputFileElement_put_onselect_Proxy(
    IHTMLInputFileElement* This,
    VARIANT v);
void __RPC_STUB IHTMLInputFileElement_put_onselect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputFileElement_get_onselect_Proxy(
    IHTMLInputFileElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLInputFileElement_get_onselect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputFileElement_put_value_Proxy(
    IHTMLInputFileElement* This,
    BSTR v);
void __RPC_STUB IHTMLInputFileElement_put_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputFileElement_get_value_Proxy(
    IHTMLInputFileElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputFileElement_get_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLInputFileElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLOptionButtonElement interface
 */
#ifndef __IHTMLOptionButtonElement_INTERFACE_DEFINED__
#define __IHTMLOptionButtonElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLOptionButtonElement, 0x3050f2bc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f2bc-98b5-11cf-bb82-00aa00bdce0b")
IHTMLOptionButtonElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_value(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_value(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_name(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_checked(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_checked(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_defaultChecked(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_defaultChecked(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onchange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onchange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_disabled(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_disabled(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_status(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_status(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_indeterminate(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_indeterminate(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_form(
        IHTMLFormElement **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLOptionButtonElement, 0x3050f2bc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLOptionButtonElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLOptionButtonElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLOptionButtonElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLOptionButtonElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLOptionButtonElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLOptionButtonElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLOptionButtonElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLOptionButtonElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLOptionButtonElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_value)(
        IHTMLOptionButtonElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_value)(
        IHTMLOptionButtonElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLOptionButtonElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_name)(
        IHTMLOptionButtonElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_name)(
        IHTMLOptionButtonElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_checked)(
        IHTMLOptionButtonElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_checked)(
        IHTMLOptionButtonElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_defaultChecked)(
        IHTMLOptionButtonElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_defaultChecked)(
        IHTMLOptionButtonElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_onchange)(
        IHTMLOptionButtonElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onchange)(
        IHTMLOptionButtonElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_disabled)(
        IHTMLOptionButtonElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_disabled)(
        IHTMLOptionButtonElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_status)(
        IHTMLOptionButtonElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_status)(
        IHTMLOptionButtonElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_indeterminate)(
        IHTMLOptionButtonElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_indeterminate)(
        IHTMLOptionButtonElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_form)(
        IHTMLOptionButtonElement* This,
        IHTMLFormElement **p);

    END_INTERFACE
} IHTMLOptionButtonElementVtbl;
interface IHTMLOptionButtonElement {
    CONST_VTBL IHTMLOptionButtonElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLOptionButtonElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLOptionButtonElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLOptionButtonElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLOptionButtonElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLOptionButtonElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLOptionButtonElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLOptionButtonElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLOptionButtonElement methods ***/
#define IHTMLOptionButtonElement_put_value(This,v) (This)->lpVtbl->put_value(This,v)
#define IHTMLOptionButtonElement_get_value(This,p) (This)->lpVtbl->get_value(This,p)
#define IHTMLOptionButtonElement_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#define IHTMLOptionButtonElement_put_name(This,v) (This)->lpVtbl->put_name(This,v)
#define IHTMLOptionButtonElement_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#define IHTMLOptionButtonElement_put_checked(This,v) (This)->lpVtbl->put_checked(This,v)
#define IHTMLOptionButtonElement_get_checked(This,p) (This)->lpVtbl->get_checked(This,p)
#define IHTMLOptionButtonElement_put_defaultChecked(This,v) (This)->lpVtbl->put_defaultChecked(This,v)
#define IHTMLOptionButtonElement_get_defaultChecked(This,p) (This)->lpVtbl->get_defaultChecked(This,p)
#define IHTMLOptionButtonElement_put_onchange(This,v) (This)->lpVtbl->put_onchange(This,v)
#define IHTMLOptionButtonElement_get_onchange(This,p) (This)->lpVtbl->get_onchange(This,p)
#define IHTMLOptionButtonElement_put_disabled(This,v) (This)->lpVtbl->put_disabled(This,v)
#define IHTMLOptionButtonElement_get_disabled(This,p) (This)->lpVtbl->get_disabled(This,p)
#define IHTMLOptionButtonElement_put_status(This,v) (This)->lpVtbl->put_status(This,v)
#define IHTMLOptionButtonElement_get_status(This,p) (This)->lpVtbl->get_status(This,p)
#define IHTMLOptionButtonElement_put_indeterminate(This,v) (This)->lpVtbl->put_indeterminate(This,v)
#define IHTMLOptionButtonElement_get_indeterminate(This,p) (This)->lpVtbl->get_indeterminate(This,p)
#define IHTMLOptionButtonElement_get_form(This,p) (This)->lpVtbl->get_form(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLOptionButtonElement_QueryInterface(IHTMLOptionButtonElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLOptionButtonElement_AddRef(IHTMLOptionButtonElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLOptionButtonElement_Release(IHTMLOptionButtonElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLOptionButtonElement_GetTypeInfoCount(IHTMLOptionButtonElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLOptionButtonElement_GetTypeInfo(IHTMLOptionButtonElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLOptionButtonElement_GetIDsOfNames(IHTMLOptionButtonElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLOptionButtonElement_Invoke(IHTMLOptionButtonElement* 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);
}
/*** IHTMLOptionButtonElement methods ***/
static FORCEINLINE HRESULT IHTMLOptionButtonElement_put_value(IHTMLOptionButtonElement* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static FORCEINLINE HRESULT IHTMLOptionButtonElement_get_value(IHTMLOptionButtonElement* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
static FORCEINLINE HRESULT IHTMLOptionButtonElement_get_type(IHTMLOptionButtonElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static FORCEINLINE HRESULT IHTMLOptionButtonElement_put_name(IHTMLOptionButtonElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static FORCEINLINE HRESULT IHTMLOptionButtonElement_get_name(IHTMLOptionButtonElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static FORCEINLINE HRESULT IHTMLOptionButtonElement_put_checked(IHTMLOptionButtonElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_checked(This,v);
}
static FORCEINLINE HRESULT IHTMLOptionButtonElement_get_checked(IHTMLOptionButtonElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_checked(This,p);
}
static FORCEINLINE HRESULT IHTMLOptionButtonElement_put_defaultChecked(IHTMLOptionButtonElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_defaultChecked(This,v);
}
static FORCEINLINE HRESULT IHTMLOptionButtonElement_get_defaultChecked(IHTMLOptionButtonElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_defaultChecked(This,p);
}
static FORCEINLINE HRESULT IHTMLOptionButtonElement_put_onchange(IHTMLOptionButtonElement* This,VARIANT v) {
    return This->lpVtbl->put_onchange(This,v);
}
static FORCEINLINE HRESULT IHTMLOptionButtonElement_get_onchange(IHTMLOptionButtonElement* This,VARIANT *p) {
    return This->lpVtbl->get_onchange(This,p);
}
static FORCEINLINE HRESULT IHTMLOptionButtonElement_put_disabled(IHTMLOptionButtonElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_disabled(This,v);
}
static FORCEINLINE HRESULT IHTMLOptionButtonElement_get_disabled(IHTMLOptionButtonElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_disabled(This,p);
}
static FORCEINLINE HRESULT IHTMLOptionButtonElement_put_status(IHTMLOptionButtonElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_status(This,v);
}
static FORCEINLINE HRESULT IHTMLOptionButtonElement_get_status(IHTMLOptionButtonElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_status(This,p);
}
static FORCEINLINE HRESULT IHTMLOptionButtonElement_put_indeterminate(IHTMLOptionButtonElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_indeterminate(This,v);
}
static FORCEINLINE HRESULT IHTMLOptionButtonElement_get_indeterminate(IHTMLOptionButtonElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_indeterminate(This,p);
}
static FORCEINLINE HRESULT IHTMLOptionButtonElement_get_form(IHTMLOptionButtonElement* This,IHTMLFormElement **p) {
    return This->lpVtbl->get_form(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLOptionButtonElement_put_value_Proxy(
    IHTMLOptionButtonElement* This,
    BSTR v);
void __RPC_STUB IHTMLOptionButtonElement_put_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionButtonElement_get_value_Proxy(
    IHTMLOptionButtonElement* This,
    BSTR *p);
void __RPC_STUB IHTMLOptionButtonElement_get_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionButtonElement_get_type_Proxy(
    IHTMLOptionButtonElement* This,
    BSTR *p);
void __RPC_STUB IHTMLOptionButtonElement_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionButtonElement_put_name_Proxy(
    IHTMLOptionButtonElement* This,
    BSTR v);
void __RPC_STUB IHTMLOptionButtonElement_put_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionButtonElement_get_name_Proxy(
    IHTMLOptionButtonElement* This,
    BSTR *p);
void __RPC_STUB IHTMLOptionButtonElement_get_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionButtonElement_put_checked_Proxy(
    IHTMLOptionButtonElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLOptionButtonElement_put_checked_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionButtonElement_get_checked_Proxy(
    IHTMLOptionButtonElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLOptionButtonElement_get_checked_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionButtonElement_put_defaultChecked_Proxy(
    IHTMLOptionButtonElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLOptionButtonElement_put_defaultChecked_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionButtonElement_get_defaultChecked_Proxy(
    IHTMLOptionButtonElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLOptionButtonElement_get_defaultChecked_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionButtonElement_put_onchange_Proxy(
    IHTMLOptionButtonElement* This,
    VARIANT v);
void __RPC_STUB IHTMLOptionButtonElement_put_onchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionButtonElement_get_onchange_Proxy(
    IHTMLOptionButtonElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLOptionButtonElement_get_onchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionButtonElement_put_disabled_Proxy(
    IHTMLOptionButtonElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLOptionButtonElement_put_disabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionButtonElement_get_disabled_Proxy(
    IHTMLOptionButtonElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLOptionButtonElement_get_disabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionButtonElement_put_status_Proxy(
    IHTMLOptionButtonElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLOptionButtonElement_put_status_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionButtonElement_get_status_Proxy(
    IHTMLOptionButtonElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLOptionButtonElement_get_status_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionButtonElement_put_indeterminate_Proxy(
    IHTMLOptionButtonElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLOptionButtonElement_put_indeterminate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionButtonElement_get_indeterminate_Proxy(
    IHTMLOptionButtonElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLOptionButtonElement_get_indeterminate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionButtonElement_get_form_Proxy(
    IHTMLOptionButtonElement* This,
    IHTMLFormElement **p);
void __RPC_STUB IHTMLOptionButtonElement_get_form_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLOptionButtonElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLInputImage interface
 */
#ifndef __IHTMLInputImage_INTERFACE_DEFINED__
#define __IHTMLInputImage_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLInputImage, 0x3050f2c2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f2c2-98b5-11cf-bb82-00aa00bdce0b")
IHTMLInputImage : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_disabled(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_disabled(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_border(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_border(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_vspace(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_vspace(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_hspace(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_hspace(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_alt(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_alt(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_src(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_src(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_lowsrc(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_lowsrc(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_vrml(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_vrml(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_dynsrc(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_dynsrc(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_readyState(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_complete(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_loop(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_loop(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_align(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_align(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onload(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onload(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onerror(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onerror(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onabort(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onabort(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_name(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_width(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_width(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_height(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_height(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_start(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_start(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLInputImage, 0x3050f2c2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLInputImageVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLInputImage* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLInputImage* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLInputImage* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLInputImage* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLInputImage* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLInputImage* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLInputImage* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLInputImage methods ***/
    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLInputImage* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_disabled)(
        IHTMLInputImage* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_disabled)(
        IHTMLInputImage* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_border)(
        IHTMLInputImage* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_border)(
        IHTMLInputImage* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_vspace)(
        IHTMLInputImage* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_vspace)(
        IHTMLInputImage* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_hspace)(
        IHTMLInputImage* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_hspace)(
        IHTMLInputImage* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_alt)(
        IHTMLInputImage* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_alt)(
        IHTMLInputImage* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_src)(
        IHTMLInputImage* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_src)(
        IHTMLInputImage* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_lowsrc)(
        IHTMLInputImage* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_lowsrc)(
        IHTMLInputImage* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_vrml)(
        IHTMLInputImage* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_vrml)(
        IHTMLInputImage* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_dynsrc)(
        IHTMLInputImage* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_dynsrc)(
        IHTMLInputImage* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_readyState)(
        IHTMLInputImage* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_complete)(
        IHTMLInputImage* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_loop)(
        IHTMLInputImage* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_loop)(
        IHTMLInputImage* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_align)(
        IHTMLInputImage* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_align)(
        IHTMLInputImage* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_onload)(
        IHTMLInputImage* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onload)(
        IHTMLInputImage* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onerror)(
        IHTMLInputImage* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onerror)(
        IHTMLInputImage* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onabort)(
        IHTMLInputImage* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onabort)(
        IHTMLInputImage* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_name)(
        IHTMLInputImage* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_name)(
        IHTMLInputImage* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_width)(
        IHTMLInputImage* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_width)(
        IHTMLInputImage* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_height)(
        IHTMLInputImage* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_height)(
        IHTMLInputImage* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_start)(
        IHTMLInputImage* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_start)(
        IHTMLInputImage* This,
        BSTR *p);

    END_INTERFACE
} IHTMLInputImageVtbl;
interface IHTMLInputImage {
    CONST_VTBL IHTMLInputImageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLInputImage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLInputImage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLInputImage_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLInputImage_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLInputImage_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLInputImage_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLInputImage_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLInputImage methods ***/
#define IHTMLInputImage_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#define IHTMLInputImage_put_disabled(This,v) (This)->lpVtbl->put_disabled(This,v)
#define IHTMLInputImage_get_disabled(This,p) (This)->lpVtbl->get_disabled(This,p)
#define IHTMLInputImage_put_border(This,v) (This)->lpVtbl->put_border(This,v)
#define IHTMLInputImage_get_border(This,p) (This)->lpVtbl->get_border(This,p)
#define IHTMLInputImage_put_vspace(This,v) (This)->lpVtbl->put_vspace(This,v)
#define IHTMLInputImage_get_vspace(This,p) (This)->lpVtbl->get_vspace(This,p)
#define IHTMLInputImage_put_hspace(This,v) (This)->lpVtbl->put_hspace(This,v)
#define IHTMLInputImage_get_hspace(This,p) (This)->lpVtbl->get_hspace(This,p)
#define IHTMLInputImage_put_alt(This,v) (This)->lpVtbl->put_alt(This,v)
#define IHTMLInputImage_get_alt(This,p) (This)->lpVtbl->get_alt(This,p)
#define IHTMLInputImage_put_src(This,v) (This)->lpVtbl->put_src(This,v)
#define IHTMLInputImage_get_src(This,p) (This)->lpVtbl->get_src(This,p)
#define IHTMLInputImage_put_lowsrc(This,v) (This)->lpVtbl->put_lowsrc(This,v)
#define IHTMLInputImage_get_lowsrc(This,p) (This)->lpVtbl->get_lowsrc(This,p)
#define IHTMLInputImage_put_vrml(This,v) (This)->lpVtbl->put_vrml(This,v)
#define IHTMLInputImage_get_vrml(This,p) (This)->lpVtbl->get_vrml(This,p)
#define IHTMLInputImage_put_dynsrc(This,v) (This)->lpVtbl->put_dynsrc(This,v)
#define IHTMLInputImage_get_dynsrc(This,p) (This)->lpVtbl->get_dynsrc(This,p)
#define IHTMLInputImage_get_readyState(This,p) (This)->lpVtbl->get_readyState(This,p)
#define IHTMLInputImage_get_complete(This,p) (This)->lpVtbl->get_complete(This,p)
#define IHTMLInputImage_put_loop(This,v) (This)->lpVtbl->put_loop(This,v)
#define IHTMLInputImage_get_loop(This,p) (This)->lpVtbl->get_loop(This,p)
#define IHTMLInputImage_put_align(This,v) (This)->lpVtbl->put_align(This,v)
#define IHTMLInputImage_get_align(This,p) (This)->lpVtbl->get_align(This,p)
#define IHTMLInputImage_put_onload(This,v) (This)->lpVtbl->put_onload(This,v)
#define IHTMLInputImage_get_onload(This,p) (This)->lpVtbl->get_onload(This,p)
#define IHTMLInputImage_put_onerror(This,v) (This)->lpVtbl->put_onerror(This,v)
#define IHTMLInputImage_get_onerror(This,p) (This)->lpVtbl->get_onerror(This,p)
#define IHTMLInputImage_put_onabort(This,v) (This)->lpVtbl->put_onabort(This,v)
#define IHTMLInputImage_get_onabort(This,p) (This)->lpVtbl->get_onabort(This,p)
#define IHTMLInputImage_put_name(This,v) (This)->lpVtbl->put_name(This,v)
#define IHTMLInputImage_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#define IHTMLInputImage_put_width(This,v) (This)->lpVtbl->put_width(This,v)
#define IHTMLInputImage_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#define IHTMLInputImage_put_height(This,v) (This)->lpVtbl->put_height(This,v)
#define IHTMLInputImage_get_height(This,p) (This)->lpVtbl->get_height(This,p)
#define IHTMLInputImage_put_start(This,v) (This)->lpVtbl->put_start(This,v)
#define IHTMLInputImage_get_start(This,p) (This)->lpVtbl->get_start(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLInputImage_QueryInterface(IHTMLInputImage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLInputImage_AddRef(IHTMLInputImage* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLInputImage_Release(IHTMLInputImage* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLInputImage_GetTypeInfoCount(IHTMLInputImage* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLInputImage_GetTypeInfo(IHTMLInputImage* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLInputImage_GetIDsOfNames(IHTMLInputImage* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLInputImage_Invoke(IHTMLInputImage* 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);
}
/*** IHTMLInputImage methods ***/
static FORCEINLINE HRESULT IHTMLInputImage_get_type(IHTMLInputImage* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static FORCEINLINE HRESULT IHTMLInputImage_put_disabled(IHTMLInputImage* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_disabled(This,v);
}
static FORCEINLINE HRESULT IHTMLInputImage_get_disabled(IHTMLInputImage* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_disabled(This,p);
}
static FORCEINLINE HRESULT IHTMLInputImage_put_border(IHTMLInputImage* This,VARIANT v) {
    return This->lpVtbl->put_border(This,v);
}
static FORCEINLINE HRESULT IHTMLInputImage_get_border(IHTMLInputImage* This,VARIANT *p) {
    return This->lpVtbl->get_border(This,p);
}
static FORCEINLINE HRESULT IHTMLInputImage_put_vspace(IHTMLInputImage* This,LONG v) {
    return This->lpVtbl->put_vspace(This,v);
}
static FORCEINLINE HRESULT IHTMLInputImage_get_vspace(IHTMLInputImage* This,LONG *p) {
    return This->lpVtbl->get_vspace(This,p);
}
static FORCEINLINE HRESULT IHTMLInputImage_put_hspace(IHTMLInputImage* This,LONG v) {
    return This->lpVtbl->put_hspace(This,v);
}
static FORCEINLINE HRESULT IHTMLInputImage_get_hspace(IHTMLInputImage* This,LONG *p) {
    return This->lpVtbl->get_hspace(This,p);
}
static FORCEINLINE HRESULT IHTMLInputImage_put_alt(IHTMLInputImage* This,BSTR v) {
    return This->lpVtbl->put_alt(This,v);
}
static FORCEINLINE HRESULT IHTMLInputImage_get_alt(IHTMLInputImage* This,BSTR *p) {
    return This->lpVtbl->get_alt(This,p);
}
static FORCEINLINE HRESULT IHTMLInputImage_put_src(IHTMLInputImage* This,BSTR v) {
    return This->lpVtbl->put_src(This,v);
}
static FORCEINLINE HRESULT IHTMLInputImage_get_src(IHTMLInputImage* This,BSTR *p) {
    return This->lpVtbl->get_src(This,p);
}
static FORCEINLINE HRESULT IHTMLInputImage_put_lowsrc(IHTMLInputImage* This,BSTR v) {
    return This->lpVtbl->put_lowsrc(This,v);
}
static FORCEINLINE HRESULT IHTMLInputImage_get_lowsrc(IHTMLInputImage* This,BSTR *p) {
    return This->lpVtbl->get_lowsrc(This,p);
}
static FORCEINLINE HRESULT IHTMLInputImage_put_vrml(IHTMLInputImage* This,BSTR v) {
    return This->lpVtbl->put_vrml(This,v);
}
static FORCEINLINE HRESULT IHTMLInputImage_get_vrml(IHTMLInputImage* This,BSTR *p) {
    return This->lpVtbl->get_vrml(This,p);
}
static FORCEINLINE HRESULT IHTMLInputImage_put_dynsrc(IHTMLInputImage* This,BSTR v) {
    return This->lpVtbl->put_dynsrc(This,v);
}
static FORCEINLINE HRESULT IHTMLInputImage_get_dynsrc(IHTMLInputImage* This,BSTR *p) {
    return This->lpVtbl->get_dynsrc(This,p);
}
static FORCEINLINE HRESULT IHTMLInputImage_get_readyState(IHTMLInputImage* This,BSTR *p) {
    return This->lpVtbl->get_readyState(This,p);
}
static FORCEINLINE HRESULT IHTMLInputImage_get_complete(IHTMLInputImage* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_complete(This,p);
}
static FORCEINLINE HRESULT IHTMLInputImage_put_loop(IHTMLInputImage* This,VARIANT v) {
    return This->lpVtbl->put_loop(This,v);
}
static FORCEINLINE HRESULT IHTMLInputImage_get_loop(IHTMLInputImage* This,VARIANT *p) {
    return This->lpVtbl->get_loop(This,p);
}
static FORCEINLINE HRESULT IHTMLInputImage_put_align(IHTMLInputImage* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static FORCEINLINE HRESULT IHTMLInputImage_get_align(IHTMLInputImage* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
static FORCEINLINE HRESULT IHTMLInputImage_put_onload(IHTMLInputImage* This,VARIANT v) {
    return This->lpVtbl->put_onload(This,v);
}
static FORCEINLINE HRESULT IHTMLInputImage_get_onload(IHTMLInputImage* This,VARIANT *p) {
    return This->lpVtbl->get_onload(This,p);
}
static FORCEINLINE HRESULT IHTMLInputImage_put_onerror(IHTMLInputImage* This,VARIANT v) {
    return This->lpVtbl->put_onerror(This,v);
}
static FORCEINLINE HRESULT IHTMLInputImage_get_onerror(IHTMLInputImage* This,VARIANT *p) {
    return This->lpVtbl->get_onerror(This,p);
}
static FORCEINLINE HRESULT IHTMLInputImage_put_onabort(IHTMLInputImage* This,VARIANT v) {
    return This->lpVtbl->put_onabort(This,v);
}
static FORCEINLINE HRESULT IHTMLInputImage_get_onabort(IHTMLInputImage* This,VARIANT *p) {
    return This->lpVtbl->get_onabort(This,p);
}
static FORCEINLINE HRESULT IHTMLInputImage_put_name(IHTMLInputImage* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static FORCEINLINE HRESULT IHTMLInputImage_get_name(IHTMLInputImage* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static FORCEINLINE HRESULT IHTMLInputImage_put_width(IHTMLInputImage* This,LONG v) {
    return This->lpVtbl->put_width(This,v);
}
static FORCEINLINE HRESULT IHTMLInputImage_get_width(IHTMLInputImage* This,LONG *p) {
    return This->lpVtbl->get_width(This,p);
}
static FORCEINLINE HRESULT IHTMLInputImage_put_height(IHTMLInputImage* This,LONG v) {
    return This->lpVtbl->put_height(This,v);
}
static FORCEINLINE HRESULT IHTMLInputImage_get_height(IHTMLInputImage* This,LONG *p) {
    return This->lpVtbl->get_height(This,p);
}
static FORCEINLINE HRESULT IHTMLInputImage_put_start(IHTMLInputImage* This,BSTR v) {
    return This->lpVtbl->put_start(This,v);
}
static FORCEINLINE HRESULT IHTMLInputImage_get_start(IHTMLInputImage* This,BSTR *p) {
    return This->lpVtbl->get_start(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLInputImage_get_type_Proxy(
    IHTMLInputImage* This,
    BSTR *p);
void __RPC_STUB IHTMLInputImage_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_put_disabled_Proxy(
    IHTMLInputImage* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLInputImage_put_disabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_get_disabled_Proxy(
    IHTMLInputImage* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLInputImage_get_disabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_put_border_Proxy(
    IHTMLInputImage* This,
    VARIANT v);
void __RPC_STUB IHTMLInputImage_put_border_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_get_border_Proxy(
    IHTMLInputImage* This,
    VARIANT *p);
void __RPC_STUB IHTMLInputImage_get_border_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_put_vspace_Proxy(
    IHTMLInputImage* This,
    LONG v);
void __RPC_STUB IHTMLInputImage_put_vspace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_get_vspace_Proxy(
    IHTMLInputImage* This,
    LONG *p);
void __RPC_STUB IHTMLInputImage_get_vspace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_put_hspace_Proxy(
    IHTMLInputImage* This,
    LONG v);
void __RPC_STUB IHTMLInputImage_put_hspace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_get_hspace_Proxy(
    IHTMLInputImage* This,
    LONG *p);
void __RPC_STUB IHTMLInputImage_get_hspace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_put_alt_Proxy(
    IHTMLInputImage* This,
    BSTR v);
void __RPC_STUB IHTMLInputImage_put_alt_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_get_alt_Proxy(
    IHTMLInputImage* This,
    BSTR *p);
void __RPC_STUB IHTMLInputImage_get_alt_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_put_src_Proxy(
    IHTMLInputImage* This,
    BSTR v);
void __RPC_STUB IHTMLInputImage_put_src_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_get_src_Proxy(
    IHTMLInputImage* This,
    BSTR *p);
void __RPC_STUB IHTMLInputImage_get_src_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_put_lowsrc_Proxy(
    IHTMLInputImage* This,
    BSTR v);
void __RPC_STUB IHTMLInputImage_put_lowsrc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_get_lowsrc_Proxy(
    IHTMLInputImage* This,
    BSTR *p);
void __RPC_STUB IHTMLInputImage_get_lowsrc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_put_vrml_Proxy(
    IHTMLInputImage* This,
    BSTR v);
void __RPC_STUB IHTMLInputImage_put_vrml_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_get_vrml_Proxy(
    IHTMLInputImage* This,
    BSTR *p);
void __RPC_STUB IHTMLInputImage_get_vrml_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_put_dynsrc_Proxy(
    IHTMLInputImage* This,
    BSTR v);
void __RPC_STUB IHTMLInputImage_put_dynsrc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_get_dynsrc_Proxy(
    IHTMLInputImage* This,
    BSTR *p);
void __RPC_STUB IHTMLInputImage_get_dynsrc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_get_readyState_Proxy(
    IHTMLInputImage* This,
    BSTR *p);
void __RPC_STUB IHTMLInputImage_get_readyState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_get_complete_Proxy(
    IHTMLInputImage* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLInputImage_get_complete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_put_loop_Proxy(
    IHTMLInputImage* This,
    VARIANT v);
void __RPC_STUB IHTMLInputImage_put_loop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_get_loop_Proxy(
    IHTMLInputImage* This,
    VARIANT *p);
void __RPC_STUB IHTMLInputImage_get_loop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_put_align_Proxy(
    IHTMLInputImage* This,
    BSTR v);
void __RPC_STUB IHTMLInputImage_put_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_get_align_Proxy(
    IHTMLInputImage* This,
    BSTR *p);
void __RPC_STUB IHTMLInputImage_get_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_put_onload_Proxy(
    IHTMLInputImage* This,
    VARIANT v);
void __RPC_STUB IHTMLInputImage_put_onload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_get_onload_Proxy(
    IHTMLInputImage* This,
    VARIANT *p);
void __RPC_STUB IHTMLInputImage_get_onload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_put_onerror_Proxy(
    IHTMLInputImage* This,
    VARIANT v);
void __RPC_STUB IHTMLInputImage_put_onerror_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_get_onerror_Proxy(
    IHTMLInputImage* This,
    VARIANT *p);
void __RPC_STUB IHTMLInputImage_get_onerror_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_put_onabort_Proxy(
    IHTMLInputImage* This,
    VARIANT v);
void __RPC_STUB IHTMLInputImage_put_onabort_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_get_onabort_Proxy(
    IHTMLInputImage* This,
    VARIANT *p);
void __RPC_STUB IHTMLInputImage_get_onabort_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_put_name_Proxy(
    IHTMLInputImage* This,
    BSTR v);
void __RPC_STUB IHTMLInputImage_put_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_get_name_Proxy(
    IHTMLInputImage* This,
    BSTR *p);
void __RPC_STUB IHTMLInputImage_get_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_put_width_Proxy(
    IHTMLInputImage* This,
    LONG v);
void __RPC_STUB IHTMLInputImage_put_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_get_width_Proxy(
    IHTMLInputImage* This,
    LONG *p);
void __RPC_STUB IHTMLInputImage_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_put_height_Proxy(
    IHTMLInputImage* This,
    LONG v);
void __RPC_STUB IHTMLInputImage_put_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_get_height_Proxy(
    IHTMLInputImage* This,
    LONG *p);
void __RPC_STUB IHTMLInputImage_get_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_put_start_Proxy(
    IHTMLInputImage* This,
    BSTR v);
void __RPC_STUB IHTMLInputImage_put_start_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputImage_get_start_Proxy(
    IHTMLInputImage* This,
    BSTR *p);
void __RPC_STUB IHTMLInputImage_get_start_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLInputImage_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLInputRangeElement interface
 */
#ifndef __IHTMLInputRangeElement_INTERFACE_DEFINED__
#define __IHTMLInputRangeElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLInputRangeElement, 0x3050f2d4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f2d4-98b5-11cf-bb82-00aa00bdce0b")
IHTMLInputRangeElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_disabled(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_disabled(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_alt(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_alt(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_name(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_value(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_value(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_min(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_min(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_max(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_max(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_step(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_step(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_valueAsNumber(
        double v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_valueAsNumber(
        double *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE stepUp(
        LONG n = 1) = 0;

    virtual HRESULT STDMETHODCALLTYPE stepDown(
        LONG n = 1) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLInputRangeElement, 0x3050f2d4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLInputRangeElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLInputRangeElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLInputRangeElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLInputRangeElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLInputRangeElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLInputRangeElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLInputRangeElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLInputRangeElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLInputRangeElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_disabled)(
        IHTMLInputRangeElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_disabled)(
        IHTMLInputRangeElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLInputRangeElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_alt)(
        IHTMLInputRangeElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_alt)(
        IHTMLInputRangeElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_name)(
        IHTMLInputRangeElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_name)(
        IHTMLInputRangeElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_value)(
        IHTMLInputRangeElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_value)(
        IHTMLInputRangeElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_min)(
        IHTMLInputRangeElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_min)(
        IHTMLInputRangeElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_max)(
        IHTMLInputRangeElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_max)(
        IHTMLInputRangeElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_step)(
        IHTMLInputRangeElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_step)(
        IHTMLInputRangeElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_valueAsNumber)(
        IHTMLInputRangeElement* This,
        double v);

    HRESULT (STDMETHODCALLTYPE *get_valueAsNumber)(
        IHTMLInputRangeElement* This,
        double *p);

    HRESULT (STDMETHODCALLTYPE *stepUp)(
        IHTMLInputRangeElement* This,
        LONG n);

    HRESULT (STDMETHODCALLTYPE *stepDown)(
        IHTMLInputRangeElement* This,
        LONG n);

    END_INTERFACE
} IHTMLInputRangeElementVtbl;
interface IHTMLInputRangeElement {
    CONST_VTBL IHTMLInputRangeElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLInputRangeElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLInputRangeElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLInputRangeElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLInputRangeElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLInputRangeElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLInputRangeElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLInputRangeElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLInputRangeElement methods ***/
#define IHTMLInputRangeElement_put_disabled(This,v) (This)->lpVtbl->put_disabled(This,v)
#define IHTMLInputRangeElement_get_disabled(This,p) (This)->lpVtbl->get_disabled(This,p)
#define IHTMLInputRangeElement_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#define IHTMLInputRangeElement_put_alt(This,v) (This)->lpVtbl->put_alt(This,v)
#define IHTMLInputRangeElement_get_alt(This,p) (This)->lpVtbl->get_alt(This,p)
#define IHTMLInputRangeElement_put_name(This,v) (This)->lpVtbl->put_name(This,v)
#define IHTMLInputRangeElement_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#define IHTMLInputRangeElement_put_value(This,v) (This)->lpVtbl->put_value(This,v)
#define IHTMLInputRangeElement_get_value(This,p) (This)->lpVtbl->get_value(This,p)
#define IHTMLInputRangeElement_put_min(This,v) (This)->lpVtbl->put_min(This,v)
#define IHTMLInputRangeElement_get_min(This,p) (This)->lpVtbl->get_min(This,p)
#define IHTMLInputRangeElement_put_max(This,v) (This)->lpVtbl->put_max(This,v)
#define IHTMLInputRangeElement_get_max(This,p) (This)->lpVtbl->get_max(This,p)
#define IHTMLInputRangeElement_put_step(This,v) (This)->lpVtbl->put_step(This,v)
#define IHTMLInputRangeElement_get_step(This,p) (This)->lpVtbl->get_step(This,p)
#define IHTMLInputRangeElement_put_valueAsNumber(This,v) (This)->lpVtbl->put_valueAsNumber(This,v)
#define IHTMLInputRangeElement_get_valueAsNumber(This,p) (This)->lpVtbl->get_valueAsNumber(This,p)
#define IHTMLInputRangeElement_stepUp(This,n) (This)->lpVtbl->stepUp(This,n)
#define IHTMLInputRangeElement_stepDown(This,n) (This)->lpVtbl->stepDown(This,n)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLInputRangeElement_QueryInterface(IHTMLInputRangeElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLInputRangeElement_AddRef(IHTMLInputRangeElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLInputRangeElement_Release(IHTMLInputRangeElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLInputRangeElement_GetTypeInfoCount(IHTMLInputRangeElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLInputRangeElement_GetTypeInfo(IHTMLInputRangeElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLInputRangeElement_GetIDsOfNames(IHTMLInputRangeElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLInputRangeElement_Invoke(IHTMLInputRangeElement* 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);
}
/*** IHTMLInputRangeElement methods ***/
static FORCEINLINE HRESULT IHTMLInputRangeElement_put_disabled(IHTMLInputRangeElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_disabled(This,v);
}
static FORCEINLINE HRESULT IHTMLInputRangeElement_get_disabled(IHTMLInputRangeElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_disabled(This,p);
}
static FORCEINLINE HRESULT IHTMLInputRangeElement_get_type(IHTMLInputRangeElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static FORCEINLINE HRESULT IHTMLInputRangeElement_put_alt(IHTMLInputRangeElement* This,BSTR v) {
    return This->lpVtbl->put_alt(This,v);
}
static FORCEINLINE HRESULT IHTMLInputRangeElement_get_alt(IHTMLInputRangeElement* This,BSTR *p) {
    return This->lpVtbl->get_alt(This,p);
}
static FORCEINLINE HRESULT IHTMLInputRangeElement_put_name(IHTMLInputRangeElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static FORCEINLINE HRESULT IHTMLInputRangeElement_get_name(IHTMLInputRangeElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static FORCEINLINE HRESULT IHTMLInputRangeElement_put_value(IHTMLInputRangeElement* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static FORCEINLINE HRESULT IHTMLInputRangeElement_get_value(IHTMLInputRangeElement* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
static FORCEINLINE HRESULT IHTMLInputRangeElement_put_min(IHTMLInputRangeElement* This,BSTR v) {
    return This->lpVtbl->put_min(This,v);
}
static FORCEINLINE HRESULT IHTMLInputRangeElement_get_min(IHTMLInputRangeElement* This,BSTR *p) {
    return This->lpVtbl->get_min(This,p);
}
static FORCEINLINE HRESULT IHTMLInputRangeElement_put_max(IHTMLInputRangeElement* This,BSTR v) {
    return This->lpVtbl->put_max(This,v);
}
static FORCEINLINE HRESULT IHTMLInputRangeElement_get_max(IHTMLInputRangeElement* This,BSTR *p) {
    return This->lpVtbl->get_max(This,p);
}
static FORCEINLINE HRESULT IHTMLInputRangeElement_put_step(IHTMLInputRangeElement* This,BSTR v) {
    return This->lpVtbl->put_step(This,v);
}
static FORCEINLINE HRESULT IHTMLInputRangeElement_get_step(IHTMLInputRangeElement* This,BSTR *p) {
    return This->lpVtbl->get_step(This,p);
}
static FORCEINLINE HRESULT IHTMLInputRangeElement_put_valueAsNumber(IHTMLInputRangeElement* This,double v) {
    return This->lpVtbl->put_valueAsNumber(This,v);
}
static FORCEINLINE HRESULT IHTMLInputRangeElement_get_valueAsNumber(IHTMLInputRangeElement* This,double *p) {
    return This->lpVtbl->get_valueAsNumber(This,p);
}
static FORCEINLINE HRESULT IHTMLInputRangeElement_stepUp(IHTMLInputRangeElement* This,LONG n) {
    return This->lpVtbl->stepUp(This,n);
}
static FORCEINLINE HRESULT IHTMLInputRangeElement_stepDown(IHTMLInputRangeElement* This,LONG n) {
    return This->lpVtbl->stepDown(This,n);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLInputRangeElement_put_disabled_Proxy(
    IHTMLInputRangeElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLInputRangeElement_put_disabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputRangeElement_get_disabled_Proxy(
    IHTMLInputRangeElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLInputRangeElement_get_disabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputRangeElement_get_type_Proxy(
    IHTMLInputRangeElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputRangeElement_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputRangeElement_put_alt_Proxy(
    IHTMLInputRangeElement* This,
    BSTR v);
void __RPC_STUB IHTMLInputRangeElement_put_alt_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputRangeElement_get_alt_Proxy(
    IHTMLInputRangeElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputRangeElement_get_alt_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputRangeElement_put_name_Proxy(
    IHTMLInputRangeElement* This,
    BSTR v);
void __RPC_STUB IHTMLInputRangeElement_put_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputRangeElement_get_name_Proxy(
    IHTMLInputRangeElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputRangeElement_get_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputRangeElement_put_value_Proxy(
    IHTMLInputRangeElement* This,
    BSTR v);
void __RPC_STUB IHTMLInputRangeElement_put_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputRangeElement_get_value_Proxy(
    IHTMLInputRangeElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputRangeElement_get_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputRangeElement_put_min_Proxy(
    IHTMLInputRangeElement* This,
    BSTR v);
void __RPC_STUB IHTMLInputRangeElement_put_min_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputRangeElement_get_min_Proxy(
    IHTMLInputRangeElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputRangeElement_get_min_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputRangeElement_put_max_Proxy(
    IHTMLInputRangeElement* This,
    BSTR v);
void __RPC_STUB IHTMLInputRangeElement_put_max_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputRangeElement_get_max_Proxy(
    IHTMLInputRangeElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputRangeElement_get_max_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputRangeElement_put_step_Proxy(
    IHTMLInputRangeElement* This,
    BSTR v);
void __RPC_STUB IHTMLInputRangeElement_put_step_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputRangeElement_get_step_Proxy(
    IHTMLInputRangeElement* This,
    BSTR *p);
void __RPC_STUB IHTMLInputRangeElement_get_step_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputRangeElement_put_valueAsNumber_Proxy(
    IHTMLInputRangeElement* This,
    double v);
void __RPC_STUB IHTMLInputRangeElement_put_valueAsNumber_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputRangeElement_get_valueAsNumber_Proxy(
    IHTMLInputRangeElement* This,
    double *p);
void __RPC_STUB IHTMLInputRangeElement_get_valueAsNumber_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputRangeElement_stepUp_Proxy(
    IHTMLInputRangeElement* This,
    LONG n);
void __RPC_STUB IHTMLInputRangeElement_stepUp_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLInputRangeElement_stepDown_Proxy(
    IHTMLInputRangeElement* This,
    LONG n);
void __RPC_STUB IHTMLInputRangeElement_stepDown_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLInputRangeElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLInputElement dispinterface
 */
#ifndef __DispHTMLInputElement_DISPINTERFACE_DEFINED__
#define __DispHTMLInputElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLInputElement, 0x3050f57d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f57d-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLInputElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLInputElement, 0x3050f57d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLInputElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLInputElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLInputElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLInputElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLInputElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLInputElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLInputElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLInputElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLInputElementVtbl;
interface DispHTMLInputElement {
    CONST_VTBL DispHTMLInputElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLInputElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLInputElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLInputElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLInputElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLInputElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLInputElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLInputElement_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 DispHTMLInputElement_QueryInterface(DispHTMLInputElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLInputElement_AddRef(DispHTMLInputElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLInputElement_Release(DispHTMLInputElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLInputElement_GetTypeInfoCount(DispHTMLInputElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLInputElement_GetTypeInfo(DispHTMLInputElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLInputElement_GetIDsOfNames(DispHTMLInputElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLInputElement_Invoke(DispHTMLInputElement* 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  /* __DispHTMLInputElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLInputElement coclass
 */

DEFINE_GUID(CLSID_HTMLInputElement, 0x3050f5d8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f5d8-98b5-11cf-bb82-00aa00bdce0b") HTMLInputElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLInputElement, 0x3050f5d8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CInput;
/*****************************************************************************
 * IHTMLTextAreaElement interface
 */
#ifndef __IHTMLTextAreaElement_INTERFACE_DEFINED__
#define __IHTMLTextAreaElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTextAreaElement, 0x3050f2aa, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f2aa-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTextAreaElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_value(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_value(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_name(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_status(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_status(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_disabled(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_disabled(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_form(
        IHTMLFormElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_defaultValue(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_defaultValue(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE select(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onchange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onchange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onselect(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onselect(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_readOnly(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_readOnly(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_rows(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_rows(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_cols(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cols(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_wrap(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_wrap(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE createTextRange(
        IHTMLTxtRange **range) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTextAreaElement, 0x3050f2aa, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTextAreaElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTextAreaElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTextAreaElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTextAreaElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTextAreaElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTextAreaElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTextAreaElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTextAreaElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLTextAreaElement methods ***/
    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLTextAreaElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_value)(
        IHTMLTextAreaElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_value)(
        IHTMLTextAreaElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_name)(
        IHTMLTextAreaElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_name)(
        IHTMLTextAreaElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_status)(
        IHTMLTextAreaElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_status)(
        IHTMLTextAreaElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_disabled)(
        IHTMLTextAreaElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_disabled)(
        IHTMLTextAreaElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_form)(
        IHTMLTextAreaElement* This,
        IHTMLFormElement **p);

    HRESULT (STDMETHODCALLTYPE *put_defaultValue)(
        IHTMLTextAreaElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_defaultValue)(
        IHTMLTextAreaElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *select)(
        IHTMLTextAreaElement* This);

    HRESULT (STDMETHODCALLTYPE *put_onchange)(
        IHTMLTextAreaElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onchange)(
        IHTMLTextAreaElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onselect)(
        IHTMLTextAreaElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onselect)(
        IHTMLTextAreaElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_readOnly)(
        IHTMLTextAreaElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_readOnly)(
        IHTMLTextAreaElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_rows)(
        IHTMLTextAreaElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_rows)(
        IHTMLTextAreaElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_cols)(
        IHTMLTextAreaElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_cols)(
        IHTMLTextAreaElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_wrap)(
        IHTMLTextAreaElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_wrap)(
        IHTMLTextAreaElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *createTextRange)(
        IHTMLTextAreaElement* This,
        IHTMLTxtRange **range);

    END_INTERFACE
} IHTMLTextAreaElementVtbl;
interface IHTMLTextAreaElement {
    CONST_VTBL IHTMLTextAreaElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTextAreaElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTextAreaElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTextAreaElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTextAreaElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTextAreaElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTextAreaElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTextAreaElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLTextAreaElement methods ***/
#define IHTMLTextAreaElement_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#define IHTMLTextAreaElement_put_value(This,v) (This)->lpVtbl->put_value(This,v)
#define IHTMLTextAreaElement_get_value(This,p) (This)->lpVtbl->get_value(This,p)
#define IHTMLTextAreaElement_put_name(This,v) (This)->lpVtbl->put_name(This,v)
#define IHTMLTextAreaElement_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#define IHTMLTextAreaElement_put_status(This,v) (This)->lpVtbl->put_status(This,v)
#define IHTMLTextAreaElement_get_status(This,p) (This)->lpVtbl->get_status(This,p)
#define IHTMLTextAreaElement_put_disabled(This,v) (This)->lpVtbl->put_disabled(This,v)
#define IHTMLTextAreaElement_get_disabled(This,p) (This)->lpVtbl->get_disabled(This,p)
#define IHTMLTextAreaElement_get_form(This,p) (This)->lpVtbl->get_form(This,p)
#define IHTMLTextAreaElement_put_defaultValue(This,v) (This)->lpVtbl->put_defaultValue(This,v)
#define IHTMLTextAreaElement_get_defaultValue(This,p) (This)->lpVtbl->get_defaultValue(This,p)
#define IHTMLTextAreaElement_select(This) (This)->lpVtbl->select(This)
#define IHTMLTextAreaElement_put_onchange(This,v) (This)->lpVtbl->put_onchange(This,v)
#define IHTMLTextAreaElement_get_onchange(This,p) (This)->lpVtbl->get_onchange(This,p)
#define IHTMLTextAreaElement_put_onselect(This,v) (This)->lpVtbl->put_onselect(This,v)
#define IHTMLTextAreaElement_get_onselect(This,p) (This)->lpVtbl->get_onselect(This,p)
#define IHTMLTextAreaElement_put_readOnly(This,v) (This)->lpVtbl->put_readOnly(This,v)
#define IHTMLTextAreaElement_get_readOnly(This,p) (This)->lpVtbl->get_readOnly(This,p)
#define IHTMLTextAreaElement_put_rows(This,v) (This)->lpVtbl->put_rows(This,v)
#define IHTMLTextAreaElement_get_rows(This,p) (This)->lpVtbl->get_rows(This,p)
#define IHTMLTextAreaElement_put_cols(This,v) (This)->lpVtbl->put_cols(This,v)
#define IHTMLTextAreaElement_get_cols(This,p) (This)->lpVtbl->get_cols(This,p)
#define IHTMLTextAreaElement_put_wrap(This,v) (This)->lpVtbl->put_wrap(This,v)
#define IHTMLTextAreaElement_get_wrap(This,p) (This)->lpVtbl->get_wrap(This,p)
#define IHTMLTextAreaElement_createTextRange(This,range) (This)->lpVtbl->createTextRange(This,range)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLTextAreaElement_QueryInterface(IHTMLTextAreaElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTextAreaElement_AddRef(IHTMLTextAreaElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTextAreaElement_Release(IHTMLTextAreaElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTextAreaElement_GetTypeInfoCount(IHTMLTextAreaElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement_GetTypeInfo(IHTMLTextAreaElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement_GetIDsOfNames(IHTMLTextAreaElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement_Invoke(IHTMLTextAreaElement* 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);
}
/*** IHTMLTextAreaElement methods ***/
static FORCEINLINE HRESULT IHTMLTextAreaElement_get_type(IHTMLTextAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement_put_value(IHTMLTextAreaElement* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement_get_value(IHTMLTextAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement_put_name(IHTMLTextAreaElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement_get_name(IHTMLTextAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement_put_status(IHTMLTextAreaElement* This,VARIANT v) {
    return This->lpVtbl->put_status(This,v);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement_get_status(IHTMLTextAreaElement* This,VARIANT *p) {
    return This->lpVtbl->get_status(This,p);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement_put_disabled(IHTMLTextAreaElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_disabled(This,v);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement_get_disabled(IHTMLTextAreaElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_disabled(This,p);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement_get_form(IHTMLTextAreaElement* This,IHTMLFormElement **p) {
    return This->lpVtbl->get_form(This,p);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement_put_defaultValue(IHTMLTextAreaElement* This,BSTR v) {
    return This->lpVtbl->put_defaultValue(This,v);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement_get_defaultValue(IHTMLTextAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_defaultValue(This,p);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement_select(IHTMLTextAreaElement* This) {
    return This->lpVtbl->select(This);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement_put_onchange(IHTMLTextAreaElement* This,VARIANT v) {
    return This->lpVtbl->put_onchange(This,v);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement_get_onchange(IHTMLTextAreaElement* This,VARIANT *p) {
    return This->lpVtbl->get_onchange(This,p);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement_put_onselect(IHTMLTextAreaElement* This,VARIANT v) {
    return This->lpVtbl->put_onselect(This,v);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement_get_onselect(IHTMLTextAreaElement* This,VARIANT *p) {
    return This->lpVtbl->get_onselect(This,p);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement_put_readOnly(IHTMLTextAreaElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_readOnly(This,v);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement_get_readOnly(IHTMLTextAreaElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_readOnly(This,p);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement_put_rows(IHTMLTextAreaElement* This,LONG v) {
    return This->lpVtbl->put_rows(This,v);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement_get_rows(IHTMLTextAreaElement* This,LONG *p) {
    return This->lpVtbl->get_rows(This,p);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement_put_cols(IHTMLTextAreaElement* This,LONG v) {
    return This->lpVtbl->put_cols(This,v);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement_get_cols(IHTMLTextAreaElement* This,LONG *p) {
    return This->lpVtbl->get_cols(This,p);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement_put_wrap(IHTMLTextAreaElement* This,BSTR v) {
    return This->lpVtbl->put_wrap(This,v);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement_get_wrap(IHTMLTextAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_wrap(This,p);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement_createTextRange(IHTMLTextAreaElement* This,IHTMLTxtRange **range) {
    return This->lpVtbl->createTextRange(This,range);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement_get_type_Proxy(
    IHTMLTextAreaElement* This,
    BSTR *p);
void __RPC_STUB IHTMLTextAreaElement_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement_put_value_Proxy(
    IHTMLTextAreaElement* This,
    BSTR v);
void __RPC_STUB IHTMLTextAreaElement_put_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement_get_value_Proxy(
    IHTMLTextAreaElement* This,
    BSTR *p);
void __RPC_STUB IHTMLTextAreaElement_get_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement_put_name_Proxy(
    IHTMLTextAreaElement* This,
    BSTR v);
void __RPC_STUB IHTMLTextAreaElement_put_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement_get_name_Proxy(
    IHTMLTextAreaElement* This,
    BSTR *p);
void __RPC_STUB IHTMLTextAreaElement_get_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement_put_status_Proxy(
    IHTMLTextAreaElement* This,
    VARIANT v);
void __RPC_STUB IHTMLTextAreaElement_put_status_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement_get_status_Proxy(
    IHTMLTextAreaElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLTextAreaElement_get_status_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement_put_disabled_Proxy(
    IHTMLTextAreaElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLTextAreaElement_put_disabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement_get_disabled_Proxy(
    IHTMLTextAreaElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLTextAreaElement_get_disabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement_get_form_Proxy(
    IHTMLTextAreaElement* This,
    IHTMLFormElement **p);
void __RPC_STUB IHTMLTextAreaElement_get_form_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement_put_defaultValue_Proxy(
    IHTMLTextAreaElement* This,
    BSTR v);
void __RPC_STUB IHTMLTextAreaElement_put_defaultValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement_get_defaultValue_Proxy(
    IHTMLTextAreaElement* This,
    BSTR *p);
void __RPC_STUB IHTMLTextAreaElement_get_defaultValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement_select_Proxy(
    IHTMLTextAreaElement* This);
void __RPC_STUB IHTMLTextAreaElement_select_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement_put_onchange_Proxy(
    IHTMLTextAreaElement* This,
    VARIANT v);
void __RPC_STUB IHTMLTextAreaElement_put_onchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement_get_onchange_Proxy(
    IHTMLTextAreaElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLTextAreaElement_get_onchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement_put_onselect_Proxy(
    IHTMLTextAreaElement* This,
    VARIANT v);
void __RPC_STUB IHTMLTextAreaElement_put_onselect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement_get_onselect_Proxy(
    IHTMLTextAreaElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLTextAreaElement_get_onselect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement_put_readOnly_Proxy(
    IHTMLTextAreaElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLTextAreaElement_put_readOnly_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement_get_readOnly_Proxy(
    IHTMLTextAreaElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLTextAreaElement_get_readOnly_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement_put_rows_Proxy(
    IHTMLTextAreaElement* This,
    LONG v);
void __RPC_STUB IHTMLTextAreaElement_put_rows_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement_get_rows_Proxy(
    IHTMLTextAreaElement* This,
    LONG *p);
void __RPC_STUB IHTMLTextAreaElement_get_rows_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement_put_cols_Proxy(
    IHTMLTextAreaElement* This,
    LONG v);
void __RPC_STUB IHTMLTextAreaElement_put_cols_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement_get_cols_Proxy(
    IHTMLTextAreaElement* This,
    LONG *p);
void __RPC_STUB IHTMLTextAreaElement_get_cols_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement_put_wrap_Proxy(
    IHTMLTextAreaElement* This,
    BSTR v);
void __RPC_STUB IHTMLTextAreaElement_put_wrap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement_get_wrap_Proxy(
    IHTMLTextAreaElement* This,
    BSTR *p);
void __RPC_STUB IHTMLTextAreaElement_get_wrap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement_createTextRange_Proxy(
    IHTMLTextAreaElement* This,
    IHTMLTxtRange **range);
void __RPC_STUB IHTMLTextAreaElement_createTextRange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLTextAreaElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLTextAreaElement2 interface
 */
#ifndef __IHTMLTextAreaElement2_INTERFACE_DEFINED__
#define __IHTMLTextAreaElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTextAreaElement2, 0x3050f2d3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f2d3-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTextAreaElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_selectionStart(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_selectionStart(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_selectionEnd(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_selectionEnd(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE setSelectionRange(
        LONG start,
        LONG end) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTextAreaElement2, 0x3050f2d3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTextAreaElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTextAreaElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTextAreaElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTextAreaElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTextAreaElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTextAreaElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTextAreaElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTextAreaElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLTextAreaElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_selectionStart)(
        IHTMLTextAreaElement2* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_selectionStart)(
        IHTMLTextAreaElement2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_selectionEnd)(
        IHTMLTextAreaElement2* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_selectionEnd)(
        IHTMLTextAreaElement2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *setSelectionRange)(
        IHTMLTextAreaElement2* This,
        LONG start,
        LONG end);

    END_INTERFACE
} IHTMLTextAreaElement2Vtbl;
interface IHTMLTextAreaElement2 {
    CONST_VTBL IHTMLTextAreaElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTextAreaElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTextAreaElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTextAreaElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTextAreaElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTextAreaElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTextAreaElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTextAreaElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLTextAreaElement2 methods ***/
#define IHTMLTextAreaElement2_put_selectionStart(This,v) (This)->lpVtbl->put_selectionStart(This,v)
#define IHTMLTextAreaElement2_get_selectionStart(This,p) (This)->lpVtbl->get_selectionStart(This,p)
#define IHTMLTextAreaElement2_put_selectionEnd(This,v) (This)->lpVtbl->put_selectionEnd(This,v)
#define IHTMLTextAreaElement2_get_selectionEnd(This,p) (This)->lpVtbl->get_selectionEnd(This,p)
#define IHTMLTextAreaElement2_setSelectionRange(This,start,end) (This)->lpVtbl->setSelectionRange(This,start,end)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLTextAreaElement2_QueryInterface(IHTMLTextAreaElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTextAreaElement2_AddRef(IHTMLTextAreaElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTextAreaElement2_Release(IHTMLTextAreaElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTextAreaElement2_GetTypeInfoCount(IHTMLTextAreaElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement2_GetTypeInfo(IHTMLTextAreaElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement2_GetIDsOfNames(IHTMLTextAreaElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement2_Invoke(IHTMLTextAreaElement2* 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);
}
/*** IHTMLTextAreaElement2 methods ***/
static FORCEINLINE HRESULT IHTMLTextAreaElement2_put_selectionStart(IHTMLTextAreaElement2* This,LONG v) {
    return This->lpVtbl->put_selectionStart(This,v);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement2_get_selectionStart(IHTMLTextAreaElement2* This,LONG *p) {
    return This->lpVtbl->get_selectionStart(This,p);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement2_put_selectionEnd(IHTMLTextAreaElement2* This,LONG v) {
    return This->lpVtbl->put_selectionEnd(This,v);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement2_get_selectionEnd(IHTMLTextAreaElement2* This,LONG *p) {
    return This->lpVtbl->get_selectionEnd(This,p);
}
static FORCEINLINE HRESULT IHTMLTextAreaElement2_setSelectionRange(IHTMLTextAreaElement2* This,LONG start,LONG end) {
    return This->lpVtbl->setSelectionRange(This,start,end);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement2_put_selectionStart_Proxy(
    IHTMLTextAreaElement2* This,
    LONG v);
void __RPC_STUB IHTMLTextAreaElement2_put_selectionStart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement2_get_selectionStart_Proxy(
    IHTMLTextAreaElement2* This,
    LONG *p);
void __RPC_STUB IHTMLTextAreaElement2_get_selectionStart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement2_put_selectionEnd_Proxy(
    IHTMLTextAreaElement2* This,
    LONG v);
void __RPC_STUB IHTMLTextAreaElement2_put_selectionEnd_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement2_get_selectionEnd_Proxy(
    IHTMLTextAreaElement2* This,
    LONG *p);
void __RPC_STUB IHTMLTextAreaElement2_get_selectionEnd_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTextAreaElement2_setSelectionRange_Proxy(
    IHTMLTextAreaElement2* This,
    LONG start,
    LONG end);
void __RPC_STUB IHTMLTextAreaElement2_setSelectionRange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLTextAreaElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLTextAreaElement dispinterface
 */
#ifndef __DispHTMLTextAreaElement_DISPINTERFACE_DEFINED__
#define __DispHTMLTextAreaElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLTextAreaElement, 0x3050f521, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f521-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLTextAreaElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLTextAreaElement, 0x3050f521, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLTextAreaElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLTextAreaElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLTextAreaElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLTextAreaElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLTextAreaElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLTextAreaElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLTextAreaElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLTextAreaElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLTextAreaElementVtbl;
interface DispHTMLTextAreaElement {
    CONST_VTBL DispHTMLTextAreaElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLTextAreaElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLTextAreaElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLTextAreaElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLTextAreaElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLTextAreaElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLTextAreaElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLTextAreaElement_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 DispHTMLTextAreaElement_QueryInterface(DispHTMLTextAreaElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLTextAreaElement_AddRef(DispHTMLTextAreaElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLTextAreaElement_Release(DispHTMLTextAreaElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLTextAreaElement_GetTypeInfoCount(DispHTMLTextAreaElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLTextAreaElement_GetTypeInfo(DispHTMLTextAreaElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLTextAreaElement_GetIDsOfNames(DispHTMLTextAreaElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLTextAreaElement_Invoke(DispHTMLTextAreaElement* 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  /* __DispHTMLTextAreaElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLTextAreaElement coclass
 */

DEFINE_GUID(CLSID_HTMLTextAreaElement, 0x3050f2ac, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f2ac-98b5-11cf-bb82-00aa00bdce0b") HTMLTextAreaElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLTextAreaElement, 0x3050f2ac, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CTextArea;
/*****************************************************************************
 * DispHTMLRichtextElement dispinterface
 */
#ifndef __DispHTMLRichtextElement_DISPINTERFACE_DEFINED__
#define __DispHTMLRichtextElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLRichtextElement, 0x3050f54d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f54d-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLRichtextElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLRichtextElement, 0x3050f54d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLRichtextElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLRichtextElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLRichtextElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLRichtextElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLRichtextElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLRichtextElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLRichtextElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLRichtextElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLRichtextElementVtbl;
interface DispHTMLRichtextElement {
    CONST_VTBL DispHTMLRichtextElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLRichtextElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLRichtextElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLRichtextElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLRichtextElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLRichtextElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLRichtextElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLRichtextElement_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 DispHTMLRichtextElement_QueryInterface(DispHTMLRichtextElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLRichtextElement_AddRef(DispHTMLRichtextElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLRichtextElement_Release(DispHTMLRichtextElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLRichtextElement_GetTypeInfoCount(DispHTMLRichtextElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLRichtextElement_GetTypeInfo(DispHTMLRichtextElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLRichtextElement_GetIDsOfNames(DispHTMLRichtextElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLRichtextElement_Invoke(DispHTMLRichtextElement* 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  /* __DispHTMLRichtextElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLRichtextElement coclass
 */

DEFINE_GUID(CLSID_HTMLRichtextElement, 0x3050f2df, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f2df-98b5-11cf-bb82-00aa00bdce0b") HTMLRichtextElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLRichtextElement, 0x3050f2df, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CRichtext;
/*****************************************************************************
 * IHTMLButtonElement interface
 */
#ifndef __IHTMLButtonElement_INTERFACE_DEFINED__
#define __IHTMLButtonElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLButtonElement, 0x3050f2bb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f2bb-98b5-11cf-bb82-00aa00bdce0b")
IHTMLButtonElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_value(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_value(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_name(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_status(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_status(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_disabled(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_disabled(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_form(
        IHTMLFormElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE createTextRange(
        IHTMLTxtRange **range) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLButtonElement, 0x3050f2bb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLButtonElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLButtonElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLButtonElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLButtonElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLButtonElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLButtonElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLButtonElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLButtonElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLButtonElement methods ***/
    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLButtonElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_value)(
        IHTMLButtonElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_value)(
        IHTMLButtonElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_name)(
        IHTMLButtonElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_name)(
        IHTMLButtonElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_status)(
        IHTMLButtonElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_status)(
        IHTMLButtonElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_disabled)(
        IHTMLButtonElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_disabled)(
        IHTMLButtonElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_form)(
        IHTMLButtonElement* This,
        IHTMLFormElement **p);

    HRESULT (STDMETHODCALLTYPE *createTextRange)(
        IHTMLButtonElement* This,
        IHTMLTxtRange **range);

    END_INTERFACE
} IHTMLButtonElementVtbl;
interface IHTMLButtonElement {
    CONST_VTBL IHTMLButtonElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLButtonElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLButtonElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLButtonElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLButtonElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLButtonElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLButtonElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLButtonElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLButtonElement methods ***/
#define IHTMLButtonElement_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#define IHTMLButtonElement_put_value(This,v) (This)->lpVtbl->put_value(This,v)
#define IHTMLButtonElement_get_value(This,p) (This)->lpVtbl->get_value(This,p)
#define IHTMLButtonElement_put_name(This,v) (This)->lpVtbl->put_name(This,v)
#define IHTMLButtonElement_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#define IHTMLButtonElement_put_status(This,v) (This)->lpVtbl->put_status(This,v)
#define IHTMLButtonElement_get_status(This,p) (This)->lpVtbl->get_status(This,p)
#define IHTMLButtonElement_put_disabled(This,v) (This)->lpVtbl->put_disabled(This,v)
#define IHTMLButtonElement_get_disabled(This,p) (This)->lpVtbl->get_disabled(This,p)
#define IHTMLButtonElement_get_form(This,p) (This)->lpVtbl->get_form(This,p)
#define IHTMLButtonElement_createTextRange(This,range) (This)->lpVtbl->createTextRange(This,range)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLButtonElement_QueryInterface(IHTMLButtonElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLButtonElement_AddRef(IHTMLButtonElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLButtonElement_Release(IHTMLButtonElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLButtonElement_GetTypeInfoCount(IHTMLButtonElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLButtonElement_GetTypeInfo(IHTMLButtonElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLButtonElement_GetIDsOfNames(IHTMLButtonElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLButtonElement_Invoke(IHTMLButtonElement* 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);
}
/*** IHTMLButtonElement methods ***/
static FORCEINLINE HRESULT IHTMLButtonElement_get_type(IHTMLButtonElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static FORCEINLINE HRESULT IHTMLButtonElement_put_value(IHTMLButtonElement* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static FORCEINLINE HRESULT IHTMLButtonElement_get_value(IHTMLButtonElement* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
static FORCEINLINE HRESULT IHTMLButtonElement_put_name(IHTMLButtonElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static FORCEINLINE HRESULT IHTMLButtonElement_get_name(IHTMLButtonElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static FORCEINLINE HRESULT IHTMLButtonElement_put_status(IHTMLButtonElement* This,VARIANT v) {
    return This->lpVtbl->put_status(This,v);
}
static FORCEINLINE HRESULT IHTMLButtonElement_get_status(IHTMLButtonElement* This,VARIANT *p) {
    return This->lpVtbl->get_status(This,p);
}
static FORCEINLINE HRESULT IHTMLButtonElement_put_disabled(IHTMLButtonElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_disabled(This,v);
}
static FORCEINLINE HRESULT IHTMLButtonElement_get_disabled(IHTMLButtonElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_disabled(This,p);
}
static FORCEINLINE HRESULT IHTMLButtonElement_get_form(IHTMLButtonElement* This,IHTMLFormElement **p) {
    return This->lpVtbl->get_form(This,p);
}
static FORCEINLINE HRESULT IHTMLButtonElement_createTextRange(IHTMLButtonElement* This,IHTMLTxtRange **range) {
    return This->lpVtbl->createTextRange(This,range);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLButtonElement_get_type_Proxy(
    IHTMLButtonElement* This,
    BSTR *p);
void __RPC_STUB IHTMLButtonElement_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLButtonElement_put_value_Proxy(
    IHTMLButtonElement* This,
    BSTR v);
void __RPC_STUB IHTMLButtonElement_put_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLButtonElement_get_value_Proxy(
    IHTMLButtonElement* This,
    BSTR *p);
void __RPC_STUB IHTMLButtonElement_get_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLButtonElement_put_name_Proxy(
    IHTMLButtonElement* This,
    BSTR v);
void __RPC_STUB IHTMLButtonElement_put_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLButtonElement_get_name_Proxy(
    IHTMLButtonElement* This,
    BSTR *p);
void __RPC_STUB IHTMLButtonElement_get_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLButtonElement_put_status_Proxy(
    IHTMLButtonElement* This,
    VARIANT v);
void __RPC_STUB IHTMLButtonElement_put_status_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLButtonElement_get_status_Proxy(
    IHTMLButtonElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLButtonElement_get_status_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLButtonElement_put_disabled_Proxy(
    IHTMLButtonElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLButtonElement_put_disabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLButtonElement_get_disabled_Proxy(
    IHTMLButtonElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLButtonElement_get_disabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLButtonElement_get_form_Proxy(
    IHTMLButtonElement* This,
    IHTMLFormElement **p);
void __RPC_STUB IHTMLButtonElement_get_form_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLButtonElement_createTextRange_Proxy(
    IHTMLButtonElement* This,
    IHTMLTxtRange **range);
void __RPC_STUB IHTMLButtonElement_createTextRange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLButtonElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLButtonElement2 interface
 */
#ifndef __IHTMLButtonElement2_INTERFACE_DEFINED__
#define __IHTMLButtonElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLButtonElement2, 0x305106f3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106f3-98b5-11cf-bb82-00aa00bdce0b")
IHTMLButtonElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_type(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLButtonElement2, 0x305106f3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLButtonElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLButtonElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLButtonElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLButtonElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLButtonElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLButtonElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLButtonElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLButtonElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLButtonElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_type)(
        IHTMLButtonElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLButtonElement2* This,
        BSTR *p);

    END_INTERFACE
} IHTMLButtonElement2Vtbl;
interface IHTMLButtonElement2 {
    CONST_VTBL IHTMLButtonElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLButtonElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLButtonElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLButtonElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLButtonElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLButtonElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLButtonElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLButtonElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLButtonElement2 methods ***/
#define IHTMLButtonElement2_put_type(This,v) (This)->lpVtbl->put_type(This,v)
#define IHTMLButtonElement2_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLButtonElement2_QueryInterface(IHTMLButtonElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLButtonElement2_AddRef(IHTMLButtonElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLButtonElement2_Release(IHTMLButtonElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLButtonElement2_GetTypeInfoCount(IHTMLButtonElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLButtonElement2_GetTypeInfo(IHTMLButtonElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLButtonElement2_GetIDsOfNames(IHTMLButtonElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLButtonElement2_Invoke(IHTMLButtonElement2* 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);
}
/*** IHTMLButtonElement2 methods ***/
static FORCEINLINE HRESULT IHTMLButtonElement2_put_type(IHTMLButtonElement2* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static FORCEINLINE HRESULT IHTMLButtonElement2_get_type(IHTMLButtonElement2* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLButtonElement2_put_type_Proxy(
    IHTMLButtonElement2* This,
    BSTR v);
void __RPC_STUB IHTMLButtonElement2_put_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLButtonElement2_get_type_Proxy(
    IHTMLButtonElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLButtonElement2_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLButtonElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLButtonElement dispinterface
 */
#ifndef __DispHTMLButtonElement_DISPINTERFACE_DEFINED__
#define __DispHTMLButtonElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLButtonElement, 0x3050f51f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f51f-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLButtonElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLButtonElement, 0x3050f51f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLButtonElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLButtonElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLButtonElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLButtonElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLButtonElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLButtonElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLButtonElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLButtonElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLButtonElementVtbl;
interface DispHTMLButtonElement {
    CONST_VTBL DispHTMLButtonElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLButtonElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLButtonElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLButtonElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLButtonElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLButtonElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLButtonElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLButtonElement_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 DispHTMLButtonElement_QueryInterface(DispHTMLButtonElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLButtonElement_AddRef(DispHTMLButtonElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLButtonElement_Release(DispHTMLButtonElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLButtonElement_GetTypeInfoCount(DispHTMLButtonElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLButtonElement_GetTypeInfo(DispHTMLButtonElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLButtonElement_GetIDsOfNames(DispHTMLButtonElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLButtonElement_Invoke(DispHTMLButtonElement* 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  /* __DispHTMLButtonElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLButtonElement coclass
 */

DEFINE_GUID(CLSID_HTMLButtonElement, 0x3050f2c6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f2c6-98b5-11cf-bb82-00aa00bdce0b") HTMLButtonElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLButtonElement, 0x3050f2c6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CButton;
/*****************************************************************************
 * HTMLMarqueeElementEvents2 dispinterface
 */
#ifndef __HTMLMarqueeElementEvents2_DISPINTERFACE_DEFINED__
#define __HTMLMarqueeElementEvents2_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLMarqueeElementEvents2, 0x3050f61f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f61f-98b5-11cf-bb82-00aa00bdce0b")
HTMLMarqueeElementEvents2 : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLMarqueeElementEvents2, 0x3050f61f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLMarqueeElementEvents2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLMarqueeElementEvents2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLMarqueeElementEvents2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLMarqueeElementEvents2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLMarqueeElementEvents2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLMarqueeElementEvents2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLMarqueeElementEvents2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLMarqueeElementEvents2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLMarqueeElementEvents2Vtbl;
interface HTMLMarqueeElementEvents2 {
    CONST_VTBL HTMLMarqueeElementEvents2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLMarqueeElementEvents2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLMarqueeElementEvents2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLMarqueeElementEvents2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLMarqueeElementEvents2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLMarqueeElementEvents2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLMarqueeElementEvents2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLMarqueeElementEvents2_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 HTMLMarqueeElementEvents2_QueryInterface(HTMLMarqueeElementEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLMarqueeElementEvents2_AddRef(HTMLMarqueeElementEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLMarqueeElementEvents2_Release(HTMLMarqueeElementEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLMarqueeElementEvents2_GetTypeInfoCount(HTMLMarqueeElementEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLMarqueeElementEvents2_GetTypeInfo(HTMLMarqueeElementEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLMarqueeElementEvents2_GetIDsOfNames(HTMLMarqueeElementEvents2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLMarqueeElementEvents2_Invoke(HTMLMarqueeElementEvents2* 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  /* __HTMLMarqueeElementEvents2_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLMarqueeElementEvents dispinterface
 */
#ifndef __HTMLMarqueeElementEvents_DISPINTERFACE_DEFINED__
#define __HTMLMarqueeElementEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLMarqueeElementEvents, 0x3050f2b8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f2b8-98b5-11cf-bb82-00aa00bdce0b")
HTMLMarqueeElementEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLMarqueeElementEvents, 0x3050f2b8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLMarqueeElementEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLMarqueeElementEvents* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLMarqueeElementEvents* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLMarqueeElementEvents* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLMarqueeElementEvents* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLMarqueeElementEvents* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLMarqueeElementEvents* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLMarqueeElementEvents* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLMarqueeElementEventsVtbl;
interface HTMLMarqueeElementEvents {
    CONST_VTBL HTMLMarqueeElementEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLMarqueeElementEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLMarqueeElementEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLMarqueeElementEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLMarqueeElementEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLMarqueeElementEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLMarqueeElementEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLMarqueeElementEvents_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 HTMLMarqueeElementEvents_QueryInterface(HTMLMarqueeElementEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLMarqueeElementEvents_AddRef(HTMLMarqueeElementEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLMarqueeElementEvents_Release(HTMLMarqueeElementEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLMarqueeElementEvents_GetTypeInfoCount(HTMLMarqueeElementEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLMarqueeElementEvents_GetTypeInfo(HTMLMarqueeElementEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLMarqueeElementEvents_GetIDsOfNames(HTMLMarqueeElementEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLMarqueeElementEvents_Invoke(HTMLMarqueeElementEvents* 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  /* __HTMLMarqueeElementEvents_DISPINTERFACE_DEFINED__ */

typedef enum _htmlMarqueeBehavior {
    htmlMarqueeBehaviorscroll = 1,
    htmlMarqueeBehaviorslide = 2,
    htmlMarqueeBehavioralternate = 3,
    htmlMarqueeBehavior_Max = 0x7fffffff
} htmlMarqueeBehavior;
typedef enum _htmlMarqueeDirection {
    htmlMarqueeDirectionleft = 1,
    htmlMarqueeDirectionright = 3,
    htmlMarqueeDirectionup = 5,
    htmlMarqueeDirectiondown = 7,
    htmlMarqueeDirection_Max = 0x7fffffff
} htmlMarqueeDirection;
/*****************************************************************************
 * IHTMLMarqueeElement interface
 */
#ifndef __IHTMLMarqueeElement_INTERFACE_DEFINED__
#define __IHTMLMarqueeElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLMarqueeElement, 0x3050f2b5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f2b5-98b5-11cf-bb82-00aa00bdce0b")
IHTMLMarqueeElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_bgColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_bgColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollDelay(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollDelay(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_direction(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_direction(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_behavior(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_behavior(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollAmount(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollAmount(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_loop(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_loop(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_vspace(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_vspace(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_hspace(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_hspace(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onfinish(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onfinish(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onstart(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onstart(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onbounce(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onbounce(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_width(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_width(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_height(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_height(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_trueSpeed(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_trueSpeed(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE start(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE stop(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLMarqueeElement, 0x3050f2b5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLMarqueeElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLMarqueeElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLMarqueeElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLMarqueeElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLMarqueeElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLMarqueeElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLMarqueeElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLMarqueeElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLMarqueeElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_bgColor)(
        IHTMLMarqueeElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_bgColor)(
        IHTMLMarqueeElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollDelay)(
        IHTMLMarqueeElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_scrollDelay)(
        IHTMLMarqueeElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_direction)(
        IHTMLMarqueeElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_direction)(
        IHTMLMarqueeElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_behavior)(
        IHTMLMarqueeElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_behavior)(
        IHTMLMarqueeElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollAmount)(
        IHTMLMarqueeElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_scrollAmount)(
        IHTMLMarqueeElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_loop)(
        IHTMLMarqueeElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_loop)(
        IHTMLMarqueeElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_vspace)(
        IHTMLMarqueeElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_vspace)(
        IHTMLMarqueeElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_hspace)(
        IHTMLMarqueeElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_hspace)(
        IHTMLMarqueeElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_onfinish)(
        IHTMLMarqueeElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onfinish)(
        IHTMLMarqueeElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onstart)(
        IHTMLMarqueeElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onstart)(
        IHTMLMarqueeElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onbounce)(
        IHTMLMarqueeElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onbounce)(
        IHTMLMarqueeElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_width)(
        IHTMLMarqueeElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_width)(
        IHTMLMarqueeElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_height)(
        IHTMLMarqueeElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_height)(
        IHTMLMarqueeElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_trueSpeed)(
        IHTMLMarqueeElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_trueSpeed)(
        IHTMLMarqueeElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *start)(
        IHTMLMarqueeElement* This);

    HRESULT (STDMETHODCALLTYPE *stop)(
        IHTMLMarqueeElement* This);

    END_INTERFACE
} IHTMLMarqueeElementVtbl;
interface IHTMLMarqueeElement {
    CONST_VTBL IHTMLMarqueeElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLMarqueeElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLMarqueeElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLMarqueeElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLMarqueeElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLMarqueeElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLMarqueeElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLMarqueeElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLMarqueeElement methods ***/
#define IHTMLMarqueeElement_put_bgColor(This,v) (This)->lpVtbl->put_bgColor(This,v)
#define IHTMLMarqueeElement_get_bgColor(This,p) (This)->lpVtbl->get_bgColor(This,p)
#define IHTMLMarqueeElement_put_scrollDelay(This,v) (This)->lpVtbl->put_scrollDelay(This,v)
#define IHTMLMarqueeElement_get_scrollDelay(This,p) (This)->lpVtbl->get_scrollDelay(This,p)
#define IHTMLMarqueeElement_put_direction(This,v) (This)->lpVtbl->put_direction(This,v)
#define IHTMLMarqueeElement_get_direction(This,p) (This)->lpVtbl->get_direction(This,p)
#define IHTMLMarqueeElement_put_behavior(This,v) (This)->lpVtbl->put_behavior(This,v)
#define IHTMLMarqueeElement_get_behavior(This,p) (This)->lpVtbl->get_behavior(This,p)
#define IHTMLMarqueeElement_put_scrollAmount(This,v) (This)->lpVtbl->put_scrollAmount(This,v)
#define IHTMLMarqueeElement_get_scrollAmount(This,p) (This)->lpVtbl->get_scrollAmount(This,p)
#define IHTMLMarqueeElement_put_loop(This,v) (This)->lpVtbl->put_loop(This,v)
#define IHTMLMarqueeElement_get_loop(This,p) (This)->lpVtbl->get_loop(This,p)
#define IHTMLMarqueeElement_put_vspace(This,v) (This)->lpVtbl->put_vspace(This,v)
#define IHTMLMarqueeElement_get_vspace(This,p) (This)->lpVtbl->get_vspace(This,p)
#define IHTMLMarqueeElement_put_hspace(This,v) (This)->lpVtbl->put_hspace(This,v)
#define IHTMLMarqueeElement_get_hspace(This,p) (This)->lpVtbl->get_hspace(This,p)
#define IHTMLMarqueeElement_put_onfinish(This,v) (This)->lpVtbl->put_onfinish(This,v)
#define IHTMLMarqueeElement_get_onfinish(This,p) (This)->lpVtbl->get_onfinish(This,p)
#define IHTMLMarqueeElement_put_onstart(This,v) (This)->lpVtbl->put_onstart(This,v)
#define IHTMLMarqueeElement_get_onstart(This,p) (This)->lpVtbl->get_onstart(This,p)
#define IHTMLMarqueeElement_put_onbounce(This,v) (This)->lpVtbl->put_onbounce(This,v)
#define IHTMLMarqueeElement_get_onbounce(This,p) (This)->lpVtbl->get_onbounce(This,p)
#define IHTMLMarqueeElement_put_width(This,v) (This)->lpVtbl->put_width(This,v)
#define IHTMLMarqueeElement_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#define IHTMLMarqueeElement_put_height(This,v) (This)->lpVtbl->put_height(This,v)
#define IHTMLMarqueeElement_get_height(This,p) (This)->lpVtbl->get_height(This,p)
#define IHTMLMarqueeElement_put_trueSpeed(This,v) (This)->lpVtbl->put_trueSpeed(This,v)
#define IHTMLMarqueeElement_get_trueSpeed(This,p) (This)->lpVtbl->get_trueSpeed(This,p)
#define IHTMLMarqueeElement_start(This) (This)->lpVtbl->start(This)
#define IHTMLMarqueeElement_stop(This) (This)->lpVtbl->stop(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLMarqueeElement_QueryInterface(IHTMLMarqueeElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLMarqueeElement_AddRef(IHTMLMarqueeElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLMarqueeElement_Release(IHTMLMarqueeElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLMarqueeElement_GetTypeInfoCount(IHTMLMarqueeElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_GetTypeInfo(IHTMLMarqueeElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_GetIDsOfNames(IHTMLMarqueeElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_Invoke(IHTMLMarqueeElement* 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);
}
/*** IHTMLMarqueeElement methods ***/
static FORCEINLINE HRESULT IHTMLMarqueeElement_put_bgColor(IHTMLMarqueeElement* This,VARIANT v) {
    return This->lpVtbl->put_bgColor(This,v);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_get_bgColor(IHTMLMarqueeElement* This,VARIANT *p) {
    return This->lpVtbl->get_bgColor(This,p);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_put_scrollDelay(IHTMLMarqueeElement* This,LONG v) {
    return This->lpVtbl->put_scrollDelay(This,v);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_get_scrollDelay(IHTMLMarqueeElement* This,LONG *p) {
    return This->lpVtbl->get_scrollDelay(This,p);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_put_direction(IHTMLMarqueeElement* This,BSTR v) {
    return This->lpVtbl->put_direction(This,v);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_get_direction(IHTMLMarqueeElement* This,BSTR *p) {
    return This->lpVtbl->get_direction(This,p);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_put_behavior(IHTMLMarqueeElement* This,BSTR v) {
    return This->lpVtbl->put_behavior(This,v);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_get_behavior(IHTMLMarqueeElement* This,BSTR *p) {
    return This->lpVtbl->get_behavior(This,p);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_put_scrollAmount(IHTMLMarqueeElement* This,LONG v) {
    return This->lpVtbl->put_scrollAmount(This,v);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_get_scrollAmount(IHTMLMarqueeElement* This,LONG *p) {
    return This->lpVtbl->get_scrollAmount(This,p);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_put_loop(IHTMLMarqueeElement* This,LONG v) {
    return This->lpVtbl->put_loop(This,v);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_get_loop(IHTMLMarqueeElement* This,LONG *p) {
    return This->lpVtbl->get_loop(This,p);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_put_vspace(IHTMLMarqueeElement* This,LONG v) {
    return This->lpVtbl->put_vspace(This,v);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_get_vspace(IHTMLMarqueeElement* This,LONG *p) {
    return This->lpVtbl->get_vspace(This,p);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_put_hspace(IHTMLMarqueeElement* This,LONG v) {
    return This->lpVtbl->put_hspace(This,v);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_get_hspace(IHTMLMarqueeElement* This,LONG *p) {
    return This->lpVtbl->get_hspace(This,p);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_put_onfinish(IHTMLMarqueeElement* This,VARIANT v) {
    return This->lpVtbl->put_onfinish(This,v);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_get_onfinish(IHTMLMarqueeElement* This,VARIANT *p) {
    return This->lpVtbl->get_onfinish(This,p);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_put_onstart(IHTMLMarqueeElement* This,VARIANT v) {
    return This->lpVtbl->put_onstart(This,v);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_get_onstart(IHTMLMarqueeElement* This,VARIANT *p) {
    return This->lpVtbl->get_onstart(This,p);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_put_onbounce(IHTMLMarqueeElement* This,VARIANT v) {
    return This->lpVtbl->put_onbounce(This,v);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_get_onbounce(IHTMLMarqueeElement* This,VARIANT *p) {
    return This->lpVtbl->get_onbounce(This,p);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_put_width(IHTMLMarqueeElement* This,VARIANT v) {
    return This->lpVtbl->put_width(This,v);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_get_width(IHTMLMarqueeElement* This,VARIANT *p) {
    return This->lpVtbl->get_width(This,p);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_put_height(IHTMLMarqueeElement* This,VARIANT v) {
    return This->lpVtbl->put_height(This,v);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_get_height(IHTMLMarqueeElement* This,VARIANT *p) {
    return This->lpVtbl->get_height(This,p);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_put_trueSpeed(IHTMLMarqueeElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_trueSpeed(This,v);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_get_trueSpeed(IHTMLMarqueeElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_trueSpeed(This,p);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_start(IHTMLMarqueeElement* This) {
    return This->lpVtbl->start(This);
}
static FORCEINLINE HRESULT IHTMLMarqueeElement_stop(IHTMLMarqueeElement* This) {
    return This->lpVtbl->stop(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLMarqueeElement_put_bgColor_Proxy(
    IHTMLMarqueeElement* This,
    VARIANT v);
void __RPC_STUB IHTMLMarqueeElement_put_bgColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMarqueeElement_get_bgColor_Proxy(
    IHTMLMarqueeElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLMarqueeElement_get_bgColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMarqueeElement_put_scrollDelay_Proxy(
    IHTMLMarqueeElement* This,
    LONG v);
void __RPC_STUB IHTMLMarqueeElement_put_scrollDelay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMarqueeElement_get_scrollDelay_Proxy(
    IHTMLMarqueeElement* This,
    LONG *p);
void __RPC_STUB IHTMLMarqueeElement_get_scrollDelay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMarqueeElement_put_direction_Proxy(
    IHTMLMarqueeElement* This,
    BSTR v);
void __RPC_STUB IHTMLMarqueeElement_put_direction_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMarqueeElement_get_direction_Proxy(
    IHTMLMarqueeElement* This,
    BSTR *p);
void __RPC_STUB IHTMLMarqueeElement_get_direction_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMarqueeElement_put_behavior_Proxy(
    IHTMLMarqueeElement* This,
    BSTR v);
void __RPC_STUB IHTMLMarqueeElement_put_behavior_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMarqueeElement_get_behavior_Proxy(
    IHTMLMarqueeElement* This,
    BSTR *p);
void __RPC_STUB IHTMLMarqueeElement_get_behavior_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMarqueeElement_put_scrollAmount_Proxy(
    IHTMLMarqueeElement* This,
    LONG v);
void __RPC_STUB IHTMLMarqueeElement_put_scrollAmount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMarqueeElement_get_scrollAmount_Proxy(
    IHTMLMarqueeElement* This,
    LONG *p);
void __RPC_STUB IHTMLMarqueeElement_get_scrollAmount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMarqueeElement_put_loop_Proxy(
    IHTMLMarqueeElement* This,
    LONG v);
void __RPC_STUB IHTMLMarqueeElement_put_loop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMarqueeElement_get_loop_Proxy(
    IHTMLMarqueeElement* This,
    LONG *p);
void __RPC_STUB IHTMLMarqueeElement_get_loop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMarqueeElement_put_vspace_Proxy(
    IHTMLMarqueeElement* This,
    LONG v);
void __RPC_STUB IHTMLMarqueeElement_put_vspace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMarqueeElement_get_vspace_Proxy(
    IHTMLMarqueeElement* This,
    LONG *p);
void __RPC_STUB IHTMLMarqueeElement_get_vspace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMarqueeElement_put_hspace_Proxy(
    IHTMLMarqueeElement* This,
    LONG v);
void __RPC_STUB IHTMLMarqueeElement_put_hspace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMarqueeElement_get_hspace_Proxy(
    IHTMLMarqueeElement* This,
    LONG *p);
void __RPC_STUB IHTMLMarqueeElement_get_hspace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMarqueeElement_put_onfinish_Proxy(
    IHTMLMarqueeElement* This,
    VARIANT v);
void __RPC_STUB IHTMLMarqueeElement_put_onfinish_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMarqueeElement_get_onfinish_Proxy(
    IHTMLMarqueeElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLMarqueeElement_get_onfinish_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMarqueeElement_put_onstart_Proxy(
    IHTMLMarqueeElement* This,
    VARIANT v);
void __RPC_STUB IHTMLMarqueeElement_put_onstart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMarqueeElement_get_onstart_Proxy(
    IHTMLMarqueeElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLMarqueeElement_get_onstart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMarqueeElement_put_onbounce_Proxy(
    IHTMLMarqueeElement* This,
    VARIANT v);
void __RPC_STUB IHTMLMarqueeElement_put_onbounce_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMarqueeElement_get_onbounce_Proxy(
    IHTMLMarqueeElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLMarqueeElement_get_onbounce_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMarqueeElement_put_width_Proxy(
    IHTMLMarqueeElement* This,
    VARIANT v);
void __RPC_STUB IHTMLMarqueeElement_put_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMarqueeElement_get_width_Proxy(
    IHTMLMarqueeElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLMarqueeElement_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMarqueeElement_put_height_Proxy(
    IHTMLMarqueeElement* This,
    VARIANT v);
void __RPC_STUB IHTMLMarqueeElement_put_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMarqueeElement_get_height_Proxy(
    IHTMLMarqueeElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLMarqueeElement_get_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMarqueeElement_put_trueSpeed_Proxy(
    IHTMLMarqueeElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLMarqueeElement_put_trueSpeed_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMarqueeElement_get_trueSpeed_Proxy(
    IHTMLMarqueeElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLMarqueeElement_get_trueSpeed_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMarqueeElement_start_Proxy(
    IHTMLMarqueeElement* This);
void __RPC_STUB IHTMLMarqueeElement_start_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMarqueeElement_stop_Proxy(
    IHTMLMarqueeElement* This);
void __RPC_STUB IHTMLMarqueeElement_stop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLMarqueeElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLMarqueeElement dispinterface
 */
#ifndef __DispHTMLMarqueeElement_DISPINTERFACE_DEFINED__
#define __DispHTMLMarqueeElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLMarqueeElement, 0x3050f527, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f527-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLMarqueeElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLMarqueeElement, 0x3050f527, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLMarqueeElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLMarqueeElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLMarqueeElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLMarqueeElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLMarqueeElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLMarqueeElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLMarqueeElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLMarqueeElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLMarqueeElementVtbl;
interface DispHTMLMarqueeElement {
    CONST_VTBL DispHTMLMarqueeElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLMarqueeElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLMarqueeElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLMarqueeElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLMarqueeElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLMarqueeElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLMarqueeElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLMarqueeElement_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 DispHTMLMarqueeElement_QueryInterface(DispHTMLMarqueeElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLMarqueeElement_AddRef(DispHTMLMarqueeElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLMarqueeElement_Release(DispHTMLMarqueeElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLMarqueeElement_GetTypeInfoCount(DispHTMLMarqueeElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLMarqueeElement_GetTypeInfo(DispHTMLMarqueeElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLMarqueeElement_GetIDsOfNames(DispHTMLMarqueeElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLMarqueeElement_Invoke(DispHTMLMarqueeElement* 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  /* __DispHTMLMarqueeElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLMarqueeElement coclass
 */

DEFINE_GUID(CLSID_HTMLMarqueeElement, 0x3050f2b9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f2b9-98b5-11cf-bb82-00aa00bdce0b") HTMLMarqueeElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLMarqueeElement, 0x3050f2b9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CMarquee;
/*****************************************************************************
 * IHTMLHtmlElement interface
 */
#ifndef __IHTMLHtmlElement_INTERFACE_DEFINED__
#define __IHTMLHtmlElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLHtmlElement, 0x3050f81c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f81c-98b5-11cf-bb82-00aa00bdce0b")
IHTMLHtmlElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_version(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_version(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLHtmlElement, 0x3050f81c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLHtmlElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLHtmlElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLHtmlElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLHtmlElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLHtmlElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLHtmlElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLHtmlElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLHtmlElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLHtmlElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_version)(
        IHTMLHtmlElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_version)(
        IHTMLHtmlElement* This,
        BSTR *p);

    END_INTERFACE
} IHTMLHtmlElementVtbl;
interface IHTMLHtmlElement {
    CONST_VTBL IHTMLHtmlElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLHtmlElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLHtmlElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLHtmlElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLHtmlElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLHtmlElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLHtmlElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLHtmlElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLHtmlElement methods ***/
#define IHTMLHtmlElement_put_version(This,v) (This)->lpVtbl->put_version(This,v)
#define IHTMLHtmlElement_get_version(This,p) (This)->lpVtbl->get_version(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLHtmlElement_QueryInterface(IHTMLHtmlElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLHtmlElement_AddRef(IHTMLHtmlElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLHtmlElement_Release(IHTMLHtmlElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLHtmlElement_GetTypeInfoCount(IHTMLHtmlElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLHtmlElement_GetTypeInfo(IHTMLHtmlElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLHtmlElement_GetIDsOfNames(IHTMLHtmlElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLHtmlElement_Invoke(IHTMLHtmlElement* 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);
}
/*** IHTMLHtmlElement methods ***/
static FORCEINLINE HRESULT IHTMLHtmlElement_put_version(IHTMLHtmlElement* This,BSTR v) {
    return This->lpVtbl->put_version(This,v);
}
static FORCEINLINE HRESULT IHTMLHtmlElement_get_version(IHTMLHtmlElement* This,BSTR *p) {
    return This->lpVtbl->get_version(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLHtmlElement_put_version_Proxy(
    IHTMLHtmlElement* This,
    BSTR v);
void __RPC_STUB IHTMLHtmlElement_put_version_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLHtmlElement_get_version_Proxy(
    IHTMLHtmlElement* This,
    BSTR *p);
void __RPC_STUB IHTMLHtmlElement_get_version_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLHtmlElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLHeadElement interface
 */
#ifndef __IHTMLHeadElement_INTERFACE_DEFINED__
#define __IHTMLHeadElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLHeadElement, 0x3050f81d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f81d-98b5-11cf-bb82-00aa00bdce0b")
IHTMLHeadElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_profile(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_profile(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLHeadElement, 0x3050f81d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLHeadElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLHeadElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLHeadElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLHeadElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLHeadElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLHeadElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLHeadElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLHeadElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLHeadElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_profile)(
        IHTMLHeadElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_profile)(
        IHTMLHeadElement* This,
        BSTR *p);

    END_INTERFACE
} IHTMLHeadElementVtbl;
interface IHTMLHeadElement {
    CONST_VTBL IHTMLHeadElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLHeadElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLHeadElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLHeadElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLHeadElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLHeadElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLHeadElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLHeadElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLHeadElement methods ***/
#define IHTMLHeadElement_put_profile(This,v) (This)->lpVtbl->put_profile(This,v)
#define IHTMLHeadElement_get_profile(This,p) (This)->lpVtbl->get_profile(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLHeadElement_QueryInterface(IHTMLHeadElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLHeadElement_AddRef(IHTMLHeadElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLHeadElement_Release(IHTMLHeadElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLHeadElement_GetTypeInfoCount(IHTMLHeadElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLHeadElement_GetTypeInfo(IHTMLHeadElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLHeadElement_GetIDsOfNames(IHTMLHeadElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLHeadElement_Invoke(IHTMLHeadElement* 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);
}
/*** IHTMLHeadElement methods ***/
static FORCEINLINE HRESULT IHTMLHeadElement_put_profile(IHTMLHeadElement* This,BSTR v) {
    return This->lpVtbl->put_profile(This,v);
}
static FORCEINLINE HRESULT IHTMLHeadElement_get_profile(IHTMLHeadElement* This,BSTR *p) {
    return This->lpVtbl->get_profile(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLHeadElement_put_profile_Proxy(
    IHTMLHeadElement* This,
    BSTR v);
void __RPC_STUB IHTMLHeadElement_put_profile_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLHeadElement_get_profile_Proxy(
    IHTMLHeadElement* This,
    BSTR *p);
void __RPC_STUB IHTMLHeadElement_get_profile_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLHeadElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLHeadElement2 interface
 */
#ifndef __IHTMLHeadElement2_INTERFACE_DEFINED__
#define __IHTMLHeadElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLHeadElement2, 0x3051042f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051042f-98b5-11cf-bb82-00aa00bdce0b")
IHTMLHeadElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_profile(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_profile(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLHeadElement2, 0x3051042f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLHeadElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLHeadElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLHeadElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLHeadElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLHeadElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLHeadElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLHeadElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLHeadElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLHeadElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_profile)(
        IHTMLHeadElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_profile)(
        IHTMLHeadElement2* This,
        BSTR *p);

    END_INTERFACE
} IHTMLHeadElement2Vtbl;
interface IHTMLHeadElement2 {
    CONST_VTBL IHTMLHeadElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLHeadElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLHeadElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLHeadElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLHeadElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLHeadElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLHeadElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLHeadElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLHeadElement2 methods ***/
#define IHTMLHeadElement2_put_profile(This,v) (This)->lpVtbl->put_profile(This,v)
#define IHTMLHeadElement2_get_profile(This,p) (This)->lpVtbl->get_profile(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLHeadElement2_QueryInterface(IHTMLHeadElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLHeadElement2_AddRef(IHTMLHeadElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLHeadElement2_Release(IHTMLHeadElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLHeadElement2_GetTypeInfoCount(IHTMLHeadElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLHeadElement2_GetTypeInfo(IHTMLHeadElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLHeadElement2_GetIDsOfNames(IHTMLHeadElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLHeadElement2_Invoke(IHTMLHeadElement2* 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);
}
/*** IHTMLHeadElement2 methods ***/
static FORCEINLINE HRESULT IHTMLHeadElement2_put_profile(IHTMLHeadElement2* This,BSTR v) {
    return This->lpVtbl->put_profile(This,v);
}
static FORCEINLINE HRESULT IHTMLHeadElement2_get_profile(IHTMLHeadElement2* This,BSTR *p) {
    return This->lpVtbl->get_profile(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLHeadElement2_put_profile_Proxy(
    IHTMLHeadElement2* This,
    BSTR v);
void __RPC_STUB IHTMLHeadElement2_put_profile_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLHeadElement2_get_profile_Proxy(
    IHTMLHeadElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLHeadElement2_get_profile_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLHeadElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLTitleElement interface
 */
#ifndef __IHTMLTitleElement_INTERFACE_DEFINED__
#define __IHTMLTitleElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTitleElement, 0x3050f322, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f322-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTitleElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_text(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_text(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTitleElement, 0x3050f322, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTitleElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTitleElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTitleElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTitleElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTitleElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTitleElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTitleElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTitleElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLTitleElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_text)(
        IHTMLTitleElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_text)(
        IHTMLTitleElement* This,
        BSTR *p);

    END_INTERFACE
} IHTMLTitleElementVtbl;
interface IHTMLTitleElement {
    CONST_VTBL IHTMLTitleElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTitleElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTitleElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTitleElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTitleElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTitleElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTitleElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTitleElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLTitleElement methods ***/
#define IHTMLTitleElement_put_text(This,v) (This)->lpVtbl->put_text(This,v)
#define IHTMLTitleElement_get_text(This,p) (This)->lpVtbl->get_text(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLTitleElement_QueryInterface(IHTMLTitleElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTitleElement_AddRef(IHTMLTitleElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTitleElement_Release(IHTMLTitleElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTitleElement_GetTypeInfoCount(IHTMLTitleElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTitleElement_GetTypeInfo(IHTMLTitleElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTitleElement_GetIDsOfNames(IHTMLTitleElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTitleElement_Invoke(IHTMLTitleElement* 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);
}
/*** IHTMLTitleElement methods ***/
static FORCEINLINE HRESULT IHTMLTitleElement_put_text(IHTMLTitleElement* This,BSTR v) {
    return This->lpVtbl->put_text(This,v);
}
static FORCEINLINE HRESULT IHTMLTitleElement_get_text(IHTMLTitleElement* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLTitleElement_put_text_Proxy(
    IHTMLTitleElement* This,
    BSTR v);
void __RPC_STUB IHTMLTitleElement_put_text_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTitleElement_get_text_Proxy(
    IHTMLTitleElement* This,
    BSTR *p);
void __RPC_STUB IHTMLTitleElement_get_text_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLTitleElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLMetaElement interface
 */
#ifndef __IHTMLMetaElement_INTERFACE_DEFINED__
#define __IHTMLMetaElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLMetaElement, 0x3050f203, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f203-98b5-11cf-bb82-00aa00bdce0b")
IHTMLMetaElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_httpEquiv(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_httpEquiv(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_content(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_content(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_name(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_url(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_url(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_charset(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_charset(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLMetaElement, 0x3050f203, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLMetaElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLMetaElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLMetaElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLMetaElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLMetaElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLMetaElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLMetaElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLMetaElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLMetaElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_httpEquiv)(
        IHTMLMetaElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_httpEquiv)(
        IHTMLMetaElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_content)(
        IHTMLMetaElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_content)(
        IHTMLMetaElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_name)(
        IHTMLMetaElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_name)(
        IHTMLMetaElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_url)(
        IHTMLMetaElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_url)(
        IHTMLMetaElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_charset)(
        IHTMLMetaElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_charset)(
        IHTMLMetaElement* This,
        BSTR *p);

    END_INTERFACE
} IHTMLMetaElementVtbl;
interface IHTMLMetaElement {
    CONST_VTBL IHTMLMetaElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLMetaElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLMetaElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLMetaElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLMetaElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLMetaElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLMetaElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLMetaElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLMetaElement methods ***/
#define IHTMLMetaElement_put_httpEquiv(This,v) (This)->lpVtbl->put_httpEquiv(This,v)
#define IHTMLMetaElement_get_httpEquiv(This,p) (This)->lpVtbl->get_httpEquiv(This,p)
#define IHTMLMetaElement_put_content(This,v) (This)->lpVtbl->put_content(This,v)
#define IHTMLMetaElement_get_content(This,p) (This)->lpVtbl->get_content(This,p)
#define IHTMLMetaElement_put_name(This,v) (This)->lpVtbl->put_name(This,v)
#define IHTMLMetaElement_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#define IHTMLMetaElement_put_url(This,v) (This)->lpVtbl->put_url(This,v)
#define IHTMLMetaElement_get_url(This,p) (This)->lpVtbl->get_url(This,p)
#define IHTMLMetaElement_put_charset(This,v) (This)->lpVtbl->put_charset(This,v)
#define IHTMLMetaElement_get_charset(This,p) (This)->lpVtbl->get_charset(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLMetaElement_QueryInterface(IHTMLMetaElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLMetaElement_AddRef(IHTMLMetaElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLMetaElement_Release(IHTMLMetaElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLMetaElement_GetTypeInfoCount(IHTMLMetaElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLMetaElement_GetTypeInfo(IHTMLMetaElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLMetaElement_GetIDsOfNames(IHTMLMetaElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLMetaElement_Invoke(IHTMLMetaElement* 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);
}
/*** IHTMLMetaElement methods ***/
static FORCEINLINE HRESULT IHTMLMetaElement_put_httpEquiv(IHTMLMetaElement* This,BSTR v) {
    return This->lpVtbl->put_httpEquiv(This,v);
}
static FORCEINLINE HRESULT IHTMLMetaElement_get_httpEquiv(IHTMLMetaElement* This,BSTR *p) {
    return This->lpVtbl->get_httpEquiv(This,p);
}
static FORCEINLINE HRESULT IHTMLMetaElement_put_content(IHTMLMetaElement* This,BSTR v) {
    return This->lpVtbl->put_content(This,v);
}
static FORCEINLINE HRESULT IHTMLMetaElement_get_content(IHTMLMetaElement* This,BSTR *p) {
    return This->lpVtbl->get_content(This,p);
}
static FORCEINLINE HRESULT IHTMLMetaElement_put_name(IHTMLMetaElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static FORCEINLINE HRESULT IHTMLMetaElement_get_name(IHTMLMetaElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static FORCEINLINE HRESULT IHTMLMetaElement_put_url(IHTMLMetaElement* This,BSTR v) {
    return This->lpVtbl->put_url(This,v);
}
static FORCEINLINE HRESULT IHTMLMetaElement_get_url(IHTMLMetaElement* This,BSTR *p) {
    return This->lpVtbl->get_url(This,p);
}
static FORCEINLINE HRESULT IHTMLMetaElement_put_charset(IHTMLMetaElement* This,BSTR v) {
    return This->lpVtbl->put_charset(This,v);
}
static FORCEINLINE HRESULT IHTMLMetaElement_get_charset(IHTMLMetaElement* This,BSTR *p) {
    return This->lpVtbl->get_charset(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLMetaElement_put_httpEquiv_Proxy(
    IHTMLMetaElement* This,
    BSTR v);
void __RPC_STUB IHTMLMetaElement_put_httpEquiv_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMetaElement_get_httpEquiv_Proxy(
    IHTMLMetaElement* This,
    BSTR *p);
void __RPC_STUB IHTMLMetaElement_get_httpEquiv_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMetaElement_put_content_Proxy(
    IHTMLMetaElement* This,
    BSTR v);
void __RPC_STUB IHTMLMetaElement_put_content_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMetaElement_get_content_Proxy(
    IHTMLMetaElement* This,
    BSTR *p);
void __RPC_STUB IHTMLMetaElement_get_content_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMetaElement_put_name_Proxy(
    IHTMLMetaElement* This,
    BSTR v);
void __RPC_STUB IHTMLMetaElement_put_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMetaElement_get_name_Proxy(
    IHTMLMetaElement* This,
    BSTR *p);
void __RPC_STUB IHTMLMetaElement_get_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMetaElement_put_url_Proxy(
    IHTMLMetaElement* This,
    BSTR v);
void __RPC_STUB IHTMLMetaElement_put_url_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMetaElement_get_url_Proxy(
    IHTMLMetaElement* This,
    BSTR *p);
void __RPC_STUB IHTMLMetaElement_get_url_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMetaElement_put_charset_Proxy(
    IHTMLMetaElement* This,
    BSTR v);
void __RPC_STUB IHTMLMetaElement_put_charset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMetaElement_get_charset_Proxy(
    IHTMLMetaElement* This,
    BSTR *p);
void __RPC_STUB IHTMLMetaElement_get_charset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLMetaElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLMetaElement2 interface
 */
#ifndef __IHTMLMetaElement2_INTERFACE_DEFINED__
#define __IHTMLMetaElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLMetaElement2, 0x3050f81f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f81f-98b5-11cf-bb82-00aa00bdce0b")
IHTMLMetaElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_scheme(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scheme(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLMetaElement2, 0x3050f81f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLMetaElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLMetaElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLMetaElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLMetaElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLMetaElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLMetaElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLMetaElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLMetaElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLMetaElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_scheme)(
        IHTMLMetaElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_scheme)(
        IHTMLMetaElement2* This,
        BSTR *p);

    END_INTERFACE
} IHTMLMetaElement2Vtbl;
interface IHTMLMetaElement2 {
    CONST_VTBL IHTMLMetaElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLMetaElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLMetaElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLMetaElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLMetaElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLMetaElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLMetaElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLMetaElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLMetaElement2 methods ***/
#define IHTMLMetaElement2_put_scheme(This,v) (This)->lpVtbl->put_scheme(This,v)
#define IHTMLMetaElement2_get_scheme(This,p) (This)->lpVtbl->get_scheme(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLMetaElement2_QueryInterface(IHTMLMetaElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLMetaElement2_AddRef(IHTMLMetaElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLMetaElement2_Release(IHTMLMetaElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLMetaElement2_GetTypeInfoCount(IHTMLMetaElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLMetaElement2_GetTypeInfo(IHTMLMetaElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLMetaElement2_GetIDsOfNames(IHTMLMetaElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLMetaElement2_Invoke(IHTMLMetaElement2* 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);
}
/*** IHTMLMetaElement2 methods ***/
static FORCEINLINE HRESULT IHTMLMetaElement2_put_scheme(IHTMLMetaElement2* This,BSTR v) {
    return This->lpVtbl->put_scheme(This,v);
}
static FORCEINLINE HRESULT IHTMLMetaElement2_get_scheme(IHTMLMetaElement2* This,BSTR *p) {
    return This->lpVtbl->get_scheme(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLMetaElement2_put_scheme_Proxy(
    IHTMLMetaElement2* This,
    BSTR v);
void __RPC_STUB IHTMLMetaElement2_put_scheme_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMetaElement2_get_scheme_Proxy(
    IHTMLMetaElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLMetaElement2_get_scheme_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLMetaElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLMetaElement3 interface
 */
#ifndef __IHTMLMetaElement3_INTERFACE_DEFINED__
#define __IHTMLMetaElement3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLMetaElement3, 0x30510495, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510495-98b5-11cf-bb82-00aa00bdce0b")
IHTMLMetaElement3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_url(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_url(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLMetaElement3, 0x30510495, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLMetaElement3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLMetaElement3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLMetaElement3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLMetaElement3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLMetaElement3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLMetaElement3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLMetaElement3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLMetaElement3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLMetaElement3 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_url)(
        IHTMLMetaElement3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_url)(
        IHTMLMetaElement3* This,
        BSTR *p);

    END_INTERFACE
} IHTMLMetaElement3Vtbl;
interface IHTMLMetaElement3 {
    CONST_VTBL IHTMLMetaElement3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLMetaElement3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLMetaElement3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLMetaElement3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLMetaElement3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLMetaElement3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLMetaElement3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLMetaElement3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLMetaElement3 methods ***/
#define IHTMLMetaElement3_put_url(This,v) (This)->lpVtbl->put_url(This,v)
#define IHTMLMetaElement3_get_url(This,p) (This)->lpVtbl->get_url(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLMetaElement3_QueryInterface(IHTMLMetaElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLMetaElement3_AddRef(IHTMLMetaElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLMetaElement3_Release(IHTMLMetaElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLMetaElement3_GetTypeInfoCount(IHTMLMetaElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLMetaElement3_GetTypeInfo(IHTMLMetaElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLMetaElement3_GetIDsOfNames(IHTMLMetaElement3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLMetaElement3_Invoke(IHTMLMetaElement3* 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);
}
/*** IHTMLMetaElement3 methods ***/
static FORCEINLINE HRESULT IHTMLMetaElement3_put_url(IHTMLMetaElement3* This,BSTR v) {
    return This->lpVtbl->put_url(This,v);
}
static FORCEINLINE HRESULT IHTMLMetaElement3_get_url(IHTMLMetaElement3* This,BSTR *p) {
    return This->lpVtbl->get_url(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLMetaElement3_put_url_Proxy(
    IHTMLMetaElement3* This,
    BSTR v);
void __RPC_STUB IHTMLMetaElement3_put_url_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMetaElement3_get_url_Proxy(
    IHTMLMetaElement3* This,
    BSTR *p);
void __RPC_STUB IHTMLMetaElement3_get_url_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLMetaElement3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLBaseElement interface
 */
#ifndef __IHTMLBaseElement_INTERFACE_DEFINED__
#define __IHTMLBaseElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLBaseElement, 0x3050f204, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f204-98b5-11cf-bb82-00aa00bdce0b")
IHTMLBaseElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_href(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_href(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_target(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_target(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLBaseElement, 0x3050f204, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLBaseElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLBaseElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLBaseElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLBaseElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLBaseElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLBaseElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLBaseElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLBaseElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLBaseElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_href)(
        IHTMLBaseElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_href)(
        IHTMLBaseElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_target)(
        IHTMLBaseElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_target)(
        IHTMLBaseElement* This,
        BSTR *p);

    END_INTERFACE
} IHTMLBaseElementVtbl;
interface IHTMLBaseElement {
    CONST_VTBL IHTMLBaseElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLBaseElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLBaseElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLBaseElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLBaseElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLBaseElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLBaseElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLBaseElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLBaseElement methods ***/
#define IHTMLBaseElement_put_href(This,v) (This)->lpVtbl->put_href(This,v)
#define IHTMLBaseElement_get_href(This,p) (This)->lpVtbl->get_href(This,p)
#define IHTMLBaseElement_put_target(This,v) (This)->lpVtbl->put_target(This,v)
#define IHTMLBaseElement_get_target(This,p) (This)->lpVtbl->get_target(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLBaseElement_QueryInterface(IHTMLBaseElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLBaseElement_AddRef(IHTMLBaseElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLBaseElement_Release(IHTMLBaseElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLBaseElement_GetTypeInfoCount(IHTMLBaseElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLBaseElement_GetTypeInfo(IHTMLBaseElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLBaseElement_GetIDsOfNames(IHTMLBaseElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLBaseElement_Invoke(IHTMLBaseElement* 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);
}
/*** IHTMLBaseElement methods ***/
static FORCEINLINE HRESULT IHTMLBaseElement_put_href(IHTMLBaseElement* This,BSTR v) {
    return This->lpVtbl->put_href(This,v);
}
static FORCEINLINE HRESULT IHTMLBaseElement_get_href(IHTMLBaseElement* This,BSTR *p) {
    return This->lpVtbl->get_href(This,p);
}
static FORCEINLINE HRESULT IHTMLBaseElement_put_target(IHTMLBaseElement* This,BSTR v) {
    return This->lpVtbl->put_target(This,v);
}
static FORCEINLINE HRESULT IHTMLBaseElement_get_target(IHTMLBaseElement* This,BSTR *p) {
    return This->lpVtbl->get_target(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLBaseElement_put_href_Proxy(
    IHTMLBaseElement* This,
    BSTR v);
void __RPC_STUB IHTMLBaseElement_put_href_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBaseElement_get_href_Proxy(
    IHTMLBaseElement* This,
    BSTR *p);
void __RPC_STUB IHTMLBaseElement_get_href_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBaseElement_put_target_Proxy(
    IHTMLBaseElement* This,
    BSTR v);
void __RPC_STUB IHTMLBaseElement_put_target_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBaseElement_get_target_Proxy(
    IHTMLBaseElement* This,
    BSTR *p);
void __RPC_STUB IHTMLBaseElement_get_target_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLBaseElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLBaseElement2 interface
 */
#ifndef __IHTMLBaseElement2_INTERFACE_DEFINED__
#define __IHTMLBaseElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLBaseElement2, 0x30510420, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510420-98b5-11cf-bb82-00aa00bdce0b")
IHTMLBaseElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_href(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_href(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLBaseElement2, 0x30510420, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLBaseElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLBaseElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLBaseElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLBaseElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLBaseElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLBaseElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLBaseElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLBaseElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLBaseElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_href)(
        IHTMLBaseElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_href)(
        IHTMLBaseElement2* This,
        BSTR *p);

    END_INTERFACE
} IHTMLBaseElement2Vtbl;
interface IHTMLBaseElement2 {
    CONST_VTBL IHTMLBaseElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLBaseElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLBaseElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLBaseElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLBaseElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLBaseElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLBaseElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLBaseElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLBaseElement2 methods ***/
#define IHTMLBaseElement2_put_href(This,v) (This)->lpVtbl->put_href(This,v)
#define IHTMLBaseElement2_get_href(This,p) (This)->lpVtbl->get_href(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLBaseElement2_QueryInterface(IHTMLBaseElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLBaseElement2_AddRef(IHTMLBaseElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLBaseElement2_Release(IHTMLBaseElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLBaseElement2_GetTypeInfoCount(IHTMLBaseElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLBaseElement2_GetTypeInfo(IHTMLBaseElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLBaseElement2_GetIDsOfNames(IHTMLBaseElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLBaseElement2_Invoke(IHTMLBaseElement2* 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);
}
/*** IHTMLBaseElement2 methods ***/
static FORCEINLINE HRESULT IHTMLBaseElement2_put_href(IHTMLBaseElement2* This,BSTR v) {
    return This->lpVtbl->put_href(This,v);
}
static FORCEINLINE HRESULT IHTMLBaseElement2_get_href(IHTMLBaseElement2* This,BSTR *p) {
    return This->lpVtbl->get_href(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLBaseElement2_put_href_Proxy(
    IHTMLBaseElement2* This,
    BSTR v);
void __RPC_STUB IHTMLBaseElement2_put_href_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBaseElement2_get_href_Proxy(
    IHTMLBaseElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLBaseElement2_get_href_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLBaseElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLIsIndexElement interface
 */
#ifndef __IHTMLIsIndexElement_INTERFACE_DEFINED__
#define __IHTMLIsIndexElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLIsIndexElement, 0x3050f206, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f206-98b5-11cf-bb82-00aa00bdce0b")
IHTMLIsIndexElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_prompt(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_prompt(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_action(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_action(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLIsIndexElement, 0x3050f206, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLIsIndexElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLIsIndexElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLIsIndexElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLIsIndexElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLIsIndexElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLIsIndexElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLIsIndexElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLIsIndexElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLIsIndexElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_prompt)(
        IHTMLIsIndexElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_prompt)(
        IHTMLIsIndexElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_action)(
        IHTMLIsIndexElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_action)(
        IHTMLIsIndexElement* This,
        BSTR *p);

    END_INTERFACE
} IHTMLIsIndexElementVtbl;
interface IHTMLIsIndexElement {
    CONST_VTBL IHTMLIsIndexElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLIsIndexElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLIsIndexElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLIsIndexElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLIsIndexElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLIsIndexElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLIsIndexElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLIsIndexElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLIsIndexElement methods ***/
#define IHTMLIsIndexElement_put_prompt(This,v) (This)->lpVtbl->put_prompt(This,v)
#define IHTMLIsIndexElement_get_prompt(This,p) (This)->lpVtbl->get_prompt(This,p)
#define IHTMLIsIndexElement_put_action(This,v) (This)->lpVtbl->put_action(This,v)
#define IHTMLIsIndexElement_get_action(This,p) (This)->lpVtbl->get_action(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLIsIndexElement_QueryInterface(IHTMLIsIndexElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLIsIndexElement_AddRef(IHTMLIsIndexElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLIsIndexElement_Release(IHTMLIsIndexElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLIsIndexElement_GetTypeInfoCount(IHTMLIsIndexElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLIsIndexElement_GetTypeInfo(IHTMLIsIndexElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLIsIndexElement_GetIDsOfNames(IHTMLIsIndexElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLIsIndexElement_Invoke(IHTMLIsIndexElement* 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);
}
/*** IHTMLIsIndexElement methods ***/
static FORCEINLINE HRESULT IHTMLIsIndexElement_put_prompt(IHTMLIsIndexElement* This,BSTR v) {
    return This->lpVtbl->put_prompt(This,v);
}
static FORCEINLINE HRESULT IHTMLIsIndexElement_get_prompt(IHTMLIsIndexElement* This,BSTR *p) {
    return This->lpVtbl->get_prompt(This,p);
}
static FORCEINLINE HRESULT IHTMLIsIndexElement_put_action(IHTMLIsIndexElement* This,BSTR v) {
    return This->lpVtbl->put_action(This,v);
}
static FORCEINLINE HRESULT IHTMLIsIndexElement_get_action(IHTMLIsIndexElement* This,BSTR *p) {
    return This->lpVtbl->get_action(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLIsIndexElement_put_prompt_Proxy(
    IHTMLIsIndexElement* This,
    BSTR v);
void __RPC_STUB IHTMLIsIndexElement_put_prompt_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLIsIndexElement_get_prompt_Proxy(
    IHTMLIsIndexElement* This,
    BSTR *p);
void __RPC_STUB IHTMLIsIndexElement_get_prompt_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLIsIndexElement_put_action_Proxy(
    IHTMLIsIndexElement* This,
    BSTR v);
void __RPC_STUB IHTMLIsIndexElement_put_action_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLIsIndexElement_get_action_Proxy(
    IHTMLIsIndexElement* This,
    BSTR *p);
void __RPC_STUB IHTMLIsIndexElement_get_action_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLIsIndexElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLIsIndexElement2 interface
 */
#ifndef __IHTMLIsIndexElement2_INTERFACE_DEFINED__
#define __IHTMLIsIndexElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLIsIndexElement2, 0x3050f82f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f82f-98b5-11cf-bb82-00aa00bdce0b")
IHTMLIsIndexElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_form(
        IHTMLFormElement **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLIsIndexElement2, 0x3050f82f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLIsIndexElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLIsIndexElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLIsIndexElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLIsIndexElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLIsIndexElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLIsIndexElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLIsIndexElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLIsIndexElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLIsIndexElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_form)(
        IHTMLIsIndexElement2* This,
        IHTMLFormElement **p);

    END_INTERFACE
} IHTMLIsIndexElement2Vtbl;
interface IHTMLIsIndexElement2 {
    CONST_VTBL IHTMLIsIndexElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLIsIndexElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLIsIndexElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLIsIndexElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLIsIndexElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLIsIndexElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLIsIndexElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLIsIndexElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLIsIndexElement2 methods ***/
#define IHTMLIsIndexElement2_get_form(This,p) (This)->lpVtbl->get_form(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLIsIndexElement2_QueryInterface(IHTMLIsIndexElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLIsIndexElement2_AddRef(IHTMLIsIndexElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLIsIndexElement2_Release(IHTMLIsIndexElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLIsIndexElement2_GetTypeInfoCount(IHTMLIsIndexElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLIsIndexElement2_GetTypeInfo(IHTMLIsIndexElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLIsIndexElement2_GetIDsOfNames(IHTMLIsIndexElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLIsIndexElement2_Invoke(IHTMLIsIndexElement2* 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);
}
/*** IHTMLIsIndexElement2 methods ***/
static FORCEINLINE HRESULT IHTMLIsIndexElement2_get_form(IHTMLIsIndexElement2* This,IHTMLFormElement **p) {
    return This->lpVtbl->get_form(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLIsIndexElement2_get_form_Proxy(
    IHTMLIsIndexElement2* This,
    IHTMLFormElement **p);
void __RPC_STUB IHTMLIsIndexElement2_get_form_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLIsIndexElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLNextIdElement interface
 */
#ifndef __IHTMLNextIdElement_INTERFACE_DEFINED__
#define __IHTMLNextIdElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLNextIdElement, 0x3050f207, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f207-98b5-11cf-bb82-00aa00bdce0b")
IHTMLNextIdElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_n(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_n(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLNextIdElement, 0x3050f207, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLNextIdElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLNextIdElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLNextIdElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLNextIdElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLNextIdElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLNextIdElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLNextIdElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLNextIdElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLNextIdElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_n)(
        IHTMLNextIdElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_n)(
        IHTMLNextIdElement* This,
        BSTR *p);

    END_INTERFACE
} IHTMLNextIdElementVtbl;
interface IHTMLNextIdElement {
    CONST_VTBL IHTMLNextIdElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLNextIdElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLNextIdElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLNextIdElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLNextIdElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLNextIdElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLNextIdElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLNextIdElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLNextIdElement methods ***/
#define IHTMLNextIdElement_put_n(This,v) (This)->lpVtbl->put_n(This,v)
#define IHTMLNextIdElement_get_n(This,p) (This)->lpVtbl->get_n(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLNextIdElement_QueryInterface(IHTMLNextIdElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLNextIdElement_AddRef(IHTMLNextIdElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLNextIdElement_Release(IHTMLNextIdElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLNextIdElement_GetTypeInfoCount(IHTMLNextIdElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLNextIdElement_GetTypeInfo(IHTMLNextIdElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLNextIdElement_GetIDsOfNames(IHTMLNextIdElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLNextIdElement_Invoke(IHTMLNextIdElement* 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);
}
/*** IHTMLNextIdElement methods ***/
static FORCEINLINE HRESULT IHTMLNextIdElement_put_n(IHTMLNextIdElement* This,BSTR v) {
    return This->lpVtbl->put_n(This,v);
}
static FORCEINLINE HRESULT IHTMLNextIdElement_get_n(IHTMLNextIdElement* This,BSTR *p) {
    return This->lpVtbl->get_n(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLNextIdElement_put_n_Proxy(
    IHTMLNextIdElement* This,
    BSTR v);
void __RPC_STUB IHTMLNextIdElement_put_n_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLNextIdElement_get_n_Proxy(
    IHTMLNextIdElement* This,
    BSTR *p);
void __RPC_STUB IHTMLNextIdElement_get_n_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLNextIdElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLHtmlElement dispinterface
 */
#ifndef __DispHTMLHtmlElement_DISPINTERFACE_DEFINED__
#define __DispHTMLHtmlElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLHtmlElement, 0x3050f560, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f560-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLHtmlElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLHtmlElement, 0x3050f560, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLHtmlElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLHtmlElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLHtmlElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLHtmlElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLHtmlElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLHtmlElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLHtmlElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLHtmlElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLHtmlElementVtbl;
interface DispHTMLHtmlElement {
    CONST_VTBL DispHTMLHtmlElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLHtmlElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLHtmlElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLHtmlElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLHtmlElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLHtmlElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLHtmlElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLHtmlElement_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 DispHTMLHtmlElement_QueryInterface(DispHTMLHtmlElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLHtmlElement_AddRef(DispHTMLHtmlElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLHtmlElement_Release(DispHTMLHtmlElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLHtmlElement_GetTypeInfoCount(DispHTMLHtmlElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLHtmlElement_GetTypeInfo(DispHTMLHtmlElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLHtmlElement_GetIDsOfNames(DispHTMLHtmlElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLHtmlElement_Invoke(DispHTMLHtmlElement* 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  /* __DispHTMLHtmlElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLHtmlElement coclass
 */

DEFINE_GUID(CLSID_HTMLHtmlElement, 0x3050f491, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f491-98b5-11cf-bb82-00aa00bdce0b") HTMLHtmlElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLHtmlElement, 0x3050f491, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CHtmlElement;
/*****************************************************************************
 * DispHTMLHeadElement dispinterface
 */
#ifndef __DispHTMLHeadElement_DISPINTERFACE_DEFINED__
#define __DispHTMLHeadElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLHeadElement, 0x3050f561, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f561-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLHeadElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLHeadElement, 0x3050f561, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLHeadElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLHeadElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLHeadElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLHeadElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLHeadElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLHeadElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLHeadElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLHeadElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLHeadElementVtbl;
interface DispHTMLHeadElement {
    CONST_VTBL DispHTMLHeadElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLHeadElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLHeadElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLHeadElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLHeadElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLHeadElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLHeadElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLHeadElement_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 DispHTMLHeadElement_QueryInterface(DispHTMLHeadElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLHeadElement_AddRef(DispHTMLHeadElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLHeadElement_Release(DispHTMLHeadElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLHeadElement_GetTypeInfoCount(DispHTMLHeadElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLHeadElement_GetTypeInfo(DispHTMLHeadElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLHeadElement_GetIDsOfNames(DispHTMLHeadElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLHeadElement_Invoke(DispHTMLHeadElement* 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  /* __DispHTMLHeadElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLHeadElement coclass
 */

DEFINE_GUID(CLSID_HTMLHeadElement, 0x3050f493, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f493-98b5-11cf-bb82-00aa00bdce0b") HTMLHeadElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLHeadElement, 0x3050f493, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CHeadElement;
/*****************************************************************************
 * DispHTMLTitleElement dispinterface
 */
#ifndef __DispHTMLTitleElement_DISPINTERFACE_DEFINED__
#define __DispHTMLTitleElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLTitleElement, 0x3050f516, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f516-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLTitleElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLTitleElement, 0x3050f516, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLTitleElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLTitleElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLTitleElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLTitleElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLTitleElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLTitleElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLTitleElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLTitleElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLTitleElementVtbl;
interface DispHTMLTitleElement {
    CONST_VTBL DispHTMLTitleElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLTitleElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLTitleElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLTitleElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLTitleElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLTitleElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLTitleElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLTitleElement_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 DispHTMLTitleElement_QueryInterface(DispHTMLTitleElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLTitleElement_AddRef(DispHTMLTitleElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLTitleElement_Release(DispHTMLTitleElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLTitleElement_GetTypeInfoCount(DispHTMLTitleElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLTitleElement_GetTypeInfo(DispHTMLTitleElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLTitleElement_GetIDsOfNames(DispHTMLTitleElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLTitleElement_Invoke(DispHTMLTitleElement* 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  /* __DispHTMLTitleElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLTitleElement coclass
 */

DEFINE_GUID(CLSID_HTMLTitleElement, 0x3050f284, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f284-98b5-11cf-bb82-00aa00bdce0b") HTMLTitleElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLTitleElement, 0x3050f284, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CTitleElement;
/*****************************************************************************
 * DispHTMLMetaElement dispinterface
 */
#ifndef __DispHTMLMetaElement_DISPINTERFACE_DEFINED__
#define __DispHTMLMetaElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLMetaElement, 0x3050f517, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f517-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLMetaElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLMetaElement, 0x3050f517, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLMetaElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLMetaElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLMetaElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLMetaElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLMetaElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLMetaElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLMetaElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLMetaElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLMetaElementVtbl;
interface DispHTMLMetaElement {
    CONST_VTBL DispHTMLMetaElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLMetaElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLMetaElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLMetaElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLMetaElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLMetaElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLMetaElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLMetaElement_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 DispHTMLMetaElement_QueryInterface(DispHTMLMetaElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLMetaElement_AddRef(DispHTMLMetaElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLMetaElement_Release(DispHTMLMetaElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLMetaElement_GetTypeInfoCount(DispHTMLMetaElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLMetaElement_GetTypeInfo(DispHTMLMetaElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLMetaElement_GetIDsOfNames(DispHTMLMetaElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLMetaElement_Invoke(DispHTMLMetaElement* 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  /* __DispHTMLMetaElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLMetaElement coclass
 */

DEFINE_GUID(CLSID_HTMLMetaElement, 0x3050f275, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f275-98b5-11cf-bb82-00aa00bdce0b") HTMLMetaElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLMetaElement, 0x3050f275, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CMetaElement;
/*****************************************************************************
 * DispHTMLBaseElement dispinterface
 */
#ifndef __DispHTMLBaseElement_DISPINTERFACE_DEFINED__
#define __DispHTMLBaseElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLBaseElement, 0x3050f518, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f518-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLBaseElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLBaseElement, 0x3050f518, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLBaseElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLBaseElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLBaseElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLBaseElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLBaseElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLBaseElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLBaseElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLBaseElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLBaseElementVtbl;
interface DispHTMLBaseElement {
    CONST_VTBL DispHTMLBaseElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLBaseElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLBaseElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLBaseElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLBaseElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLBaseElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLBaseElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLBaseElement_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 DispHTMLBaseElement_QueryInterface(DispHTMLBaseElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLBaseElement_AddRef(DispHTMLBaseElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLBaseElement_Release(DispHTMLBaseElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLBaseElement_GetTypeInfoCount(DispHTMLBaseElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLBaseElement_GetTypeInfo(DispHTMLBaseElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLBaseElement_GetIDsOfNames(DispHTMLBaseElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLBaseElement_Invoke(DispHTMLBaseElement* 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  /* __DispHTMLBaseElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLBaseElement coclass
 */

DEFINE_GUID(CLSID_HTMLBaseElement, 0x3050f276, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f276-98b5-11cf-bb82-00aa00bdce0b") HTMLBaseElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLBaseElement, 0x3050f276, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CBaseElement;
/*****************************************************************************
 * DispHTMLIsIndexElement dispinterface
 */
#ifndef __DispHTMLIsIndexElement_DISPINTERFACE_DEFINED__
#define __DispHTMLIsIndexElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLIsIndexElement, 0x3050f519, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f519-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLIsIndexElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLIsIndexElement, 0x3050f519, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLIsIndexElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLIsIndexElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLIsIndexElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLIsIndexElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLIsIndexElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLIsIndexElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLIsIndexElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLIsIndexElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLIsIndexElementVtbl;
interface DispHTMLIsIndexElement {
    CONST_VTBL DispHTMLIsIndexElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLIsIndexElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLIsIndexElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLIsIndexElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLIsIndexElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLIsIndexElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLIsIndexElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLIsIndexElement_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 DispHTMLIsIndexElement_QueryInterface(DispHTMLIsIndexElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLIsIndexElement_AddRef(DispHTMLIsIndexElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLIsIndexElement_Release(DispHTMLIsIndexElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLIsIndexElement_GetTypeInfoCount(DispHTMLIsIndexElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLIsIndexElement_GetTypeInfo(DispHTMLIsIndexElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLIsIndexElement_GetIDsOfNames(DispHTMLIsIndexElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLIsIndexElement_Invoke(DispHTMLIsIndexElement* 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  /* __DispHTMLIsIndexElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLIsIndexElement coclass
 */

DEFINE_GUID(CLSID_HTMLIsIndexElement, 0x3050f278, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f278-98b5-11cf-bb82-00aa00bdce0b") HTMLIsIndexElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLIsIndexElement, 0x3050f278, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CIsIndexElement;
/*****************************************************************************
 * DispHTMLNextIdElement dispinterface
 */
#ifndef __DispHTMLNextIdElement_DISPINTERFACE_DEFINED__
#define __DispHTMLNextIdElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLNextIdElement, 0x3050f51a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f51a-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLNextIdElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLNextIdElement, 0x3050f51a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLNextIdElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLNextIdElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLNextIdElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLNextIdElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLNextIdElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLNextIdElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLNextIdElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLNextIdElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLNextIdElementVtbl;
interface DispHTMLNextIdElement {
    CONST_VTBL DispHTMLNextIdElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLNextIdElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLNextIdElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLNextIdElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLNextIdElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLNextIdElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLNextIdElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLNextIdElement_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 DispHTMLNextIdElement_QueryInterface(DispHTMLNextIdElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLNextIdElement_AddRef(DispHTMLNextIdElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLNextIdElement_Release(DispHTMLNextIdElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLNextIdElement_GetTypeInfoCount(DispHTMLNextIdElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLNextIdElement_GetTypeInfo(DispHTMLNextIdElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLNextIdElement_GetIDsOfNames(DispHTMLNextIdElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLNextIdElement_Invoke(DispHTMLNextIdElement* 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  /* __DispHTMLNextIdElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLNextIdElement coclass
 */

DEFINE_GUID(CLSID_HTMLNextIdElement, 0x3050f279, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f279-98b5-11cf-bb82-00aa00bdce0b") HTMLNextIdElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLNextIdElement, 0x3050f279, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CNextIdElement;
/*****************************************************************************
 * IHTMLBaseFontElement interface
 */
#ifndef __IHTMLBaseFontElement_INTERFACE_DEFINED__
#define __IHTMLBaseFontElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLBaseFontElement, 0x3050f202, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f202-98b5-11cf-bb82-00aa00bdce0b")
IHTMLBaseFontElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_color(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_color(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_face(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_face(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_size(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_size(
        LONG *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLBaseFontElement, 0x3050f202, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLBaseFontElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLBaseFontElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLBaseFontElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLBaseFontElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLBaseFontElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLBaseFontElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLBaseFontElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLBaseFontElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLBaseFontElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_color)(
        IHTMLBaseFontElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_color)(
        IHTMLBaseFontElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_face)(
        IHTMLBaseFontElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_face)(
        IHTMLBaseFontElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_size)(
        IHTMLBaseFontElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_size)(
        IHTMLBaseFontElement* This,
        LONG *p);

    END_INTERFACE
} IHTMLBaseFontElementVtbl;
interface IHTMLBaseFontElement {
    CONST_VTBL IHTMLBaseFontElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLBaseFontElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLBaseFontElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLBaseFontElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLBaseFontElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLBaseFontElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLBaseFontElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLBaseFontElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLBaseFontElement methods ***/
#define IHTMLBaseFontElement_put_color(This,v) (This)->lpVtbl->put_color(This,v)
#define IHTMLBaseFontElement_get_color(This,p) (This)->lpVtbl->get_color(This,p)
#define IHTMLBaseFontElement_put_face(This,v) (This)->lpVtbl->put_face(This,v)
#define IHTMLBaseFontElement_get_face(This,p) (This)->lpVtbl->get_face(This,p)
#define IHTMLBaseFontElement_put_size(This,v) (This)->lpVtbl->put_size(This,v)
#define IHTMLBaseFontElement_get_size(This,p) (This)->lpVtbl->get_size(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLBaseFontElement_QueryInterface(IHTMLBaseFontElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLBaseFontElement_AddRef(IHTMLBaseFontElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLBaseFontElement_Release(IHTMLBaseFontElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLBaseFontElement_GetTypeInfoCount(IHTMLBaseFontElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLBaseFontElement_GetTypeInfo(IHTMLBaseFontElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLBaseFontElement_GetIDsOfNames(IHTMLBaseFontElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLBaseFontElement_Invoke(IHTMLBaseFontElement* 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);
}
/*** IHTMLBaseFontElement methods ***/
static FORCEINLINE HRESULT IHTMLBaseFontElement_put_color(IHTMLBaseFontElement* This,VARIANT v) {
    return This->lpVtbl->put_color(This,v);
}
static FORCEINLINE HRESULT IHTMLBaseFontElement_get_color(IHTMLBaseFontElement* This,VARIANT *p) {
    return This->lpVtbl->get_color(This,p);
}
static FORCEINLINE HRESULT IHTMLBaseFontElement_put_face(IHTMLBaseFontElement* This,BSTR v) {
    return This->lpVtbl->put_face(This,v);
}
static FORCEINLINE HRESULT IHTMLBaseFontElement_get_face(IHTMLBaseFontElement* This,BSTR *p) {
    return This->lpVtbl->get_face(This,p);
}
static FORCEINLINE HRESULT IHTMLBaseFontElement_put_size(IHTMLBaseFontElement* This,LONG v) {
    return This->lpVtbl->put_size(This,v);
}
static FORCEINLINE HRESULT IHTMLBaseFontElement_get_size(IHTMLBaseFontElement* This,LONG *p) {
    return This->lpVtbl->get_size(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLBaseFontElement_put_color_Proxy(
    IHTMLBaseFontElement* This,
    VARIANT v);
void __RPC_STUB IHTMLBaseFontElement_put_color_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBaseFontElement_get_color_Proxy(
    IHTMLBaseFontElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLBaseFontElement_get_color_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBaseFontElement_put_face_Proxy(
    IHTMLBaseFontElement* This,
    BSTR v);
void __RPC_STUB IHTMLBaseFontElement_put_face_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBaseFontElement_get_face_Proxy(
    IHTMLBaseFontElement* This,
    BSTR *p);
void __RPC_STUB IHTMLBaseFontElement_get_face_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBaseFontElement_put_size_Proxy(
    IHTMLBaseFontElement* This,
    LONG v);
void __RPC_STUB IHTMLBaseFontElement_put_size_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBaseFontElement_get_size_Proxy(
    IHTMLBaseFontElement* This,
    LONG *p);
void __RPC_STUB IHTMLBaseFontElement_get_size_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLBaseFontElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLBaseFontElement dispinterface
 */
#ifndef __DispHTMLBaseFontElement_DISPINTERFACE_DEFINED__
#define __DispHTMLBaseFontElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLBaseFontElement, 0x3050f504, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f504-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLBaseFontElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLBaseFontElement, 0x3050f504, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLBaseFontElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLBaseFontElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLBaseFontElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLBaseFontElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLBaseFontElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLBaseFontElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLBaseFontElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLBaseFontElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLBaseFontElementVtbl;
interface DispHTMLBaseFontElement {
    CONST_VTBL DispHTMLBaseFontElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLBaseFontElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLBaseFontElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLBaseFontElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLBaseFontElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLBaseFontElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLBaseFontElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLBaseFontElement_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 DispHTMLBaseFontElement_QueryInterface(DispHTMLBaseFontElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLBaseFontElement_AddRef(DispHTMLBaseFontElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLBaseFontElement_Release(DispHTMLBaseFontElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLBaseFontElement_GetTypeInfoCount(DispHTMLBaseFontElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLBaseFontElement_GetTypeInfo(DispHTMLBaseFontElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLBaseFontElement_GetIDsOfNames(DispHTMLBaseFontElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLBaseFontElement_Invoke(DispHTMLBaseFontElement* 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  /* __DispHTMLBaseFontElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLBaseFontElement coclass
 */

DEFINE_GUID(CLSID_HTMLBaseFontElement, 0x3050f282, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f282-98b5-11cf-bb82-00aa00bdce0b") HTMLBaseFontElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLBaseFontElement, 0x3050f282, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CBaseFontElement;
/*****************************************************************************
 * IHTMLUnknownElement interface
 */
#ifndef __IHTMLUnknownElement_INTERFACE_DEFINED__
#define __IHTMLUnknownElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLUnknownElement, 0x3050f209, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f209-98b5-11cf-bb82-00aa00bdce0b")
IHTMLUnknownElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLUnknownElement, 0x3050f209, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLUnknownElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLUnknownElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLUnknownElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLUnknownElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLUnknownElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLUnknownElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLUnknownElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLUnknownElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} IHTMLUnknownElementVtbl;
interface IHTMLUnknownElement {
    CONST_VTBL IHTMLUnknownElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLUnknownElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLUnknownElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLUnknownElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLUnknownElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLUnknownElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLUnknownElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLUnknownElement_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 IHTMLUnknownElement_QueryInterface(IHTMLUnknownElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLUnknownElement_AddRef(IHTMLUnknownElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLUnknownElement_Release(IHTMLUnknownElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLUnknownElement_GetTypeInfoCount(IHTMLUnknownElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLUnknownElement_GetTypeInfo(IHTMLUnknownElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLUnknownElement_GetIDsOfNames(IHTMLUnknownElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLUnknownElement_Invoke(IHTMLUnknownElement* 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  /* __IHTMLUnknownElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLUnknownElement dispinterface
 */
#ifndef __DispHTMLUnknownElement_DISPINTERFACE_DEFINED__
#define __DispHTMLUnknownElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLUnknownElement, 0x3050f539, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f539-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLUnknownElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLUnknownElement, 0x3050f539, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLUnknownElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLUnknownElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLUnknownElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLUnknownElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLUnknownElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLUnknownElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLUnknownElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLUnknownElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLUnknownElementVtbl;
interface DispHTMLUnknownElement {
    CONST_VTBL DispHTMLUnknownElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLUnknownElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLUnknownElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLUnknownElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLUnknownElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLUnknownElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLUnknownElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLUnknownElement_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 DispHTMLUnknownElement_QueryInterface(DispHTMLUnknownElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLUnknownElement_AddRef(DispHTMLUnknownElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLUnknownElement_Release(DispHTMLUnknownElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLUnknownElement_GetTypeInfoCount(DispHTMLUnknownElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLUnknownElement_GetTypeInfo(DispHTMLUnknownElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLUnknownElement_GetIDsOfNames(DispHTMLUnknownElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLUnknownElement_Invoke(DispHTMLUnknownElement* 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  /* __DispHTMLUnknownElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLUnknownElement coclass
 */

DEFINE_GUID(CLSID_HTMLUnknownElement, 0x3050f268, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f268-98b5-11cf-bb82-00aa00bdce0b") HTMLUnknownElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLUnknownElement, 0x3050f268, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CUnknownElement;
#ifndef __IWebGeolocation_FWD_DEFINED__
#define __IWebGeolocation_FWD_DEFINED__
typedef interface IWebGeolocation IWebGeolocation;
#endif

/*****************************************************************************
 * IOmHistory interface
 */
#ifndef __IOmHistory_INTERFACE_DEFINED__
#define __IOmHistory_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOmHistory, 0xfeceaaa2, 0x8405, 0x11cf, 0x8b,0xa1, 0x00,0xaa,0x00,0x47,0x6d,0xa6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("feceaaa2-8405-11cf-8ba1-00aa00476da6")
IOmHistory : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_length(
        short *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE back(
        VARIANT *pvargdistance) = 0;

    virtual HRESULT STDMETHODCALLTYPE forward(
        VARIANT *pvargdistance) = 0;

    virtual HRESULT STDMETHODCALLTYPE go(
        VARIANT *pvargdistance) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOmHistory, 0xfeceaaa2, 0x8405, 0x11cf, 0x8b,0xa1, 0x00,0xaa,0x00,0x47,0x6d,0xa6)
#endif
#else
typedef struct IOmHistoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IOmHistory* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IOmHistory* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IOmHistory* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IOmHistory* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IOmHistory* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IOmHistory* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IOmHistory* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IOmHistory methods ***/
    HRESULT (STDMETHODCALLTYPE *get_length)(
        IOmHistory* This,
        short *p);

    HRESULT (STDMETHODCALLTYPE *back)(
        IOmHistory* This,
        VARIANT *pvargdistance);

    HRESULT (STDMETHODCALLTYPE *forward)(
        IOmHistory* This,
        VARIANT *pvargdistance);

    HRESULT (STDMETHODCALLTYPE *go)(
        IOmHistory* This,
        VARIANT *pvargdistance);

    END_INTERFACE
} IOmHistoryVtbl;
interface IOmHistory {
    CONST_VTBL IOmHistoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOmHistory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOmHistory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOmHistory_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IOmHistory_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IOmHistory_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IOmHistory_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IOmHistory_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IOmHistory methods ***/
#define IOmHistory_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IOmHistory_back(This,pvargdistance) (This)->lpVtbl->back(This,pvargdistance)
#define IOmHistory_forward(This,pvargdistance) (This)->lpVtbl->forward(This,pvargdistance)
#define IOmHistory_go(This,pvargdistance) (This)->lpVtbl->go(This,pvargdistance)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOmHistory_QueryInterface(IOmHistory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOmHistory_AddRef(IOmHistory* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOmHistory_Release(IOmHistory* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IOmHistory_GetTypeInfoCount(IOmHistory* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IOmHistory_GetTypeInfo(IOmHistory* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IOmHistory_GetIDsOfNames(IOmHistory* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IOmHistory_Invoke(IOmHistory* 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);
}
/*** IOmHistory methods ***/
static FORCEINLINE HRESULT IOmHistory_get_length(IOmHistory* This,short *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IOmHistory_back(IOmHistory* This,VARIANT *pvargdistance) {
    return This->lpVtbl->back(This,pvargdistance);
}
static FORCEINLINE HRESULT IOmHistory_forward(IOmHistory* This,VARIANT *pvargdistance) {
    return This->lpVtbl->forward(This,pvargdistance);
}
static FORCEINLINE HRESULT IOmHistory_go(IOmHistory* This,VARIANT *pvargdistance) {
    return This->lpVtbl->go(This,pvargdistance);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOmHistory_get_length_Proxy(
    IOmHistory* This,
    short *p);
void __RPC_STUB IOmHistory_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOmHistory_back_Proxy(
    IOmHistory* This,
    VARIANT *pvargdistance);
void __RPC_STUB IOmHistory_back_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOmHistory_forward_Proxy(
    IOmHistory* This,
    VARIANT *pvargdistance);
void __RPC_STUB IOmHistory_forward_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOmHistory_go_Proxy(
    IOmHistory* This,
    VARIANT *pvargdistance);
void __RPC_STUB IOmHistory_go_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOmHistory_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLMimeTypesCollection interface
 */
#ifndef __IHTMLMimeTypesCollection_INTERFACE_DEFINED__
#define __IHTMLMimeTypesCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLMimeTypesCollection, 0x3050f3fc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f3fc-98b5-11cf-bb82-00aa00bdce0b")
IHTMLMimeTypesCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLMimeTypesCollection, 0x3050f3fc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLMimeTypesCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLMimeTypesCollection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLMimeTypesCollection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLMimeTypesCollection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLMimeTypesCollection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLMimeTypesCollection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLMimeTypesCollection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLMimeTypesCollection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLMimeTypesCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLMimeTypesCollection* This,
        LONG *p);

    END_INTERFACE
} IHTMLMimeTypesCollectionVtbl;
interface IHTMLMimeTypesCollection {
    CONST_VTBL IHTMLMimeTypesCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLMimeTypesCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLMimeTypesCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLMimeTypesCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLMimeTypesCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLMimeTypesCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLMimeTypesCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLMimeTypesCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLMimeTypesCollection methods ***/
#define IHTMLMimeTypesCollection_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLMimeTypesCollection_QueryInterface(IHTMLMimeTypesCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLMimeTypesCollection_AddRef(IHTMLMimeTypesCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLMimeTypesCollection_Release(IHTMLMimeTypesCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLMimeTypesCollection_GetTypeInfoCount(IHTMLMimeTypesCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLMimeTypesCollection_GetTypeInfo(IHTMLMimeTypesCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLMimeTypesCollection_GetIDsOfNames(IHTMLMimeTypesCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLMimeTypesCollection_Invoke(IHTMLMimeTypesCollection* 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);
}
/*** IHTMLMimeTypesCollection methods ***/
static FORCEINLINE HRESULT IHTMLMimeTypesCollection_get_length(IHTMLMimeTypesCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLMimeTypesCollection_get_length_Proxy(
    IHTMLMimeTypesCollection* This,
    LONG *p);
void __RPC_STUB IHTMLMimeTypesCollection_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLMimeTypesCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLPluginsCollection interface
 */
#ifndef __IHTMLPluginsCollection_INTERFACE_DEFINED__
#define __IHTMLPluginsCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLPluginsCollection, 0x3050f3fd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f3fd-98b5-11cf-bb82-00aa00bdce0b")
IHTMLPluginsCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE refresh(
        VARIANT_BOOL reload = 0) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLPluginsCollection, 0x3050f3fd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLPluginsCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLPluginsCollection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLPluginsCollection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLPluginsCollection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLPluginsCollection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLPluginsCollection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLPluginsCollection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLPluginsCollection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLPluginsCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLPluginsCollection* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *refresh)(
        IHTMLPluginsCollection* This,
        VARIANT_BOOL reload);

    END_INTERFACE
} IHTMLPluginsCollectionVtbl;
interface IHTMLPluginsCollection {
    CONST_VTBL IHTMLPluginsCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLPluginsCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLPluginsCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLPluginsCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLPluginsCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLPluginsCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLPluginsCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLPluginsCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLPluginsCollection methods ***/
#define IHTMLPluginsCollection_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLPluginsCollection_refresh(This,reload) (This)->lpVtbl->refresh(This,reload)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLPluginsCollection_QueryInterface(IHTMLPluginsCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLPluginsCollection_AddRef(IHTMLPluginsCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLPluginsCollection_Release(IHTMLPluginsCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLPluginsCollection_GetTypeInfoCount(IHTMLPluginsCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLPluginsCollection_GetTypeInfo(IHTMLPluginsCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLPluginsCollection_GetIDsOfNames(IHTMLPluginsCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLPluginsCollection_Invoke(IHTMLPluginsCollection* 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);
}
/*** IHTMLPluginsCollection methods ***/
static FORCEINLINE HRESULT IHTMLPluginsCollection_get_length(IHTMLPluginsCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IHTMLPluginsCollection_refresh(IHTMLPluginsCollection* This,VARIANT_BOOL reload) {
    return This->lpVtbl->refresh(This,reload);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLPluginsCollection_get_length_Proxy(
    IHTMLPluginsCollection* This,
    LONG *p);
void __RPC_STUB IHTMLPluginsCollection_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPluginsCollection_refresh_Proxy(
    IHTMLPluginsCollection* This,
    VARIANT_BOOL reload);
void __RPC_STUB IHTMLPluginsCollection_refresh_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLPluginsCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLOpsProfile interface
 */
#ifndef __IHTMLOpsProfile_INTERFACE_DEFINED__
#define __IHTMLOpsProfile_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLOpsProfile, 0x3050f401, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f401-98b5-11cf-bb82-00aa00bdce0b")
IHTMLOpsProfile : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE addRequest(
        BSTR name,
        VARIANT reserved,
        VARIANT_BOOL *success) = 0;

    virtual HRESULT STDMETHODCALLTYPE clearRequest(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE doRequest(
        VARIANT usage,
        VARIANT fname,
        VARIANT domain,
        VARIANT path,
        VARIANT expire,
        VARIANT reserved) = 0;

    virtual HRESULT STDMETHODCALLTYPE getAttribute(
        BSTR name,
        BSTR *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE setAttribute(
        BSTR name,
        BSTR value,
        VARIANT prefs,
        VARIANT_BOOL *success) = 0;

    virtual HRESULT STDMETHODCALLTYPE commitChanges(
        VARIANT_BOOL *success) = 0;

    virtual HRESULT STDMETHODCALLTYPE addReadRequest(
        BSTR name,
        VARIANT reserved,
        VARIANT_BOOL *success) = 0;

    virtual HRESULT STDMETHODCALLTYPE doReadRequest(
        VARIANT usage,
        VARIANT fname,
        VARIANT domain,
        VARIANT path,
        VARIANT expire,
        VARIANT reserved) = 0;

    virtual HRESULT STDMETHODCALLTYPE doWriteRequest(
        VARIANT_BOOL *success) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLOpsProfile, 0x3050f401, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLOpsProfileVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLOpsProfile* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLOpsProfile* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLOpsProfile* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLOpsProfile* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLOpsProfile* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLOpsProfile* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLOpsProfile* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLOpsProfile methods ***/
    HRESULT (STDMETHODCALLTYPE *addRequest)(
        IHTMLOpsProfile* This,
        BSTR name,
        VARIANT reserved,
        VARIANT_BOOL *success);

    HRESULT (STDMETHODCALLTYPE *clearRequest)(
        IHTMLOpsProfile* This);

    HRESULT (STDMETHODCALLTYPE *doRequest)(
        IHTMLOpsProfile* This,
        VARIANT usage,
        VARIANT fname,
        VARIANT domain,
        VARIANT path,
        VARIANT expire,
        VARIANT reserved);

    HRESULT (STDMETHODCALLTYPE *getAttribute)(
        IHTMLOpsProfile* This,
        BSTR name,
        BSTR *value);

    HRESULT (STDMETHODCALLTYPE *setAttribute)(
        IHTMLOpsProfile* This,
        BSTR name,
        BSTR value,
        VARIANT prefs,
        VARIANT_BOOL *success);

    HRESULT (STDMETHODCALLTYPE *commitChanges)(
        IHTMLOpsProfile* This,
        VARIANT_BOOL *success);

    HRESULT (STDMETHODCALLTYPE *addReadRequest)(
        IHTMLOpsProfile* This,
        BSTR name,
        VARIANT reserved,
        VARIANT_BOOL *success);

    HRESULT (STDMETHODCALLTYPE *doReadRequest)(
        IHTMLOpsProfile* This,
        VARIANT usage,
        VARIANT fname,
        VARIANT domain,
        VARIANT path,
        VARIANT expire,
        VARIANT reserved);

    HRESULT (STDMETHODCALLTYPE *doWriteRequest)(
        IHTMLOpsProfile* This,
        VARIANT_BOOL *success);

    END_INTERFACE
} IHTMLOpsProfileVtbl;
interface IHTMLOpsProfile {
    CONST_VTBL IHTMLOpsProfileVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLOpsProfile_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLOpsProfile_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLOpsProfile_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLOpsProfile_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLOpsProfile_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLOpsProfile_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLOpsProfile_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLOpsProfile methods ***/
#define IHTMLOpsProfile_addRequest(This,name,reserved,success) (This)->lpVtbl->addRequest(This,name,reserved,success)
#define IHTMLOpsProfile_clearRequest(This) (This)->lpVtbl->clearRequest(This)
#define IHTMLOpsProfile_doRequest(This,usage,fname,domain,path,expire,reserved) (This)->lpVtbl->doRequest(This,usage,fname,domain,path,expire,reserved)
#define IHTMLOpsProfile_getAttribute(This,name,value) (This)->lpVtbl->getAttribute(This,name,value)
#define IHTMLOpsProfile_setAttribute(This,name,value,prefs,success) (This)->lpVtbl->setAttribute(This,name,value,prefs,success)
#define IHTMLOpsProfile_commitChanges(This,success) (This)->lpVtbl->commitChanges(This,success)
#define IHTMLOpsProfile_addReadRequest(This,name,reserved,success) (This)->lpVtbl->addReadRequest(This,name,reserved,success)
#define IHTMLOpsProfile_doReadRequest(This,usage,fname,domain,path,expire,reserved) (This)->lpVtbl->doReadRequest(This,usage,fname,domain,path,expire,reserved)
#define IHTMLOpsProfile_doWriteRequest(This,success) (This)->lpVtbl->doWriteRequest(This,success)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLOpsProfile_QueryInterface(IHTMLOpsProfile* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLOpsProfile_AddRef(IHTMLOpsProfile* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLOpsProfile_Release(IHTMLOpsProfile* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLOpsProfile_GetTypeInfoCount(IHTMLOpsProfile* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLOpsProfile_GetTypeInfo(IHTMLOpsProfile* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLOpsProfile_GetIDsOfNames(IHTMLOpsProfile* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLOpsProfile_Invoke(IHTMLOpsProfile* 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);
}
/*** IHTMLOpsProfile methods ***/
static FORCEINLINE HRESULT IHTMLOpsProfile_addRequest(IHTMLOpsProfile* This,BSTR name,VARIANT reserved,VARIANT_BOOL *success) {
    return This->lpVtbl->addRequest(This,name,reserved,success);
}
static FORCEINLINE HRESULT IHTMLOpsProfile_clearRequest(IHTMLOpsProfile* This) {
    return This->lpVtbl->clearRequest(This);
}
static FORCEINLINE HRESULT IHTMLOpsProfile_doRequest(IHTMLOpsProfile* This,VARIANT usage,VARIANT fname,VARIANT domain,VARIANT path,VARIANT expire,VARIANT reserved) {
    return This->lpVtbl->doRequest(This,usage,fname,domain,path,expire,reserved);
}
static FORCEINLINE HRESULT IHTMLOpsProfile_getAttribute(IHTMLOpsProfile* This,BSTR name,BSTR *value) {
    return This->lpVtbl->getAttribute(This,name,value);
}
static FORCEINLINE HRESULT IHTMLOpsProfile_setAttribute(IHTMLOpsProfile* This,BSTR name,BSTR value,VARIANT prefs,VARIANT_BOOL *success) {
    return This->lpVtbl->setAttribute(This,name,value,prefs,success);
}
static FORCEINLINE HRESULT IHTMLOpsProfile_commitChanges(IHTMLOpsProfile* This,VARIANT_BOOL *success) {
    return This->lpVtbl->commitChanges(This,success);
}
static FORCEINLINE HRESULT IHTMLOpsProfile_addReadRequest(IHTMLOpsProfile* This,BSTR name,VARIANT reserved,VARIANT_BOOL *success) {
    return This->lpVtbl->addReadRequest(This,name,reserved,success);
}
static FORCEINLINE HRESULT IHTMLOpsProfile_doReadRequest(IHTMLOpsProfile* This,VARIANT usage,VARIANT fname,VARIANT domain,VARIANT path,VARIANT expire,VARIANT reserved) {
    return This->lpVtbl->doReadRequest(This,usage,fname,domain,path,expire,reserved);
}
static FORCEINLINE HRESULT IHTMLOpsProfile_doWriteRequest(IHTMLOpsProfile* This,VARIANT_BOOL *success) {
    return This->lpVtbl->doWriteRequest(This,success);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLOpsProfile_addRequest_Proxy(
    IHTMLOpsProfile* This,
    BSTR name,
    VARIANT reserved,
    VARIANT_BOOL *success);
void __RPC_STUB IHTMLOpsProfile_addRequest_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOpsProfile_clearRequest_Proxy(
    IHTMLOpsProfile* This);
void __RPC_STUB IHTMLOpsProfile_clearRequest_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOpsProfile_doRequest_Proxy(
    IHTMLOpsProfile* This,
    VARIANT usage,
    VARIANT fname,
    VARIANT domain,
    VARIANT path,
    VARIANT expire,
    VARIANT reserved);
void __RPC_STUB IHTMLOpsProfile_doRequest_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOpsProfile_getAttribute_Proxy(
    IHTMLOpsProfile* This,
    BSTR name,
    BSTR *value);
void __RPC_STUB IHTMLOpsProfile_getAttribute_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOpsProfile_setAttribute_Proxy(
    IHTMLOpsProfile* This,
    BSTR name,
    BSTR value,
    VARIANT prefs,
    VARIANT_BOOL *success);
void __RPC_STUB IHTMLOpsProfile_setAttribute_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOpsProfile_commitChanges_Proxy(
    IHTMLOpsProfile* This,
    VARIANT_BOOL *success);
void __RPC_STUB IHTMLOpsProfile_commitChanges_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOpsProfile_addReadRequest_Proxy(
    IHTMLOpsProfile* This,
    BSTR name,
    VARIANT reserved,
    VARIANT_BOOL *success);
void __RPC_STUB IHTMLOpsProfile_addReadRequest_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOpsProfile_doReadRequest_Proxy(
    IHTMLOpsProfile* This,
    VARIANT usage,
    VARIANT fname,
    VARIANT domain,
    VARIANT path,
    VARIANT expire,
    VARIANT reserved);
void __RPC_STUB IHTMLOpsProfile_doReadRequest_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOpsProfile_doWriteRequest_Proxy(
    IHTMLOpsProfile* This,
    VARIANT_BOOL *success);
void __RPC_STUB IHTMLOpsProfile_doWriteRequest_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLOpsProfile_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOmNavigator interface
 */
#ifndef __IOmNavigator_INTERFACE_DEFINED__
#define __IOmNavigator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOmNavigator, 0xfeceaaa5, 0x8405, 0x11cf, 0x8b,0xa1, 0x00,0xaa,0x00,0x47,0x6d,0xa6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("feceaaa5-8405-11cf-8ba1-00aa00476da6")
IOmNavigator : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_appCodeName(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_appName(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_appVersion(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_userAgent(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE javaEnabled(
        VARIANT_BOOL *enabled) = 0;

    virtual HRESULT STDMETHODCALLTYPE taintEnabled(
        VARIANT_BOOL *enabled) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_mimeTypes(
        IHTMLMimeTypesCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_plugins(
        IHTMLPluginsCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cookieEnabled(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_opsProfile(
        IHTMLOpsProfile **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE toString(
        BSTR *string) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cpuClass(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_systemLanguage(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_browserLanguage(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_userLanguage(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_platform(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_appMinorVersion(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_connectionSpeed(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onLine(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_userProfile(
        IHTMLOpsProfile **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOmNavigator, 0xfeceaaa5, 0x8405, 0x11cf, 0x8b,0xa1, 0x00,0xaa,0x00,0x47,0x6d,0xa6)
#endif
#else
typedef struct IOmNavigatorVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IOmNavigator* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IOmNavigator* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IOmNavigator* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IOmNavigator* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IOmNavigator* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IOmNavigator* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IOmNavigator* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IOmNavigator methods ***/
    HRESULT (STDMETHODCALLTYPE *get_appCodeName)(
        IOmNavigator* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_appName)(
        IOmNavigator* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_appVersion)(
        IOmNavigator* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_userAgent)(
        IOmNavigator* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *javaEnabled)(
        IOmNavigator* This,
        VARIANT_BOOL *enabled);

    HRESULT (STDMETHODCALLTYPE *taintEnabled)(
        IOmNavigator* This,
        VARIANT_BOOL *enabled);

    HRESULT (STDMETHODCALLTYPE *get_mimeTypes)(
        IOmNavigator* This,
        IHTMLMimeTypesCollection **p);

    HRESULT (STDMETHODCALLTYPE *get_plugins)(
        IOmNavigator* This,
        IHTMLPluginsCollection **p);

    HRESULT (STDMETHODCALLTYPE *get_cookieEnabled)(
        IOmNavigator* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_opsProfile)(
        IOmNavigator* This,
        IHTMLOpsProfile **p);

    HRESULT (STDMETHODCALLTYPE *toString)(
        IOmNavigator* This,
        BSTR *string);

    HRESULT (STDMETHODCALLTYPE *get_cpuClass)(
        IOmNavigator* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_systemLanguage)(
        IOmNavigator* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_browserLanguage)(
        IOmNavigator* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_userLanguage)(
        IOmNavigator* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_platform)(
        IOmNavigator* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_appMinorVersion)(
        IOmNavigator* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_connectionSpeed)(
        IOmNavigator* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_onLine)(
        IOmNavigator* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_userProfile)(
        IOmNavigator* This,
        IHTMLOpsProfile **p);

    END_INTERFACE
} IOmNavigatorVtbl;
interface IOmNavigator {
    CONST_VTBL IOmNavigatorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOmNavigator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOmNavigator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOmNavigator_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IOmNavigator_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IOmNavigator_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IOmNavigator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IOmNavigator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IOmNavigator methods ***/
#define IOmNavigator_get_appCodeName(This,p) (This)->lpVtbl->get_appCodeName(This,p)
#define IOmNavigator_get_appName(This,p) (This)->lpVtbl->get_appName(This,p)
#define IOmNavigator_get_appVersion(This,p) (This)->lpVtbl->get_appVersion(This,p)
#define IOmNavigator_get_userAgent(This,p) (This)->lpVtbl->get_userAgent(This,p)
#define IOmNavigator_javaEnabled(This,enabled) (This)->lpVtbl->javaEnabled(This,enabled)
#define IOmNavigator_taintEnabled(This,enabled) (This)->lpVtbl->taintEnabled(This,enabled)
#define IOmNavigator_get_mimeTypes(This,p) (This)->lpVtbl->get_mimeTypes(This,p)
#define IOmNavigator_get_plugins(This,p) (This)->lpVtbl->get_plugins(This,p)
#define IOmNavigator_get_cookieEnabled(This,p) (This)->lpVtbl->get_cookieEnabled(This,p)
#define IOmNavigator_get_opsProfile(This,p) (This)->lpVtbl->get_opsProfile(This,p)
#define IOmNavigator_toString(This,string) (This)->lpVtbl->toString(This,string)
#define IOmNavigator_get_cpuClass(This,p) (This)->lpVtbl->get_cpuClass(This,p)
#define IOmNavigator_get_systemLanguage(This,p) (This)->lpVtbl->get_systemLanguage(This,p)
#define IOmNavigator_get_browserLanguage(This,p) (This)->lpVtbl->get_browserLanguage(This,p)
#define IOmNavigator_get_userLanguage(This,p) (This)->lpVtbl->get_userLanguage(This,p)
#define IOmNavigator_get_platform(This,p) (This)->lpVtbl->get_platform(This,p)
#define IOmNavigator_get_appMinorVersion(This,p) (This)->lpVtbl->get_appMinorVersion(This,p)
#define IOmNavigator_get_connectionSpeed(This,p) (This)->lpVtbl->get_connectionSpeed(This,p)
#define IOmNavigator_get_onLine(This,p) (This)->lpVtbl->get_onLine(This,p)
#define IOmNavigator_get_userProfile(This,p) (This)->lpVtbl->get_userProfile(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOmNavigator_QueryInterface(IOmNavigator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOmNavigator_AddRef(IOmNavigator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOmNavigator_Release(IOmNavigator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IOmNavigator_GetTypeInfoCount(IOmNavigator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IOmNavigator_GetTypeInfo(IOmNavigator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IOmNavigator_GetIDsOfNames(IOmNavigator* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IOmNavigator_Invoke(IOmNavigator* 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);
}
/*** IOmNavigator methods ***/
static FORCEINLINE HRESULT IOmNavigator_get_appCodeName(IOmNavigator* This,BSTR *p) {
    return This->lpVtbl->get_appCodeName(This,p);
}
static FORCEINLINE HRESULT IOmNavigator_get_appName(IOmNavigator* This,BSTR *p) {
    return This->lpVtbl->get_appName(This,p);
}
static FORCEINLINE HRESULT IOmNavigator_get_appVersion(IOmNavigator* This,BSTR *p) {
    return This->lpVtbl->get_appVersion(This,p);
}
static FORCEINLINE HRESULT IOmNavigator_get_userAgent(IOmNavigator* This,BSTR *p) {
    return This->lpVtbl->get_userAgent(This,p);
}
static FORCEINLINE HRESULT IOmNavigator_javaEnabled(IOmNavigator* This,VARIANT_BOOL *enabled) {
    return This->lpVtbl->javaEnabled(This,enabled);
}
static FORCEINLINE HRESULT IOmNavigator_taintEnabled(IOmNavigator* This,VARIANT_BOOL *enabled) {
    return This->lpVtbl->taintEnabled(This,enabled);
}
static FORCEINLINE HRESULT IOmNavigator_get_mimeTypes(IOmNavigator* This,IHTMLMimeTypesCollection **p) {
    return This->lpVtbl->get_mimeTypes(This,p);
}
static FORCEINLINE HRESULT IOmNavigator_get_plugins(IOmNavigator* This,IHTMLPluginsCollection **p) {
    return This->lpVtbl->get_plugins(This,p);
}
static FORCEINLINE HRESULT IOmNavigator_get_cookieEnabled(IOmNavigator* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_cookieEnabled(This,p);
}
static FORCEINLINE HRESULT IOmNavigator_get_opsProfile(IOmNavigator* This,IHTMLOpsProfile **p) {
    return This->lpVtbl->get_opsProfile(This,p);
}
static FORCEINLINE HRESULT IOmNavigator_toString(IOmNavigator* This,BSTR *string) {
    return This->lpVtbl->toString(This,string);
}
static FORCEINLINE HRESULT IOmNavigator_get_cpuClass(IOmNavigator* This,BSTR *p) {
    return This->lpVtbl->get_cpuClass(This,p);
}
static FORCEINLINE HRESULT IOmNavigator_get_systemLanguage(IOmNavigator* This,BSTR *p) {
    return This->lpVtbl->get_systemLanguage(This,p);
}
static FORCEINLINE HRESULT IOmNavigator_get_browserLanguage(IOmNavigator* This,BSTR *p) {
    return This->lpVtbl->get_browserLanguage(This,p);
}
static FORCEINLINE HRESULT IOmNavigator_get_userLanguage(IOmNavigator* This,BSTR *p) {
    return This->lpVtbl->get_userLanguage(This,p);
}
static FORCEINLINE HRESULT IOmNavigator_get_platform(IOmNavigator* This,BSTR *p) {
    return This->lpVtbl->get_platform(This,p);
}
static FORCEINLINE HRESULT IOmNavigator_get_appMinorVersion(IOmNavigator* This,BSTR *p) {
    return This->lpVtbl->get_appMinorVersion(This,p);
}
static FORCEINLINE HRESULT IOmNavigator_get_connectionSpeed(IOmNavigator* This,LONG *p) {
    return This->lpVtbl->get_connectionSpeed(This,p);
}
static FORCEINLINE HRESULT IOmNavigator_get_onLine(IOmNavigator* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_onLine(This,p);
}
static FORCEINLINE HRESULT IOmNavigator_get_userProfile(IOmNavigator* This,IHTMLOpsProfile **p) {
    return This->lpVtbl->get_userProfile(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOmNavigator_get_appCodeName_Proxy(
    IOmNavigator* This,
    BSTR *p);
void __RPC_STUB IOmNavigator_get_appCodeName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOmNavigator_get_appName_Proxy(
    IOmNavigator* This,
    BSTR *p);
void __RPC_STUB IOmNavigator_get_appName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOmNavigator_get_appVersion_Proxy(
    IOmNavigator* This,
    BSTR *p);
void __RPC_STUB IOmNavigator_get_appVersion_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOmNavigator_get_userAgent_Proxy(
    IOmNavigator* This,
    BSTR *p);
void __RPC_STUB IOmNavigator_get_userAgent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOmNavigator_javaEnabled_Proxy(
    IOmNavigator* This,
    VARIANT_BOOL *enabled);
void __RPC_STUB IOmNavigator_javaEnabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOmNavigator_taintEnabled_Proxy(
    IOmNavigator* This,
    VARIANT_BOOL *enabled);
void __RPC_STUB IOmNavigator_taintEnabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOmNavigator_get_mimeTypes_Proxy(
    IOmNavigator* This,
    IHTMLMimeTypesCollection **p);
void __RPC_STUB IOmNavigator_get_mimeTypes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOmNavigator_get_plugins_Proxy(
    IOmNavigator* This,
    IHTMLPluginsCollection **p);
void __RPC_STUB IOmNavigator_get_plugins_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOmNavigator_get_cookieEnabled_Proxy(
    IOmNavigator* This,
    VARIANT_BOOL *p);
void __RPC_STUB IOmNavigator_get_cookieEnabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOmNavigator_get_opsProfile_Proxy(
    IOmNavigator* This,
    IHTMLOpsProfile **p);
void __RPC_STUB IOmNavigator_get_opsProfile_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOmNavigator_toString_Proxy(
    IOmNavigator* This,
    BSTR *string);
void __RPC_STUB IOmNavigator_toString_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOmNavigator_get_cpuClass_Proxy(
    IOmNavigator* This,
    BSTR *p);
void __RPC_STUB IOmNavigator_get_cpuClass_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOmNavigator_get_systemLanguage_Proxy(
    IOmNavigator* This,
    BSTR *p);
void __RPC_STUB IOmNavigator_get_systemLanguage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOmNavigator_get_browserLanguage_Proxy(
    IOmNavigator* This,
    BSTR *p);
void __RPC_STUB IOmNavigator_get_browserLanguage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOmNavigator_get_userLanguage_Proxy(
    IOmNavigator* This,
    BSTR *p);
void __RPC_STUB IOmNavigator_get_userLanguage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOmNavigator_get_platform_Proxy(
    IOmNavigator* This,
    BSTR *p);
void __RPC_STUB IOmNavigator_get_platform_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOmNavigator_get_appMinorVersion_Proxy(
    IOmNavigator* This,
    BSTR *p);
void __RPC_STUB IOmNavigator_get_appMinorVersion_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOmNavigator_get_connectionSpeed_Proxy(
    IOmNavigator* This,
    LONG *p);
void __RPC_STUB IOmNavigator_get_connectionSpeed_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOmNavigator_get_onLine_Proxy(
    IOmNavigator* This,
    VARIANT_BOOL *p);
void __RPC_STUB IOmNavigator_get_onLine_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOmNavigator_get_userProfile_Proxy(
    IOmNavigator* This,
    IHTMLOpsProfile **p);
void __RPC_STUB IOmNavigator_get_userProfile_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOmNavigator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * INavigatorGeolocation interface
 */
#ifndef __INavigatorGeolocation_INTERFACE_DEFINED__
#define __INavigatorGeolocation_INTERFACE_DEFINED__

DEFINE_GUID(IID_INavigatorGeolocation, 0x305107cf, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305107cf-98b5-11cf-bb82-00aa00bdce0b")
INavigatorGeolocation : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_geolocation(
        IWebGeolocation **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INavigatorGeolocation, 0x305107cf, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct INavigatorGeolocationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        INavigatorGeolocation* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        INavigatorGeolocation* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        INavigatorGeolocation* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        INavigatorGeolocation* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        INavigatorGeolocation* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        INavigatorGeolocation* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        INavigatorGeolocation* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** INavigatorGeolocation methods ***/
    HRESULT (STDMETHODCALLTYPE *get_geolocation)(
        INavigatorGeolocation* This,
        IWebGeolocation **p);

    END_INTERFACE
} INavigatorGeolocationVtbl;
interface INavigatorGeolocation {
    CONST_VTBL INavigatorGeolocationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INavigatorGeolocation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INavigatorGeolocation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INavigatorGeolocation_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define INavigatorGeolocation_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define INavigatorGeolocation_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define INavigatorGeolocation_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define INavigatorGeolocation_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** INavigatorGeolocation methods ***/
#define INavigatorGeolocation_get_geolocation(This,p) (This)->lpVtbl->get_geolocation(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INavigatorGeolocation_QueryInterface(INavigatorGeolocation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INavigatorGeolocation_AddRef(INavigatorGeolocation* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INavigatorGeolocation_Release(INavigatorGeolocation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT INavigatorGeolocation_GetTypeInfoCount(INavigatorGeolocation* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT INavigatorGeolocation_GetTypeInfo(INavigatorGeolocation* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT INavigatorGeolocation_GetIDsOfNames(INavigatorGeolocation* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT INavigatorGeolocation_Invoke(INavigatorGeolocation* 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);
}
/*** INavigatorGeolocation methods ***/
static FORCEINLINE HRESULT INavigatorGeolocation_get_geolocation(INavigatorGeolocation* This,IWebGeolocation **p) {
    return This->lpVtbl->get_geolocation(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE INavigatorGeolocation_get_geolocation_Proxy(
    INavigatorGeolocation* This,
    IWebGeolocation **p);
void __RPC_STUB INavigatorGeolocation_get_geolocation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __INavigatorGeolocation_INTERFACE_DEFINED__ */

/*****************************************************************************
 * INavigatorDoNotTrack interface
 */
#ifndef __INavigatorDoNotTrack_INTERFACE_DEFINED__
#define __INavigatorDoNotTrack_INTERFACE_DEFINED__

DEFINE_GUID(IID_INavigatorDoNotTrack, 0x30510804, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510804-98b5-11cf-bb82-00aa00bdce0b")
INavigatorDoNotTrack : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_msDoNotTrack(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INavigatorDoNotTrack, 0x30510804, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct INavigatorDoNotTrackVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        INavigatorDoNotTrack* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        INavigatorDoNotTrack* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        INavigatorDoNotTrack* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        INavigatorDoNotTrack* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        INavigatorDoNotTrack* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        INavigatorDoNotTrack* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        INavigatorDoNotTrack* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** INavigatorDoNotTrack methods ***/
    HRESULT (STDMETHODCALLTYPE *get_msDoNotTrack)(
        INavigatorDoNotTrack* This,
        BSTR *p);

    END_INTERFACE
} INavigatorDoNotTrackVtbl;
interface INavigatorDoNotTrack {
    CONST_VTBL INavigatorDoNotTrackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INavigatorDoNotTrack_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INavigatorDoNotTrack_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INavigatorDoNotTrack_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define INavigatorDoNotTrack_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define INavigatorDoNotTrack_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define INavigatorDoNotTrack_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define INavigatorDoNotTrack_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** INavigatorDoNotTrack methods ***/
#define INavigatorDoNotTrack_get_msDoNotTrack(This,p) (This)->lpVtbl->get_msDoNotTrack(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INavigatorDoNotTrack_QueryInterface(INavigatorDoNotTrack* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INavigatorDoNotTrack_AddRef(INavigatorDoNotTrack* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INavigatorDoNotTrack_Release(INavigatorDoNotTrack* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT INavigatorDoNotTrack_GetTypeInfoCount(INavigatorDoNotTrack* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT INavigatorDoNotTrack_GetTypeInfo(INavigatorDoNotTrack* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT INavigatorDoNotTrack_GetIDsOfNames(INavigatorDoNotTrack* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT INavigatorDoNotTrack_Invoke(INavigatorDoNotTrack* 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);
}
/*** INavigatorDoNotTrack methods ***/
static FORCEINLINE HRESULT INavigatorDoNotTrack_get_msDoNotTrack(INavigatorDoNotTrack* This,BSTR *p) {
    return This->lpVtbl->get_msDoNotTrack(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE INavigatorDoNotTrack_get_msDoNotTrack_Proxy(
    INavigatorDoNotTrack* This,
    BSTR *p);
void __RPC_STUB INavigatorDoNotTrack_get_msDoNotTrack_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __INavigatorDoNotTrack_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLLocation interface
 */
#ifndef __IHTMLLocation_INTERFACE_DEFINED__
#define __IHTMLLocation_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLLocation, 0x163bb1e0, 0x6e00, 0x11cf, 0x83,0x7a, 0x48,0xdc,0x04,0xc1,0x00,0x00);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("163bb1e0-6e00-11cf-837a-48dc04c10000")
IHTMLLocation : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_href(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_href(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_protocol(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_protocol(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_host(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_host(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_hostname(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_hostname(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_port(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_port(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_pathname(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pathname(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_search(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_search(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_hash(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_hash(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE reload(
        VARIANT_BOOL flag = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE replace(
        BSTR bstr) = 0;

    virtual HRESULT STDMETHODCALLTYPE assign(
        BSTR bstr) = 0;

    virtual HRESULT STDMETHODCALLTYPE toString(
        BSTR *string) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLLocation, 0x163bb1e0, 0x6e00, 0x11cf, 0x83,0x7a, 0x48,0xdc,0x04,0xc1,0x00,0x00)
#endif
#else
typedef struct IHTMLLocationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLLocation* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLLocation* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLLocation* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLLocation* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLLocation* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLLocation* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLLocation* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLLocation methods ***/
    HRESULT (STDMETHODCALLTYPE *put_href)(
        IHTMLLocation* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_href)(
        IHTMLLocation* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_protocol)(
        IHTMLLocation* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_protocol)(
        IHTMLLocation* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_host)(
        IHTMLLocation* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_host)(
        IHTMLLocation* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_hostname)(
        IHTMLLocation* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_hostname)(
        IHTMLLocation* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_port)(
        IHTMLLocation* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_port)(
        IHTMLLocation* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_pathname)(
        IHTMLLocation* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_pathname)(
        IHTMLLocation* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_search)(
        IHTMLLocation* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_search)(
        IHTMLLocation* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_hash)(
        IHTMLLocation* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_hash)(
        IHTMLLocation* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *reload)(
        IHTMLLocation* This,
        VARIANT_BOOL flag);

    HRESULT (STDMETHODCALLTYPE *replace)(
        IHTMLLocation* This,
        BSTR bstr);

    HRESULT (STDMETHODCALLTYPE *assign)(
        IHTMLLocation* This,
        BSTR bstr);

    HRESULT (STDMETHODCALLTYPE *toString)(
        IHTMLLocation* This,
        BSTR *string);

    END_INTERFACE
} IHTMLLocationVtbl;
interface IHTMLLocation {
    CONST_VTBL IHTMLLocationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLLocation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLLocation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLLocation_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLLocation_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLLocation_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLLocation_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLLocation_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLLocation methods ***/
#define IHTMLLocation_put_href(This,v) (This)->lpVtbl->put_href(This,v)
#define IHTMLLocation_get_href(This,p) (This)->lpVtbl->get_href(This,p)
#define IHTMLLocation_put_protocol(This,v) (This)->lpVtbl->put_protocol(This,v)
#define IHTMLLocation_get_protocol(This,p) (This)->lpVtbl->get_protocol(This,p)
#define IHTMLLocation_put_host(This,v) (This)->lpVtbl->put_host(This,v)
#define IHTMLLocation_get_host(This,p) (This)->lpVtbl->get_host(This,p)
#define IHTMLLocation_put_hostname(This,v) (This)->lpVtbl->put_hostname(This,v)
#define IHTMLLocation_get_hostname(This,p) (This)->lpVtbl->get_hostname(This,p)
#define IHTMLLocation_put_port(This,v) (This)->lpVtbl->put_port(This,v)
#define IHTMLLocation_get_port(This,p) (This)->lpVtbl->get_port(This,p)
#define IHTMLLocation_put_pathname(This,v) (This)->lpVtbl->put_pathname(This,v)
#define IHTMLLocation_get_pathname(This,p) (This)->lpVtbl->get_pathname(This,p)
#define IHTMLLocation_put_search(This,v) (This)->lpVtbl->put_search(This,v)
#define IHTMLLocation_get_search(This,p) (This)->lpVtbl->get_search(This,p)
#define IHTMLLocation_put_hash(This,v) (This)->lpVtbl->put_hash(This,v)
#define IHTMLLocation_get_hash(This,p) (This)->lpVtbl->get_hash(This,p)
#define IHTMLLocation_reload(This,flag) (This)->lpVtbl->reload(This,flag)
#define IHTMLLocation_replace(This,bstr) (This)->lpVtbl->replace(This,bstr)
#define IHTMLLocation_assign(This,bstr) (This)->lpVtbl->assign(This,bstr)
#define IHTMLLocation_toString(This,string) (This)->lpVtbl->toString(This,string)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLLocation_QueryInterface(IHTMLLocation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLLocation_AddRef(IHTMLLocation* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLLocation_Release(IHTMLLocation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLLocation_GetTypeInfoCount(IHTMLLocation* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLLocation_GetTypeInfo(IHTMLLocation* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLLocation_GetIDsOfNames(IHTMLLocation* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLLocation_Invoke(IHTMLLocation* 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);
}
/*** IHTMLLocation methods ***/
static FORCEINLINE HRESULT IHTMLLocation_put_href(IHTMLLocation* This,BSTR v) {
    return This->lpVtbl->put_href(This,v);
}
static FORCEINLINE HRESULT IHTMLLocation_get_href(IHTMLLocation* This,BSTR *p) {
    return This->lpVtbl->get_href(This,p);
}
static FORCEINLINE HRESULT IHTMLLocation_put_protocol(IHTMLLocation* This,BSTR v) {
    return This->lpVtbl->put_protocol(This,v);
}
static FORCEINLINE HRESULT IHTMLLocation_get_protocol(IHTMLLocation* This,BSTR *p) {
    return This->lpVtbl->get_protocol(This,p);
}
static FORCEINLINE HRESULT IHTMLLocation_put_host(IHTMLLocation* This,BSTR v) {
    return This->lpVtbl->put_host(This,v);
}
static FORCEINLINE HRESULT IHTMLLocation_get_host(IHTMLLocation* This,BSTR *p) {
    return This->lpVtbl->get_host(This,p);
}
static FORCEINLINE HRESULT IHTMLLocation_put_hostname(IHTMLLocation* This,BSTR v) {
    return This->lpVtbl->put_hostname(This,v);
}
static FORCEINLINE HRESULT IHTMLLocation_get_hostname(IHTMLLocation* This,BSTR *p) {
    return This->lpVtbl->get_hostname(This,p);
}
static FORCEINLINE HRESULT IHTMLLocation_put_port(IHTMLLocation* This,BSTR v) {
    return This->lpVtbl->put_port(This,v);
}
static FORCEINLINE HRESULT IHTMLLocation_get_port(IHTMLLocation* This,BSTR *p) {
    return This->lpVtbl->get_port(This,p);
}
static FORCEINLINE HRESULT IHTMLLocation_put_pathname(IHTMLLocation* This,BSTR v) {
    return This->lpVtbl->put_pathname(This,v);
}
static FORCEINLINE HRESULT IHTMLLocation_get_pathname(IHTMLLocation* This,BSTR *p) {
    return This->lpVtbl->get_pathname(This,p);
}
static FORCEINLINE HRESULT IHTMLLocation_put_search(IHTMLLocation* This,BSTR v) {
    return This->lpVtbl->put_search(This,v);
}
static FORCEINLINE HRESULT IHTMLLocation_get_search(IHTMLLocation* This,BSTR *p) {
    return This->lpVtbl->get_search(This,p);
}
static FORCEINLINE HRESULT IHTMLLocation_put_hash(IHTMLLocation* This,BSTR v) {
    return This->lpVtbl->put_hash(This,v);
}
static FORCEINLINE HRESULT IHTMLLocation_get_hash(IHTMLLocation* This,BSTR *p) {
    return This->lpVtbl->get_hash(This,p);
}
static FORCEINLINE HRESULT IHTMLLocation_reload(IHTMLLocation* This,VARIANT_BOOL flag) {
    return This->lpVtbl->reload(This,flag);
}
static FORCEINLINE HRESULT IHTMLLocation_replace(IHTMLLocation* This,BSTR bstr) {
    return This->lpVtbl->replace(This,bstr);
}
static FORCEINLINE HRESULT IHTMLLocation_assign(IHTMLLocation* This,BSTR bstr) {
    return This->lpVtbl->assign(This,bstr);
}
static FORCEINLINE HRESULT IHTMLLocation_toString(IHTMLLocation* This,BSTR *string) {
    return This->lpVtbl->toString(This,string);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLLocation_put_href_Proxy(
    IHTMLLocation* This,
    BSTR v);
void __RPC_STUB IHTMLLocation_put_href_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLocation_get_href_Proxy(
    IHTMLLocation* This,
    BSTR *p);
void __RPC_STUB IHTMLLocation_get_href_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLocation_put_protocol_Proxy(
    IHTMLLocation* This,
    BSTR v);
void __RPC_STUB IHTMLLocation_put_protocol_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLocation_get_protocol_Proxy(
    IHTMLLocation* This,
    BSTR *p);
void __RPC_STUB IHTMLLocation_get_protocol_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLocation_put_host_Proxy(
    IHTMLLocation* This,
    BSTR v);
void __RPC_STUB IHTMLLocation_put_host_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLocation_get_host_Proxy(
    IHTMLLocation* This,
    BSTR *p);
void __RPC_STUB IHTMLLocation_get_host_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLocation_put_hostname_Proxy(
    IHTMLLocation* This,
    BSTR v);
void __RPC_STUB IHTMLLocation_put_hostname_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLocation_get_hostname_Proxy(
    IHTMLLocation* This,
    BSTR *p);
void __RPC_STUB IHTMLLocation_get_hostname_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLocation_put_port_Proxy(
    IHTMLLocation* This,
    BSTR v);
void __RPC_STUB IHTMLLocation_put_port_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLocation_get_port_Proxy(
    IHTMLLocation* This,
    BSTR *p);
void __RPC_STUB IHTMLLocation_get_port_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLocation_put_pathname_Proxy(
    IHTMLLocation* This,
    BSTR v);
void __RPC_STUB IHTMLLocation_put_pathname_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLocation_get_pathname_Proxy(
    IHTMLLocation* This,
    BSTR *p);
void __RPC_STUB IHTMLLocation_get_pathname_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLocation_put_search_Proxy(
    IHTMLLocation* This,
    BSTR v);
void __RPC_STUB IHTMLLocation_put_search_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLocation_get_search_Proxy(
    IHTMLLocation* This,
    BSTR *p);
void __RPC_STUB IHTMLLocation_get_search_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLocation_put_hash_Proxy(
    IHTMLLocation* This,
    BSTR v);
void __RPC_STUB IHTMLLocation_put_hash_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLocation_get_hash_Proxy(
    IHTMLLocation* This,
    BSTR *p);
void __RPC_STUB IHTMLLocation_get_hash_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLocation_reload_Proxy(
    IHTMLLocation* This,
    VARIANT_BOOL flag);
void __RPC_STUB IHTMLLocation_reload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLocation_replace_Proxy(
    IHTMLLocation* This,
    BSTR bstr);
void __RPC_STUB IHTMLLocation_replace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLocation_assign_Proxy(
    IHTMLLocation* This,
    BSTR bstr);
void __RPC_STUB IHTMLLocation_assign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLocation_toString_Proxy(
    IHTMLLocation* This,
    BSTR *string);
void __RPC_STUB IHTMLLocation_toString_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLLocation_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLHistory dispinterface
 */
#ifndef __DispHTMLHistory_DISPINTERFACE_DEFINED__
#define __DispHTMLHistory_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLHistory, 0x3050f549, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f549-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLHistory : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLHistory, 0x3050f549, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLHistoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLHistory* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLHistory* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLHistory* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLHistory* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLHistory* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLHistory* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLHistory* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLHistoryVtbl;
interface DispHTMLHistory {
    CONST_VTBL DispHTMLHistoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLHistory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLHistory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLHistory_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLHistory_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLHistory_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLHistory_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLHistory_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 DispHTMLHistory_QueryInterface(DispHTMLHistory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLHistory_AddRef(DispHTMLHistory* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLHistory_Release(DispHTMLHistory* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLHistory_GetTypeInfoCount(DispHTMLHistory* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLHistory_GetTypeInfo(DispHTMLHistory* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLHistory_GetIDsOfNames(DispHTMLHistory* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLHistory_Invoke(DispHTMLHistory* 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  /* __DispHTMLHistory_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLHistory coclass
 */

DEFINE_GUID(CLSID_HTMLHistory, 0xfeceaaa3, 0x8405, 0x11cf, 0x8b,0xa1, 0x00,0xaa,0x00,0x47,0x6d,0xa6);

#ifdef __cplusplus
class DECLSPEC_UUID("feceaaa3-8405-11cf-8ba1-00aa00476da6") HTMLHistory;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLHistory, 0xfeceaaa3, 0x8405, 0x11cf, 0x8b,0xa1, 0x00,0xaa,0x00,0x47,0x6d,0xa6)
#endif
#endif

EXTERN_C const GUID CLSID_COmHistory;
/*****************************************************************************
 * CMimeTypes coclass
 */

DEFINE_GUID(CLSID_CMimeTypes, 0x3050f3fe, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f3fe-98b5-11cf-bb82-00aa00bdce0b") CMimeTypes;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(CMimeTypes, 0x3050f3fe, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CMimeTypes;
/*****************************************************************************
 * DispCPlugins dispinterface
 */
#ifndef __DispCPlugins_DISPINTERFACE_DEFINED__
#define __DispCPlugins_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispCPlugins, 0x3050f54a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f54a-98b5-11cf-bb82-00aa00bdce0b")
DispCPlugins : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispCPlugins, 0x3050f54a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispCPluginsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispCPlugins* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispCPlugins* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispCPlugins* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispCPlugins* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispCPlugins* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispCPlugins* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispCPlugins* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispCPluginsVtbl;
interface DispCPlugins {
    CONST_VTBL DispCPluginsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispCPlugins_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispCPlugins_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispCPlugins_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispCPlugins_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispCPlugins_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispCPlugins_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispCPlugins_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 DispCPlugins_QueryInterface(DispCPlugins* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispCPlugins_AddRef(DispCPlugins* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispCPlugins_Release(DispCPlugins* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispCPlugins_GetTypeInfoCount(DispCPlugins* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispCPlugins_GetTypeInfo(DispCPlugins* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispCPlugins_GetIDsOfNames(DispCPlugins* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispCPlugins_Invoke(DispCPlugins* 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  /* __DispCPlugins_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * CPlugins coclass
 */

DEFINE_GUID(CLSID_CPlugins, 0x3050f3ff, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f3ff-98b5-11cf-bb82-00aa00bdce0b") CPlugins;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(CPlugins, 0x3050f3ff, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CPlugins;
/*****************************************************************************
 * COpsProfile coclass
 */

DEFINE_GUID(CLSID_COpsProfile, 0x3050f402, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f402-98b5-11cf-bb82-00aa00bdce0b") COpsProfile;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(COpsProfile, 0x3050f402, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_COpsProfile;
/*****************************************************************************
 * DispHTMLNavigator dispinterface
 */
#ifndef __DispHTMLNavigator_DISPINTERFACE_DEFINED__
#define __DispHTMLNavigator_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLNavigator, 0x3050f54c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f54c-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLNavigator : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLNavigator, 0x3050f54c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLNavigatorVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLNavigator* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLNavigator* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLNavigator* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLNavigator* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLNavigator* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLNavigator* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLNavigator* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLNavigatorVtbl;
interface DispHTMLNavigator {
    CONST_VTBL DispHTMLNavigatorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLNavigator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLNavigator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLNavigator_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLNavigator_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLNavigator_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLNavigator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLNavigator_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 DispHTMLNavigator_QueryInterface(DispHTMLNavigator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLNavigator_AddRef(DispHTMLNavigator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLNavigator_Release(DispHTMLNavigator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLNavigator_GetTypeInfoCount(DispHTMLNavigator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLNavigator_GetTypeInfo(DispHTMLNavigator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLNavigator_GetIDsOfNames(DispHTMLNavigator* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLNavigator_Invoke(DispHTMLNavigator* 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  /* __DispHTMLNavigator_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLNavigator coclass
 */

DEFINE_GUID(CLSID_HTMLNavigator, 0xfeceaaa6, 0x8405, 0x11cf, 0x8b,0xa1, 0x00,0xaa,0x00,0x47,0x6d,0xa6);

#ifdef __cplusplus
class DECLSPEC_UUID("feceaaa6-8405-11cf-8ba1-00aa00476da6") HTMLNavigator;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLNavigator, 0xfeceaaa6, 0x8405, 0x11cf, 0x8b,0xa1, 0x00,0xaa,0x00,0x47,0x6d,0xa6)
#endif
#endif

EXTERN_C const GUID CLSID_COmNavigator;
/*****************************************************************************
 * DispHTMLLocation dispinterface
 */
#ifndef __DispHTMLLocation_DISPINTERFACE_DEFINED__
#define __DispHTMLLocation_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLLocation, 0x3050f54e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f54e-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLLocation : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLLocation, 0x3050f54e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLLocationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLLocation* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLLocation* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLLocation* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLLocation* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLLocation* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLLocation* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLLocation* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLLocationVtbl;
interface DispHTMLLocation {
    CONST_VTBL DispHTMLLocationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLLocation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLLocation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLLocation_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLLocation_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLLocation_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLLocation_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLLocation_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 DispHTMLLocation_QueryInterface(DispHTMLLocation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLLocation_AddRef(DispHTMLLocation* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLLocation_Release(DispHTMLLocation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLLocation_GetTypeInfoCount(DispHTMLLocation* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLLocation_GetTypeInfo(DispHTMLLocation* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLLocation_GetIDsOfNames(DispHTMLLocation* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLLocation_Invoke(DispHTMLLocation* 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  /* __DispHTMLLocation_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLLocation coclass
 */

DEFINE_GUID(CLSID_HTMLLocation, 0x163bb1e1, 0x6e00, 0x11cf, 0x83,0x7a, 0x48,0xdc,0x04,0xc1,0x00,0x00);

#ifdef __cplusplus
class DECLSPEC_UUID("163bb1e1-6e00-11cf-837a-48dc04c10000") HTMLLocation;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLLocation, 0x163bb1e1, 0x6e00, 0x11cf, 0x83,0x7a, 0x48,0xdc,0x04,0xc1,0x00,0x00)
#endif
#endif

EXTERN_C const GUID CLSID_COmLocation;
/*****************************************************************************
 * IHTMLBookmarkCollection interface
 */
#ifndef __IHTMLBookmarkCollection_INTERFACE_DEFINED__
#define __IHTMLBookmarkCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLBookmarkCollection, 0x3050f4ce, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f4ce-98b5-11cf-bb82-00aa00bdce0b")
IHTMLBookmarkCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__newEnum(
        IUnknown **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE item(
        LONG index,
        VARIANT *pVarBookmark) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLBookmarkCollection, 0x3050f4ce, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLBookmarkCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLBookmarkCollection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLBookmarkCollection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLBookmarkCollection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLBookmarkCollection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLBookmarkCollection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLBookmarkCollection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLBookmarkCollection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLBookmarkCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLBookmarkCollection* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get__newEnum)(
        IHTMLBookmarkCollection* This,
        IUnknown **p);

    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLBookmarkCollection* This,
        LONG index,
        VARIANT *pVarBookmark);

    END_INTERFACE
} IHTMLBookmarkCollectionVtbl;
interface IHTMLBookmarkCollection {
    CONST_VTBL IHTMLBookmarkCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLBookmarkCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLBookmarkCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLBookmarkCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLBookmarkCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLBookmarkCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLBookmarkCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLBookmarkCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLBookmarkCollection methods ***/
#define IHTMLBookmarkCollection_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLBookmarkCollection_get__newEnum(This,p) (This)->lpVtbl->get__newEnum(This,p)
#define IHTMLBookmarkCollection_item(This,index,pVarBookmark) (This)->lpVtbl->item(This,index,pVarBookmark)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLBookmarkCollection_QueryInterface(IHTMLBookmarkCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLBookmarkCollection_AddRef(IHTMLBookmarkCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLBookmarkCollection_Release(IHTMLBookmarkCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLBookmarkCollection_GetTypeInfoCount(IHTMLBookmarkCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLBookmarkCollection_GetTypeInfo(IHTMLBookmarkCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLBookmarkCollection_GetIDsOfNames(IHTMLBookmarkCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLBookmarkCollection_Invoke(IHTMLBookmarkCollection* 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);
}
/*** IHTMLBookmarkCollection methods ***/
static FORCEINLINE HRESULT IHTMLBookmarkCollection_get_length(IHTMLBookmarkCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IHTMLBookmarkCollection_get__newEnum(IHTMLBookmarkCollection* This,IUnknown **p) {
    return This->lpVtbl->get__newEnum(This,p);
}
static FORCEINLINE HRESULT IHTMLBookmarkCollection_item(IHTMLBookmarkCollection* This,LONG index,VARIANT *pVarBookmark) {
    return This->lpVtbl->item(This,index,pVarBookmark);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLBookmarkCollection_get_length_Proxy(
    IHTMLBookmarkCollection* This,
    LONG *p);
void __RPC_STUB IHTMLBookmarkCollection_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBookmarkCollection_get__newEnum_Proxy(
    IHTMLBookmarkCollection* This,
    IUnknown **p);
void __RPC_STUB IHTMLBookmarkCollection_get__newEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBookmarkCollection_item_Proxy(
    IHTMLBookmarkCollection* This,
    LONG index,
    VARIANT *pVarBookmark);
void __RPC_STUB IHTMLBookmarkCollection_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLBookmarkCollection_INTERFACE_DEFINED__ */

typedef enum _htmlPersistState {
    htmlPersistStateNormal = 0,
    htmlPersistStateFavorite = 1,
    htmlPersistStateHistory = 2,
    htmlPersistStateSnapshot = 3,
    htmlPersistStateUserData = 4,
    htmlPersistState_Max = 0x7fffffff
} htmlPersistState;
typedef enum _htmlDropEffect {
    htmlDropEffectCopy = 0,
    htmlDropEffectLink = 1,
    htmlDropEffectMove = 2,
    htmlDropEffectNone = 3,
    htmlDropEffect_Max = 0x7fffffff
} htmlDropEffect;
typedef enum _htmlEffectAllowed {
    htmlEffectAllowedCopy = 0,
    htmlEffectAllowedLink = 1,
    htmlEffectAllowedMove = 2,
    htmlEffectAllowedCopyLink = 3,
    htmlEffectAllowedCopyMove = 4,
    htmlEffectAllowedLinkMove = 5,
    htmlEffectAllowedAll = 6,
    htmlEffectAllowedNone = 7,
    htmlEffectAllowedUninitialized = 8,
    htmlEffectAllowed_Max = 0x7fffffff
} htmlEffectAllowed;
/*****************************************************************************
 * IHTMLDataTransfer interface
 */
#ifndef __IHTMLDataTransfer_INTERFACE_DEFINED__
#define __IHTMLDataTransfer_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDataTransfer, 0x3050f4b3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f4b3-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDataTransfer : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE setData(
        BSTR format,
        VARIANT *data,
        VARIANT_BOOL *pret) = 0;

    virtual HRESULT STDMETHODCALLTYPE getData(
        BSTR format,
        VARIANT *pvarRet) = 0;

    virtual HRESULT STDMETHODCALLTYPE clearData(
        BSTR format,
        VARIANT_BOOL *pret) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_dropEffect(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_dropEffect(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_effectAllowed(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_effectAllowed(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDataTransfer, 0x3050f4b3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDataTransferVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLDataTransfer* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLDataTransfer* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLDataTransfer* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLDataTransfer* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLDataTransfer* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLDataTransfer* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLDataTransfer* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLDataTransfer methods ***/
    HRESULT (STDMETHODCALLTYPE *setData)(
        IHTMLDataTransfer* This,
        BSTR format,
        VARIANT *data,
        VARIANT_BOOL *pret);

    HRESULT (STDMETHODCALLTYPE *getData)(
        IHTMLDataTransfer* This,
        BSTR format,
        VARIANT *pvarRet);

    HRESULT (STDMETHODCALLTYPE *clearData)(
        IHTMLDataTransfer* This,
        BSTR format,
        VARIANT_BOOL *pret);

    HRESULT (STDMETHODCALLTYPE *put_dropEffect)(
        IHTMLDataTransfer* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_dropEffect)(
        IHTMLDataTransfer* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_effectAllowed)(
        IHTMLDataTransfer* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_effectAllowed)(
        IHTMLDataTransfer* This,
        BSTR *p);

    END_INTERFACE
} IHTMLDataTransferVtbl;
interface IHTMLDataTransfer {
    CONST_VTBL IHTMLDataTransferVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDataTransfer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDataTransfer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDataTransfer_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDataTransfer_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDataTransfer_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDataTransfer_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDataTransfer_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDataTransfer methods ***/
#define IHTMLDataTransfer_setData(This,format,data,pret) (This)->lpVtbl->setData(This,format,data,pret)
#define IHTMLDataTransfer_getData(This,format,pvarRet) (This)->lpVtbl->getData(This,format,pvarRet)
#define IHTMLDataTransfer_clearData(This,format,pret) (This)->lpVtbl->clearData(This,format,pret)
#define IHTMLDataTransfer_put_dropEffect(This,v) (This)->lpVtbl->put_dropEffect(This,v)
#define IHTMLDataTransfer_get_dropEffect(This,p) (This)->lpVtbl->get_dropEffect(This,p)
#define IHTMLDataTransfer_put_effectAllowed(This,v) (This)->lpVtbl->put_effectAllowed(This,v)
#define IHTMLDataTransfer_get_effectAllowed(This,p) (This)->lpVtbl->get_effectAllowed(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDataTransfer_QueryInterface(IHTMLDataTransfer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDataTransfer_AddRef(IHTMLDataTransfer* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDataTransfer_Release(IHTMLDataTransfer* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDataTransfer_GetTypeInfoCount(IHTMLDataTransfer* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDataTransfer_GetTypeInfo(IHTMLDataTransfer* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDataTransfer_GetIDsOfNames(IHTMLDataTransfer* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDataTransfer_Invoke(IHTMLDataTransfer* 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);
}
/*** IHTMLDataTransfer methods ***/
static FORCEINLINE HRESULT IHTMLDataTransfer_setData(IHTMLDataTransfer* This,BSTR format,VARIANT *data,VARIANT_BOOL *pret) {
    return This->lpVtbl->setData(This,format,data,pret);
}
static FORCEINLINE HRESULT IHTMLDataTransfer_getData(IHTMLDataTransfer* This,BSTR format,VARIANT *pvarRet) {
    return This->lpVtbl->getData(This,format,pvarRet);
}
static FORCEINLINE HRESULT IHTMLDataTransfer_clearData(IHTMLDataTransfer* This,BSTR format,VARIANT_BOOL *pret) {
    return This->lpVtbl->clearData(This,format,pret);
}
static FORCEINLINE HRESULT IHTMLDataTransfer_put_dropEffect(IHTMLDataTransfer* This,BSTR v) {
    return This->lpVtbl->put_dropEffect(This,v);
}
static FORCEINLINE HRESULT IHTMLDataTransfer_get_dropEffect(IHTMLDataTransfer* This,BSTR *p) {
    return This->lpVtbl->get_dropEffect(This,p);
}
static FORCEINLINE HRESULT IHTMLDataTransfer_put_effectAllowed(IHTMLDataTransfer* This,BSTR v) {
    return This->lpVtbl->put_effectAllowed(This,v);
}
static FORCEINLINE HRESULT IHTMLDataTransfer_get_effectAllowed(IHTMLDataTransfer* This,BSTR *p) {
    return This->lpVtbl->get_effectAllowed(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDataTransfer_setData_Proxy(
    IHTMLDataTransfer* This,
    BSTR format,
    VARIANT *data,
    VARIANT_BOOL *pret);
void __RPC_STUB IHTMLDataTransfer_setData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDataTransfer_getData_Proxy(
    IHTMLDataTransfer* This,
    BSTR format,
    VARIANT *pvarRet);
void __RPC_STUB IHTMLDataTransfer_getData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDataTransfer_clearData_Proxy(
    IHTMLDataTransfer* This,
    BSTR format,
    VARIANT_BOOL *pret);
void __RPC_STUB IHTMLDataTransfer_clearData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDataTransfer_put_dropEffect_Proxy(
    IHTMLDataTransfer* This,
    BSTR v);
void __RPC_STUB IHTMLDataTransfer_put_dropEffect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDataTransfer_get_dropEffect_Proxy(
    IHTMLDataTransfer* This,
    BSTR *p);
void __RPC_STUB IHTMLDataTransfer_get_dropEffect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDataTransfer_put_effectAllowed_Proxy(
    IHTMLDataTransfer* This,
    BSTR v);
void __RPC_STUB IHTMLDataTransfer_put_effectAllowed_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDataTransfer_get_effectAllowed_Proxy(
    IHTMLDataTransfer* This,
    BSTR *p);
void __RPC_STUB IHTMLDataTransfer_get_effectAllowed_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDataTransfer_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLEventObj interface
 */
#ifndef __IHTMLEventObj_INTERFACE_DEFINED__
#define __IHTMLEventObj_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLEventObj, 0x3050f32d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f32d-98b5-11cf-bb82-00aa00bdce0b")
IHTMLEventObj : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_srcElement(
        IHTMLElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_altKey(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ctrlKey(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_shiftKey(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_returnValue(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_returnValue(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_cancelBubble(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cancelBubble(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fromElement(
        IHTMLElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_toElement(
        IHTMLElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_keyCode(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_keyCode(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_button(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_qualifier(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_reason(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clientX(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clientY(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_offsetX(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_offsetY(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_screenX(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_screenY(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_srcFilter(
        IDispatch **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLEventObj, 0x3050f32d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLEventObjVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLEventObj* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLEventObj* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLEventObj* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLEventObj* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLEventObj* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLEventObj* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLEventObj* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLEventObj methods ***/
    HRESULT (STDMETHODCALLTYPE *get_srcElement)(
        IHTMLEventObj* This,
        IHTMLElement **p);

    HRESULT (STDMETHODCALLTYPE *get_altKey)(
        IHTMLEventObj* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_ctrlKey)(
        IHTMLEventObj* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_shiftKey)(
        IHTMLEventObj* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_returnValue)(
        IHTMLEventObj* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_returnValue)(
        IHTMLEventObj* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_cancelBubble)(
        IHTMLEventObj* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_cancelBubble)(
        IHTMLEventObj* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_fromElement)(
        IHTMLEventObj* This,
        IHTMLElement **p);

    HRESULT (STDMETHODCALLTYPE *get_toElement)(
        IHTMLEventObj* This,
        IHTMLElement **p);

    HRESULT (STDMETHODCALLTYPE *put_keyCode)(
        IHTMLEventObj* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_keyCode)(
        IHTMLEventObj* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_button)(
        IHTMLEventObj* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLEventObj* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_qualifier)(
        IHTMLEventObj* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_reason)(
        IHTMLEventObj* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_x)(
        IHTMLEventObj* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_y)(
        IHTMLEventObj* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_clientX)(
        IHTMLEventObj* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_clientY)(
        IHTMLEventObj* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_offsetX)(
        IHTMLEventObj* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_offsetY)(
        IHTMLEventObj* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_screenX)(
        IHTMLEventObj* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_screenY)(
        IHTMLEventObj* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_srcFilter)(
        IHTMLEventObj* This,
        IDispatch **p);

    END_INTERFACE
} IHTMLEventObjVtbl;
interface IHTMLEventObj {
    CONST_VTBL IHTMLEventObjVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLEventObj_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLEventObj_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLEventObj_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLEventObj_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLEventObj_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLEventObj_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLEventObj_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLEventObj methods ***/
#define IHTMLEventObj_get_srcElement(This,p) (This)->lpVtbl->get_srcElement(This,p)
#define IHTMLEventObj_get_altKey(This,p) (This)->lpVtbl->get_altKey(This,p)
#define IHTMLEventObj_get_ctrlKey(This,p) (This)->lpVtbl->get_ctrlKey(This,p)
#define IHTMLEventObj_get_shiftKey(This,p) (This)->lpVtbl->get_shiftKey(This,p)
#define IHTMLEventObj_put_returnValue(This,v) (This)->lpVtbl->put_returnValue(This,v)
#define IHTMLEventObj_get_returnValue(This,p) (This)->lpVtbl->get_returnValue(This,p)
#define IHTMLEventObj_put_cancelBubble(This,v) (This)->lpVtbl->put_cancelBubble(This,v)
#define IHTMLEventObj_get_cancelBubble(This,p) (This)->lpVtbl->get_cancelBubble(This,p)
#define IHTMLEventObj_get_fromElement(This,p) (This)->lpVtbl->get_fromElement(This,p)
#define IHTMLEventObj_get_toElement(This,p) (This)->lpVtbl->get_toElement(This,p)
#define IHTMLEventObj_put_keyCode(This,v) (This)->lpVtbl->put_keyCode(This,v)
#define IHTMLEventObj_get_keyCode(This,p) (This)->lpVtbl->get_keyCode(This,p)
#define IHTMLEventObj_get_button(This,p) (This)->lpVtbl->get_button(This,p)
#define IHTMLEventObj_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#define IHTMLEventObj_get_qualifier(This,p) (This)->lpVtbl->get_qualifier(This,p)
#define IHTMLEventObj_get_reason(This,p) (This)->lpVtbl->get_reason(This,p)
#define IHTMLEventObj_get_x(This,p) (This)->lpVtbl->get_x(This,p)
#define IHTMLEventObj_get_y(This,p) (This)->lpVtbl->get_y(This,p)
#define IHTMLEventObj_get_clientX(This,p) (This)->lpVtbl->get_clientX(This,p)
#define IHTMLEventObj_get_clientY(This,p) (This)->lpVtbl->get_clientY(This,p)
#define IHTMLEventObj_get_offsetX(This,p) (This)->lpVtbl->get_offsetX(This,p)
#define IHTMLEventObj_get_offsetY(This,p) (This)->lpVtbl->get_offsetY(This,p)
#define IHTMLEventObj_get_screenX(This,p) (This)->lpVtbl->get_screenX(This,p)
#define IHTMLEventObj_get_screenY(This,p) (This)->lpVtbl->get_screenY(This,p)
#define IHTMLEventObj_get_srcFilter(This,p) (This)->lpVtbl->get_srcFilter(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLEventObj_QueryInterface(IHTMLEventObj* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLEventObj_AddRef(IHTMLEventObj* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLEventObj_Release(IHTMLEventObj* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLEventObj_GetTypeInfoCount(IHTMLEventObj* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLEventObj_GetTypeInfo(IHTMLEventObj* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLEventObj_GetIDsOfNames(IHTMLEventObj* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLEventObj_Invoke(IHTMLEventObj* 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);
}
/*** IHTMLEventObj methods ***/
static FORCEINLINE HRESULT IHTMLEventObj_get_srcElement(IHTMLEventObj* This,IHTMLElement **p) {
    return This->lpVtbl->get_srcElement(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj_get_altKey(IHTMLEventObj* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_altKey(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj_get_ctrlKey(IHTMLEventObj* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_ctrlKey(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj_get_shiftKey(IHTMLEventObj* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_shiftKey(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj_put_returnValue(IHTMLEventObj* This,VARIANT v) {
    return This->lpVtbl->put_returnValue(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj_get_returnValue(IHTMLEventObj* This,VARIANT *p) {
    return This->lpVtbl->get_returnValue(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj_put_cancelBubble(IHTMLEventObj* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_cancelBubble(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj_get_cancelBubble(IHTMLEventObj* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_cancelBubble(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj_get_fromElement(IHTMLEventObj* This,IHTMLElement **p) {
    return This->lpVtbl->get_fromElement(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj_get_toElement(IHTMLEventObj* This,IHTMLElement **p) {
    return This->lpVtbl->get_toElement(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj_put_keyCode(IHTMLEventObj* This,LONG v) {
    return This->lpVtbl->put_keyCode(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj_get_keyCode(IHTMLEventObj* This,LONG *p) {
    return This->lpVtbl->get_keyCode(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj_get_button(IHTMLEventObj* This,LONG *p) {
    return This->lpVtbl->get_button(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj_get_type(IHTMLEventObj* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj_get_qualifier(IHTMLEventObj* This,BSTR *p) {
    return This->lpVtbl->get_qualifier(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj_get_reason(IHTMLEventObj* This,LONG *p) {
    return This->lpVtbl->get_reason(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj_get_x(IHTMLEventObj* This,LONG *p) {
    return This->lpVtbl->get_x(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj_get_y(IHTMLEventObj* This,LONG *p) {
    return This->lpVtbl->get_y(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj_get_clientX(IHTMLEventObj* This,LONG *p) {
    return This->lpVtbl->get_clientX(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj_get_clientY(IHTMLEventObj* This,LONG *p) {
    return This->lpVtbl->get_clientY(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj_get_offsetX(IHTMLEventObj* This,LONG *p) {
    return This->lpVtbl->get_offsetX(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj_get_offsetY(IHTMLEventObj* This,LONG *p) {
    return This->lpVtbl->get_offsetY(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj_get_screenX(IHTMLEventObj* This,LONG *p) {
    return This->lpVtbl->get_screenX(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj_get_screenY(IHTMLEventObj* This,LONG *p) {
    return This->lpVtbl->get_screenY(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj_get_srcFilter(IHTMLEventObj* This,IDispatch **p) {
    return This->lpVtbl->get_srcFilter(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLEventObj_get_srcElement_Proxy(
    IHTMLEventObj* This,
    IHTMLElement **p);
void __RPC_STUB IHTMLEventObj_get_srcElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj_get_altKey_Proxy(
    IHTMLEventObj* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLEventObj_get_altKey_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj_get_ctrlKey_Proxy(
    IHTMLEventObj* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLEventObj_get_ctrlKey_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj_get_shiftKey_Proxy(
    IHTMLEventObj* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLEventObj_get_shiftKey_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj_put_returnValue_Proxy(
    IHTMLEventObj* This,
    VARIANT v);
void __RPC_STUB IHTMLEventObj_put_returnValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj_get_returnValue_Proxy(
    IHTMLEventObj* This,
    VARIANT *p);
void __RPC_STUB IHTMLEventObj_get_returnValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj_put_cancelBubble_Proxy(
    IHTMLEventObj* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLEventObj_put_cancelBubble_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj_get_cancelBubble_Proxy(
    IHTMLEventObj* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLEventObj_get_cancelBubble_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj_get_fromElement_Proxy(
    IHTMLEventObj* This,
    IHTMLElement **p);
void __RPC_STUB IHTMLEventObj_get_fromElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj_get_toElement_Proxy(
    IHTMLEventObj* This,
    IHTMLElement **p);
void __RPC_STUB IHTMLEventObj_get_toElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj_put_keyCode_Proxy(
    IHTMLEventObj* This,
    LONG v);
void __RPC_STUB IHTMLEventObj_put_keyCode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj_get_keyCode_Proxy(
    IHTMLEventObj* This,
    LONG *p);
void __RPC_STUB IHTMLEventObj_get_keyCode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj_get_button_Proxy(
    IHTMLEventObj* This,
    LONG *p);
void __RPC_STUB IHTMLEventObj_get_button_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj_get_type_Proxy(
    IHTMLEventObj* This,
    BSTR *p);
void __RPC_STUB IHTMLEventObj_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj_get_qualifier_Proxy(
    IHTMLEventObj* This,
    BSTR *p);
void __RPC_STUB IHTMLEventObj_get_qualifier_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj_get_reason_Proxy(
    IHTMLEventObj* This,
    LONG *p);
void __RPC_STUB IHTMLEventObj_get_reason_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj_get_x_Proxy(
    IHTMLEventObj* This,
    LONG *p);
void __RPC_STUB IHTMLEventObj_get_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj_get_y_Proxy(
    IHTMLEventObj* This,
    LONG *p);
void __RPC_STUB IHTMLEventObj_get_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj_get_clientX_Proxy(
    IHTMLEventObj* This,
    LONG *p);
void __RPC_STUB IHTMLEventObj_get_clientX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj_get_clientY_Proxy(
    IHTMLEventObj* This,
    LONG *p);
void __RPC_STUB IHTMLEventObj_get_clientY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj_get_offsetX_Proxy(
    IHTMLEventObj* This,
    LONG *p);
void __RPC_STUB IHTMLEventObj_get_offsetX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj_get_offsetY_Proxy(
    IHTMLEventObj* This,
    LONG *p);
void __RPC_STUB IHTMLEventObj_get_offsetY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj_get_screenX_Proxy(
    IHTMLEventObj* This,
    LONG *p);
void __RPC_STUB IHTMLEventObj_get_screenX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj_get_screenY_Proxy(
    IHTMLEventObj* This,
    LONG *p);
void __RPC_STUB IHTMLEventObj_get_screenY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj_get_srcFilter_Proxy(
    IHTMLEventObj* This,
    IDispatch **p);
void __RPC_STUB IHTMLEventObj_get_srcFilter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLEventObj_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLEventObj2 interface
 */
#ifndef __IHTMLEventObj2_INTERFACE_DEFINED__
#define __IHTMLEventObj2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLEventObj2, 0x3050f48b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f48b-98b5-11cf-bb82-00aa00bdce0b")
IHTMLEventObj2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE setAttribute(
        BSTR strAttributeName,
        VARIANT AttributeValue,
        LONG lFlags = 1) = 0;

    virtual HRESULT STDMETHODCALLTYPE getAttribute(
        BSTR strAttributeName,
        LONG lFlags = 0,
        VARIANT *AttributeValue = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeAttribute(
        BSTR strAttributeName,
        LONG lFlags = 1,
        VARIANT_BOOL *pfSuccess = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_propertyName(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_propertyName(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_bookmarks(
        IHTMLBookmarkCollection *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_bookmarks(
        IHTMLBookmarkCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_recordset(
        IDispatch *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_recordset(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_dataFld(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_dataFld(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_boundElements(
        IHTMLElementCollection *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_boundElements(
        IHTMLElementCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_repeat(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_repeat(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_srcUrn(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_srcUrn(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_srcElement(
        IHTMLElement *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_srcElement(
        IHTMLElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_altKey(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_altKey(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ctrlKey(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ctrlKey(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_shiftKey(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_shiftKey(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_fromElement(
        IHTMLElement *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fromElement(
        IHTMLElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_toElement(
        IHTMLElement *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_toElement(
        IHTMLElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_button(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_button(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_type(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_qualifier(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_qualifier(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_reason(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_reason(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_x(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_y(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_clientX(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clientX(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_clientY(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clientY(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_offsetX(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_offsetX(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_offsetY(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_offsetY(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_screenX(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_screenX(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_screenY(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_screenY(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_srcFilter(
        IDispatch *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_srcFilter(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_dataTransfer(
        IHTMLDataTransfer **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLEventObj2, 0x3050f48b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLEventObj2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLEventObj2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLEventObj2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLEventObj2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLEventObj2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLEventObj2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLEventObj2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLEventObj2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLEventObj2 methods ***/
    HRESULT (STDMETHODCALLTYPE *setAttribute)(
        IHTMLEventObj2* This,
        BSTR strAttributeName,
        VARIANT AttributeValue,
        LONG lFlags);

    HRESULT (STDMETHODCALLTYPE *getAttribute)(
        IHTMLEventObj2* This,
        BSTR strAttributeName,
        LONG lFlags,
        VARIANT *AttributeValue);

    HRESULT (STDMETHODCALLTYPE *removeAttribute)(
        IHTMLEventObj2* This,
        BSTR strAttributeName,
        LONG lFlags,
        VARIANT_BOOL *pfSuccess);

    HRESULT (STDMETHODCALLTYPE *put_propertyName)(
        IHTMLEventObj2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_propertyName)(
        IHTMLEventObj2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *putref_bookmarks)(
        IHTMLEventObj2* This,
        IHTMLBookmarkCollection *v);

    HRESULT (STDMETHODCALLTYPE *get_bookmarks)(
        IHTMLEventObj2* This,
        IHTMLBookmarkCollection **p);

    HRESULT (STDMETHODCALLTYPE *putref_recordset)(
        IHTMLEventObj2* This,
        IDispatch *v);

    HRESULT (STDMETHODCALLTYPE *get_recordset)(
        IHTMLEventObj2* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *put_dataFld)(
        IHTMLEventObj2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_dataFld)(
        IHTMLEventObj2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *putref_boundElements)(
        IHTMLEventObj2* This,
        IHTMLElementCollection *v);

    HRESULT (STDMETHODCALLTYPE *get_boundElements)(
        IHTMLEventObj2* This,
        IHTMLElementCollection **p);

    HRESULT (STDMETHODCALLTYPE *put_repeat)(
        IHTMLEventObj2* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_repeat)(
        IHTMLEventObj2* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_srcUrn)(
        IHTMLEventObj2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_srcUrn)(
        IHTMLEventObj2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *putref_srcElement)(
        IHTMLEventObj2* This,
        IHTMLElement *v);

    HRESULT (STDMETHODCALLTYPE *get_srcElement)(
        IHTMLEventObj2* This,
        IHTMLElement **p);

    HRESULT (STDMETHODCALLTYPE *put_altKey)(
        IHTMLEventObj2* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_altKey)(
        IHTMLEventObj2* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_ctrlKey)(
        IHTMLEventObj2* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_ctrlKey)(
        IHTMLEventObj2* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_shiftKey)(
        IHTMLEventObj2* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_shiftKey)(
        IHTMLEventObj2* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *putref_fromElement)(
        IHTMLEventObj2* This,
        IHTMLElement *v);

    HRESULT (STDMETHODCALLTYPE *get_fromElement)(
        IHTMLEventObj2* This,
        IHTMLElement **p);

    HRESULT (STDMETHODCALLTYPE *putref_toElement)(
        IHTMLEventObj2* This,
        IHTMLElement *v);

    HRESULT (STDMETHODCALLTYPE *get_toElement)(
        IHTMLEventObj2* This,
        IHTMLElement **p);

    HRESULT (STDMETHODCALLTYPE *put_button)(
        IHTMLEventObj2* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_button)(
        IHTMLEventObj2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_type)(
        IHTMLEventObj2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLEventObj2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_qualifier)(
        IHTMLEventObj2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_qualifier)(
        IHTMLEventObj2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_reason)(
        IHTMLEventObj2* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_reason)(
        IHTMLEventObj2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_x)(
        IHTMLEventObj2* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_x)(
        IHTMLEventObj2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_y)(
        IHTMLEventObj2* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_y)(
        IHTMLEventObj2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_clientX)(
        IHTMLEventObj2* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_clientX)(
        IHTMLEventObj2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_clientY)(
        IHTMLEventObj2* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_clientY)(
        IHTMLEventObj2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_offsetX)(
        IHTMLEventObj2* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_offsetX)(
        IHTMLEventObj2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_offsetY)(
        IHTMLEventObj2* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_offsetY)(
        IHTMLEventObj2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_screenX)(
        IHTMLEventObj2* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_screenX)(
        IHTMLEventObj2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_screenY)(
        IHTMLEventObj2* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_screenY)(
        IHTMLEventObj2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *putref_srcFilter)(
        IHTMLEventObj2* This,
        IDispatch *v);

    HRESULT (STDMETHODCALLTYPE *get_srcFilter)(
        IHTMLEventObj2* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_dataTransfer)(
        IHTMLEventObj2* This,
        IHTMLDataTransfer **p);

    END_INTERFACE
} IHTMLEventObj2Vtbl;
interface IHTMLEventObj2 {
    CONST_VTBL IHTMLEventObj2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLEventObj2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLEventObj2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLEventObj2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLEventObj2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLEventObj2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLEventObj2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLEventObj2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLEventObj2 methods ***/
#define IHTMLEventObj2_setAttribute(This,strAttributeName,AttributeValue,lFlags) (This)->lpVtbl->setAttribute(This,strAttributeName,AttributeValue,lFlags)
#define IHTMLEventObj2_getAttribute(This,strAttributeName,lFlags,AttributeValue) (This)->lpVtbl->getAttribute(This,strAttributeName,lFlags,AttributeValue)
#define IHTMLEventObj2_removeAttribute(This,strAttributeName,lFlags,pfSuccess) (This)->lpVtbl->removeAttribute(This,strAttributeName,lFlags,pfSuccess)
#define IHTMLEventObj2_put_propertyName(This,v) (This)->lpVtbl->put_propertyName(This,v)
#define IHTMLEventObj2_get_propertyName(This,p) (This)->lpVtbl->get_propertyName(This,p)
#define IHTMLEventObj2_putref_bookmarks(This,v) (This)->lpVtbl->putref_bookmarks(This,v)
#define IHTMLEventObj2_get_bookmarks(This,p) (This)->lpVtbl->get_bookmarks(This,p)
#define IHTMLEventObj2_putref_recordset(This,v) (This)->lpVtbl->putref_recordset(This,v)
#define IHTMLEventObj2_get_recordset(This,p) (This)->lpVtbl->get_recordset(This,p)
#define IHTMLEventObj2_put_dataFld(This,v) (This)->lpVtbl->put_dataFld(This,v)
#define IHTMLEventObj2_get_dataFld(This,p) (This)->lpVtbl->get_dataFld(This,p)
#define IHTMLEventObj2_putref_boundElements(This,v) (This)->lpVtbl->putref_boundElements(This,v)
#define IHTMLEventObj2_get_boundElements(This,p) (This)->lpVtbl->get_boundElements(This,p)
#define IHTMLEventObj2_put_repeat(This,v) (This)->lpVtbl->put_repeat(This,v)
#define IHTMLEventObj2_get_repeat(This,p) (This)->lpVtbl->get_repeat(This,p)
#define IHTMLEventObj2_put_srcUrn(This,v) (This)->lpVtbl->put_srcUrn(This,v)
#define IHTMLEventObj2_get_srcUrn(This,p) (This)->lpVtbl->get_srcUrn(This,p)
#define IHTMLEventObj2_putref_srcElement(This,v) (This)->lpVtbl->putref_srcElement(This,v)
#define IHTMLEventObj2_get_srcElement(This,p) (This)->lpVtbl->get_srcElement(This,p)
#define IHTMLEventObj2_put_altKey(This,v) (This)->lpVtbl->put_altKey(This,v)
#define IHTMLEventObj2_get_altKey(This,p) (This)->lpVtbl->get_altKey(This,p)
#define IHTMLEventObj2_put_ctrlKey(This,v) (This)->lpVtbl->put_ctrlKey(This,v)
#define IHTMLEventObj2_get_ctrlKey(This,p) (This)->lpVtbl->get_ctrlKey(This,p)
#define IHTMLEventObj2_put_shiftKey(This,v) (This)->lpVtbl->put_shiftKey(This,v)
#define IHTMLEventObj2_get_shiftKey(This,p) (This)->lpVtbl->get_shiftKey(This,p)
#define IHTMLEventObj2_putref_fromElement(This,v) (This)->lpVtbl->putref_fromElement(This,v)
#define IHTMLEventObj2_get_fromElement(This,p) (This)->lpVtbl->get_fromElement(This,p)
#define IHTMLEventObj2_putref_toElement(This,v) (This)->lpVtbl->putref_toElement(This,v)
#define IHTMLEventObj2_get_toElement(This,p) (This)->lpVtbl->get_toElement(This,p)
#define IHTMLEventObj2_put_button(This,v) (This)->lpVtbl->put_button(This,v)
#define IHTMLEventObj2_get_button(This,p) (This)->lpVtbl->get_button(This,p)
#define IHTMLEventObj2_put_type(This,v) (This)->lpVtbl->put_type(This,v)
#define IHTMLEventObj2_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#define IHTMLEventObj2_put_qualifier(This,v) (This)->lpVtbl->put_qualifier(This,v)
#define IHTMLEventObj2_get_qualifier(This,p) (This)->lpVtbl->get_qualifier(This,p)
#define IHTMLEventObj2_put_reason(This,v) (This)->lpVtbl->put_reason(This,v)
#define IHTMLEventObj2_get_reason(This,p) (This)->lpVtbl->get_reason(This,p)
#define IHTMLEventObj2_put_x(This,v) (This)->lpVtbl->put_x(This,v)
#define IHTMLEventObj2_get_x(This,p) (This)->lpVtbl->get_x(This,p)
#define IHTMLEventObj2_put_y(This,v) (This)->lpVtbl->put_y(This,v)
#define IHTMLEventObj2_get_y(This,p) (This)->lpVtbl->get_y(This,p)
#define IHTMLEventObj2_put_clientX(This,v) (This)->lpVtbl->put_clientX(This,v)
#define IHTMLEventObj2_get_clientX(This,p) (This)->lpVtbl->get_clientX(This,p)
#define IHTMLEventObj2_put_clientY(This,v) (This)->lpVtbl->put_clientY(This,v)
#define IHTMLEventObj2_get_clientY(This,p) (This)->lpVtbl->get_clientY(This,p)
#define IHTMLEventObj2_put_offsetX(This,v) (This)->lpVtbl->put_offsetX(This,v)
#define IHTMLEventObj2_get_offsetX(This,p) (This)->lpVtbl->get_offsetX(This,p)
#define IHTMLEventObj2_put_offsetY(This,v) (This)->lpVtbl->put_offsetY(This,v)
#define IHTMLEventObj2_get_offsetY(This,p) (This)->lpVtbl->get_offsetY(This,p)
#define IHTMLEventObj2_put_screenX(This,v) (This)->lpVtbl->put_screenX(This,v)
#define IHTMLEventObj2_get_screenX(This,p) (This)->lpVtbl->get_screenX(This,p)
#define IHTMLEventObj2_put_screenY(This,v) (This)->lpVtbl->put_screenY(This,v)
#define IHTMLEventObj2_get_screenY(This,p) (This)->lpVtbl->get_screenY(This,p)
#define IHTMLEventObj2_putref_srcFilter(This,v) (This)->lpVtbl->putref_srcFilter(This,v)
#define IHTMLEventObj2_get_srcFilter(This,p) (This)->lpVtbl->get_srcFilter(This,p)
#define IHTMLEventObj2_get_dataTransfer(This,p) (This)->lpVtbl->get_dataTransfer(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLEventObj2_QueryInterface(IHTMLEventObj2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLEventObj2_AddRef(IHTMLEventObj2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLEventObj2_Release(IHTMLEventObj2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLEventObj2_GetTypeInfoCount(IHTMLEventObj2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLEventObj2_GetTypeInfo(IHTMLEventObj2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLEventObj2_GetIDsOfNames(IHTMLEventObj2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLEventObj2_Invoke(IHTMLEventObj2* 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);
}
/*** IHTMLEventObj2 methods ***/
static FORCEINLINE HRESULT IHTMLEventObj2_setAttribute(IHTMLEventObj2* This,BSTR strAttributeName,VARIANT AttributeValue,LONG lFlags) {
    return This->lpVtbl->setAttribute(This,strAttributeName,AttributeValue,lFlags);
}
static FORCEINLINE HRESULT IHTMLEventObj2_getAttribute(IHTMLEventObj2* This,BSTR strAttributeName,LONG lFlags,VARIANT *AttributeValue) {
    return This->lpVtbl->getAttribute(This,strAttributeName,lFlags,AttributeValue);
}
static FORCEINLINE HRESULT IHTMLEventObj2_removeAttribute(IHTMLEventObj2* This,BSTR strAttributeName,LONG lFlags,VARIANT_BOOL *pfSuccess) {
    return This->lpVtbl->removeAttribute(This,strAttributeName,lFlags,pfSuccess);
}
static FORCEINLINE HRESULT IHTMLEventObj2_put_propertyName(IHTMLEventObj2* This,BSTR v) {
    return This->lpVtbl->put_propertyName(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj2_get_propertyName(IHTMLEventObj2* This,BSTR *p) {
    return This->lpVtbl->get_propertyName(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj2_putref_bookmarks(IHTMLEventObj2* This,IHTMLBookmarkCollection *v) {
    return This->lpVtbl->putref_bookmarks(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj2_get_bookmarks(IHTMLEventObj2* This,IHTMLBookmarkCollection **p) {
    return This->lpVtbl->get_bookmarks(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj2_putref_recordset(IHTMLEventObj2* This,IDispatch *v) {
    return This->lpVtbl->putref_recordset(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj2_get_recordset(IHTMLEventObj2* This,IDispatch **p) {
    return This->lpVtbl->get_recordset(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj2_put_dataFld(IHTMLEventObj2* This,BSTR v) {
    return This->lpVtbl->put_dataFld(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj2_get_dataFld(IHTMLEventObj2* This,BSTR *p) {
    return This->lpVtbl->get_dataFld(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj2_putref_boundElements(IHTMLEventObj2* This,IHTMLElementCollection *v) {
    return This->lpVtbl->putref_boundElements(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj2_get_boundElements(IHTMLEventObj2* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_boundElements(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj2_put_repeat(IHTMLEventObj2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_repeat(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj2_get_repeat(IHTMLEventObj2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_repeat(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj2_put_srcUrn(IHTMLEventObj2* This,BSTR v) {
    return This->lpVtbl->put_srcUrn(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj2_get_srcUrn(IHTMLEventObj2* This,BSTR *p) {
    return This->lpVtbl->get_srcUrn(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj2_putref_srcElement(IHTMLEventObj2* This,IHTMLElement *v) {
    return This->lpVtbl->putref_srcElement(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj2_get_srcElement(IHTMLEventObj2* This,IHTMLElement **p) {
    return This->lpVtbl->get_srcElement(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj2_put_altKey(IHTMLEventObj2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_altKey(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj2_get_altKey(IHTMLEventObj2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_altKey(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj2_put_ctrlKey(IHTMLEventObj2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_ctrlKey(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj2_get_ctrlKey(IHTMLEventObj2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_ctrlKey(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj2_put_shiftKey(IHTMLEventObj2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_shiftKey(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj2_get_shiftKey(IHTMLEventObj2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_shiftKey(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj2_putref_fromElement(IHTMLEventObj2* This,IHTMLElement *v) {
    return This->lpVtbl->putref_fromElement(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj2_get_fromElement(IHTMLEventObj2* This,IHTMLElement **p) {
    return This->lpVtbl->get_fromElement(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj2_putref_toElement(IHTMLEventObj2* This,IHTMLElement *v) {
    return This->lpVtbl->putref_toElement(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj2_get_toElement(IHTMLEventObj2* This,IHTMLElement **p) {
    return This->lpVtbl->get_toElement(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj2_put_button(IHTMLEventObj2* This,LONG v) {
    return This->lpVtbl->put_button(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj2_get_button(IHTMLEventObj2* This,LONG *p) {
    return This->lpVtbl->get_button(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj2_put_type(IHTMLEventObj2* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj2_get_type(IHTMLEventObj2* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj2_put_qualifier(IHTMLEventObj2* This,BSTR v) {
    return This->lpVtbl->put_qualifier(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj2_get_qualifier(IHTMLEventObj2* This,BSTR *p) {
    return This->lpVtbl->get_qualifier(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj2_put_reason(IHTMLEventObj2* This,LONG v) {
    return This->lpVtbl->put_reason(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj2_get_reason(IHTMLEventObj2* This,LONG *p) {
    return This->lpVtbl->get_reason(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj2_put_x(IHTMLEventObj2* This,LONG v) {
    return This->lpVtbl->put_x(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj2_get_x(IHTMLEventObj2* This,LONG *p) {
    return This->lpVtbl->get_x(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj2_put_y(IHTMLEventObj2* This,LONG v) {
    return This->lpVtbl->put_y(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj2_get_y(IHTMLEventObj2* This,LONG *p) {
    return This->lpVtbl->get_y(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj2_put_clientX(IHTMLEventObj2* This,LONG v) {
    return This->lpVtbl->put_clientX(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj2_get_clientX(IHTMLEventObj2* This,LONG *p) {
    return This->lpVtbl->get_clientX(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj2_put_clientY(IHTMLEventObj2* This,LONG v) {
    return This->lpVtbl->put_clientY(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj2_get_clientY(IHTMLEventObj2* This,LONG *p) {
    return This->lpVtbl->get_clientY(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj2_put_offsetX(IHTMLEventObj2* This,LONG v) {
    return This->lpVtbl->put_offsetX(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj2_get_offsetX(IHTMLEventObj2* This,LONG *p) {
    return This->lpVtbl->get_offsetX(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj2_put_offsetY(IHTMLEventObj2* This,LONG v) {
    return This->lpVtbl->put_offsetY(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj2_get_offsetY(IHTMLEventObj2* This,LONG *p) {
    return This->lpVtbl->get_offsetY(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj2_put_screenX(IHTMLEventObj2* This,LONG v) {
    return This->lpVtbl->put_screenX(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj2_get_screenX(IHTMLEventObj2* This,LONG *p) {
    return This->lpVtbl->get_screenX(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj2_put_screenY(IHTMLEventObj2* This,LONG v) {
    return This->lpVtbl->put_screenY(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj2_get_screenY(IHTMLEventObj2* This,LONG *p) {
    return This->lpVtbl->get_screenY(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj2_putref_srcFilter(IHTMLEventObj2* This,IDispatch *v) {
    return This->lpVtbl->putref_srcFilter(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj2_get_srcFilter(IHTMLEventObj2* This,IDispatch **p) {
    return This->lpVtbl->get_srcFilter(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj2_get_dataTransfer(IHTMLEventObj2* This,IHTMLDataTransfer **p) {
    return This->lpVtbl->get_dataTransfer(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLEventObj2_setAttribute_Proxy(
    IHTMLEventObj2* This,
    BSTR strAttributeName,
    VARIANT AttributeValue,
    LONG lFlags);
void __RPC_STUB IHTMLEventObj2_setAttribute_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_getAttribute_Proxy(
    IHTMLEventObj2* This,
    BSTR strAttributeName,
    LONG lFlags,
    VARIANT *AttributeValue);
void __RPC_STUB IHTMLEventObj2_getAttribute_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_removeAttribute_Proxy(
    IHTMLEventObj2* This,
    BSTR strAttributeName,
    LONG lFlags,
    VARIANT_BOOL *pfSuccess);
void __RPC_STUB IHTMLEventObj2_removeAttribute_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_put_propertyName_Proxy(
    IHTMLEventObj2* This,
    BSTR v);
void __RPC_STUB IHTMLEventObj2_put_propertyName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_get_propertyName_Proxy(
    IHTMLEventObj2* This,
    BSTR *p);
void __RPC_STUB IHTMLEventObj2_get_propertyName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_putref_bookmarks_Proxy(
    IHTMLEventObj2* This,
    IHTMLBookmarkCollection *v);
void __RPC_STUB IHTMLEventObj2_putref_bookmarks_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_get_bookmarks_Proxy(
    IHTMLEventObj2* This,
    IHTMLBookmarkCollection **p);
void __RPC_STUB IHTMLEventObj2_get_bookmarks_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_putref_recordset_Proxy(
    IHTMLEventObj2* This,
    IDispatch *v);
void __RPC_STUB IHTMLEventObj2_putref_recordset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_get_recordset_Proxy(
    IHTMLEventObj2* This,
    IDispatch **p);
void __RPC_STUB IHTMLEventObj2_get_recordset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_put_dataFld_Proxy(
    IHTMLEventObj2* This,
    BSTR v);
void __RPC_STUB IHTMLEventObj2_put_dataFld_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_get_dataFld_Proxy(
    IHTMLEventObj2* This,
    BSTR *p);
void __RPC_STUB IHTMLEventObj2_get_dataFld_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_putref_boundElements_Proxy(
    IHTMLEventObj2* This,
    IHTMLElementCollection *v);
void __RPC_STUB IHTMLEventObj2_putref_boundElements_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_get_boundElements_Proxy(
    IHTMLEventObj2* This,
    IHTMLElementCollection **p);
void __RPC_STUB IHTMLEventObj2_get_boundElements_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_put_repeat_Proxy(
    IHTMLEventObj2* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLEventObj2_put_repeat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_get_repeat_Proxy(
    IHTMLEventObj2* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLEventObj2_get_repeat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_put_srcUrn_Proxy(
    IHTMLEventObj2* This,
    BSTR v);
void __RPC_STUB IHTMLEventObj2_put_srcUrn_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_get_srcUrn_Proxy(
    IHTMLEventObj2* This,
    BSTR *p);
void __RPC_STUB IHTMLEventObj2_get_srcUrn_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_putref_srcElement_Proxy(
    IHTMLEventObj2* This,
    IHTMLElement *v);
void __RPC_STUB IHTMLEventObj2_putref_srcElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_get_srcElement_Proxy(
    IHTMLEventObj2* This,
    IHTMLElement **p);
void __RPC_STUB IHTMLEventObj2_get_srcElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_put_altKey_Proxy(
    IHTMLEventObj2* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLEventObj2_put_altKey_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_get_altKey_Proxy(
    IHTMLEventObj2* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLEventObj2_get_altKey_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_put_ctrlKey_Proxy(
    IHTMLEventObj2* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLEventObj2_put_ctrlKey_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_get_ctrlKey_Proxy(
    IHTMLEventObj2* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLEventObj2_get_ctrlKey_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_put_shiftKey_Proxy(
    IHTMLEventObj2* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLEventObj2_put_shiftKey_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_get_shiftKey_Proxy(
    IHTMLEventObj2* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLEventObj2_get_shiftKey_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_putref_fromElement_Proxy(
    IHTMLEventObj2* This,
    IHTMLElement *v);
void __RPC_STUB IHTMLEventObj2_putref_fromElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_get_fromElement_Proxy(
    IHTMLEventObj2* This,
    IHTMLElement **p);
void __RPC_STUB IHTMLEventObj2_get_fromElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_putref_toElement_Proxy(
    IHTMLEventObj2* This,
    IHTMLElement *v);
void __RPC_STUB IHTMLEventObj2_putref_toElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_get_toElement_Proxy(
    IHTMLEventObj2* This,
    IHTMLElement **p);
void __RPC_STUB IHTMLEventObj2_get_toElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_put_button_Proxy(
    IHTMLEventObj2* This,
    LONG v);
void __RPC_STUB IHTMLEventObj2_put_button_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_get_button_Proxy(
    IHTMLEventObj2* This,
    LONG *p);
void __RPC_STUB IHTMLEventObj2_get_button_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_put_type_Proxy(
    IHTMLEventObj2* This,
    BSTR v);
void __RPC_STUB IHTMLEventObj2_put_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_get_type_Proxy(
    IHTMLEventObj2* This,
    BSTR *p);
void __RPC_STUB IHTMLEventObj2_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_put_qualifier_Proxy(
    IHTMLEventObj2* This,
    BSTR v);
void __RPC_STUB IHTMLEventObj2_put_qualifier_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_get_qualifier_Proxy(
    IHTMLEventObj2* This,
    BSTR *p);
void __RPC_STUB IHTMLEventObj2_get_qualifier_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_put_reason_Proxy(
    IHTMLEventObj2* This,
    LONG v);
void __RPC_STUB IHTMLEventObj2_put_reason_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_get_reason_Proxy(
    IHTMLEventObj2* This,
    LONG *p);
void __RPC_STUB IHTMLEventObj2_get_reason_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_put_x_Proxy(
    IHTMLEventObj2* This,
    LONG v);
void __RPC_STUB IHTMLEventObj2_put_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_get_x_Proxy(
    IHTMLEventObj2* This,
    LONG *p);
void __RPC_STUB IHTMLEventObj2_get_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_put_y_Proxy(
    IHTMLEventObj2* This,
    LONG v);
void __RPC_STUB IHTMLEventObj2_put_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_get_y_Proxy(
    IHTMLEventObj2* This,
    LONG *p);
void __RPC_STUB IHTMLEventObj2_get_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_put_clientX_Proxy(
    IHTMLEventObj2* This,
    LONG v);
void __RPC_STUB IHTMLEventObj2_put_clientX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_get_clientX_Proxy(
    IHTMLEventObj2* This,
    LONG *p);
void __RPC_STUB IHTMLEventObj2_get_clientX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_put_clientY_Proxy(
    IHTMLEventObj2* This,
    LONG v);
void __RPC_STUB IHTMLEventObj2_put_clientY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_get_clientY_Proxy(
    IHTMLEventObj2* This,
    LONG *p);
void __RPC_STUB IHTMLEventObj2_get_clientY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_put_offsetX_Proxy(
    IHTMLEventObj2* This,
    LONG v);
void __RPC_STUB IHTMLEventObj2_put_offsetX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_get_offsetX_Proxy(
    IHTMLEventObj2* This,
    LONG *p);
void __RPC_STUB IHTMLEventObj2_get_offsetX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_put_offsetY_Proxy(
    IHTMLEventObj2* This,
    LONG v);
void __RPC_STUB IHTMLEventObj2_put_offsetY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_get_offsetY_Proxy(
    IHTMLEventObj2* This,
    LONG *p);
void __RPC_STUB IHTMLEventObj2_get_offsetY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_put_screenX_Proxy(
    IHTMLEventObj2* This,
    LONG v);
void __RPC_STUB IHTMLEventObj2_put_screenX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_get_screenX_Proxy(
    IHTMLEventObj2* This,
    LONG *p);
void __RPC_STUB IHTMLEventObj2_get_screenX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_put_screenY_Proxy(
    IHTMLEventObj2* This,
    LONG v);
void __RPC_STUB IHTMLEventObj2_put_screenY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_get_screenY_Proxy(
    IHTMLEventObj2* This,
    LONG *p);
void __RPC_STUB IHTMLEventObj2_get_screenY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_putref_srcFilter_Proxy(
    IHTMLEventObj2* This,
    IDispatch *v);
void __RPC_STUB IHTMLEventObj2_putref_srcFilter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_get_srcFilter_Proxy(
    IHTMLEventObj2* This,
    IDispatch **p);
void __RPC_STUB IHTMLEventObj2_get_srcFilter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj2_get_dataTransfer_Proxy(
    IHTMLEventObj2* This,
    IHTMLDataTransfer **p);
void __RPC_STUB IHTMLEventObj2_get_dataTransfer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLEventObj2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLEventObj3 interface
 */
#ifndef __IHTMLEventObj3_INTERFACE_DEFINED__
#define __IHTMLEventObj3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLEventObj3, 0x3050f680, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f680-98b5-11cf-bb82-00aa00bdce0b")
IHTMLEventObj3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_contentOverflow(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_shiftLeft(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_shiftLeft(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_altLeft(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_altLeft(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ctrlLeft(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ctrlLeft(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_imeCompositionChange(
        LONG_PTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_imeNotifyCommand(
        LONG_PTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_imeNotifyData(
        LONG_PTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_imeRequest(
        LONG_PTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_imeRequestData(
        LONG_PTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_keyboardLayout(
        LONG_PTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_behaviorCookie(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_behaviorPart(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_nextPage(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLEventObj3, 0x3050f680, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLEventObj3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLEventObj3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLEventObj3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLEventObj3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLEventObj3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLEventObj3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLEventObj3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLEventObj3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLEventObj3 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_contentOverflow)(
        IHTMLEventObj3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_shiftLeft)(
        IHTMLEventObj3* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_shiftLeft)(
        IHTMLEventObj3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_altLeft)(
        IHTMLEventObj3* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_altLeft)(
        IHTMLEventObj3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_ctrlLeft)(
        IHTMLEventObj3* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_ctrlLeft)(
        IHTMLEventObj3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_imeCompositionChange)(
        IHTMLEventObj3* This,
        LONG_PTR *p);

    HRESULT (STDMETHODCALLTYPE *get_imeNotifyCommand)(
        IHTMLEventObj3* This,
        LONG_PTR *p);

    HRESULT (STDMETHODCALLTYPE *get_imeNotifyData)(
        IHTMLEventObj3* This,
        LONG_PTR *p);

    HRESULT (STDMETHODCALLTYPE *get_imeRequest)(
        IHTMLEventObj3* This,
        LONG_PTR *p);

    HRESULT (STDMETHODCALLTYPE *get_imeRequestData)(
        IHTMLEventObj3* This,
        LONG_PTR *p);

    HRESULT (STDMETHODCALLTYPE *get_keyboardLayout)(
        IHTMLEventObj3* This,
        LONG_PTR *p);

    HRESULT (STDMETHODCALLTYPE *get_behaviorCookie)(
        IHTMLEventObj3* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_behaviorPart)(
        IHTMLEventObj3* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_nextPage)(
        IHTMLEventObj3* This,
        BSTR *p);

    END_INTERFACE
} IHTMLEventObj3Vtbl;
interface IHTMLEventObj3 {
    CONST_VTBL IHTMLEventObj3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLEventObj3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLEventObj3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLEventObj3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLEventObj3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLEventObj3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLEventObj3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLEventObj3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLEventObj3 methods ***/
#define IHTMLEventObj3_get_contentOverflow(This,p) (This)->lpVtbl->get_contentOverflow(This,p)
#define IHTMLEventObj3_put_shiftLeft(This,v) (This)->lpVtbl->put_shiftLeft(This,v)
#define IHTMLEventObj3_get_shiftLeft(This,p) (This)->lpVtbl->get_shiftLeft(This,p)
#define IHTMLEventObj3_put_altLeft(This,v) (This)->lpVtbl->put_altLeft(This,v)
#define IHTMLEventObj3_get_altLeft(This,p) (This)->lpVtbl->get_altLeft(This,p)
#define IHTMLEventObj3_put_ctrlLeft(This,v) (This)->lpVtbl->put_ctrlLeft(This,v)
#define IHTMLEventObj3_get_ctrlLeft(This,p) (This)->lpVtbl->get_ctrlLeft(This,p)
#define IHTMLEventObj3_get_imeCompositionChange(This,p) (This)->lpVtbl->get_imeCompositionChange(This,p)
#define IHTMLEventObj3_get_imeNotifyCommand(This,p) (This)->lpVtbl->get_imeNotifyCommand(This,p)
#define IHTMLEventObj3_get_imeNotifyData(This,p) (This)->lpVtbl->get_imeNotifyData(This,p)
#define IHTMLEventObj3_get_imeRequest(This,p) (This)->lpVtbl->get_imeRequest(This,p)
#define IHTMLEventObj3_get_imeRequestData(This,p) (This)->lpVtbl->get_imeRequestData(This,p)
#define IHTMLEventObj3_get_keyboardLayout(This,p) (This)->lpVtbl->get_keyboardLayout(This,p)
#define IHTMLEventObj3_get_behaviorCookie(This,p) (This)->lpVtbl->get_behaviorCookie(This,p)
#define IHTMLEventObj3_get_behaviorPart(This,p) (This)->lpVtbl->get_behaviorPart(This,p)
#define IHTMLEventObj3_get_nextPage(This,p) (This)->lpVtbl->get_nextPage(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLEventObj3_QueryInterface(IHTMLEventObj3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLEventObj3_AddRef(IHTMLEventObj3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLEventObj3_Release(IHTMLEventObj3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLEventObj3_GetTypeInfoCount(IHTMLEventObj3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLEventObj3_GetTypeInfo(IHTMLEventObj3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLEventObj3_GetIDsOfNames(IHTMLEventObj3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLEventObj3_Invoke(IHTMLEventObj3* 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);
}
/*** IHTMLEventObj3 methods ***/
static FORCEINLINE HRESULT IHTMLEventObj3_get_contentOverflow(IHTMLEventObj3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_contentOverflow(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj3_put_shiftLeft(IHTMLEventObj3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_shiftLeft(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj3_get_shiftLeft(IHTMLEventObj3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_shiftLeft(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj3_put_altLeft(IHTMLEventObj3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_altLeft(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj3_get_altLeft(IHTMLEventObj3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_altLeft(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj3_put_ctrlLeft(IHTMLEventObj3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_ctrlLeft(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj3_get_ctrlLeft(IHTMLEventObj3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_ctrlLeft(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj3_get_imeCompositionChange(IHTMLEventObj3* This,LONG_PTR *p) {
    return This->lpVtbl->get_imeCompositionChange(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj3_get_imeNotifyCommand(IHTMLEventObj3* This,LONG_PTR *p) {
    return This->lpVtbl->get_imeNotifyCommand(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj3_get_imeNotifyData(IHTMLEventObj3* This,LONG_PTR *p) {
    return This->lpVtbl->get_imeNotifyData(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj3_get_imeRequest(IHTMLEventObj3* This,LONG_PTR *p) {
    return This->lpVtbl->get_imeRequest(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj3_get_imeRequestData(IHTMLEventObj3* This,LONG_PTR *p) {
    return This->lpVtbl->get_imeRequestData(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj3_get_keyboardLayout(IHTMLEventObj3* This,LONG_PTR *p) {
    return This->lpVtbl->get_keyboardLayout(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj3_get_behaviorCookie(IHTMLEventObj3* This,LONG *p) {
    return This->lpVtbl->get_behaviorCookie(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj3_get_behaviorPart(IHTMLEventObj3* This,LONG *p) {
    return This->lpVtbl->get_behaviorPart(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj3_get_nextPage(IHTMLEventObj3* This,BSTR *p) {
    return This->lpVtbl->get_nextPage(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLEventObj3_get_contentOverflow_Proxy(
    IHTMLEventObj3* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLEventObj3_get_contentOverflow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj3_put_shiftLeft_Proxy(
    IHTMLEventObj3* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLEventObj3_put_shiftLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj3_get_shiftLeft_Proxy(
    IHTMLEventObj3* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLEventObj3_get_shiftLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj3_put_altLeft_Proxy(
    IHTMLEventObj3* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLEventObj3_put_altLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj3_get_altLeft_Proxy(
    IHTMLEventObj3* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLEventObj3_get_altLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj3_put_ctrlLeft_Proxy(
    IHTMLEventObj3* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLEventObj3_put_ctrlLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj3_get_ctrlLeft_Proxy(
    IHTMLEventObj3* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLEventObj3_get_ctrlLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj3_get_imeCompositionChange_Proxy(
    IHTMLEventObj3* This,
    LONG_PTR *p);
void __RPC_STUB IHTMLEventObj3_get_imeCompositionChange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj3_get_imeNotifyCommand_Proxy(
    IHTMLEventObj3* This,
    LONG_PTR *p);
void __RPC_STUB IHTMLEventObj3_get_imeNotifyCommand_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj3_get_imeNotifyData_Proxy(
    IHTMLEventObj3* This,
    LONG_PTR *p);
void __RPC_STUB IHTMLEventObj3_get_imeNotifyData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj3_get_imeRequest_Proxy(
    IHTMLEventObj3* This,
    LONG_PTR *p);
void __RPC_STUB IHTMLEventObj3_get_imeRequest_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj3_get_imeRequestData_Proxy(
    IHTMLEventObj3* This,
    LONG_PTR *p);
void __RPC_STUB IHTMLEventObj3_get_imeRequestData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj3_get_keyboardLayout_Proxy(
    IHTMLEventObj3* This,
    LONG_PTR *p);
void __RPC_STUB IHTMLEventObj3_get_keyboardLayout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj3_get_behaviorCookie_Proxy(
    IHTMLEventObj3* This,
    LONG *p);
void __RPC_STUB IHTMLEventObj3_get_behaviorCookie_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj3_get_behaviorPart_Proxy(
    IHTMLEventObj3* This,
    LONG *p);
void __RPC_STUB IHTMLEventObj3_get_behaviorPart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj3_get_nextPage_Proxy(
    IHTMLEventObj3* This,
    BSTR *p);
void __RPC_STUB IHTMLEventObj3_get_nextPage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLEventObj3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLEventObj4 interface
 */
#ifndef __IHTMLEventObj4_INTERFACE_DEFINED__
#define __IHTMLEventObj4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLEventObj4, 0x3050f814, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f814-98b5-11cf-bb82-00aa00bdce0b")
IHTMLEventObj4 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_wheelDelta(
        LONG *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLEventObj4, 0x3050f814, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLEventObj4Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLEventObj4* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLEventObj4* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLEventObj4* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLEventObj4* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLEventObj4* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLEventObj4* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLEventObj4* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLEventObj4 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_wheelDelta)(
        IHTMLEventObj4* This,
        LONG *p);

    END_INTERFACE
} IHTMLEventObj4Vtbl;
interface IHTMLEventObj4 {
    CONST_VTBL IHTMLEventObj4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLEventObj4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLEventObj4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLEventObj4_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLEventObj4_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLEventObj4_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLEventObj4_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLEventObj4_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLEventObj4 methods ***/
#define IHTMLEventObj4_get_wheelDelta(This,p) (This)->lpVtbl->get_wheelDelta(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLEventObj4_QueryInterface(IHTMLEventObj4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLEventObj4_AddRef(IHTMLEventObj4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLEventObj4_Release(IHTMLEventObj4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLEventObj4_GetTypeInfoCount(IHTMLEventObj4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLEventObj4_GetTypeInfo(IHTMLEventObj4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLEventObj4_GetIDsOfNames(IHTMLEventObj4* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLEventObj4_Invoke(IHTMLEventObj4* 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);
}
/*** IHTMLEventObj4 methods ***/
static FORCEINLINE HRESULT IHTMLEventObj4_get_wheelDelta(IHTMLEventObj4* This,LONG *p) {
    return This->lpVtbl->get_wheelDelta(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLEventObj4_get_wheelDelta_Proxy(
    IHTMLEventObj4* This,
    LONG *p);
void __RPC_STUB IHTMLEventObj4_get_wheelDelta_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLEventObj4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLEventObj5 interface
 */
#ifndef __IHTMLEventObj5_INTERFACE_DEFINED__
#define __IHTMLEventObj5_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLEventObj5, 0x30510478, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510478-98b5-11cf-bb82-00aa00bdce0b")
IHTMLEventObj5 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_url(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_url(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_data(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_data(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_source(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_origin(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_origin(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_issession(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_issession(
        VARIANT_BOOL *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLEventObj5, 0x30510478, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLEventObj5Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLEventObj5* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLEventObj5* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLEventObj5* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLEventObj5* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLEventObj5* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLEventObj5* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLEventObj5* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLEventObj5 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_url)(
        IHTMLEventObj5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_url)(
        IHTMLEventObj5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_data)(
        IHTMLEventObj5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_data)(
        IHTMLEventObj5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_source)(
        IHTMLEventObj5* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *put_origin)(
        IHTMLEventObj5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_origin)(
        IHTMLEventObj5* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_issession)(
        IHTMLEventObj5* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_issession)(
        IHTMLEventObj5* This,
        VARIANT_BOOL *p);

    END_INTERFACE
} IHTMLEventObj5Vtbl;
interface IHTMLEventObj5 {
    CONST_VTBL IHTMLEventObj5Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLEventObj5_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLEventObj5_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLEventObj5_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLEventObj5_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLEventObj5_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLEventObj5_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLEventObj5_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLEventObj5 methods ***/
#define IHTMLEventObj5_put_url(This,v) (This)->lpVtbl->put_url(This,v)
#define IHTMLEventObj5_get_url(This,p) (This)->lpVtbl->get_url(This,p)
#define IHTMLEventObj5_put_data(This,v) (This)->lpVtbl->put_data(This,v)
#define IHTMLEventObj5_get_data(This,p) (This)->lpVtbl->get_data(This,p)
#define IHTMLEventObj5_get_source(This,p) (This)->lpVtbl->get_source(This,p)
#define IHTMLEventObj5_put_origin(This,v) (This)->lpVtbl->put_origin(This,v)
#define IHTMLEventObj5_get_origin(This,p) (This)->lpVtbl->get_origin(This,p)
#define IHTMLEventObj5_put_issession(This,v) (This)->lpVtbl->put_issession(This,v)
#define IHTMLEventObj5_get_issession(This,p) (This)->lpVtbl->get_issession(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLEventObj5_QueryInterface(IHTMLEventObj5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLEventObj5_AddRef(IHTMLEventObj5* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLEventObj5_Release(IHTMLEventObj5* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLEventObj5_GetTypeInfoCount(IHTMLEventObj5* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLEventObj5_GetTypeInfo(IHTMLEventObj5* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLEventObj5_GetIDsOfNames(IHTMLEventObj5* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLEventObj5_Invoke(IHTMLEventObj5* 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);
}
/*** IHTMLEventObj5 methods ***/
static FORCEINLINE HRESULT IHTMLEventObj5_put_url(IHTMLEventObj5* This,BSTR v) {
    return This->lpVtbl->put_url(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj5_get_url(IHTMLEventObj5* This,BSTR *p) {
    return This->lpVtbl->get_url(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj5_put_data(IHTMLEventObj5* This,BSTR v) {
    return This->lpVtbl->put_data(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj5_get_data(IHTMLEventObj5* This,BSTR *p) {
    return This->lpVtbl->get_data(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj5_get_source(IHTMLEventObj5* This,IDispatch **p) {
    return This->lpVtbl->get_source(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj5_put_origin(IHTMLEventObj5* This,BSTR v) {
    return This->lpVtbl->put_origin(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj5_get_origin(IHTMLEventObj5* This,BSTR *p) {
    return This->lpVtbl->get_origin(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj5_put_issession(IHTMLEventObj5* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_issession(This,v);
}
static FORCEINLINE HRESULT IHTMLEventObj5_get_issession(IHTMLEventObj5* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_issession(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLEventObj5_put_url_Proxy(
    IHTMLEventObj5* This,
    BSTR v);
void __RPC_STUB IHTMLEventObj5_put_url_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj5_get_url_Proxy(
    IHTMLEventObj5* This,
    BSTR *p);
void __RPC_STUB IHTMLEventObj5_get_url_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj5_put_data_Proxy(
    IHTMLEventObj5* This,
    BSTR v);
void __RPC_STUB IHTMLEventObj5_put_data_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj5_get_data_Proxy(
    IHTMLEventObj5* This,
    BSTR *p);
void __RPC_STUB IHTMLEventObj5_get_data_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj5_get_source_Proxy(
    IHTMLEventObj5* This,
    IDispatch **p);
void __RPC_STUB IHTMLEventObj5_get_source_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj5_put_origin_Proxy(
    IHTMLEventObj5* This,
    BSTR v);
void __RPC_STUB IHTMLEventObj5_put_origin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj5_get_origin_Proxy(
    IHTMLEventObj5* This,
    BSTR *p);
void __RPC_STUB IHTMLEventObj5_get_origin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj5_put_issession_Proxy(
    IHTMLEventObj5* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLEventObj5_put_issession_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj5_get_issession_Proxy(
    IHTMLEventObj5* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLEventObj5_get_issession_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLEventObj5_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLEventObj6 interface
 */
#ifndef __IHTMLEventObj6_INTERFACE_DEFINED__
#define __IHTMLEventObj6_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLEventObj6, 0x30510734, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510734-98b5-11cf-bb82-00aa00bdce0b")
IHTMLEventObj6 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_actionURL(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_buttonID(
        LONG *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLEventObj6, 0x30510734, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLEventObj6Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLEventObj6* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLEventObj6* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLEventObj6* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLEventObj6* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLEventObj6* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLEventObj6* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLEventObj6* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLEventObj6 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_actionURL)(
        IHTMLEventObj6* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_buttonID)(
        IHTMLEventObj6* This,
        LONG *p);

    END_INTERFACE
} IHTMLEventObj6Vtbl;
interface IHTMLEventObj6 {
    CONST_VTBL IHTMLEventObj6Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLEventObj6_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLEventObj6_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLEventObj6_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLEventObj6_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLEventObj6_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLEventObj6_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLEventObj6_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLEventObj6 methods ***/
#define IHTMLEventObj6_get_actionURL(This,p) (This)->lpVtbl->get_actionURL(This,p)
#define IHTMLEventObj6_get_buttonID(This,p) (This)->lpVtbl->get_buttonID(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLEventObj6_QueryInterface(IHTMLEventObj6* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLEventObj6_AddRef(IHTMLEventObj6* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLEventObj6_Release(IHTMLEventObj6* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLEventObj6_GetTypeInfoCount(IHTMLEventObj6* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLEventObj6_GetTypeInfo(IHTMLEventObj6* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLEventObj6_GetIDsOfNames(IHTMLEventObj6* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLEventObj6_Invoke(IHTMLEventObj6* 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);
}
/*** IHTMLEventObj6 methods ***/
static FORCEINLINE HRESULT IHTMLEventObj6_get_actionURL(IHTMLEventObj6* This,BSTR *p) {
    return This->lpVtbl->get_actionURL(This,p);
}
static FORCEINLINE HRESULT IHTMLEventObj6_get_buttonID(IHTMLEventObj6* This,LONG *p) {
    return This->lpVtbl->get_buttonID(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLEventObj6_get_actionURL_Proxy(
    IHTMLEventObj6* This,
    BSTR *p);
void __RPC_STUB IHTMLEventObj6_get_actionURL_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEventObj6_get_buttonID_Proxy(
    IHTMLEventObj6* This,
    LONG *p);
void __RPC_STUB IHTMLEventObj6_get_buttonID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLEventObj6_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispCEventObj dispinterface
 */
#ifndef __DispCEventObj_DISPINTERFACE_DEFINED__
#define __DispCEventObj_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispCEventObj, 0x3050f558, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f558-98b5-11cf-bb82-00aa00bdce0b")
DispCEventObj : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispCEventObj, 0x3050f558, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispCEventObjVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispCEventObj* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispCEventObj* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispCEventObj* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispCEventObj* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispCEventObj* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispCEventObj* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispCEventObj* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispCEventObjVtbl;
interface DispCEventObj {
    CONST_VTBL DispCEventObjVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispCEventObj_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispCEventObj_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispCEventObj_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispCEventObj_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispCEventObj_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispCEventObj_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispCEventObj_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 DispCEventObj_QueryInterface(DispCEventObj* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispCEventObj_AddRef(DispCEventObj* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispCEventObj_Release(DispCEventObj* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispCEventObj_GetTypeInfoCount(DispCEventObj* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispCEventObj_GetTypeInfo(DispCEventObj* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispCEventObj_GetIDsOfNames(DispCEventObj* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispCEventObj_Invoke(DispCEventObj* 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  /* __DispCEventObj_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * CEventObj coclass
 */

DEFINE_GUID(CLSID_CEventObj, 0x3050f48a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f48a-98b5-11cf-bb82-00aa00bdce0b") CEventObj;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(CEventObj, 0x3050f48a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CEventObj;
/*****************************************************************************
 * IHTMLStyleMedia interface
 */
#ifndef __IHTMLStyleMedia_INTERFACE_DEFINED__
#define __IHTMLStyleMedia_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLStyleMedia, 0x3051074b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051074b-98b5-11cf-bb82-00aa00bdce0b")
IHTMLStyleMedia : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE matchMedium(
        BSTR mediaQuery,
        VARIANT_BOOL *matches) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLStyleMedia, 0x3051074b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLStyleMediaVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLStyleMedia* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLStyleMedia* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLStyleMedia* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLStyleMedia* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLStyleMedia* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLStyleMedia* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLStyleMedia* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLStyleMedia methods ***/
    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLStyleMedia* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *matchMedium)(
        IHTMLStyleMedia* This,
        BSTR mediaQuery,
        VARIANT_BOOL *matches);

    END_INTERFACE
} IHTMLStyleMediaVtbl;
interface IHTMLStyleMedia {
    CONST_VTBL IHTMLStyleMediaVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLStyleMedia_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLStyleMedia_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLStyleMedia_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLStyleMedia_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLStyleMedia_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLStyleMedia_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLStyleMedia_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLStyleMedia methods ***/
#define IHTMLStyleMedia_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#define IHTMLStyleMedia_matchMedium(This,mediaQuery,matches) (This)->lpVtbl->matchMedium(This,mediaQuery,matches)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLStyleMedia_QueryInterface(IHTMLStyleMedia* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLStyleMedia_AddRef(IHTMLStyleMedia* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLStyleMedia_Release(IHTMLStyleMedia* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLStyleMedia_GetTypeInfoCount(IHTMLStyleMedia* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLStyleMedia_GetTypeInfo(IHTMLStyleMedia* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLStyleMedia_GetIDsOfNames(IHTMLStyleMedia* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLStyleMedia_Invoke(IHTMLStyleMedia* 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);
}
/*** IHTMLStyleMedia methods ***/
static FORCEINLINE HRESULT IHTMLStyleMedia_get_type(IHTMLStyleMedia* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleMedia_matchMedium(IHTMLStyleMedia* This,BSTR mediaQuery,VARIANT_BOOL *matches) {
    return This->lpVtbl->matchMedium(This,mediaQuery,matches);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLStyleMedia_get_type_Proxy(
    IHTMLStyleMedia* This,
    BSTR *p);
void __RPC_STUB IHTMLStyleMedia_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleMedia_matchMedium_Proxy(
    IHTMLStyleMedia* This,
    BSTR mediaQuery,
    VARIANT_BOOL *matches);
void __RPC_STUB IHTMLStyleMedia_matchMedium_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLStyleMedia_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLStyleMedia dispinterface
 */
#ifndef __DispHTMLStyleMedia_DISPINTERFACE_DEFINED__
#define __DispHTMLStyleMedia_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLStyleMedia, 0x3059009e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059009e-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLStyleMedia : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLStyleMedia, 0x3059009e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLStyleMediaVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLStyleMedia* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLStyleMedia* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLStyleMedia* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLStyleMedia* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLStyleMedia* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLStyleMedia* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLStyleMedia* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLStyleMediaVtbl;
interface DispHTMLStyleMedia {
    CONST_VTBL DispHTMLStyleMediaVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLStyleMedia_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLStyleMedia_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLStyleMedia_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLStyleMedia_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLStyleMedia_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLStyleMedia_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLStyleMedia_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 DispHTMLStyleMedia_QueryInterface(DispHTMLStyleMedia* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLStyleMedia_AddRef(DispHTMLStyleMedia* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLStyleMedia_Release(DispHTMLStyleMedia* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLStyleMedia_GetTypeInfoCount(DispHTMLStyleMedia* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLStyleMedia_GetTypeInfo(DispHTMLStyleMedia* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLStyleMedia_GetIDsOfNames(DispHTMLStyleMedia* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLStyleMedia_Invoke(DispHTMLStyleMedia* 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  /* __DispHTMLStyleMedia_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLStyleMedia coclass
 */

DEFINE_GUID(CLSID_HTMLStyleMedia, 0x3051074c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3051074c-98b5-11cf-bb82-00aa00bdce0b") HTMLStyleMedia;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLStyleMedia, 0x3051074c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CStyleMedia;
/*****************************************************************************
 * HTMLWindowEvents3 dispinterface
 */
#ifndef __HTMLWindowEvents3_DISPINTERFACE_DEFINED__
#define __HTMLWindowEvents3_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLWindowEvents3, 0x3050f5a1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f5a1-98b5-11cf-bb82-00aa00bdce0b")
HTMLWindowEvents3 : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLWindowEvents3, 0x3050f5a1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLWindowEvents3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLWindowEvents3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLWindowEvents3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLWindowEvents3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLWindowEvents3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLWindowEvents3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLWindowEvents3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLWindowEvents3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLWindowEvents3Vtbl;
interface HTMLWindowEvents3 {
    CONST_VTBL HTMLWindowEvents3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLWindowEvents3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLWindowEvents3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLWindowEvents3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLWindowEvents3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLWindowEvents3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLWindowEvents3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLWindowEvents3_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 HTMLWindowEvents3_QueryInterface(HTMLWindowEvents3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLWindowEvents3_AddRef(HTMLWindowEvents3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLWindowEvents3_Release(HTMLWindowEvents3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLWindowEvents3_GetTypeInfoCount(HTMLWindowEvents3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLWindowEvents3_GetTypeInfo(HTMLWindowEvents3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLWindowEvents3_GetIDsOfNames(HTMLWindowEvents3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLWindowEvents3_Invoke(HTMLWindowEvents3* 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  /* __HTMLWindowEvents3_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLWindowEvents2 dispinterface
 */
#ifndef __HTMLWindowEvents2_DISPINTERFACE_DEFINED__
#define __HTMLWindowEvents2_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLWindowEvents2, 0x3050f625, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f625-98b5-11cf-bb82-00aa00bdce0b")
HTMLWindowEvents2 : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLWindowEvents2, 0x3050f625, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLWindowEvents2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLWindowEvents2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLWindowEvents2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLWindowEvents2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLWindowEvents2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLWindowEvents2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLWindowEvents2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLWindowEvents2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLWindowEvents2Vtbl;
interface HTMLWindowEvents2 {
    CONST_VTBL HTMLWindowEvents2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLWindowEvents2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLWindowEvents2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLWindowEvents2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLWindowEvents2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLWindowEvents2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLWindowEvents2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLWindowEvents2_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 HTMLWindowEvents2_QueryInterface(HTMLWindowEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLWindowEvents2_AddRef(HTMLWindowEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLWindowEvents2_Release(HTMLWindowEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLWindowEvents2_GetTypeInfoCount(HTMLWindowEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLWindowEvents2_GetTypeInfo(HTMLWindowEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLWindowEvents2_GetIDsOfNames(HTMLWindowEvents2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLWindowEvents2_Invoke(HTMLWindowEvents2* 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  /* __HTMLWindowEvents2_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLWindowEvents dispinterface
 */
#ifndef __HTMLWindowEvents_DISPINTERFACE_DEFINED__
#define __HTMLWindowEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLWindowEvents, 0x96a0a4e0, 0xd062, 0x11cf, 0x94,0xb6, 0x00,0xaa,0x00,0x60,0x27,0x5c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96a0a4e0-d062-11cf-94b6-00aa0060275c")
HTMLWindowEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLWindowEvents, 0x96a0a4e0, 0xd062, 0x11cf, 0x94,0xb6, 0x00,0xaa,0x00,0x60,0x27,0x5c)
#endif
#else
typedef struct HTMLWindowEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLWindowEvents* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLWindowEvents* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLWindowEvents* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLWindowEvents* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLWindowEvents* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLWindowEvents* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLWindowEvents* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLWindowEventsVtbl;
interface HTMLWindowEvents {
    CONST_VTBL HTMLWindowEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLWindowEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLWindowEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLWindowEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLWindowEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLWindowEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLWindowEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLWindowEvents_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 HTMLWindowEvents_QueryInterface(HTMLWindowEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLWindowEvents_AddRef(HTMLWindowEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLWindowEvents_Release(HTMLWindowEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLWindowEvents_GetTypeInfoCount(HTMLWindowEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLWindowEvents_GetTypeInfo(HTMLWindowEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLWindowEvents_GetIDsOfNames(HTMLWindowEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLWindowEvents_Invoke(HTMLWindowEvents* 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  /* __HTMLWindowEvents_DISPINTERFACE_DEFINED__ */

#ifndef __IHTMLDocument_FWD_DEFINED__
#define __IHTMLDocument_FWD_DEFINED__
typedef interface IHTMLDocument IHTMLDocument;
#endif

#ifndef __IHTMLDocument2_FWD_DEFINED__
#define __IHTMLDocument2_FWD_DEFINED__
typedef interface IHTMLDocument2 IHTMLDocument2;
#endif

#ifndef __IHTMLFramesCollection2_FWD_DEFINED__
#define __IHTMLFramesCollection2_FWD_DEFINED__
typedef interface IHTMLFramesCollection2 IHTMLFramesCollection2;
#endif

#ifndef __IHTMLWindow2_FWD_DEFINED__
#define __IHTMLWindow2_FWD_DEFINED__
typedef interface IHTMLWindow2 IHTMLWindow2;
#endif

#ifndef __IHTMLWindow3_FWD_DEFINED__
#define __IHTMLWindow3_FWD_DEFINED__
typedef interface IHTMLWindow3 IHTMLWindow3;
#endif

#ifndef __IHTMLFrameBase_FWD_DEFINED__
#define __IHTMLFrameBase_FWD_DEFINED__
typedef interface IHTMLFrameBase IHTMLFrameBase;
#endif

#ifndef __IHTMLStorage_FWD_DEFINED__
#define __IHTMLStorage_FWD_DEFINED__
typedef interface IHTMLStorage IHTMLStorage;
#endif

#ifndef __IHTMLPerformance_FWD_DEFINED__
#define __IHTMLPerformance_FWD_DEFINED__
typedef interface IHTMLPerformance IHTMLPerformance;
#endif

#ifndef __IHTMLCSSStyleDeclaration_FWD_DEFINED__
#define __IHTMLCSSStyleDeclaration_FWD_DEFINED__
typedef interface IHTMLCSSStyleDeclaration IHTMLCSSStyleDeclaration;
#endif

#ifndef __IHTMLApplicationCache_FWD_DEFINED__
#define __IHTMLApplicationCache_FWD_DEFINED__
typedef interface IHTMLApplicationCache IHTMLApplicationCache;
#endif

/*****************************************************************************
 * IHTMLFramesCollection2 interface
 */
#ifndef __IHTMLFramesCollection2_INTERFACE_DEFINED__
#define __IHTMLFramesCollection2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLFramesCollection2, 0x332c4426, 0x26cb, 0x11d0, 0xb4,0x83, 0x00,0xc0,0x4f,0xd9,0x01,0x19);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("332c4426-26cb-11d0-b483-00c04fd90119")
IHTMLFramesCollection2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE item(
        VARIANT *pvarIndex,
        VARIANT *pvarResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLFramesCollection2, 0x332c4426, 0x26cb, 0x11d0, 0xb4,0x83, 0x00,0xc0,0x4f,0xd9,0x01,0x19)
#endif
#else
typedef struct IHTMLFramesCollection2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLFramesCollection2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLFramesCollection2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLFramesCollection2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLFramesCollection2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLFramesCollection2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLFramesCollection2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLFramesCollection2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLFramesCollection2 methods ***/
    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLFramesCollection2* This,
        VARIANT *pvarIndex,
        VARIANT *pvarResult);

    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLFramesCollection2* This,
        LONG *p);

    END_INTERFACE
} IHTMLFramesCollection2Vtbl;
interface IHTMLFramesCollection2 {
    CONST_VTBL IHTMLFramesCollection2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLFramesCollection2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLFramesCollection2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLFramesCollection2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLFramesCollection2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLFramesCollection2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLFramesCollection2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLFramesCollection2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLFramesCollection2 methods ***/
#define IHTMLFramesCollection2_item(This,pvarIndex,pvarResult) (This)->lpVtbl->item(This,pvarIndex,pvarResult)
#define IHTMLFramesCollection2_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLFramesCollection2_QueryInterface(IHTMLFramesCollection2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLFramesCollection2_AddRef(IHTMLFramesCollection2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLFramesCollection2_Release(IHTMLFramesCollection2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLFramesCollection2_GetTypeInfoCount(IHTMLFramesCollection2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLFramesCollection2_GetTypeInfo(IHTMLFramesCollection2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLFramesCollection2_GetIDsOfNames(IHTMLFramesCollection2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLFramesCollection2_Invoke(IHTMLFramesCollection2* 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);
}
/*** IHTMLFramesCollection2 methods ***/
static FORCEINLINE HRESULT IHTMLFramesCollection2_item(IHTMLFramesCollection2* This,VARIANT *pvarIndex,VARIANT *pvarResult) {
    return This->lpVtbl->item(This,pvarIndex,pvarResult);
}
static FORCEINLINE HRESULT IHTMLFramesCollection2_get_length(IHTMLFramesCollection2* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLFramesCollection2_item_Proxy(
    IHTMLFramesCollection2* This,
    VARIANT *pvarIndex,
    VARIANT *pvarResult);
void __RPC_STUB IHTMLFramesCollection2_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFramesCollection2_get_length_Proxy(
    IHTMLFramesCollection2* This,
    LONG *p);
void __RPC_STUB IHTMLFramesCollection2_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLFramesCollection2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLScreen interface
 */
#ifndef __IHTMLScreen_INTERFACE_DEFINED__
#define __IHTMLScreen_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLScreen, 0x3050f35c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f35c-98b5-11cf-bb82-00aa00bdce0b")
IHTMLScreen : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_colorDepth(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_bufferDepth(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_bufferDepth(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_width(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_height(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_updateInterval(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_updateInterval(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_availHeight(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_availWidth(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fontSmoothingEnabled(
        VARIANT_BOOL *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLScreen, 0x3050f35c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLScreenVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLScreen* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLScreen* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLScreen* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLScreen* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLScreen* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLScreen* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLScreen* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLScreen methods ***/
    HRESULT (STDMETHODCALLTYPE *get_colorDepth)(
        IHTMLScreen* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_bufferDepth)(
        IHTMLScreen* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_bufferDepth)(
        IHTMLScreen* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_width)(
        IHTMLScreen* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_height)(
        IHTMLScreen* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_updateInterval)(
        IHTMLScreen* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_updateInterval)(
        IHTMLScreen* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_availHeight)(
        IHTMLScreen* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_availWidth)(
        IHTMLScreen* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_fontSmoothingEnabled)(
        IHTMLScreen* This,
        VARIANT_BOOL *p);

    END_INTERFACE
} IHTMLScreenVtbl;
interface IHTMLScreen {
    CONST_VTBL IHTMLScreenVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLScreen_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLScreen_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLScreen_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLScreen_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLScreen_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLScreen_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLScreen_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLScreen methods ***/
#define IHTMLScreen_get_colorDepth(This,p) (This)->lpVtbl->get_colorDepth(This,p)
#define IHTMLScreen_put_bufferDepth(This,v) (This)->lpVtbl->put_bufferDepth(This,v)
#define IHTMLScreen_get_bufferDepth(This,p) (This)->lpVtbl->get_bufferDepth(This,p)
#define IHTMLScreen_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#define IHTMLScreen_get_height(This,p) (This)->lpVtbl->get_height(This,p)
#define IHTMLScreen_put_updateInterval(This,v) (This)->lpVtbl->put_updateInterval(This,v)
#define IHTMLScreen_get_updateInterval(This,p) (This)->lpVtbl->get_updateInterval(This,p)
#define IHTMLScreen_get_availHeight(This,p) (This)->lpVtbl->get_availHeight(This,p)
#define IHTMLScreen_get_availWidth(This,p) (This)->lpVtbl->get_availWidth(This,p)
#define IHTMLScreen_get_fontSmoothingEnabled(This,p) (This)->lpVtbl->get_fontSmoothingEnabled(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLScreen_QueryInterface(IHTMLScreen* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLScreen_AddRef(IHTMLScreen* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLScreen_Release(IHTMLScreen* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLScreen_GetTypeInfoCount(IHTMLScreen* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLScreen_GetTypeInfo(IHTMLScreen* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLScreen_GetIDsOfNames(IHTMLScreen* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLScreen_Invoke(IHTMLScreen* 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);
}
/*** IHTMLScreen methods ***/
static FORCEINLINE HRESULT IHTMLScreen_get_colorDepth(IHTMLScreen* This,LONG *p) {
    return This->lpVtbl->get_colorDepth(This,p);
}
static FORCEINLINE HRESULT IHTMLScreen_put_bufferDepth(IHTMLScreen* This,LONG v) {
    return This->lpVtbl->put_bufferDepth(This,v);
}
static FORCEINLINE HRESULT IHTMLScreen_get_bufferDepth(IHTMLScreen* This,LONG *p) {
    return This->lpVtbl->get_bufferDepth(This,p);
}
static FORCEINLINE HRESULT IHTMLScreen_get_width(IHTMLScreen* This,LONG *p) {
    return This->lpVtbl->get_width(This,p);
}
static FORCEINLINE HRESULT IHTMLScreen_get_height(IHTMLScreen* This,LONG *p) {
    return This->lpVtbl->get_height(This,p);
}
static FORCEINLINE HRESULT IHTMLScreen_put_updateInterval(IHTMLScreen* This,LONG v) {
    return This->lpVtbl->put_updateInterval(This,v);
}
static FORCEINLINE HRESULT IHTMLScreen_get_updateInterval(IHTMLScreen* This,LONG *p) {
    return This->lpVtbl->get_updateInterval(This,p);
}
static FORCEINLINE HRESULT IHTMLScreen_get_availHeight(IHTMLScreen* This,LONG *p) {
    return This->lpVtbl->get_availHeight(This,p);
}
static FORCEINLINE HRESULT IHTMLScreen_get_availWidth(IHTMLScreen* This,LONG *p) {
    return This->lpVtbl->get_availWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLScreen_get_fontSmoothingEnabled(IHTMLScreen* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_fontSmoothingEnabled(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLScreen_get_colorDepth_Proxy(
    IHTMLScreen* This,
    LONG *p);
void __RPC_STUB IHTMLScreen_get_colorDepth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLScreen_put_bufferDepth_Proxy(
    IHTMLScreen* This,
    LONG v);
void __RPC_STUB IHTMLScreen_put_bufferDepth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLScreen_get_bufferDepth_Proxy(
    IHTMLScreen* This,
    LONG *p);
void __RPC_STUB IHTMLScreen_get_bufferDepth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLScreen_get_width_Proxy(
    IHTMLScreen* This,
    LONG *p);
void __RPC_STUB IHTMLScreen_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLScreen_get_height_Proxy(
    IHTMLScreen* This,
    LONG *p);
void __RPC_STUB IHTMLScreen_get_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLScreen_put_updateInterval_Proxy(
    IHTMLScreen* This,
    LONG v);
void __RPC_STUB IHTMLScreen_put_updateInterval_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLScreen_get_updateInterval_Proxy(
    IHTMLScreen* This,
    LONG *p);
void __RPC_STUB IHTMLScreen_get_updateInterval_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLScreen_get_availHeight_Proxy(
    IHTMLScreen* This,
    LONG *p);
void __RPC_STUB IHTMLScreen_get_availHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLScreen_get_availWidth_Proxy(
    IHTMLScreen* This,
    LONG *p);
void __RPC_STUB IHTMLScreen_get_availWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLScreen_get_fontSmoothingEnabled_Proxy(
    IHTMLScreen* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLScreen_get_fontSmoothingEnabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLScreen_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLScreen2 interface
 */
#ifndef __IHTMLScreen2_INTERFACE_DEFINED__
#define __IHTMLScreen2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLScreen2, 0x3050f84a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f84a-98b5-11cf-bb82-00aa00bdce0b")
IHTMLScreen2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_logicalXDPI(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_logicalYDPI(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_deviceXDPI(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_deviceYDPI(
        LONG *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLScreen2, 0x3050f84a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLScreen2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLScreen2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLScreen2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLScreen2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLScreen2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLScreen2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLScreen2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLScreen2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLScreen2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_logicalXDPI)(
        IHTMLScreen2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_logicalYDPI)(
        IHTMLScreen2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_deviceXDPI)(
        IHTMLScreen2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_deviceYDPI)(
        IHTMLScreen2* This,
        LONG *p);

    END_INTERFACE
} IHTMLScreen2Vtbl;
interface IHTMLScreen2 {
    CONST_VTBL IHTMLScreen2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLScreen2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLScreen2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLScreen2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLScreen2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLScreen2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLScreen2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLScreen2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLScreen2 methods ***/
#define IHTMLScreen2_get_logicalXDPI(This,p) (This)->lpVtbl->get_logicalXDPI(This,p)
#define IHTMLScreen2_get_logicalYDPI(This,p) (This)->lpVtbl->get_logicalYDPI(This,p)
#define IHTMLScreen2_get_deviceXDPI(This,p) (This)->lpVtbl->get_deviceXDPI(This,p)
#define IHTMLScreen2_get_deviceYDPI(This,p) (This)->lpVtbl->get_deviceYDPI(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLScreen2_QueryInterface(IHTMLScreen2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLScreen2_AddRef(IHTMLScreen2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLScreen2_Release(IHTMLScreen2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLScreen2_GetTypeInfoCount(IHTMLScreen2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLScreen2_GetTypeInfo(IHTMLScreen2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLScreen2_GetIDsOfNames(IHTMLScreen2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLScreen2_Invoke(IHTMLScreen2* 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);
}
/*** IHTMLScreen2 methods ***/
static FORCEINLINE HRESULT IHTMLScreen2_get_logicalXDPI(IHTMLScreen2* This,LONG *p) {
    return This->lpVtbl->get_logicalXDPI(This,p);
}
static FORCEINLINE HRESULT IHTMLScreen2_get_logicalYDPI(IHTMLScreen2* This,LONG *p) {
    return This->lpVtbl->get_logicalYDPI(This,p);
}
static FORCEINLINE HRESULT IHTMLScreen2_get_deviceXDPI(IHTMLScreen2* This,LONG *p) {
    return This->lpVtbl->get_deviceXDPI(This,p);
}
static FORCEINLINE HRESULT IHTMLScreen2_get_deviceYDPI(IHTMLScreen2* This,LONG *p) {
    return This->lpVtbl->get_deviceYDPI(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLScreen2_get_logicalXDPI_Proxy(
    IHTMLScreen2* This,
    LONG *p);
void __RPC_STUB IHTMLScreen2_get_logicalXDPI_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLScreen2_get_logicalYDPI_Proxy(
    IHTMLScreen2* This,
    LONG *p);
void __RPC_STUB IHTMLScreen2_get_logicalYDPI_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLScreen2_get_deviceXDPI_Proxy(
    IHTMLScreen2* This,
    LONG *p);
void __RPC_STUB IHTMLScreen2_get_deviceXDPI_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLScreen2_get_deviceYDPI_Proxy(
    IHTMLScreen2* This,
    LONG *p);
void __RPC_STUB IHTMLScreen2_get_deviceYDPI_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLScreen2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLScreen3 interface
 */
#ifndef __IHTMLScreen3_INTERFACE_DEFINED__
#define __IHTMLScreen3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLScreen3, 0x305104a1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104a1-98b5-11cf-bb82-00aa00bdce0b")
IHTMLScreen3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_systemXDPI(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_systemYDPI(
        LONG *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLScreen3, 0x305104a1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLScreen3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLScreen3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLScreen3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLScreen3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLScreen3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLScreen3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLScreen3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLScreen3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLScreen3 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_systemXDPI)(
        IHTMLScreen3* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_systemYDPI)(
        IHTMLScreen3* This,
        LONG *p);

    END_INTERFACE
} IHTMLScreen3Vtbl;
interface IHTMLScreen3 {
    CONST_VTBL IHTMLScreen3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLScreen3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLScreen3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLScreen3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLScreen3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLScreen3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLScreen3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLScreen3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLScreen3 methods ***/
#define IHTMLScreen3_get_systemXDPI(This,p) (This)->lpVtbl->get_systemXDPI(This,p)
#define IHTMLScreen3_get_systemYDPI(This,p) (This)->lpVtbl->get_systemYDPI(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLScreen3_QueryInterface(IHTMLScreen3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLScreen3_AddRef(IHTMLScreen3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLScreen3_Release(IHTMLScreen3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLScreen3_GetTypeInfoCount(IHTMLScreen3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLScreen3_GetTypeInfo(IHTMLScreen3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLScreen3_GetIDsOfNames(IHTMLScreen3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLScreen3_Invoke(IHTMLScreen3* 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);
}
/*** IHTMLScreen3 methods ***/
static FORCEINLINE HRESULT IHTMLScreen3_get_systemXDPI(IHTMLScreen3* This,LONG *p) {
    return This->lpVtbl->get_systemXDPI(This,p);
}
static FORCEINLINE HRESULT IHTMLScreen3_get_systemYDPI(IHTMLScreen3* This,LONG *p) {
    return This->lpVtbl->get_systemYDPI(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLScreen3_get_systemXDPI_Proxy(
    IHTMLScreen3* This,
    LONG *p);
void __RPC_STUB IHTMLScreen3_get_systemXDPI_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLScreen3_get_systemYDPI_Proxy(
    IHTMLScreen3* This,
    LONG *p);
void __RPC_STUB IHTMLScreen3_get_systemYDPI_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLScreen3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLScreen4 interface
 */
#ifndef __IHTMLScreen4_INTERFACE_DEFINED__
#define __IHTMLScreen4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLScreen4, 0x3051076b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051076b-98b5-11cf-bb82-00aa00bdce0b")
IHTMLScreen4 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_pixelDepth(
        LONG *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLScreen4, 0x3051076b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLScreen4Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLScreen4* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLScreen4* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLScreen4* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLScreen4* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLScreen4* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLScreen4* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLScreen4* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLScreen4 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_pixelDepth)(
        IHTMLScreen4* This,
        LONG *p);

    END_INTERFACE
} IHTMLScreen4Vtbl;
interface IHTMLScreen4 {
    CONST_VTBL IHTMLScreen4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLScreen4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLScreen4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLScreen4_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLScreen4_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLScreen4_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLScreen4_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLScreen4_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLScreen4 methods ***/
#define IHTMLScreen4_get_pixelDepth(This,p) (This)->lpVtbl->get_pixelDepth(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLScreen4_QueryInterface(IHTMLScreen4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLScreen4_AddRef(IHTMLScreen4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLScreen4_Release(IHTMLScreen4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLScreen4_GetTypeInfoCount(IHTMLScreen4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLScreen4_GetTypeInfo(IHTMLScreen4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLScreen4_GetIDsOfNames(IHTMLScreen4* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLScreen4_Invoke(IHTMLScreen4* 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);
}
/*** IHTMLScreen4 methods ***/
static FORCEINLINE HRESULT IHTMLScreen4_get_pixelDepth(IHTMLScreen4* This,LONG *p) {
    return This->lpVtbl->get_pixelDepth(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLScreen4_get_pixelDepth_Proxy(
    IHTMLScreen4* This,
    LONG *p);
void __RPC_STUB IHTMLScreen4_get_pixelDepth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLScreen4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLWindow2 interface
 */
#ifndef __IHTMLWindow2_INTERFACE_DEFINED__
#define __IHTMLWindow2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLWindow2, 0x332c4427, 0x26cb, 0x11d0, 0xb4,0x83, 0x00,0xc0,0x4f,0xd9,0x01,0x19);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("332c4427-26cb-11d0-b483-00c04fd90119")
IHTMLWindow2 : public IHTMLFramesCollection2
{
    virtual HRESULT STDMETHODCALLTYPE get_frames(
        IHTMLFramesCollection2 **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_defaultStatus(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_defaultStatus(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_status(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_status(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE setTimeout(
        BSTR expression,
        LONG msec,
        VARIANT *language,
        LONG *timerID) = 0;

    virtual HRESULT STDMETHODCALLTYPE clearTimeout(
        LONG timerID) = 0;

    virtual HRESULT STDMETHODCALLTYPE alert(
        BSTR message = L"") = 0;

    virtual HRESULT STDMETHODCALLTYPE confirm(
        BSTR message = L"",
        VARIANT_BOOL *confirmed = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE prompt(
        BSTR message = L"",
        BSTR defstr = L"undefined",
        VARIANT *textdata = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Image(
        IHTMLImageElementFactory **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_location(
        IHTMLLocation **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_history(
        IOmHistory **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE close(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_opener(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_opener(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_navigator(
        IOmNavigator **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_name(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_parent(
        IHTMLWindow2 **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE open(
        BSTR url = L"",
        BSTR name = L"",
        BSTR features = L"",
        VARIANT_BOOL replace = 0,
        IHTMLWindow2 **pomWindowResult = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_self(
        IHTMLWindow2 **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_top(
        IHTMLWindow2 **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_window(
        IHTMLWindow2 **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE navigate(
        BSTR url) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onfocus(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onfocus(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onblur(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onblur(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onload(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onload(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onbeforeunload(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onbeforeunload(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onunload(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onunload(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onhelp(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onhelp(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onerror(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onerror(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onresize(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onresize(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onscroll(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onscroll(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_document(
        IHTMLDocument2 **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_event(
        IHTMLEventObj **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__newEnum(
        IUnknown **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE showModalDialog(
        BSTR dialog,
        VARIANT *varArgIn,
        VARIANT *varOptions,
        VARIANT *varArgOut) = 0;

    virtual HRESULT STDMETHODCALLTYPE showHelp(
        BSTR helpURL,
        VARIANT helpArg,
        BSTR features = L"") = 0;

    virtual HRESULT STDMETHODCALLTYPE get_screen(
        IHTMLScreen **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Option(
        IHTMLOptionElementFactory **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE focus(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_closed(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE blur(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE scroll(
        LONG x,
        LONG y) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clientInformation(
        IOmNavigator **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE setInterval(
        BSTR expression,
        LONG msec,
        VARIANT *language,
        LONG *timerID) = 0;

    virtual HRESULT STDMETHODCALLTYPE clearInterval(
        LONG timerID) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_offscreenBuffering(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_offscreenBuffering(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE execScript(
        BSTR code,
        BSTR language = L"JScript",
        VARIANT *pvarRet = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE toString(
        BSTR *String) = 0;

    virtual HRESULT STDMETHODCALLTYPE scrollBy(
        LONG x,
        LONG y) = 0;

    virtual HRESULT STDMETHODCALLTYPE scrollTo(
        LONG x,
        LONG y) = 0;

    virtual HRESULT STDMETHODCALLTYPE moveTo(
        LONG x,
        LONG y) = 0;

    virtual HRESULT STDMETHODCALLTYPE moveBy(
        LONG x,
        LONG y) = 0;

    virtual HRESULT STDMETHODCALLTYPE resizeTo(
        LONG x,
        LONG y) = 0;

    virtual HRESULT STDMETHODCALLTYPE resizeBy(
        LONG x,
        LONG y) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_external(
        IDispatch **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLWindow2, 0x332c4427, 0x26cb, 0x11d0, 0xb4,0x83, 0x00,0xc0,0x4f,0xd9,0x01,0x19)
#endif
#else
typedef struct IHTMLWindow2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLWindow2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLWindow2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLWindow2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLWindow2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLWindow2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLWindow2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLWindow2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLFramesCollection2 methods ***/
    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLWindow2* This,
        VARIANT *pvarIndex,
        VARIANT *pvarResult);

    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLWindow2* This,
        LONG *p);

    /*** IHTMLWindow2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_frames)(
        IHTMLWindow2* This,
        IHTMLFramesCollection2 **p);

    HRESULT (STDMETHODCALLTYPE *put_defaultStatus)(
        IHTMLWindow2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_defaultStatus)(
        IHTMLWindow2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_status)(
        IHTMLWindow2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_status)(
        IHTMLWindow2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *setTimeout)(
        IHTMLWindow2* This,
        BSTR expression,
        LONG msec,
        VARIANT *language,
        LONG *timerID);

    HRESULT (STDMETHODCALLTYPE *clearTimeout)(
        IHTMLWindow2* This,
        LONG timerID);

    HRESULT (STDMETHODCALLTYPE *alert)(
        IHTMLWindow2* This,
        BSTR message);

    HRESULT (STDMETHODCALLTYPE *confirm)(
        IHTMLWindow2* This,
        BSTR message,
        VARIANT_BOOL *confirmed);

    HRESULT (STDMETHODCALLTYPE *prompt)(
        IHTMLWindow2* This,
        BSTR message,
        BSTR defstr,
        VARIANT *textdata);

    HRESULT (STDMETHODCALLTYPE *get_Image)(
        IHTMLWindow2* This,
        IHTMLImageElementFactory **p);

    HRESULT (STDMETHODCALLTYPE *get_location)(
        IHTMLWindow2* This,
        IHTMLLocation **p);

    HRESULT (STDMETHODCALLTYPE *get_history)(
        IHTMLWindow2* This,
        IOmHistory **p);

    HRESULT (STDMETHODCALLTYPE *close)(
        IHTMLWindow2* This);

    HRESULT (STDMETHODCALLTYPE *put_opener)(
        IHTMLWindow2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_opener)(
        IHTMLWindow2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_navigator)(
        IHTMLWindow2* This,
        IOmNavigator **p);

    HRESULT (STDMETHODCALLTYPE *put_name)(
        IHTMLWindow2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_name)(
        IHTMLWindow2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_parent)(
        IHTMLWindow2* This,
        IHTMLWindow2 **p);

    HRESULT (STDMETHODCALLTYPE *open)(
        IHTMLWindow2* This,
        BSTR url,
        BSTR name,
        BSTR features,
        VARIANT_BOOL replace,
        IHTMLWindow2 **pomWindowResult);

    HRESULT (STDMETHODCALLTYPE *get_self)(
        IHTMLWindow2* This,
        IHTMLWindow2 **p);

    HRESULT (STDMETHODCALLTYPE *get_top)(
        IHTMLWindow2* This,
        IHTMLWindow2 **p);

    HRESULT (STDMETHODCALLTYPE *get_window)(
        IHTMLWindow2* This,
        IHTMLWindow2 **p);

    HRESULT (STDMETHODCALLTYPE *navigate)(
        IHTMLWindow2* This,
        BSTR url);

    HRESULT (STDMETHODCALLTYPE *put_onfocus)(
        IHTMLWindow2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onfocus)(
        IHTMLWindow2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onblur)(
        IHTMLWindow2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onblur)(
        IHTMLWindow2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onload)(
        IHTMLWindow2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onload)(
        IHTMLWindow2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onbeforeunload)(
        IHTMLWindow2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onbeforeunload)(
        IHTMLWindow2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onunload)(
        IHTMLWindow2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onunload)(
        IHTMLWindow2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onhelp)(
        IHTMLWindow2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onhelp)(
        IHTMLWindow2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onerror)(
        IHTMLWindow2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onerror)(
        IHTMLWindow2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onresize)(
        IHTMLWindow2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onresize)(
        IHTMLWindow2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onscroll)(
        IHTMLWindow2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onscroll)(
        IHTMLWindow2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_document)(
        IHTMLWindow2* This,
        IHTMLDocument2 **p);

    HRESULT (STDMETHODCALLTYPE *get_event)(
        IHTMLWindow2* This,
        IHTMLEventObj **p);

    HRESULT (STDMETHODCALLTYPE *get__newEnum)(
        IHTMLWindow2* This,
        IUnknown **p);

    HRESULT (STDMETHODCALLTYPE *showModalDialog)(
        IHTMLWindow2* This,
        BSTR dialog,
        VARIANT *varArgIn,
        VARIANT *varOptions,
        VARIANT *varArgOut);

    HRESULT (STDMETHODCALLTYPE *showHelp)(
        IHTMLWindow2* This,
        BSTR helpURL,
        VARIANT helpArg,
        BSTR features);

    HRESULT (STDMETHODCALLTYPE *get_screen)(
        IHTMLWindow2* This,
        IHTMLScreen **p);

    HRESULT (STDMETHODCALLTYPE *get_Option)(
        IHTMLWindow2* This,
        IHTMLOptionElementFactory **p);

    HRESULT (STDMETHODCALLTYPE *focus)(
        IHTMLWindow2* This);

    HRESULT (STDMETHODCALLTYPE *get_closed)(
        IHTMLWindow2* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *blur)(
        IHTMLWindow2* This);

    HRESULT (STDMETHODCALLTYPE *scroll)(
        IHTMLWindow2* This,
        LONG x,
        LONG y);

    HRESULT (STDMETHODCALLTYPE *get_clientInformation)(
        IHTMLWindow2* This,
        IOmNavigator **p);

    HRESULT (STDMETHODCALLTYPE *setInterval)(
        IHTMLWindow2* This,
        BSTR expression,
        LONG msec,
        VARIANT *language,
        LONG *timerID);

    HRESULT (STDMETHODCALLTYPE *clearInterval)(
        IHTMLWindow2* This,
        LONG timerID);

    HRESULT (STDMETHODCALLTYPE *put_offscreenBuffering)(
        IHTMLWindow2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_offscreenBuffering)(
        IHTMLWindow2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *execScript)(
        IHTMLWindow2* This,
        BSTR code,
        BSTR language,
        VARIANT *pvarRet);

    HRESULT (STDMETHODCALLTYPE *toString)(
        IHTMLWindow2* This,
        BSTR *String);

    HRESULT (STDMETHODCALLTYPE *scrollBy)(
        IHTMLWindow2* This,
        LONG x,
        LONG y);

    HRESULT (STDMETHODCALLTYPE *scrollTo)(
        IHTMLWindow2* This,
        LONG x,
        LONG y);

    HRESULT (STDMETHODCALLTYPE *moveTo)(
        IHTMLWindow2* This,
        LONG x,
        LONG y);

    HRESULT (STDMETHODCALLTYPE *moveBy)(
        IHTMLWindow2* This,
        LONG x,
        LONG y);

    HRESULT (STDMETHODCALLTYPE *resizeTo)(
        IHTMLWindow2* This,
        LONG x,
        LONG y);

    HRESULT (STDMETHODCALLTYPE *resizeBy)(
        IHTMLWindow2* This,
        LONG x,
        LONG y);

    HRESULT (STDMETHODCALLTYPE *get_external)(
        IHTMLWindow2* This,
        IDispatch **p);

    END_INTERFACE
} IHTMLWindow2Vtbl;
interface IHTMLWindow2 {
    CONST_VTBL IHTMLWindow2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLWindow2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLWindow2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLWindow2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLWindow2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLWindow2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLWindow2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLWindow2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLFramesCollection2 methods ***/
#define IHTMLWindow2_item(This,pvarIndex,pvarResult) (This)->lpVtbl->item(This,pvarIndex,pvarResult)
#define IHTMLWindow2_get_length(This,p) (This)->lpVtbl->get_length(This,p)
/*** IHTMLWindow2 methods ***/
#define IHTMLWindow2_get_frames(This,p) (This)->lpVtbl->get_frames(This,p)
#define IHTMLWindow2_put_defaultStatus(This,v) (This)->lpVtbl->put_defaultStatus(This,v)
#define IHTMLWindow2_get_defaultStatus(This,p) (This)->lpVtbl->get_defaultStatus(This,p)
#define IHTMLWindow2_put_status(This,v) (This)->lpVtbl->put_status(This,v)
#define IHTMLWindow2_get_status(This,p) (This)->lpVtbl->get_status(This,p)
#define IHTMLWindow2_setTimeout(This,expression,msec,language,timerID) (This)->lpVtbl->setTimeout(This,expression,msec,language,timerID)
#define IHTMLWindow2_clearTimeout(This,timerID) (This)->lpVtbl->clearTimeout(This,timerID)
#define IHTMLWindow2_alert(This,message) (This)->lpVtbl->alert(This,message)
#define IHTMLWindow2_confirm(This,message,confirmed) (This)->lpVtbl->confirm(This,message,confirmed)
#define IHTMLWindow2_prompt(This,message,defstr,textdata) (This)->lpVtbl->prompt(This,message,defstr,textdata)
#define IHTMLWindow2_get_Image(This,p) (This)->lpVtbl->get_Image(This,p)
#define IHTMLWindow2_get_location(This,p) (This)->lpVtbl->get_location(This,p)
#define IHTMLWindow2_get_history(This,p) (This)->lpVtbl->get_history(This,p)
#define IHTMLWindow2_close(This) (This)->lpVtbl->close(This)
#define IHTMLWindow2_put_opener(This,v) (This)->lpVtbl->put_opener(This,v)
#define IHTMLWindow2_get_opener(This,p) (This)->lpVtbl->get_opener(This,p)
#define IHTMLWindow2_get_navigator(This,p) (This)->lpVtbl->get_navigator(This,p)
#define IHTMLWindow2_put_name(This,v) (This)->lpVtbl->put_name(This,v)
#define IHTMLWindow2_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#define IHTMLWindow2_get_parent(This,p) (This)->lpVtbl->get_parent(This,p)
#define IHTMLWindow2_open(This,url,name,features,replace,pomWindowResult) (This)->lpVtbl->open(This,url,name,features,replace,pomWindowResult)
#define IHTMLWindow2_get_self(This,p) (This)->lpVtbl->get_self(This,p)
#define IHTMLWindow2_get_top(This,p) (This)->lpVtbl->get_top(This,p)
#define IHTMLWindow2_get_window(This,p) (This)->lpVtbl->get_window(This,p)
#define IHTMLWindow2_navigate(This,url) (This)->lpVtbl->navigate(This,url)
#define IHTMLWindow2_put_onfocus(This,v) (This)->lpVtbl->put_onfocus(This,v)
#define IHTMLWindow2_get_onfocus(This,p) (This)->lpVtbl->get_onfocus(This,p)
#define IHTMLWindow2_put_onblur(This,v) (This)->lpVtbl->put_onblur(This,v)
#define IHTMLWindow2_get_onblur(This,p) (This)->lpVtbl->get_onblur(This,p)
#define IHTMLWindow2_put_onload(This,v) (This)->lpVtbl->put_onload(This,v)
#define IHTMLWindow2_get_onload(This,p) (This)->lpVtbl->get_onload(This,p)
#define IHTMLWindow2_put_onbeforeunload(This,v) (This)->lpVtbl->put_onbeforeunload(This,v)
#define IHTMLWindow2_get_onbeforeunload(This,p) (This)->lpVtbl->get_onbeforeunload(This,p)
#define IHTMLWindow2_put_onunload(This,v) (This)->lpVtbl->put_onunload(This,v)
#define IHTMLWindow2_get_onunload(This,p) (This)->lpVtbl->get_onunload(This,p)
#define IHTMLWindow2_put_onhelp(This,v) (This)->lpVtbl->put_onhelp(This,v)
#define IHTMLWindow2_get_onhelp(This,p) (This)->lpVtbl->get_onhelp(This,p)
#define IHTMLWindow2_put_onerror(This,v) (This)->lpVtbl->put_onerror(This,v)
#define IHTMLWindow2_get_onerror(This,p) (This)->lpVtbl->get_onerror(This,p)
#define IHTMLWindow2_put_onresize(This,v) (This)->lpVtbl->put_onresize(This,v)
#define IHTMLWindow2_get_onresize(This,p) (This)->lpVtbl->get_onresize(This,p)
#define IHTMLWindow2_put_onscroll(This,v) (This)->lpVtbl->put_onscroll(This,v)
#define IHTMLWindow2_get_onscroll(This,p) (This)->lpVtbl->get_onscroll(This,p)
#define IHTMLWindow2_get_document(This,p) (This)->lpVtbl->get_document(This,p)
#define IHTMLWindow2_get_event(This,p) (This)->lpVtbl->get_event(This,p)
#define IHTMLWindow2_get__newEnum(This,p) (This)->lpVtbl->get__newEnum(This,p)
#define IHTMLWindow2_showModalDialog(This,dialog,varArgIn,varOptions,varArgOut) (This)->lpVtbl->showModalDialog(This,dialog,varArgIn,varOptions,varArgOut)
#define IHTMLWindow2_showHelp(This,helpURL,helpArg,features) (This)->lpVtbl->showHelp(This,helpURL,helpArg,features)
#define IHTMLWindow2_get_screen(This,p) (This)->lpVtbl->get_screen(This,p)
#define IHTMLWindow2_get_Option(This,p) (This)->lpVtbl->get_Option(This,p)
#define IHTMLWindow2_focus(This) (This)->lpVtbl->focus(This)
#define IHTMLWindow2_get_closed(This,p) (This)->lpVtbl->get_closed(This,p)
#define IHTMLWindow2_blur(This) (This)->lpVtbl->blur(This)
#define IHTMLWindow2_scroll(This,x,y) (This)->lpVtbl->scroll(This,x,y)
#define IHTMLWindow2_get_clientInformation(This,p) (This)->lpVtbl->get_clientInformation(This,p)
#define IHTMLWindow2_setInterval(This,expression,msec,language,timerID) (This)->lpVtbl->setInterval(This,expression,msec,language,timerID)
#define IHTMLWindow2_clearInterval(This,timerID) (This)->lpVtbl->clearInterval(This,timerID)
#define IHTMLWindow2_put_offscreenBuffering(This,v) (This)->lpVtbl->put_offscreenBuffering(This,v)
#define IHTMLWindow2_get_offscreenBuffering(This,p) (This)->lpVtbl->get_offscreenBuffering(This,p)
#define IHTMLWindow2_execScript(This,code,language,pvarRet) (This)->lpVtbl->execScript(This,code,language,pvarRet)
#define IHTMLWindow2_toString(This,String) (This)->lpVtbl->toString(This,String)
#define IHTMLWindow2_scrollBy(This,x,y) (This)->lpVtbl->scrollBy(This,x,y)
#define IHTMLWindow2_scrollTo(This,x,y) (This)->lpVtbl->scrollTo(This,x,y)
#define IHTMLWindow2_moveTo(This,x,y) (This)->lpVtbl->moveTo(This,x,y)
#define IHTMLWindow2_moveBy(This,x,y) (This)->lpVtbl->moveBy(This,x,y)
#define IHTMLWindow2_resizeTo(This,x,y) (This)->lpVtbl->resizeTo(This,x,y)
#define IHTMLWindow2_resizeBy(This,x,y) (This)->lpVtbl->resizeBy(This,x,y)
#define IHTMLWindow2_get_external(This,p) (This)->lpVtbl->get_external(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLWindow2_QueryInterface(IHTMLWindow2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLWindow2_AddRef(IHTMLWindow2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLWindow2_Release(IHTMLWindow2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLWindow2_GetTypeInfoCount(IHTMLWindow2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLWindow2_GetTypeInfo(IHTMLWindow2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLWindow2_GetIDsOfNames(IHTMLWindow2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLWindow2_Invoke(IHTMLWindow2* 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);
}
/*** IHTMLFramesCollection2 methods ***/
static FORCEINLINE HRESULT IHTMLWindow2_item(IHTMLWindow2* This,VARIANT *pvarIndex,VARIANT *pvarResult) {
    return This->lpVtbl->item(This,pvarIndex,pvarResult);
}
static FORCEINLINE HRESULT IHTMLWindow2_get_length(IHTMLWindow2* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
/*** IHTMLWindow2 methods ***/
static FORCEINLINE HRESULT IHTMLWindow2_get_frames(IHTMLWindow2* This,IHTMLFramesCollection2 **p) {
    return This->lpVtbl->get_frames(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow2_put_defaultStatus(IHTMLWindow2* This,BSTR v) {
    return This->lpVtbl->put_defaultStatus(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow2_get_defaultStatus(IHTMLWindow2* This,BSTR *p) {
    return This->lpVtbl->get_defaultStatus(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow2_put_status(IHTMLWindow2* This,BSTR v) {
    return This->lpVtbl->put_status(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow2_get_status(IHTMLWindow2* This,BSTR *p) {
    return This->lpVtbl->get_status(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow2_setTimeout(IHTMLWindow2* This,BSTR expression,LONG msec,VARIANT *language,LONG *timerID) {
    return This->lpVtbl->setTimeout(This,expression,msec,language,timerID);
}
static FORCEINLINE HRESULT IHTMLWindow2_clearTimeout(IHTMLWindow2* This,LONG timerID) {
    return This->lpVtbl->clearTimeout(This,timerID);
}
static FORCEINLINE HRESULT IHTMLWindow2_alert(IHTMLWindow2* This,BSTR message) {
    return This->lpVtbl->alert(This,message);
}
static FORCEINLINE HRESULT IHTMLWindow2_confirm(IHTMLWindow2* This,BSTR message,VARIANT_BOOL *confirmed) {
    return This->lpVtbl->confirm(This,message,confirmed);
}
static FORCEINLINE HRESULT IHTMLWindow2_prompt(IHTMLWindow2* This,BSTR message,BSTR defstr,VARIANT *textdata) {
    return This->lpVtbl->prompt(This,message,defstr,textdata);
}
static FORCEINLINE HRESULT IHTMLWindow2_get_Image(IHTMLWindow2* This,IHTMLImageElementFactory **p) {
    return This->lpVtbl->get_Image(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow2_get_location(IHTMLWindow2* This,IHTMLLocation **p) {
    return This->lpVtbl->get_location(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow2_get_history(IHTMLWindow2* This,IOmHistory **p) {
    return This->lpVtbl->get_history(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow2_close(IHTMLWindow2* This) {
    return This->lpVtbl->close(This);
}
static FORCEINLINE HRESULT IHTMLWindow2_put_opener(IHTMLWindow2* This,VARIANT v) {
    return This->lpVtbl->put_opener(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow2_get_opener(IHTMLWindow2* This,VARIANT *p) {
    return This->lpVtbl->get_opener(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow2_get_navigator(IHTMLWindow2* This,IOmNavigator **p) {
    return This->lpVtbl->get_navigator(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow2_put_name(IHTMLWindow2* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow2_get_name(IHTMLWindow2* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow2_get_parent(IHTMLWindow2* This,IHTMLWindow2 **p) {
    return This->lpVtbl->get_parent(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow2_open(IHTMLWindow2* This,BSTR url,BSTR name,BSTR features,VARIANT_BOOL replace,IHTMLWindow2 **pomWindowResult) {
    return This->lpVtbl->open(This,url,name,features,replace,pomWindowResult);
}
static FORCEINLINE HRESULT IHTMLWindow2_get_self(IHTMLWindow2* This,IHTMLWindow2 **p) {
    return This->lpVtbl->get_self(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow2_get_top(IHTMLWindow2* This,IHTMLWindow2 **p) {
    return This->lpVtbl->get_top(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow2_get_window(IHTMLWindow2* This,IHTMLWindow2 **p) {
    return This->lpVtbl->get_window(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow2_navigate(IHTMLWindow2* This,BSTR url) {
    return This->lpVtbl->navigate(This,url);
}
static FORCEINLINE HRESULT IHTMLWindow2_put_onfocus(IHTMLWindow2* This,VARIANT v) {
    return This->lpVtbl->put_onfocus(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow2_get_onfocus(IHTMLWindow2* This,VARIANT *p) {
    return This->lpVtbl->get_onfocus(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow2_put_onblur(IHTMLWindow2* This,VARIANT v) {
    return This->lpVtbl->put_onblur(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow2_get_onblur(IHTMLWindow2* This,VARIANT *p) {
    return This->lpVtbl->get_onblur(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow2_put_onload(IHTMLWindow2* This,VARIANT v) {
    return This->lpVtbl->put_onload(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow2_get_onload(IHTMLWindow2* This,VARIANT *p) {
    return This->lpVtbl->get_onload(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow2_put_onbeforeunload(IHTMLWindow2* This,VARIANT v) {
    return This->lpVtbl->put_onbeforeunload(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow2_get_onbeforeunload(IHTMLWindow2* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforeunload(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow2_put_onunload(IHTMLWindow2* This,VARIANT v) {
    return This->lpVtbl->put_onunload(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow2_get_onunload(IHTMLWindow2* This,VARIANT *p) {
    return This->lpVtbl->get_onunload(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow2_put_onhelp(IHTMLWindow2* This,VARIANT v) {
    return This->lpVtbl->put_onhelp(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow2_get_onhelp(IHTMLWindow2* This,VARIANT *p) {
    return This->lpVtbl->get_onhelp(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow2_put_onerror(IHTMLWindow2* This,VARIANT v) {
    return This->lpVtbl->put_onerror(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow2_get_onerror(IHTMLWindow2* This,VARIANT *p) {
    return This->lpVtbl->get_onerror(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow2_put_onresize(IHTMLWindow2* This,VARIANT v) {
    return This->lpVtbl->put_onresize(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow2_get_onresize(IHTMLWindow2* This,VARIANT *p) {
    return This->lpVtbl->get_onresize(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow2_put_onscroll(IHTMLWindow2* This,VARIANT v) {
    return This->lpVtbl->put_onscroll(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow2_get_onscroll(IHTMLWindow2* This,VARIANT *p) {
    return This->lpVtbl->get_onscroll(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow2_get_document(IHTMLWindow2* This,IHTMLDocument2 **p) {
    return This->lpVtbl->get_document(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow2_get_event(IHTMLWindow2* This,IHTMLEventObj **p) {
    return This->lpVtbl->get_event(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow2_get__newEnum(IHTMLWindow2* This,IUnknown **p) {
    return This->lpVtbl->get__newEnum(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow2_showModalDialog(IHTMLWindow2* This,BSTR dialog,VARIANT *varArgIn,VARIANT *varOptions,VARIANT *varArgOut) {
    return This->lpVtbl->showModalDialog(This,dialog,varArgIn,varOptions,varArgOut);
}
static FORCEINLINE HRESULT IHTMLWindow2_showHelp(IHTMLWindow2* This,BSTR helpURL,VARIANT helpArg,BSTR features) {
    return This->lpVtbl->showHelp(This,helpURL,helpArg,features);
}
static FORCEINLINE HRESULT IHTMLWindow2_get_screen(IHTMLWindow2* This,IHTMLScreen **p) {
    return This->lpVtbl->get_screen(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow2_get_Option(IHTMLWindow2* This,IHTMLOptionElementFactory **p) {
    return This->lpVtbl->get_Option(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow2_focus(IHTMLWindow2* This) {
    return This->lpVtbl->focus(This);
}
static FORCEINLINE HRESULT IHTMLWindow2_get_closed(IHTMLWindow2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_closed(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow2_blur(IHTMLWindow2* This) {
    return This->lpVtbl->blur(This);
}
static FORCEINLINE HRESULT IHTMLWindow2_scroll(IHTMLWindow2* This,LONG x,LONG y) {
    return This->lpVtbl->scroll(This,x,y);
}
static FORCEINLINE HRESULT IHTMLWindow2_get_clientInformation(IHTMLWindow2* This,IOmNavigator **p) {
    return This->lpVtbl->get_clientInformation(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow2_setInterval(IHTMLWindow2* This,BSTR expression,LONG msec,VARIANT *language,LONG *timerID) {
    return This->lpVtbl->setInterval(This,expression,msec,language,timerID);
}
static FORCEINLINE HRESULT IHTMLWindow2_clearInterval(IHTMLWindow2* This,LONG timerID) {
    return This->lpVtbl->clearInterval(This,timerID);
}
static FORCEINLINE HRESULT IHTMLWindow2_put_offscreenBuffering(IHTMLWindow2* This,VARIANT v) {
    return This->lpVtbl->put_offscreenBuffering(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow2_get_offscreenBuffering(IHTMLWindow2* This,VARIANT *p) {
    return This->lpVtbl->get_offscreenBuffering(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow2_execScript(IHTMLWindow2* This,BSTR code,BSTR language,VARIANT *pvarRet) {
    return This->lpVtbl->execScript(This,code,language,pvarRet);
}
static FORCEINLINE HRESULT IHTMLWindow2_toString(IHTMLWindow2* This,BSTR *String) {
    return This->lpVtbl->toString(This,String);
}
static FORCEINLINE HRESULT IHTMLWindow2_scrollBy(IHTMLWindow2* This,LONG x,LONG y) {
    return This->lpVtbl->scrollBy(This,x,y);
}
static FORCEINLINE HRESULT IHTMLWindow2_scrollTo(IHTMLWindow2* This,LONG x,LONG y) {
    return This->lpVtbl->scrollTo(This,x,y);
}
static FORCEINLINE HRESULT IHTMLWindow2_moveTo(IHTMLWindow2* This,LONG x,LONG y) {
    return This->lpVtbl->moveTo(This,x,y);
}
static FORCEINLINE HRESULT IHTMLWindow2_moveBy(IHTMLWindow2* This,LONG x,LONG y) {
    return This->lpVtbl->moveBy(This,x,y);
}
static FORCEINLINE HRESULT IHTMLWindow2_resizeTo(IHTMLWindow2* This,LONG x,LONG y) {
    return This->lpVtbl->resizeTo(This,x,y);
}
static FORCEINLINE HRESULT IHTMLWindow2_resizeBy(IHTMLWindow2* This,LONG x,LONG y) {
    return This->lpVtbl->resizeBy(This,x,y);
}
static FORCEINLINE HRESULT IHTMLWindow2_get_external(IHTMLWindow2* This,IDispatch **p) {
    return This->lpVtbl->get_external(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLWindow2_get_frames_Proxy(
    IHTMLWindow2* This,
    IHTMLFramesCollection2 **p);
void __RPC_STUB IHTMLWindow2_get_frames_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_put_defaultStatus_Proxy(
    IHTMLWindow2* This,
    BSTR v);
void __RPC_STUB IHTMLWindow2_put_defaultStatus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_get_defaultStatus_Proxy(
    IHTMLWindow2* This,
    BSTR *p);
void __RPC_STUB IHTMLWindow2_get_defaultStatus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_put_status_Proxy(
    IHTMLWindow2* This,
    BSTR v);
void __RPC_STUB IHTMLWindow2_put_status_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_get_status_Proxy(
    IHTMLWindow2* This,
    BSTR *p);
void __RPC_STUB IHTMLWindow2_get_status_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_setTimeout_Proxy(
    IHTMLWindow2* This,
    BSTR expression,
    LONG msec,
    VARIANT *language,
    LONG *timerID);
void __RPC_STUB IHTMLWindow2_setTimeout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_clearTimeout_Proxy(
    IHTMLWindow2* This,
    LONG timerID);
void __RPC_STUB IHTMLWindow2_clearTimeout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_alert_Proxy(
    IHTMLWindow2* This,
    BSTR message);
void __RPC_STUB IHTMLWindow2_alert_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_confirm_Proxy(
    IHTMLWindow2* This,
    BSTR message,
    VARIANT_BOOL *confirmed);
void __RPC_STUB IHTMLWindow2_confirm_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_prompt_Proxy(
    IHTMLWindow2* This,
    BSTR message,
    BSTR defstr,
    VARIANT *textdata);
void __RPC_STUB IHTMLWindow2_prompt_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_get_Image_Proxy(
    IHTMLWindow2* This,
    IHTMLImageElementFactory **p);
void __RPC_STUB IHTMLWindow2_get_Image_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_get_location_Proxy(
    IHTMLWindow2* This,
    IHTMLLocation **p);
void __RPC_STUB IHTMLWindow2_get_location_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_get_history_Proxy(
    IHTMLWindow2* This,
    IOmHistory **p);
void __RPC_STUB IHTMLWindow2_get_history_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_close_Proxy(
    IHTMLWindow2* This);
void __RPC_STUB IHTMLWindow2_close_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_put_opener_Proxy(
    IHTMLWindow2* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow2_put_opener_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_get_opener_Proxy(
    IHTMLWindow2* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow2_get_opener_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_get_navigator_Proxy(
    IHTMLWindow2* This,
    IOmNavigator **p);
void __RPC_STUB IHTMLWindow2_get_navigator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_put_name_Proxy(
    IHTMLWindow2* This,
    BSTR v);
void __RPC_STUB IHTMLWindow2_put_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_get_name_Proxy(
    IHTMLWindow2* This,
    BSTR *p);
void __RPC_STUB IHTMLWindow2_get_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_get_parent_Proxy(
    IHTMLWindow2* This,
    IHTMLWindow2 **p);
void __RPC_STUB IHTMLWindow2_get_parent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_open_Proxy(
    IHTMLWindow2* This,
    BSTR url,
    BSTR name,
    BSTR features,
    VARIANT_BOOL replace,
    IHTMLWindow2 **pomWindowResult);
void __RPC_STUB IHTMLWindow2_open_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_get_self_Proxy(
    IHTMLWindow2* This,
    IHTMLWindow2 **p);
void __RPC_STUB IHTMLWindow2_get_self_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_get_top_Proxy(
    IHTMLWindow2* This,
    IHTMLWindow2 **p);
void __RPC_STUB IHTMLWindow2_get_top_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_get_window_Proxy(
    IHTMLWindow2* This,
    IHTMLWindow2 **p);
void __RPC_STUB IHTMLWindow2_get_window_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_navigate_Proxy(
    IHTMLWindow2* This,
    BSTR url);
void __RPC_STUB IHTMLWindow2_navigate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_put_onfocus_Proxy(
    IHTMLWindow2* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow2_put_onfocus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_get_onfocus_Proxy(
    IHTMLWindow2* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow2_get_onfocus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_put_onblur_Proxy(
    IHTMLWindow2* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow2_put_onblur_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_get_onblur_Proxy(
    IHTMLWindow2* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow2_get_onblur_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_put_onload_Proxy(
    IHTMLWindow2* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow2_put_onload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_get_onload_Proxy(
    IHTMLWindow2* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow2_get_onload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_put_onbeforeunload_Proxy(
    IHTMLWindow2* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow2_put_onbeforeunload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_get_onbeforeunload_Proxy(
    IHTMLWindow2* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow2_get_onbeforeunload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_put_onunload_Proxy(
    IHTMLWindow2* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow2_put_onunload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_get_onunload_Proxy(
    IHTMLWindow2* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow2_get_onunload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_put_onhelp_Proxy(
    IHTMLWindow2* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow2_put_onhelp_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_get_onhelp_Proxy(
    IHTMLWindow2* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow2_get_onhelp_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_put_onerror_Proxy(
    IHTMLWindow2* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow2_put_onerror_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_get_onerror_Proxy(
    IHTMLWindow2* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow2_get_onerror_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_put_onresize_Proxy(
    IHTMLWindow2* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow2_put_onresize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_get_onresize_Proxy(
    IHTMLWindow2* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow2_get_onresize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_put_onscroll_Proxy(
    IHTMLWindow2* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow2_put_onscroll_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_get_onscroll_Proxy(
    IHTMLWindow2* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow2_get_onscroll_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_get_document_Proxy(
    IHTMLWindow2* This,
    IHTMLDocument2 **p);
void __RPC_STUB IHTMLWindow2_get_document_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_get_event_Proxy(
    IHTMLWindow2* This,
    IHTMLEventObj **p);
void __RPC_STUB IHTMLWindow2_get_event_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_get__newEnum_Proxy(
    IHTMLWindow2* This,
    IUnknown **p);
void __RPC_STUB IHTMLWindow2_get__newEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_showModalDialog_Proxy(
    IHTMLWindow2* This,
    BSTR dialog,
    VARIANT *varArgIn,
    VARIANT *varOptions,
    VARIANT *varArgOut);
void __RPC_STUB IHTMLWindow2_showModalDialog_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_showHelp_Proxy(
    IHTMLWindow2* This,
    BSTR helpURL,
    VARIANT helpArg,
    BSTR features);
void __RPC_STUB IHTMLWindow2_showHelp_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_get_screen_Proxy(
    IHTMLWindow2* This,
    IHTMLScreen **p);
void __RPC_STUB IHTMLWindow2_get_screen_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_get_Option_Proxy(
    IHTMLWindow2* This,
    IHTMLOptionElementFactory **p);
void __RPC_STUB IHTMLWindow2_get_Option_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_focus_Proxy(
    IHTMLWindow2* This);
void __RPC_STUB IHTMLWindow2_focus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_get_closed_Proxy(
    IHTMLWindow2* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLWindow2_get_closed_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_blur_Proxy(
    IHTMLWindow2* This);
void __RPC_STUB IHTMLWindow2_blur_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_scroll_Proxy(
    IHTMLWindow2* This,
    LONG x,
    LONG y);
void __RPC_STUB IHTMLWindow2_scroll_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_get_clientInformation_Proxy(
    IHTMLWindow2* This,
    IOmNavigator **p);
void __RPC_STUB IHTMLWindow2_get_clientInformation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_setInterval_Proxy(
    IHTMLWindow2* This,
    BSTR expression,
    LONG msec,
    VARIANT *language,
    LONG *timerID);
void __RPC_STUB IHTMLWindow2_setInterval_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_clearInterval_Proxy(
    IHTMLWindow2* This,
    LONG timerID);
void __RPC_STUB IHTMLWindow2_clearInterval_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_put_offscreenBuffering_Proxy(
    IHTMLWindow2* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow2_put_offscreenBuffering_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_get_offscreenBuffering_Proxy(
    IHTMLWindow2* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow2_get_offscreenBuffering_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_execScript_Proxy(
    IHTMLWindow2* This,
    BSTR code,
    BSTR language,
    VARIANT *pvarRet);
void __RPC_STUB IHTMLWindow2_execScript_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_toString_Proxy(
    IHTMLWindow2* This,
    BSTR *String);
void __RPC_STUB IHTMLWindow2_toString_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_scrollBy_Proxy(
    IHTMLWindow2* This,
    LONG x,
    LONG y);
void __RPC_STUB IHTMLWindow2_scrollBy_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_scrollTo_Proxy(
    IHTMLWindow2* This,
    LONG x,
    LONG y);
void __RPC_STUB IHTMLWindow2_scrollTo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_moveTo_Proxy(
    IHTMLWindow2* This,
    LONG x,
    LONG y);
void __RPC_STUB IHTMLWindow2_moveTo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_moveBy_Proxy(
    IHTMLWindow2* This,
    LONG x,
    LONG y);
void __RPC_STUB IHTMLWindow2_moveBy_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_resizeTo_Proxy(
    IHTMLWindow2* This,
    LONG x,
    LONG y);
void __RPC_STUB IHTMLWindow2_resizeTo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_resizeBy_Proxy(
    IHTMLWindow2* This,
    LONG x,
    LONG y);
void __RPC_STUB IHTMLWindow2_resizeBy_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow2_get_external_Proxy(
    IHTMLWindow2* This,
    IDispatch **p);
void __RPC_STUB IHTMLWindow2_get_external_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLWindow2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLWindow3 interface
 */
#ifndef __IHTMLWindow3_INTERFACE_DEFINED__
#define __IHTMLWindow3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLWindow3, 0x3050f4ae, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f4ae-98b5-11cf-bb82-00aa00bdce0b")
IHTMLWindow3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_screenLeft(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_screenTop(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE attachEvent(
        BSTR event,
        IDispatch *pDisp,
        VARIANT_BOOL *pfResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE detachEvent(
        BSTR event,
        IDispatch *pDisp) = 0;

    virtual HRESULT STDMETHODCALLTYPE setTimeout(
        VARIANT *expression,
        LONG msec,
        VARIANT *language,
        LONG *timerID) = 0;

    virtual HRESULT STDMETHODCALLTYPE setInterval(
        VARIANT *expression,
        LONG msec,
        VARIANT *language,
        LONG *timerID) = 0;

    virtual HRESULT STDMETHODCALLTYPE print(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onbeforeprint(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onbeforeprint(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onafterprint(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onafterprint(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clipboardData(
        IHTMLDataTransfer **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE showModelessDialog(
        BSTR url = L"",
        VARIANT *varArgIn = 0,
        VARIANT *options = 0,
        IHTMLWindow2 **pDialog = 0) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLWindow3, 0x3050f4ae, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLWindow3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLWindow3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLWindow3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLWindow3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLWindow3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLWindow3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLWindow3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLWindow3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLWindow3 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_screenLeft)(
        IHTMLWindow3* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_screenTop)(
        IHTMLWindow3* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *attachEvent)(
        IHTMLWindow3* This,
        BSTR event,
        IDispatch *pDisp,
        VARIANT_BOOL *pfResult);

    HRESULT (STDMETHODCALLTYPE *detachEvent)(
        IHTMLWindow3* This,
        BSTR event,
        IDispatch *pDisp);

    HRESULT (STDMETHODCALLTYPE *setTimeout)(
        IHTMLWindow3* This,
        VARIANT *expression,
        LONG msec,
        VARIANT *language,
        LONG *timerID);

    HRESULT (STDMETHODCALLTYPE *setInterval)(
        IHTMLWindow3* This,
        VARIANT *expression,
        LONG msec,
        VARIANT *language,
        LONG *timerID);

    HRESULT (STDMETHODCALLTYPE *print)(
        IHTMLWindow3* This);

    HRESULT (STDMETHODCALLTYPE *put_onbeforeprint)(
        IHTMLWindow3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onbeforeprint)(
        IHTMLWindow3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onafterprint)(
        IHTMLWindow3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onafterprint)(
        IHTMLWindow3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_clipboardData)(
        IHTMLWindow3* This,
        IHTMLDataTransfer **p);

    HRESULT (STDMETHODCALLTYPE *showModelessDialog)(
        IHTMLWindow3* This,
        BSTR url,
        VARIANT *varArgIn,
        VARIANT *options,
        IHTMLWindow2 **pDialog);

    END_INTERFACE
} IHTMLWindow3Vtbl;
interface IHTMLWindow3 {
    CONST_VTBL IHTMLWindow3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLWindow3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLWindow3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLWindow3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLWindow3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLWindow3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLWindow3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLWindow3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLWindow3 methods ***/
#define IHTMLWindow3_get_screenLeft(This,p) (This)->lpVtbl->get_screenLeft(This,p)
#define IHTMLWindow3_get_screenTop(This,p) (This)->lpVtbl->get_screenTop(This,p)
#define IHTMLWindow3_attachEvent(This,event,pDisp,pfResult) (This)->lpVtbl->attachEvent(This,event,pDisp,pfResult)
#define IHTMLWindow3_detachEvent(This,event,pDisp) (This)->lpVtbl->detachEvent(This,event,pDisp)
#define IHTMLWindow3_setTimeout(This,expression,msec,language,timerID) (This)->lpVtbl->setTimeout(This,expression,msec,language,timerID)
#define IHTMLWindow3_setInterval(This,expression,msec,language,timerID) (This)->lpVtbl->setInterval(This,expression,msec,language,timerID)
#define IHTMLWindow3_print(This) (This)->lpVtbl->print(This)
#define IHTMLWindow3_put_onbeforeprint(This,v) (This)->lpVtbl->put_onbeforeprint(This,v)
#define IHTMLWindow3_get_onbeforeprint(This,p) (This)->lpVtbl->get_onbeforeprint(This,p)
#define IHTMLWindow3_put_onafterprint(This,v) (This)->lpVtbl->put_onafterprint(This,v)
#define IHTMLWindow3_get_onafterprint(This,p) (This)->lpVtbl->get_onafterprint(This,p)
#define IHTMLWindow3_get_clipboardData(This,p) (This)->lpVtbl->get_clipboardData(This,p)
#define IHTMLWindow3_showModelessDialog(This,url,varArgIn,options,pDialog) (This)->lpVtbl->showModelessDialog(This,url,varArgIn,options,pDialog)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLWindow3_QueryInterface(IHTMLWindow3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLWindow3_AddRef(IHTMLWindow3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLWindow3_Release(IHTMLWindow3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLWindow3_GetTypeInfoCount(IHTMLWindow3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLWindow3_GetTypeInfo(IHTMLWindow3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLWindow3_GetIDsOfNames(IHTMLWindow3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLWindow3_Invoke(IHTMLWindow3* 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);
}
/*** IHTMLWindow3 methods ***/
static FORCEINLINE HRESULT IHTMLWindow3_get_screenLeft(IHTMLWindow3* This,LONG *p) {
    return This->lpVtbl->get_screenLeft(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow3_get_screenTop(IHTMLWindow3* This,LONG *p) {
    return This->lpVtbl->get_screenTop(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow3_attachEvent(IHTMLWindow3* This,BSTR event,IDispatch *pDisp,VARIANT_BOOL *pfResult) {
    return This->lpVtbl->attachEvent(This,event,pDisp,pfResult);
}
static FORCEINLINE HRESULT IHTMLWindow3_detachEvent(IHTMLWindow3* This,BSTR event,IDispatch *pDisp) {
    return This->lpVtbl->detachEvent(This,event,pDisp);
}
static FORCEINLINE HRESULT IHTMLWindow3_setTimeout(IHTMLWindow3* This,VARIANT *expression,LONG msec,VARIANT *language,LONG *timerID) {
    return This->lpVtbl->setTimeout(This,expression,msec,language,timerID);
}
static FORCEINLINE HRESULT IHTMLWindow3_setInterval(IHTMLWindow3* This,VARIANT *expression,LONG msec,VARIANT *language,LONG *timerID) {
    return This->lpVtbl->setInterval(This,expression,msec,language,timerID);
}
static FORCEINLINE HRESULT IHTMLWindow3_print(IHTMLWindow3* This) {
    return This->lpVtbl->print(This);
}
static FORCEINLINE HRESULT IHTMLWindow3_put_onbeforeprint(IHTMLWindow3* This,VARIANT v) {
    return This->lpVtbl->put_onbeforeprint(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow3_get_onbeforeprint(IHTMLWindow3* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforeprint(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow3_put_onafterprint(IHTMLWindow3* This,VARIANT v) {
    return This->lpVtbl->put_onafterprint(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow3_get_onafterprint(IHTMLWindow3* This,VARIANT *p) {
    return This->lpVtbl->get_onafterprint(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow3_get_clipboardData(IHTMLWindow3* This,IHTMLDataTransfer **p) {
    return This->lpVtbl->get_clipboardData(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow3_showModelessDialog(IHTMLWindow3* This,BSTR url,VARIANT *varArgIn,VARIANT *options,IHTMLWindow2 **pDialog) {
    return This->lpVtbl->showModelessDialog(This,url,varArgIn,options,pDialog);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLWindow3_get_screenLeft_Proxy(
    IHTMLWindow3* This,
    LONG *p);
void __RPC_STUB IHTMLWindow3_get_screenLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow3_get_screenTop_Proxy(
    IHTMLWindow3* This,
    LONG *p);
void __RPC_STUB IHTMLWindow3_get_screenTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow3_attachEvent_Proxy(
    IHTMLWindow3* This,
    BSTR event,
    IDispatch *pDisp,
    VARIANT_BOOL *pfResult);
void __RPC_STUB IHTMLWindow3_attachEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow3_detachEvent_Proxy(
    IHTMLWindow3* This,
    BSTR event,
    IDispatch *pDisp);
void __RPC_STUB IHTMLWindow3_detachEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow3_setTimeout_Proxy(
    IHTMLWindow3* This,
    VARIANT *expression,
    LONG msec,
    VARIANT *language,
    LONG *timerID);
void __RPC_STUB IHTMLWindow3_setTimeout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow3_setInterval_Proxy(
    IHTMLWindow3* This,
    VARIANT *expression,
    LONG msec,
    VARIANT *language,
    LONG *timerID);
void __RPC_STUB IHTMLWindow3_setInterval_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow3_print_Proxy(
    IHTMLWindow3* This);
void __RPC_STUB IHTMLWindow3_print_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow3_put_onbeforeprint_Proxy(
    IHTMLWindow3* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow3_put_onbeforeprint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow3_get_onbeforeprint_Proxy(
    IHTMLWindow3* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow3_get_onbeforeprint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow3_put_onafterprint_Proxy(
    IHTMLWindow3* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow3_put_onafterprint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow3_get_onafterprint_Proxy(
    IHTMLWindow3* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow3_get_onafterprint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow3_get_clipboardData_Proxy(
    IHTMLWindow3* This,
    IHTMLDataTransfer **p);
void __RPC_STUB IHTMLWindow3_get_clipboardData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow3_showModelessDialog_Proxy(
    IHTMLWindow3* This,
    BSTR url,
    VARIANT *varArgIn,
    VARIANT *options,
    IHTMLWindow2 **pDialog);
void __RPC_STUB IHTMLWindow3_showModelessDialog_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLWindow3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLWindow4 interface
 */
#ifndef __IHTMLWindow4_INTERFACE_DEFINED__
#define __IHTMLWindow4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLWindow4, 0x3050f6cf, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f6cf-98b5-11cf-bb82-00aa00bdce0b")
IHTMLWindow4 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE createPopup(
        VARIANT *varArgIn,
        IDispatch **ppPopup) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_frameElement(
        IHTMLFrameBase **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLWindow4, 0x3050f6cf, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLWindow4Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLWindow4* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLWindow4* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLWindow4* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLWindow4* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLWindow4* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLWindow4* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLWindow4* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLWindow4 methods ***/
    HRESULT (STDMETHODCALLTYPE *createPopup)(
        IHTMLWindow4* This,
        VARIANT *varArgIn,
        IDispatch **ppPopup);

    HRESULT (STDMETHODCALLTYPE *get_frameElement)(
        IHTMLWindow4* This,
        IHTMLFrameBase **p);

    END_INTERFACE
} IHTMLWindow4Vtbl;
interface IHTMLWindow4 {
    CONST_VTBL IHTMLWindow4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLWindow4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLWindow4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLWindow4_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLWindow4_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLWindow4_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLWindow4_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLWindow4_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLWindow4 methods ***/
#define IHTMLWindow4_createPopup(This,varArgIn,ppPopup) (This)->lpVtbl->createPopup(This,varArgIn,ppPopup)
#define IHTMLWindow4_get_frameElement(This,p) (This)->lpVtbl->get_frameElement(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLWindow4_QueryInterface(IHTMLWindow4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLWindow4_AddRef(IHTMLWindow4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLWindow4_Release(IHTMLWindow4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLWindow4_GetTypeInfoCount(IHTMLWindow4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLWindow4_GetTypeInfo(IHTMLWindow4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLWindow4_GetIDsOfNames(IHTMLWindow4* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLWindow4_Invoke(IHTMLWindow4* 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);
}
/*** IHTMLWindow4 methods ***/
static FORCEINLINE HRESULT IHTMLWindow4_createPopup(IHTMLWindow4* This,VARIANT *varArgIn,IDispatch **ppPopup) {
    return This->lpVtbl->createPopup(This,varArgIn,ppPopup);
}
static FORCEINLINE HRESULT IHTMLWindow4_get_frameElement(IHTMLWindow4* This,IHTMLFrameBase **p) {
    return This->lpVtbl->get_frameElement(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLWindow4_createPopup_Proxy(
    IHTMLWindow4* This,
    VARIANT *varArgIn,
    IDispatch **ppPopup);
void __RPC_STUB IHTMLWindow4_createPopup_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow4_get_frameElement_Proxy(
    IHTMLWindow4* This,
    IHTMLFrameBase **p);
void __RPC_STUB IHTMLWindow4_get_frameElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLWindow4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLWindow5 interface
 */
#ifndef __IHTMLWindow5_INTERFACE_DEFINED__
#define __IHTMLWindow5_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLWindow5, 0x3051040e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051040e-98b5-11cf-bb82-00aa00bdce0b")
IHTMLWindow5 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_XMLHttpRequest(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_XMLHttpRequest(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLWindow5, 0x3051040e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLWindow5Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLWindow5* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLWindow5* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLWindow5* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLWindow5* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLWindow5* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLWindow5* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLWindow5* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLWindow5 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_XMLHttpRequest)(
        IHTMLWindow5* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_XMLHttpRequest)(
        IHTMLWindow5* This,
        VARIANT *p);

    END_INTERFACE
} IHTMLWindow5Vtbl;
interface IHTMLWindow5 {
    CONST_VTBL IHTMLWindow5Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLWindow5_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLWindow5_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLWindow5_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLWindow5_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLWindow5_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLWindow5_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLWindow5_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLWindow5 methods ***/
#define IHTMLWindow5_put_XMLHttpRequest(This,v) (This)->lpVtbl->put_XMLHttpRequest(This,v)
#define IHTMLWindow5_get_XMLHttpRequest(This,p) (This)->lpVtbl->get_XMLHttpRequest(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLWindow5_QueryInterface(IHTMLWindow5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLWindow5_AddRef(IHTMLWindow5* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLWindow5_Release(IHTMLWindow5* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLWindow5_GetTypeInfoCount(IHTMLWindow5* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLWindow5_GetTypeInfo(IHTMLWindow5* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLWindow5_GetIDsOfNames(IHTMLWindow5* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLWindow5_Invoke(IHTMLWindow5* 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);
}
/*** IHTMLWindow5 methods ***/
static FORCEINLINE HRESULT IHTMLWindow5_put_XMLHttpRequest(IHTMLWindow5* This,VARIANT v) {
    return This->lpVtbl->put_XMLHttpRequest(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow5_get_XMLHttpRequest(IHTMLWindow5* This,VARIANT *p) {
    return This->lpVtbl->get_XMLHttpRequest(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLWindow5_put_XMLHttpRequest_Proxy(
    IHTMLWindow5* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow5_put_XMLHttpRequest_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow5_get_XMLHttpRequest_Proxy(
    IHTMLWindow5* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow5_get_XMLHttpRequest_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLWindow5_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLWindow6 interface
 */
#ifndef __IHTMLWindow6_INTERFACE_DEFINED__
#define __IHTMLWindow6_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLWindow6, 0x30510453, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510453-98b5-11cf-bb82-00aa00bdce0b")
IHTMLWindow6 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_XDomainRequest(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_XDomainRequest(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_sessionStorage(
        IHTMLStorage **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_localStorage(
        IHTMLStorage **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onhashchange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onhashchange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_maxConnectionsPerServer(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE postMessage(
        BSTR msg,
        VARIANT targetOrigin) = 0;

    virtual HRESULT STDMETHODCALLTYPE toStaticHTML(
        BSTR bstrHTML,
        BSTR *pbstrStaticHTML) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmessage(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmessage(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE msWriteProfilerMark(
        BSTR bstrProfilerMarkName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLWindow6, 0x30510453, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLWindow6Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLWindow6* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLWindow6* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLWindow6* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLWindow6* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLWindow6* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLWindow6* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLWindow6* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLWindow6 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_XDomainRequest)(
        IHTMLWindow6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_XDomainRequest)(
        IHTMLWindow6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_sessionStorage)(
        IHTMLWindow6* This,
        IHTMLStorage **p);

    HRESULT (STDMETHODCALLTYPE *get_localStorage)(
        IHTMLWindow6* This,
        IHTMLStorage **p);

    HRESULT (STDMETHODCALLTYPE *put_onhashchange)(
        IHTMLWindow6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onhashchange)(
        IHTMLWindow6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_maxConnectionsPerServer)(
        IHTMLWindow6* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *postMessage)(
        IHTMLWindow6* This,
        BSTR msg,
        VARIANT targetOrigin);

    HRESULT (STDMETHODCALLTYPE *toStaticHTML)(
        IHTMLWindow6* This,
        BSTR bstrHTML,
        BSTR *pbstrStaticHTML);

    HRESULT (STDMETHODCALLTYPE *put_onmessage)(
        IHTMLWindow6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmessage)(
        IHTMLWindow6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *msWriteProfilerMark)(
        IHTMLWindow6* This,
        BSTR bstrProfilerMarkName);

    END_INTERFACE
} IHTMLWindow6Vtbl;
interface IHTMLWindow6 {
    CONST_VTBL IHTMLWindow6Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLWindow6_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLWindow6_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLWindow6_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLWindow6_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLWindow6_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLWindow6_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLWindow6_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLWindow6 methods ***/
#define IHTMLWindow6_put_XDomainRequest(This,v) (This)->lpVtbl->put_XDomainRequest(This,v)
#define IHTMLWindow6_get_XDomainRequest(This,p) (This)->lpVtbl->get_XDomainRequest(This,p)
#define IHTMLWindow6_get_sessionStorage(This,p) (This)->lpVtbl->get_sessionStorage(This,p)
#define IHTMLWindow6_get_localStorage(This,p) (This)->lpVtbl->get_localStorage(This,p)
#define IHTMLWindow6_put_onhashchange(This,v) (This)->lpVtbl->put_onhashchange(This,v)
#define IHTMLWindow6_get_onhashchange(This,p) (This)->lpVtbl->get_onhashchange(This,p)
#define IHTMLWindow6_get_maxConnectionsPerServer(This,p) (This)->lpVtbl->get_maxConnectionsPerServer(This,p)
#define IHTMLWindow6_postMessage(This,msg,targetOrigin) (This)->lpVtbl->postMessage(This,msg,targetOrigin)
#define IHTMLWindow6_toStaticHTML(This,bstrHTML,pbstrStaticHTML) (This)->lpVtbl->toStaticHTML(This,bstrHTML,pbstrStaticHTML)
#define IHTMLWindow6_put_onmessage(This,v) (This)->lpVtbl->put_onmessage(This,v)
#define IHTMLWindow6_get_onmessage(This,p) (This)->lpVtbl->get_onmessage(This,p)
#define IHTMLWindow6_msWriteProfilerMark(This,bstrProfilerMarkName) (This)->lpVtbl->msWriteProfilerMark(This,bstrProfilerMarkName)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLWindow6_QueryInterface(IHTMLWindow6* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLWindow6_AddRef(IHTMLWindow6* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLWindow6_Release(IHTMLWindow6* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLWindow6_GetTypeInfoCount(IHTMLWindow6* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLWindow6_GetTypeInfo(IHTMLWindow6* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLWindow6_GetIDsOfNames(IHTMLWindow6* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLWindow6_Invoke(IHTMLWindow6* 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);
}
/*** IHTMLWindow6 methods ***/
static FORCEINLINE HRESULT IHTMLWindow6_put_XDomainRequest(IHTMLWindow6* This,VARIANT v) {
    return This->lpVtbl->put_XDomainRequest(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow6_get_XDomainRequest(IHTMLWindow6* This,VARIANT *p) {
    return This->lpVtbl->get_XDomainRequest(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow6_get_sessionStorage(IHTMLWindow6* This,IHTMLStorage **p) {
    return This->lpVtbl->get_sessionStorage(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow6_get_localStorage(IHTMLWindow6* This,IHTMLStorage **p) {
    return This->lpVtbl->get_localStorage(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow6_put_onhashchange(IHTMLWindow6* This,VARIANT v) {
    return This->lpVtbl->put_onhashchange(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow6_get_onhashchange(IHTMLWindow6* This,VARIANT *p) {
    return This->lpVtbl->get_onhashchange(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow6_get_maxConnectionsPerServer(IHTMLWindow6* This,LONG *p) {
    return This->lpVtbl->get_maxConnectionsPerServer(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow6_postMessage(IHTMLWindow6* This,BSTR msg,VARIANT targetOrigin) {
    return This->lpVtbl->postMessage(This,msg,targetOrigin);
}
static FORCEINLINE HRESULT IHTMLWindow6_toStaticHTML(IHTMLWindow6* This,BSTR bstrHTML,BSTR *pbstrStaticHTML) {
    return This->lpVtbl->toStaticHTML(This,bstrHTML,pbstrStaticHTML);
}
static FORCEINLINE HRESULT IHTMLWindow6_put_onmessage(IHTMLWindow6* This,VARIANT v) {
    return This->lpVtbl->put_onmessage(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow6_get_onmessage(IHTMLWindow6* This,VARIANT *p) {
    return This->lpVtbl->get_onmessage(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow6_msWriteProfilerMark(IHTMLWindow6* This,BSTR bstrProfilerMarkName) {
    return This->lpVtbl->msWriteProfilerMark(This,bstrProfilerMarkName);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLWindow6_put_XDomainRequest_Proxy(
    IHTMLWindow6* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow6_put_XDomainRequest_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow6_get_XDomainRequest_Proxy(
    IHTMLWindow6* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow6_get_XDomainRequest_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow6_get_sessionStorage_Proxy(
    IHTMLWindow6* This,
    IHTMLStorage **p);
void __RPC_STUB IHTMLWindow6_get_sessionStorage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow6_get_localStorage_Proxy(
    IHTMLWindow6* This,
    IHTMLStorage **p);
void __RPC_STUB IHTMLWindow6_get_localStorage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow6_put_onhashchange_Proxy(
    IHTMLWindow6* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow6_put_onhashchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow6_get_onhashchange_Proxy(
    IHTMLWindow6* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow6_get_onhashchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow6_get_maxConnectionsPerServer_Proxy(
    IHTMLWindow6* This,
    LONG *p);
void __RPC_STUB IHTMLWindow6_get_maxConnectionsPerServer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow6_postMessage_Proxy(
    IHTMLWindow6* This,
    BSTR msg,
    VARIANT targetOrigin);
void __RPC_STUB IHTMLWindow6_postMessage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow6_toStaticHTML_Proxy(
    IHTMLWindow6* This,
    BSTR bstrHTML,
    BSTR *pbstrStaticHTML);
void __RPC_STUB IHTMLWindow6_toStaticHTML_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow6_put_onmessage_Proxy(
    IHTMLWindow6* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow6_put_onmessage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow6_get_onmessage_Proxy(
    IHTMLWindow6* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow6_get_onmessage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow6_msWriteProfilerMark_Proxy(
    IHTMLWindow6* This,
    BSTR bstrProfilerMarkName);
void __RPC_STUB IHTMLWindow6_msWriteProfilerMark_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLWindow6_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLWindow7 interface
 */
#ifndef __IHTMLWindow7_INTERFACE_DEFINED__
#define __IHTMLWindow7_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLWindow7, 0x305104b7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104b7-98b5-11cf-bb82-00aa00bdce0b")
IHTMLWindow7 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE getSelection(
        IHTMLSelection **ppIHTMLSelection) = 0;

    virtual HRESULT STDMETHODCALLTYPE getComputedStyle(
        IHTMLDOMNode *varArgIn,
        BSTR bstrPseudoElt = L"",
        IHTMLCSSStyleDeclaration **ppComputedStyle = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_styleMedia(
        IHTMLStyleMedia **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_performance(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_performance(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_innerWidth(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_innerHeight(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pageXOffset(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pageYOffset(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_screenX(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_screenY(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_outerWidth(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_outerHeight(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onabort(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onabort(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_oncanplay(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_oncanplay(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_oncanplaythrough(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_oncanplaythrough(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onchange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onchange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onclick(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onclick(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_oncontextmenu(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_oncontextmenu(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondblclick(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondblclick(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondrag(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondrag(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondragend(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondragend(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondragenter(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondragenter(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondragleave(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondragleave(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondragover(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondragover(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondragstart(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondragstart(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondrop(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondrop(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondurationchange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondurationchange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onfocusin(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onfocusin(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onfocusout(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onfocusout(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_oninput(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_oninput(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onemptied(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onemptied(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onended(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onended(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onkeydown(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onkeydown(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onkeypress(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onkeypress(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onkeyup(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onkeyup(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onloadeddata(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onloadeddata(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onloadedmetadata(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onloadedmetadata(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onloadstart(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onloadstart(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmousedown(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmousedown(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmouseenter(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmouseenter(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmouseleave(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmouseleave(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmousemove(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmousemove(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmouseout(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmouseout(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmouseover(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmouseover(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmouseup(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmouseup(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmousewheel(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmousewheel(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onoffline(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onoffline(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ononline(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ononline(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onprogress(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onprogress(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onratechange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onratechange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onreadystatechange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onreadystatechange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onreset(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onreset(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onseeked(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onseeked(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onseeking(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onseeking(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onselect(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onselect(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onstalled(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onstalled(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onstorage(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onstorage(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onsubmit(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onsubmit(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onsuspend(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onsuspend(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ontimeupdate(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ontimeupdate(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onpause(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onpause(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onplay(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onplay(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onplaying(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onplaying(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onvolumechange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onvolumechange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onwaiting(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onwaiting(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLWindow7, 0x305104b7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLWindow7Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLWindow7* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLWindow7* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLWindow7* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLWindow7* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLWindow7* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLWindow7* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLWindow7* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLWindow7 methods ***/
    HRESULT (STDMETHODCALLTYPE *getSelection)(
        IHTMLWindow7* This,
        IHTMLSelection **ppIHTMLSelection);

    HRESULT (STDMETHODCALLTYPE *getComputedStyle)(
        IHTMLWindow7* This,
        IHTMLDOMNode *varArgIn,
        BSTR bstrPseudoElt,
        IHTMLCSSStyleDeclaration **ppComputedStyle);

    HRESULT (STDMETHODCALLTYPE *get_styleMedia)(
        IHTMLWindow7* This,
        IHTMLStyleMedia **p);

    HRESULT (STDMETHODCALLTYPE *put_performance)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_performance)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_innerWidth)(
        IHTMLWindow7* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_innerHeight)(
        IHTMLWindow7* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_pageXOffset)(
        IHTMLWindow7* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_pageYOffset)(
        IHTMLWindow7* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_screenX)(
        IHTMLWindow7* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_screenY)(
        IHTMLWindow7* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_outerWidth)(
        IHTMLWindow7* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_outerHeight)(
        IHTMLWindow7* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_onabort)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onabort)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_oncanplay)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_oncanplay)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_oncanplaythrough)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_oncanplaythrough)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onchange)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onchange)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onclick)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onclick)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_oncontextmenu)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_oncontextmenu)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondblclick)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondblclick)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondrag)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondrag)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondragend)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondragend)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondragenter)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondragenter)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondragleave)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondragleave)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondragover)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondragover)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondragstart)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondragstart)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondrop)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondrop)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondurationchange)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondurationchange)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onfocusin)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onfocusin)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onfocusout)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onfocusout)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_oninput)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_oninput)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onemptied)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onemptied)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onended)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onended)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onkeydown)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onkeydown)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onkeypress)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onkeypress)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onkeyup)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onkeyup)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onloadeddata)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onloadeddata)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onloadedmetadata)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onloadedmetadata)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onloadstart)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onloadstart)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmousedown)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmousedown)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmouseenter)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmouseenter)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmouseleave)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmouseleave)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmousemove)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmousemove)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmouseout)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmouseout)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmouseover)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmouseover)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmouseup)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmouseup)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmousewheel)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmousewheel)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onoffline)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onoffline)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ononline)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ononline)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onprogress)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onprogress)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onratechange)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onratechange)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onreadystatechange)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onreadystatechange)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onreset)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onreset)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onseeked)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onseeked)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onseeking)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onseeking)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onselect)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onselect)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onstalled)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onstalled)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onstorage)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onstorage)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onsubmit)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onsubmit)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onsuspend)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onsuspend)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ontimeupdate)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ontimeupdate)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onpause)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onpause)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onplay)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onplay)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onplaying)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onplaying)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onvolumechange)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onvolumechange)(
        IHTMLWindow7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onwaiting)(
        IHTMLWindow7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onwaiting)(
        IHTMLWindow7* This,
        VARIANT *p);

    END_INTERFACE
} IHTMLWindow7Vtbl;
interface IHTMLWindow7 {
    CONST_VTBL IHTMLWindow7Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLWindow7_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLWindow7_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLWindow7_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLWindow7_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLWindow7_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLWindow7_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLWindow7_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLWindow7 methods ***/
#define IHTMLWindow7_getSelection(This,ppIHTMLSelection) (This)->lpVtbl->getSelection(This,ppIHTMLSelection)
#define IHTMLWindow7_getComputedStyle(This,varArgIn,bstrPseudoElt,ppComputedStyle) (This)->lpVtbl->getComputedStyle(This,varArgIn,bstrPseudoElt,ppComputedStyle)
#define IHTMLWindow7_get_styleMedia(This,p) (This)->lpVtbl->get_styleMedia(This,p)
#define IHTMLWindow7_put_performance(This,v) (This)->lpVtbl->put_performance(This,v)
#define IHTMLWindow7_get_performance(This,p) (This)->lpVtbl->get_performance(This,p)
#define IHTMLWindow7_get_innerWidth(This,p) (This)->lpVtbl->get_innerWidth(This,p)
#define IHTMLWindow7_get_innerHeight(This,p) (This)->lpVtbl->get_innerHeight(This,p)
#define IHTMLWindow7_get_pageXOffset(This,p) (This)->lpVtbl->get_pageXOffset(This,p)
#define IHTMLWindow7_get_pageYOffset(This,p) (This)->lpVtbl->get_pageYOffset(This,p)
#define IHTMLWindow7_get_screenX(This,p) (This)->lpVtbl->get_screenX(This,p)
#define IHTMLWindow7_get_screenY(This,p) (This)->lpVtbl->get_screenY(This,p)
#define IHTMLWindow7_get_outerWidth(This,p) (This)->lpVtbl->get_outerWidth(This,p)
#define IHTMLWindow7_get_outerHeight(This,p) (This)->lpVtbl->get_outerHeight(This,p)
#define IHTMLWindow7_put_onabort(This,v) (This)->lpVtbl->put_onabort(This,v)
#define IHTMLWindow7_get_onabort(This,p) (This)->lpVtbl->get_onabort(This,p)
#define IHTMLWindow7_put_oncanplay(This,v) (This)->lpVtbl->put_oncanplay(This,v)
#define IHTMLWindow7_get_oncanplay(This,p) (This)->lpVtbl->get_oncanplay(This,p)
#define IHTMLWindow7_put_oncanplaythrough(This,v) (This)->lpVtbl->put_oncanplaythrough(This,v)
#define IHTMLWindow7_get_oncanplaythrough(This,p) (This)->lpVtbl->get_oncanplaythrough(This,p)
#define IHTMLWindow7_put_onchange(This,v) (This)->lpVtbl->put_onchange(This,v)
#define IHTMLWindow7_get_onchange(This,p) (This)->lpVtbl->get_onchange(This,p)
#define IHTMLWindow7_put_onclick(This,v) (This)->lpVtbl->put_onclick(This,v)
#define IHTMLWindow7_get_onclick(This,p) (This)->lpVtbl->get_onclick(This,p)
#define IHTMLWindow7_put_oncontextmenu(This,v) (This)->lpVtbl->put_oncontextmenu(This,v)
#define IHTMLWindow7_get_oncontextmenu(This,p) (This)->lpVtbl->get_oncontextmenu(This,p)
#define IHTMLWindow7_put_ondblclick(This,v) (This)->lpVtbl->put_ondblclick(This,v)
#define IHTMLWindow7_get_ondblclick(This,p) (This)->lpVtbl->get_ondblclick(This,p)
#define IHTMLWindow7_put_ondrag(This,v) (This)->lpVtbl->put_ondrag(This,v)
#define IHTMLWindow7_get_ondrag(This,p) (This)->lpVtbl->get_ondrag(This,p)
#define IHTMLWindow7_put_ondragend(This,v) (This)->lpVtbl->put_ondragend(This,v)
#define IHTMLWindow7_get_ondragend(This,p) (This)->lpVtbl->get_ondragend(This,p)
#define IHTMLWindow7_put_ondragenter(This,v) (This)->lpVtbl->put_ondragenter(This,v)
#define IHTMLWindow7_get_ondragenter(This,p) (This)->lpVtbl->get_ondragenter(This,p)
#define IHTMLWindow7_put_ondragleave(This,v) (This)->lpVtbl->put_ondragleave(This,v)
#define IHTMLWindow7_get_ondragleave(This,p) (This)->lpVtbl->get_ondragleave(This,p)
#define IHTMLWindow7_put_ondragover(This,v) (This)->lpVtbl->put_ondragover(This,v)
#define IHTMLWindow7_get_ondragover(This,p) (This)->lpVtbl->get_ondragover(This,p)
#define IHTMLWindow7_put_ondragstart(This,v) (This)->lpVtbl->put_ondragstart(This,v)
#define IHTMLWindow7_get_ondragstart(This,p) (This)->lpVtbl->get_ondragstart(This,p)
#define IHTMLWindow7_put_ondrop(This,v) (This)->lpVtbl->put_ondrop(This,v)
#define IHTMLWindow7_get_ondrop(This,p) (This)->lpVtbl->get_ondrop(This,p)
#define IHTMLWindow7_put_ondurationchange(This,v) (This)->lpVtbl->put_ondurationchange(This,v)
#define IHTMLWindow7_get_ondurationchange(This,p) (This)->lpVtbl->get_ondurationchange(This,p)
#define IHTMLWindow7_put_onfocusin(This,v) (This)->lpVtbl->put_onfocusin(This,v)
#define IHTMLWindow7_get_onfocusin(This,p) (This)->lpVtbl->get_onfocusin(This,p)
#define IHTMLWindow7_put_onfocusout(This,v) (This)->lpVtbl->put_onfocusout(This,v)
#define IHTMLWindow7_get_onfocusout(This,p) (This)->lpVtbl->get_onfocusout(This,p)
#define IHTMLWindow7_put_oninput(This,v) (This)->lpVtbl->put_oninput(This,v)
#define IHTMLWindow7_get_oninput(This,p) (This)->lpVtbl->get_oninput(This,p)
#define IHTMLWindow7_put_onemptied(This,v) (This)->lpVtbl->put_onemptied(This,v)
#define IHTMLWindow7_get_onemptied(This,p) (This)->lpVtbl->get_onemptied(This,p)
#define IHTMLWindow7_put_onended(This,v) (This)->lpVtbl->put_onended(This,v)
#define IHTMLWindow7_get_onended(This,p) (This)->lpVtbl->get_onended(This,p)
#define IHTMLWindow7_put_onkeydown(This,v) (This)->lpVtbl->put_onkeydown(This,v)
#define IHTMLWindow7_get_onkeydown(This,p) (This)->lpVtbl->get_onkeydown(This,p)
#define IHTMLWindow7_put_onkeypress(This,v) (This)->lpVtbl->put_onkeypress(This,v)
#define IHTMLWindow7_get_onkeypress(This,p) (This)->lpVtbl->get_onkeypress(This,p)
#define IHTMLWindow7_put_onkeyup(This,v) (This)->lpVtbl->put_onkeyup(This,v)
#define IHTMLWindow7_get_onkeyup(This,p) (This)->lpVtbl->get_onkeyup(This,p)
#define IHTMLWindow7_put_onloadeddata(This,v) (This)->lpVtbl->put_onloadeddata(This,v)
#define IHTMLWindow7_get_onloadeddata(This,p) (This)->lpVtbl->get_onloadeddata(This,p)
#define IHTMLWindow7_put_onloadedmetadata(This,v) (This)->lpVtbl->put_onloadedmetadata(This,v)
#define IHTMLWindow7_get_onloadedmetadata(This,p) (This)->lpVtbl->get_onloadedmetadata(This,p)
#define IHTMLWindow7_put_onloadstart(This,v) (This)->lpVtbl->put_onloadstart(This,v)
#define IHTMLWindow7_get_onloadstart(This,p) (This)->lpVtbl->get_onloadstart(This,p)
#define IHTMLWindow7_put_onmousedown(This,v) (This)->lpVtbl->put_onmousedown(This,v)
#define IHTMLWindow7_get_onmousedown(This,p) (This)->lpVtbl->get_onmousedown(This,p)
#define IHTMLWindow7_put_onmouseenter(This,v) (This)->lpVtbl->put_onmouseenter(This,v)
#define IHTMLWindow7_get_onmouseenter(This,p) (This)->lpVtbl->get_onmouseenter(This,p)
#define IHTMLWindow7_put_onmouseleave(This,v) (This)->lpVtbl->put_onmouseleave(This,v)
#define IHTMLWindow7_get_onmouseleave(This,p) (This)->lpVtbl->get_onmouseleave(This,p)
#define IHTMLWindow7_put_onmousemove(This,v) (This)->lpVtbl->put_onmousemove(This,v)
#define IHTMLWindow7_get_onmousemove(This,p) (This)->lpVtbl->get_onmousemove(This,p)
#define IHTMLWindow7_put_onmouseout(This,v) (This)->lpVtbl->put_onmouseout(This,v)
#define IHTMLWindow7_get_onmouseout(This,p) (This)->lpVtbl->get_onmouseout(This,p)
#define IHTMLWindow7_put_onmouseover(This,v) (This)->lpVtbl->put_onmouseover(This,v)
#define IHTMLWindow7_get_onmouseover(This,p) (This)->lpVtbl->get_onmouseover(This,p)
#define IHTMLWindow7_put_onmouseup(This,v) (This)->lpVtbl->put_onmouseup(This,v)
#define IHTMLWindow7_get_onmouseup(This,p) (This)->lpVtbl->get_onmouseup(This,p)
#define IHTMLWindow7_put_onmousewheel(This,v) (This)->lpVtbl->put_onmousewheel(This,v)
#define IHTMLWindow7_get_onmousewheel(This,p) (This)->lpVtbl->get_onmousewheel(This,p)
#define IHTMLWindow7_put_onoffline(This,v) (This)->lpVtbl->put_onoffline(This,v)
#define IHTMLWindow7_get_onoffline(This,p) (This)->lpVtbl->get_onoffline(This,p)
#define IHTMLWindow7_put_ononline(This,v) (This)->lpVtbl->put_ononline(This,v)
#define IHTMLWindow7_get_ononline(This,p) (This)->lpVtbl->get_ononline(This,p)
#define IHTMLWindow7_put_onprogress(This,v) (This)->lpVtbl->put_onprogress(This,v)
#define IHTMLWindow7_get_onprogress(This,p) (This)->lpVtbl->get_onprogress(This,p)
#define IHTMLWindow7_put_onratechange(This,v) (This)->lpVtbl->put_onratechange(This,v)
#define IHTMLWindow7_get_onratechange(This,p) (This)->lpVtbl->get_onratechange(This,p)
#define IHTMLWindow7_put_onreadystatechange(This,v) (This)->lpVtbl->put_onreadystatechange(This,v)
#define IHTMLWindow7_get_onreadystatechange(This,p) (This)->lpVtbl->get_onreadystatechange(This,p)
#define IHTMLWindow7_put_onreset(This,v) (This)->lpVtbl->put_onreset(This,v)
#define IHTMLWindow7_get_onreset(This,p) (This)->lpVtbl->get_onreset(This,p)
#define IHTMLWindow7_put_onseeked(This,v) (This)->lpVtbl->put_onseeked(This,v)
#define IHTMLWindow7_get_onseeked(This,p) (This)->lpVtbl->get_onseeked(This,p)
#define IHTMLWindow7_put_onseeking(This,v) (This)->lpVtbl->put_onseeking(This,v)
#define IHTMLWindow7_get_onseeking(This,p) (This)->lpVtbl->get_onseeking(This,p)
#define IHTMLWindow7_put_onselect(This,v) (This)->lpVtbl->put_onselect(This,v)
#define IHTMLWindow7_get_onselect(This,p) (This)->lpVtbl->get_onselect(This,p)
#define IHTMLWindow7_put_onstalled(This,v) (This)->lpVtbl->put_onstalled(This,v)
#define IHTMLWindow7_get_onstalled(This,p) (This)->lpVtbl->get_onstalled(This,p)
#define IHTMLWindow7_put_onstorage(This,v) (This)->lpVtbl->put_onstorage(This,v)
#define IHTMLWindow7_get_onstorage(This,p) (This)->lpVtbl->get_onstorage(This,p)
#define IHTMLWindow7_put_onsubmit(This,v) (This)->lpVtbl->put_onsubmit(This,v)
#define IHTMLWindow7_get_onsubmit(This,p) (This)->lpVtbl->get_onsubmit(This,p)
#define IHTMLWindow7_put_onsuspend(This,v) (This)->lpVtbl->put_onsuspend(This,v)
#define IHTMLWindow7_get_onsuspend(This,p) (This)->lpVtbl->get_onsuspend(This,p)
#define IHTMLWindow7_put_ontimeupdate(This,v) (This)->lpVtbl->put_ontimeupdate(This,v)
#define IHTMLWindow7_get_ontimeupdate(This,p) (This)->lpVtbl->get_ontimeupdate(This,p)
#define IHTMLWindow7_put_onpause(This,v) (This)->lpVtbl->put_onpause(This,v)
#define IHTMLWindow7_get_onpause(This,p) (This)->lpVtbl->get_onpause(This,p)
#define IHTMLWindow7_put_onplay(This,v) (This)->lpVtbl->put_onplay(This,v)
#define IHTMLWindow7_get_onplay(This,p) (This)->lpVtbl->get_onplay(This,p)
#define IHTMLWindow7_put_onplaying(This,v) (This)->lpVtbl->put_onplaying(This,v)
#define IHTMLWindow7_get_onplaying(This,p) (This)->lpVtbl->get_onplaying(This,p)
#define IHTMLWindow7_put_onvolumechange(This,v) (This)->lpVtbl->put_onvolumechange(This,v)
#define IHTMLWindow7_get_onvolumechange(This,p) (This)->lpVtbl->get_onvolumechange(This,p)
#define IHTMLWindow7_put_onwaiting(This,v) (This)->lpVtbl->put_onwaiting(This,v)
#define IHTMLWindow7_get_onwaiting(This,p) (This)->lpVtbl->get_onwaiting(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLWindow7_QueryInterface(IHTMLWindow7* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLWindow7_AddRef(IHTMLWindow7* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLWindow7_Release(IHTMLWindow7* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLWindow7_GetTypeInfoCount(IHTMLWindow7* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLWindow7_GetTypeInfo(IHTMLWindow7* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLWindow7_GetIDsOfNames(IHTMLWindow7* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLWindow7_Invoke(IHTMLWindow7* 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);
}
/*** IHTMLWindow7 methods ***/
static FORCEINLINE HRESULT IHTMLWindow7_getSelection(IHTMLWindow7* This,IHTMLSelection **ppIHTMLSelection) {
    return This->lpVtbl->getSelection(This,ppIHTMLSelection);
}
static FORCEINLINE HRESULT IHTMLWindow7_getComputedStyle(IHTMLWindow7* This,IHTMLDOMNode *varArgIn,BSTR bstrPseudoElt,IHTMLCSSStyleDeclaration **ppComputedStyle) {
    return This->lpVtbl->getComputedStyle(This,varArgIn,bstrPseudoElt,ppComputedStyle);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_styleMedia(IHTMLWindow7* This,IHTMLStyleMedia **p) {
    return This->lpVtbl->get_styleMedia(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_performance(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_performance(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_performance(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_performance(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_innerWidth(IHTMLWindow7* This,LONG *p) {
    return This->lpVtbl->get_innerWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_innerHeight(IHTMLWindow7* This,LONG *p) {
    return This->lpVtbl->get_innerHeight(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_pageXOffset(IHTMLWindow7* This,LONG *p) {
    return This->lpVtbl->get_pageXOffset(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_pageYOffset(IHTMLWindow7* This,LONG *p) {
    return This->lpVtbl->get_pageYOffset(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_screenX(IHTMLWindow7* This,LONG *p) {
    return This->lpVtbl->get_screenX(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_screenY(IHTMLWindow7* This,LONG *p) {
    return This->lpVtbl->get_screenY(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_outerWidth(IHTMLWindow7* This,LONG *p) {
    return This->lpVtbl->get_outerWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_outerHeight(IHTMLWindow7* This,LONG *p) {
    return This->lpVtbl->get_outerHeight(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onabort(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onabort(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onabort(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onabort(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_oncanplay(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_oncanplay(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_oncanplay(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_oncanplay(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_oncanplaythrough(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_oncanplaythrough(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_oncanplaythrough(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_oncanplaythrough(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onchange(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onchange(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onchange(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onchange(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onclick(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onclick(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onclick(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onclick(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_oncontextmenu(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_oncontextmenu(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_oncontextmenu(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_oncontextmenu(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_ondblclick(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_ondblclick(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_ondblclick(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_ondblclick(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_ondrag(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_ondrag(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_ondrag(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_ondrag(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_ondragend(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_ondragend(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_ondragend(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_ondragend(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_ondragenter(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_ondragenter(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_ondragenter(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_ondragenter(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_ondragleave(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_ondragleave(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_ondragleave(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_ondragleave(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_ondragover(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_ondragover(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_ondragover(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_ondragover(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_ondragstart(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_ondragstart(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_ondragstart(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_ondragstart(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_ondrop(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_ondrop(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_ondrop(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_ondrop(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_ondurationchange(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_ondurationchange(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_ondurationchange(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_ondurationchange(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onfocusin(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onfocusin(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onfocusin(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onfocusin(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onfocusout(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onfocusout(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onfocusout(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onfocusout(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_oninput(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_oninput(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_oninput(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_oninput(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onemptied(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onemptied(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onemptied(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onemptied(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onended(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onended(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onended(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onended(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onkeydown(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onkeydown(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onkeydown(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onkeydown(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onkeypress(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onkeypress(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onkeypress(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onkeypress(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onkeyup(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onkeyup(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onkeyup(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onkeyup(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onloadeddata(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onloadeddata(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onloadeddata(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onloadeddata(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onloadedmetadata(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onloadedmetadata(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onloadedmetadata(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onloadedmetadata(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onloadstart(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onloadstart(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onloadstart(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onloadstart(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onmousedown(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onmousedown(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onmousedown(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onmousedown(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onmouseenter(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onmouseenter(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onmouseenter(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onmouseenter(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onmouseleave(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onmouseleave(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onmouseleave(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onmouseleave(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onmousemove(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onmousemove(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onmousemove(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onmousemove(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onmouseout(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onmouseout(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onmouseout(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onmouseout(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onmouseover(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onmouseover(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onmouseover(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onmouseover(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onmouseup(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onmouseup(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onmouseup(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onmouseup(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onmousewheel(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onmousewheel(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onmousewheel(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onmousewheel(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onoffline(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onoffline(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onoffline(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onoffline(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_ononline(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_ononline(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_ononline(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_ononline(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onprogress(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onprogress(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onprogress(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onprogress(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onratechange(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onratechange(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onratechange(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onratechange(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onreadystatechange(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onreadystatechange(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onreadystatechange(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onreadystatechange(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onreset(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onreset(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onreset(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onreset(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onseeked(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onseeked(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onseeked(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onseeked(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onseeking(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onseeking(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onseeking(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onseeking(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onselect(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onselect(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onselect(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onselect(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onstalled(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onstalled(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onstalled(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onstalled(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onstorage(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onstorage(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onstorage(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onstorage(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onsubmit(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onsubmit(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onsubmit(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onsubmit(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onsuspend(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onsuspend(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onsuspend(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onsuspend(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_ontimeupdate(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_ontimeupdate(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_ontimeupdate(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_ontimeupdate(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onpause(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onpause(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onpause(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onpause(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onplay(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onplay(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onplay(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onplay(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onplaying(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onplaying(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onplaying(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onplaying(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onvolumechange(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onvolumechange(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onvolumechange(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onvolumechange(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow7_put_onwaiting(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onwaiting(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow7_get_onwaiting(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onwaiting(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLWindow7_getSelection_Proxy(
    IHTMLWindow7* This,
    IHTMLSelection **ppIHTMLSelection);
void __RPC_STUB IHTMLWindow7_getSelection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_getComputedStyle_Proxy(
    IHTMLWindow7* This,
    IHTMLDOMNode *varArgIn,
    BSTR bstrPseudoElt,
    IHTMLCSSStyleDeclaration **ppComputedStyle);
void __RPC_STUB IHTMLWindow7_getComputedStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_styleMedia_Proxy(
    IHTMLWindow7* This,
    IHTMLStyleMedia **p);
void __RPC_STUB IHTMLWindow7_get_styleMedia_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_performance_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_performance_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_performance_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_performance_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_innerWidth_Proxy(
    IHTMLWindow7* This,
    LONG *p);
void __RPC_STUB IHTMLWindow7_get_innerWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_innerHeight_Proxy(
    IHTMLWindow7* This,
    LONG *p);
void __RPC_STUB IHTMLWindow7_get_innerHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_pageXOffset_Proxy(
    IHTMLWindow7* This,
    LONG *p);
void __RPC_STUB IHTMLWindow7_get_pageXOffset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_pageYOffset_Proxy(
    IHTMLWindow7* This,
    LONG *p);
void __RPC_STUB IHTMLWindow7_get_pageYOffset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_screenX_Proxy(
    IHTMLWindow7* This,
    LONG *p);
void __RPC_STUB IHTMLWindow7_get_screenX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_screenY_Proxy(
    IHTMLWindow7* This,
    LONG *p);
void __RPC_STUB IHTMLWindow7_get_screenY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_outerWidth_Proxy(
    IHTMLWindow7* This,
    LONG *p);
void __RPC_STUB IHTMLWindow7_get_outerWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_outerHeight_Proxy(
    IHTMLWindow7* This,
    LONG *p);
void __RPC_STUB IHTMLWindow7_get_outerHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onabort_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onabort_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onabort_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onabort_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_oncanplay_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_oncanplay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_oncanplay_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_oncanplay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_oncanplaythrough_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_oncanplaythrough_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_oncanplaythrough_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_oncanplaythrough_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onchange_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onchange_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onclick_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onclick_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onclick_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onclick_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_oncontextmenu_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_oncontextmenu_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_oncontextmenu_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_oncontextmenu_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_ondblclick_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_ondblclick_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_ondblclick_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_ondblclick_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_ondrag_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_ondrag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_ondrag_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_ondrag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_ondragend_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_ondragend_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_ondragend_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_ondragend_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_ondragenter_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_ondragenter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_ondragenter_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_ondragenter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_ondragleave_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_ondragleave_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_ondragleave_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_ondragleave_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_ondragover_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_ondragover_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_ondragover_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_ondragover_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_ondragstart_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_ondragstart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_ondragstart_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_ondragstart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_ondrop_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_ondrop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_ondrop_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_ondrop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_ondurationchange_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_ondurationchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_ondurationchange_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_ondurationchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onfocusin_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onfocusin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onfocusin_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onfocusin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onfocusout_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onfocusout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onfocusout_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onfocusout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_oninput_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_oninput_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_oninput_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_oninput_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onemptied_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onemptied_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onemptied_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onemptied_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onended_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onended_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onended_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onended_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onkeydown_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onkeydown_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onkeydown_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onkeydown_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onkeypress_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onkeypress_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onkeypress_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onkeypress_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onkeyup_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onkeyup_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onkeyup_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onkeyup_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onloadeddata_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onloadeddata_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onloadeddata_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onloadeddata_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onloadedmetadata_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onloadedmetadata_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onloadedmetadata_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onloadedmetadata_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onloadstart_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onloadstart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onloadstart_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onloadstart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onmousedown_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onmousedown_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onmousedown_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onmousedown_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onmouseenter_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onmouseenter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onmouseenter_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onmouseenter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onmouseleave_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onmouseleave_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onmouseleave_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onmouseleave_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onmousemove_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onmousemove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onmousemove_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onmousemove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onmouseout_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onmouseout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onmouseout_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onmouseout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onmouseover_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onmouseover_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onmouseover_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onmouseover_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onmouseup_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onmouseup_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onmouseup_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onmouseup_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onmousewheel_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onmousewheel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onmousewheel_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onmousewheel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onoffline_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onoffline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onoffline_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onoffline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_ononline_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_ononline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_ononline_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_ononline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onprogress_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onprogress_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onprogress_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onprogress_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onratechange_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onratechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onratechange_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onratechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onreadystatechange_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onreadystatechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onreadystatechange_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onreadystatechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onreset_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onreset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onreset_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onreset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onseeked_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onseeked_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onseeked_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onseeked_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onseeking_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onseeking_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onseeking_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onseeking_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onselect_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onselect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onselect_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onselect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onstalled_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onstalled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onstalled_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onstalled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onstorage_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onstorage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onstorage_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onstorage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onsubmit_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onsubmit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onsubmit_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onsubmit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onsuspend_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onsuspend_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onsuspend_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onsuspend_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_ontimeupdate_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_ontimeupdate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_ontimeupdate_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_ontimeupdate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onpause_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onpause_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onpause_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onpause_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onplay_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onplay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onplay_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onplay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onplaying_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onplaying_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onplaying_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onplaying_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onvolumechange_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onvolumechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onvolumechange_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onvolumechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_put_onwaiting_Proxy(
    IHTMLWindow7* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow7_put_onwaiting_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow7_get_onwaiting_Proxy(
    IHTMLWindow7* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow7_get_onwaiting_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLWindow7_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLWindow8 interface
 */
#ifndef __IHTMLWindow8_INTERFACE_DEFINED__
#define __IHTMLWindow8_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLWindow8, 0x305107ab, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305107ab-98b5-11cf-bb82-00aa00bdce0b")
IHTMLWindow8 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_onmspointerdown(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmspointerdown(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmspointermove(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmspointermove(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmspointerup(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmspointerup(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmspointerover(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmspointerover(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmspointerout(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmspointerout(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmspointercancel(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmspointercancel(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmspointerhover(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmspointerhover(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmsgesturestart(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmsgesturestart(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmsgesturechange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmsgesturechange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmsgestureend(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmsgestureend(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmsgesturehold(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmsgesturehold(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmsgesturetap(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmsgesturetap(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmsgesturedoubletap(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmsgesturedoubletap(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmsinertiastart(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmsinertiastart(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_applicationCache(
        IHTMLApplicationCache **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onpopstate(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onpopstate(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLWindow8, 0x305107ab, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLWindow8Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLWindow8* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLWindow8* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLWindow8* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLWindow8* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLWindow8* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLWindow8* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLWindow8* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLWindow8 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_onmspointerdown)(
        IHTMLWindow8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmspointerdown)(
        IHTMLWindow8* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmspointermove)(
        IHTMLWindow8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmspointermove)(
        IHTMLWindow8* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmspointerup)(
        IHTMLWindow8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmspointerup)(
        IHTMLWindow8* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmspointerover)(
        IHTMLWindow8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmspointerover)(
        IHTMLWindow8* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmspointerout)(
        IHTMLWindow8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmspointerout)(
        IHTMLWindow8* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmspointercancel)(
        IHTMLWindow8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmspointercancel)(
        IHTMLWindow8* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmspointerhover)(
        IHTMLWindow8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmspointerhover)(
        IHTMLWindow8* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmsgesturestart)(
        IHTMLWindow8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmsgesturestart)(
        IHTMLWindow8* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmsgesturechange)(
        IHTMLWindow8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmsgesturechange)(
        IHTMLWindow8* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmsgestureend)(
        IHTMLWindow8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmsgestureend)(
        IHTMLWindow8* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmsgesturehold)(
        IHTMLWindow8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmsgesturehold)(
        IHTMLWindow8* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmsgesturetap)(
        IHTMLWindow8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmsgesturetap)(
        IHTMLWindow8* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmsgesturedoubletap)(
        IHTMLWindow8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmsgesturedoubletap)(
        IHTMLWindow8* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmsinertiastart)(
        IHTMLWindow8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmsinertiastart)(
        IHTMLWindow8* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_applicationCache)(
        IHTMLWindow8* This,
        IHTMLApplicationCache **p);

    HRESULT (STDMETHODCALLTYPE *put_onpopstate)(
        IHTMLWindow8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onpopstate)(
        IHTMLWindow8* This,
        VARIANT *p);

    END_INTERFACE
} IHTMLWindow8Vtbl;
interface IHTMLWindow8 {
    CONST_VTBL IHTMLWindow8Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLWindow8_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLWindow8_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLWindow8_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLWindow8_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLWindow8_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLWindow8_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLWindow8_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLWindow8 methods ***/
#define IHTMLWindow8_put_onmspointerdown(This,v) (This)->lpVtbl->put_onmspointerdown(This,v)
#define IHTMLWindow8_get_onmspointerdown(This,p) (This)->lpVtbl->get_onmspointerdown(This,p)
#define IHTMLWindow8_put_onmspointermove(This,v) (This)->lpVtbl->put_onmspointermove(This,v)
#define IHTMLWindow8_get_onmspointermove(This,p) (This)->lpVtbl->get_onmspointermove(This,p)
#define IHTMLWindow8_put_onmspointerup(This,v) (This)->lpVtbl->put_onmspointerup(This,v)
#define IHTMLWindow8_get_onmspointerup(This,p) (This)->lpVtbl->get_onmspointerup(This,p)
#define IHTMLWindow8_put_onmspointerover(This,v) (This)->lpVtbl->put_onmspointerover(This,v)
#define IHTMLWindow8_get_onmspointerover(This,p) (This)->lpVtbl->get_onmspointerover(This,p)
#define IHTMLWindow8_put_onmspointerout(This,v) (This)->lpVtbl->put_onmspointerout(This,v)
#define IHTMLWindow8_get_onmspointerout(This,p) (This)->lpVtbl->get_onmspointerout(This,p)
#define IHTMLWindow8_put_onmspointercancel(This,v) (This)->lpVtbl->put_onmspointercancel(This,v)
#define IHTMLWindow8_get_onmspointercancel(This,p) (This)->lpVtbl->get_onmspointercancel(This,p)
#define IHTMLWindow8_put_onmspointerhover(This,v) (This)->lpVtbl->put_onmspointerhover(This,v)
#define IHTMLWindow8_get_onmspointerhover(This,p) (This)->lpVtbl->get_onmspointerhover(This,p)
#define IHTMLWindow8_put_onmsgesturestart(This,v) (This)->lpVtbl->put_onmsgesturestart(This,v)
#define IHTMLWindow8_get_onmsgesturestart(This,p) (This)->lpVtbl->get_onmsgesturestart(This,p)
#define IHTMLWindow8_put_onmsgesturechange(This,v) (This)->lpVtbl->put_onmsgesturechange(This,v)
#define IHTMLWindow8_get_onmsgesturechange(This,p) (This)->lpVtbl->get_onmsgesturechange(This,p)
#define IHTMLWindow8_put_onmsgestureend(This,v) (This)->lpVtbl->put_onmsgestureend(This,v)
#define IHTMLWindow8_get_onmsgestureend(This,p) (This)->lpVtbl->get_onmsgestureend(This,p)
#define IHTMLWindow8_put_onmsgesturehold(This,v) (This)->lpVtbl->put_onmsgesturehold(This,v)
#define IHTMLWindow8_get_onmsgesturehold(This,p) (This)->lpVtbl->get_onmsgesturehold(This,p)
#define IHTMLWindow8_put_onmsgesturetap(This,v) (This)->lpVtbl->put_onmsgesturetap(This,v)
#define IHTMLWindow8_get_onmsgesturetap(This,p) (This)->lpVtbl->get_onmsgesturetap(This,p)
#define IHTMLWindow8_put_onmsgesturedoubletap(This,v) (This)->lpVtbl->put_onmsgesturedoubletap(This,v)
#define IHTMLWindow8_get_onmsgesturedoubletap(This,p) (This)->lpVtbl->get_onmsgesturedoubletap(This,p)
#define IHTMLWindow8_put_onmsinertiastart(This,v) (This)->lpVtbl->put_onmsinertiastart(This,v)
#define IHTMLWindow8_get_onmsinertiastart(This,p) (This)->lpVtbl->get_onmsinertiastart(This,p)
#define IHTMLWindow8_get_applicationCache(This,p) (This)->lpVtbl->get_applicationCache(This,p)
#define IHTMLWindow8_put_onpopstate(This,v) (This)->lpVtbl->put_onpopstate(This,v)
#define IHTMLWindow8_get_onpopstate(This,p) (This)->lpVtbl->get_onpopstate(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLWindow8_QueryInterface(IHTMLWindow8* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLWindow8_AddRef(IHTMLWindow8* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLWindow8_Release(IHTMLWindow8* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLWindow8_GetTypeInfoCount(IHTMLWindow8* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLWindow8_GetTypeInfo(IHTMLWindow8* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLWindow8_GetIDsOfNames(IHTMLWindow8* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLWindow8_Invoke(IHTMLWindow8* 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);
}
/*** IHTMLWindow8 methods ***/
static FORCEINLINE HRESULT IHTMLWindow8_put_onmspointerdown(IHTMLWindow8* This,VARIANT v) {
    return This->lpVtbl->put_onmspointerdown(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow8_get_onmspointerdown(IHTMLWindow8* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointerdown(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow8_put_onmspointermove(IHTMLWindow8* This,VARIANT v) {
    return This->lpVtbl->put_onmspointermove(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow8_get_onmspointermove(IHTMLWindow8* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointermove(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow8_put_onmspointerup(IHTMLWindow8* This,VARIANT v) {
    return This->lpVtbl->put_onmspointerup(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow8_get_onmspointerup(IHTMLWindow8* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointerup(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow8_put_onmspointerover(IHTMLWindow8* This,VARIANT v) {
    return This->lpVtbl->put_onmspointerover(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow8_get_onmspointerover(IHTMLWindow8* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointerover(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow8_put_onmspointerout(IHTMLWindow8* This,VARIANT v) {
    return This->lpVtbl->put_onmspointerout(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow8_get_onmspointerout(IHTMLWindow8* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointerout(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow8_put_onmspointercancel(IHTMLWindow8* This,VARIANT v) {
    return This->lpVtbl->put_onmspointercancel(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow8_get_onmspointercancel(IHTMLWindow8* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointercancel(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow8_put_onmspointerhover(IHTMLWindow8* This,VARIANT v) {
    return This->lpVtbl->put_onmspointerhover(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow8_get_onmspointerhover(IHTMLWindow8* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointerhover(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow8_put_onmsgesturestart(IHTMLWindow8* This,VARIANT v) {
    return This->lpVtbl->put_onmsgesturestart(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow8_get_onmsgesturestart(IHTMLWindow8* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgesturestart(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow8_put_onmsgesturechange(IHTMLWindow8* This,VARIANT v) {
    return This->lpVtbl->put_onmsgesturechange(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow8_get_onmsgesturechange(IHTMLWindow8* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgesturechange(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow8_put_onmsgestureend(IHTMLWindow8* This,VARIANT v) {
    return This->lpVtbl->put_onmsgestureend(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow8_get_onmsgestureend(IHTMLWindow8* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgestureend(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow8_put_onmsgesturehold(IHTMLWindow8* This,VARIANT v) {
    return This->lpVtbl->put_onmsgesturehold(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow8_get_onmsgesturehold(IHTMLWindow8* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgesturehold(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow8_put_onmsgesturetap(IHTMLWindow8* This,VARIANT v) {
    return This->lpVtbl->put_onmsgesturetap(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow8_get_onmsgesturetap(IHTMLWindow8* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgesturetap(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow8_put_onmsgesturedoubletap(IHTMLWindow8* This,VARIANT v) {
    return This->lpVtbl->put_onmsgesturedoubletap(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow8_get_onmsgesturedoubletap(IHTMLWindow8* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgesturedoubletap(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow8_put_onmsinertiastart(IHTMLWindow8* This,VARIANT v) {
    return This->lpVtbl->put_onmsinertiastart(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow8_get_onmsinertiastart(IHTMLWindow8* This,VARIANT *p) {
    return This->lpVtbl->get_onmsinertiastart(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow8_get_applicationCache(IHTMLWindow8* This,IHTMLApplicationCache **p) {
    return This->lpVtbl->get_applicationCache(This,p);
}
static FORCEINLINE HRESULT IHTMLWindow8_put_onpopstate(IHTMLWindow8* This,VARIANT v) {
    return This->lpVtbl->put_onpopstate(This,v);
}
static FORCEINLINE HRESULT IHTMLWindow8_get_onpopstate(IHTMLWindow8* This,VARIANT *p) {
    return This->lpVtbl->get_onpopstate(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLWindow8_put_onmspointerdown_Proxy(
    IHTMLWindow8* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow8_put_onmspointerdown_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow8_get_onmspointerdown_Proxy(
    IHTMLWindow8* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow8_get_onmspointerdown_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow8_put_onmspointermove_Proxy(
    IHTMLWindow8* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow8_put_onmspointermove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow8_get_onmspointermove_Proxy(
    IHTMLWindow8* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow8_get_onmspointermove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow8_put_onmspointerup_Proxy(
    IHTMLWindow8* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow8_put_onmspointerup_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow8_get_onmspointerup_Proxy(
    IHTMLWindow8* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow8_get_onmspointerup_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow8_put_onmspointerover_Proxy(
    IHTMLWindow8* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow8_put_onmspointerover_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow8_get_onmspointerover_Proxy(
    IHTMLWindow8* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow8_get_onmspointerover_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow8_put_onmspointerout_Proxy(
    IHTMLWindow8* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow8_put_onmspointerout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow8_get_onmspointerout_Proxy(
    IHTMLWindow8* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow8_get_onmspointerout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow8_put_onmspointercancel_Proxy(
    IHTMLWindow8* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow8_put_onmspointercancel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow8_get_onmspointercancel_Proxy(
    IHTMLWindow8* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow8_get_onmspointercancel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow8_put_onmspointerhover_Proxy(
    IHTMLWindow8* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow8_put_onmspointerhover_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow8_get_onmspointerhover_Proxy(
    IHTMLWindow8* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow8_get_onmspointerhover_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow8_put_onmsgesturestart_Proxy(
    IHTMLWindow8* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow8_put_onmsgesturestart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow8_get_onmsgesturestart_Proxy(
    IHTMLWindow8* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow8_get_onmsgesturestart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow8_put_onmsgesturechange_Proxy(
    IHTMLWindow8* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow8_put_onmsgesturechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow8_get_onmsgesturechange_Proxy(
    IHTMLWindow8* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow8_get_onmsgesturechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow8_put_onmsgestureend_Proxy(
    IHTMLWindow8* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow8_put_onmsgestureend_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow8_get_onmsgestureend_Proxy(
    IHTMLWindow8* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow8_get_onmsgestureend_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow8_put_onmsgesturehold_Proxy(
    IHTMLWindow8* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow8_put_onmsgesturehold_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow8_get_onmsgesturehold_Proxy(
    IHTMLWindow8* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow8_get_onmsgesturehold_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow8_put_onmsgesturetap_Proxy(
    IHTMLWindow8* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow8_put_onmsgesturetap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow8_get_onmsgesturetap_Proxy(
    IHTMLWindow8* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow8_get_onmsgesturetap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow8_put_onmsgesturedoubletap_Proxy(
    IHTMLWindow8* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow8_put_onmsgesturedoubletap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow8_get_onmsgesturedoubletap_Proxy(
    IHTMLWindow8* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow8_get_onmsgesturedoubletap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow8_put_onmsinertiastart_Proxy(
    IHTMLWindow8* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow8_put_onmsinertiastart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow8_get_onmsinertiastart_Proxy(
    IHTMLWindow8* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow8_get_onmsinertiastart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow8_get_applicationCache_Proxy(
    IHTMLWindow8* This,
    IHTMLApplicationCache **p);
void __RPC_STUB IHTMLWindow8_get_applicationCache_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow8_put_onpopstate_Proxy(
    IHTMLWindow8* This,
    VARIANT v);
void __RPC_STUB IHTMLWindow8_put_onpopstate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLWindow8_get_onpopstate_Proxy(
    IHTMLWindow8* This,
    VARIANT *p);
void __RPC_STUB IHTMLWindow8_get_onpopstate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLWindow8_INTERFACE_DEFINED__ */

/*****************************************************************************
 * FramesCollection coclass
 */

DEFINE_GUID(CLSID_FramesCollection, 0x3050f7f6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f7f6-98b5-11cf-bb82-00aa00bdce0b") FramesCollection;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(FramesCollection, 0x3050f7f6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CFramesCollection;
/*****************************************************************************
 * DispHTMLScreen dispinterface
 */
#ifndef __DispHTMLScreen_DISPINTERFACE_DEFINED__
#define __DispHTMLScreen_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLScreen, 0x3050f591, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f591-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLScreen : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLScreen, 0x3050f591, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLScreenVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLScreen* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLScreen* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLScreen* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLScreen* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLScreen* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLScreen* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLScreen* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLScreenVtbl;
interface DispHTMLScreen {
    CONST_VTBL DispHTMLScreenVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLScreen_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLScreen_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLScreen_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLScreen_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLScreen_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLScreen_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLScreen_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 DispHTMLScreen_QueryInterface(DispHTMLScreen* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLScreen_AddRef(DispHTMLScreen* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLScreen_Release(DispHTMLScreen* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLScreen_GetTypeInfoCount(DispHTMLScreen* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLScreen_GetTypeInfo(DispHTMLScreen* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLScreen_GetIDsOfNames(DispHTMLScreen* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLScreen_Invoke(DispHTMLScreen* 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  /* __DispHTMLScreen_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLScreen coclass
 */

DEFINE_GUID(CLSID_HTMLScreen, 0x3050f35d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f35d-98b5-11cf-bb82-00aa00bdce0b") HTMLScreen;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLScreen, 0x3050f35d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CScreen;
/*****************************************************************************
 * DispHTMLWindow2 dispinterface
 */
#ifndef __DispHTMLWindow2_DISPINTERFACE_DEFINED__
#define __DispHTMLWindow2_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLWindow2, 0x3050f55d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f55d-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLWindow2 : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLWindow2, 0x3050f55d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLWindow2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLWindow2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLWindow2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLWindow2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLWindow2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLWindow2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLWindow2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLWindow2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLWindow2Vtbl;
interface DispHTMLWindow2 {
    CONST_VTBL DispHTMLWindow2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLWindow2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLWindow2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLWindow2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLWindow2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLWindow2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLWindow2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLWindow2_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 DispHTMLWindow2_QueryInterface(DispHTMLWindow2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLWindow2_AddRef(DispHTMLWindow2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLWindow2_Release(DispHTMLWindow2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLWindow2_GetTypeInfoCount(DispHTMLWindow2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLWindow2_GetTypeInfo(DispHTMLWindow2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLWindow2_GetIDsOfNames(DispHTMLWindow2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLWindow2_Invoke(DispHTMLWindow2* 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  /* __DispHTMLWindow2_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLWindow2 coclass
 */

DEFINE_GUID(CLSID_HTMLWindow2, 0xd48a6ec6, 0x6a4a, 0x11cf, 0x94,0xa7, 0x44,0x45,0x53,0x54,0x00,0x00);

#ifdef __cplusplus
class DECLSPEC_UUID("d48a6ec6-6a4a-11cf-94a7-444553540000") HTMLWindow2;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLWindow2, 0xd48a6ec6, 0x6a4a, 0x11cf, 0x94,0xa7, 0x44,0x45,0x53,0x54,0x00,0x00)
#endif
#endif

EXTERN_C const GUID CLSID_CWindow;
/*****************************************************************************
 * DispHTMLWindowProxy dispinterface
 */
#ifndef __DispHTMLWindowProxy_DISPINTERFACE_DEFINED__
#define __DispHTMLWindowProxy_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLWindowProxy, 0x3050f55e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f55e-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLWindowProxy : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLWindowProxy, 0x3050f55e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLWindowProxyVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLWindowProxy* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLWindowProxy* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLWindowProxy* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLWindowProxy* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLWindowProxy* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLWindowProxy* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLWindowProxy* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLWindowProxyVtbl;
interface DispHTMLWindowProxy {
    CONST_VTBL DispHTMLWindowProxyVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLWindowProxy_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLWindowProxy_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLWindowProxy_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLWindowProxy_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLWindowProxy_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLWindowProxy_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLWindowProxy_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 DispHTMLWindowProxy_QueryInterface(DispHTMLWindowProxy* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLWindowProxy_AddRef(DispHTMLWindowProxy* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLWindowProxy_Release(DispHTMLWindowProxy* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLWindowProxy_GetTypeInfoCount(DispHTMLWindowProxy* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLWindowProxy_GetTypeInfo(DispHTMLWindowProxy* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLWindowProxy_GetIDsOfNames(DispHTMLWindowProxy* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLWindowProxy_Invoke(DispHTMLWindowProxy* 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  /* __DispHTMLWindowProxy_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLWindowProxy coclass
 */

DEFINE_GUID(CLSID_HTMLWindowProxy, 0x3050f391, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f391-98b5-11cf-bb82-00aa00bdce0b") HTMLWindowProxy;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLWindowProxy, 0x3050f391, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_COmWindowProxy;
/*****************************************************************************
 * IHTMLDocumentCompatibleInfo interface
 */
#ifndef __IHTMLDocumentCompatibleInfo_INTERFACE_DEFINED__
#define __IHTMLDocumentCompatibleInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDocumentCompatibleInfo, 0x3051041a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051041a-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDocumentCompatibleInfo : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_userAgent(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_version(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDocumentCompatibleInfo, 0x3051041a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDocumentCompatibleInfoVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLDocumentCompatibleInfo* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLDocumentCompatibleInfo* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLDocumentCompatibleInfo* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLDocumentCompatibleInfo* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLDocumentCompatibleInfo* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLDocumentCompatibleInfo* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLDocumentCompatibleInfo* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLDocumentCompatibleInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *get_userAgent)(
        IHTMLDocumentCompatibleInfo* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_version)(
        IHTMLDocumentCompatibleInfo* This,
        BSTR *p);

    END_INTERFACE
} IHTMLDocumentCompatibleInfoVtbl;
interface IHTMLDocumentCompatibleInfo {
    CONST_VTBL IHTMLDocumentCompatibleInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDocumentCompatibleInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDocumentCompatibleInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDocumentCompatibleInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDocumentCompatibleInfo_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDocumentCompatibleInfo_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDocumentCompatibleInfo_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDocumentCompatibleInfo_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDocumentCompatibleInfo methods ***/
#define IHTMLDocumentCompatibleInfo_get_userAgent(This,p) (This)->lpVtbl->get_userAgent(This,p)
#define IHTMLDocumentCompatibleInfo_get_version(This,p) (This)->lpVtbl->get_version(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDocumentCompatibleInfo_QueryInterface(IHTMLDocumentCompatibleInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDocumentCompatibleInfo_AddRef(IHTMLDocumentCompatibleInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDocumentCompatibleInfo_Release(IHTMLDocumentCompatibleInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDocumentCompatibleInfo_GetTypeInfoCount(IHTMLDocumentCompatibleInfo* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDocumentCompatibleInfo_GetTypeInfo(IHTMLDocumentCompatibleInfo* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDocumentCompatibleInfo_GetIDsOfNames(IHTMLDocumentCompatibleInfo* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDocumentCompatibleInfo_Invoke(IHTMLDocumentCompatibleInfo* 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);
}
/*** IHTMLDocumentCompatibleInfo methods ***/
static FORCEINLINE HRESULT IHTMLDocumentCompatibleInfo_get_userAgent(IHTMLDocumentCompatibleInfo* This,BSTR *p) {
    return This->lpVtbl->get_userAgent(This,p);
}
static FORCEINLINE HRESULT IHTMLDocumentCompatibleInfo_get_version(IHTMLDocumentCompatibleInfo* This,BSTR *p) {
    return This->lpVtbl->get_version(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDocumentCompatibleInfo_get_userAgent_Proxy(
    IHTMLDocumentCompatibleInfo* This,
    BSTR *p);
void __RPC_STUB IHTMLDocumentCompatibleInfo_get_userAgent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocumentCompatibleInfo_get_version_Proxy(
    IHTMLDocumentCompatibleInfo* This,
    BSTR *p);
void __RPC_STUB IHTMLDocumentCompatibleInfo_get_version_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDocumentCompatibleInfo_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLDocumentCompatibleInfoCollection interface
 */
#ifndef __IHTMLDocumentCompatibleInfoCollection_INTERFACE_DEFINED__
#define __IHTMLDocumentCompatibleInfoCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDocumentCompatibleInfoCollection, 0x30510418, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510418-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDocumentCompatibleInfoCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE item(
        LONG index,
        IHTMLDocumentCompatibleInfo **compatibleInfo) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDocumentCompatibleInfoCollection, 0x30510418, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDocumentCompatibleInfoCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLDocumentCompatibleInfoCollection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLDocumentCompatibleInfoCollection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLDocumentCompatibleInfoCollection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLDocumentCompatibleInfoCollection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLDocumentCompatibleInfoCollection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLDocumentCompatibleInfoCollection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLDocumentCompatibleInfoCollection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLDocumentCompatibleInfoCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLDocumentCompatibleInfoCollection* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLDocumentCompatibleInfoCollection* This,
        LONG index,
        IHTMLDocumentCompatibleInfo **compatibleInfo);

    END_INTERFACE
} IHTMLDocumentCompatibleInfoCollectionVtbl;
interface IHTMLDocumentCompatibleInfoCollection {
    CONST_VTBL IHTMLDocumentCompatibleInfoCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDocumentCompatibleInfoCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDocumentCompatibleInfoCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDocumentCompatibleInfoCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDocumentCompatibleInfoCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDocumentCompatibleInfoCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDocumentCompatibleInfoCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDocumentCompatibleInfoCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDocumentCompatibleInfoCollection methods ***/
#define IHTMLDocumentCompatibleInfoCollection_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLDocumentCompatibleInfoCollection_item(This,index,compatibleInfo) (This)->lpVtbl->item(This,index,compatibleInfo)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDocumentCompatibleInfoCollection_QueryInterface(IHTMLDocumentCompatibleInfoCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDocumentCompatibleInfoCollection_AddRef(IHTMLDocumentCompatibleInfoCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDocumentCompatibleInfoCollection_Release(IHTMLDocumentCompatibleInfoCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDocumentCompatibleInfoCollection_GetTypeInfoCount(IHTMLDocumentCompatibleInfoCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDocumentCompatibleInfoCollection_GetTypeInfo(IHTMLDocumentCompatibleInfoCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDocumentCompatibleInfoCollection_GetIDsOfNames(IHTMLDocumentCompatibleInfoCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDocumentCompatibleInfoCollection_Invoke(IHTMLDocumentCompatibleInfoCollection* 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);
}
/*** IHTMLDocumentCompatibleInfoCollection methods ***/
static FORCEINLINE HRESULT IHTMLDocumentCompatibleInfoCollection_get_length(IHTMLDocumentCompatibleInfoCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IHTMLDocumentCompatibleInfoCollection_item(IHTMLDocumentCompatibleInfoCollection* This,LONG index,IHTMLDocumentCompatibleInfo **compatibleInfo) {
    return This->lpVtbl->item(This,index,compatibleInfo);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDocumentCompatibleInfoCollection_get_length_Proxy(
    IHTMLDocumentCompatibleInfoCollection* This,
    LONG *p);
void __RPC_STUB IHTMLDocumentCompatibleInfoCollection_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocumentCompatibleInfoCollection_item_Proxy(
    IHTMLDocumentCompatibleInfoCollection* This,
    LONG index,
    IHTMLDocumentCompatibleInfo **compatibleInfo);
void __RPC_STUB IHTMLDocumentCompatibleInfoCollection_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDocumentCompatibleInfoCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLDocumentCompatibleInfo dispinterface
 */
#ifndef __DispHTMLDocumentCompatibleInfo_DISPINTERFACE_DEFINED__
#define __DispHTMLDocumentCompatibleInfo_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLDocumentCompatibleInfo, 0x3050f53e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f53e-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLDocumentCompatibleInfo : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLDocumentCompatibleInfo, 0x3050f53e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLDocumentCompatibleInfoVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLDocumentCompatibleInfo* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLDocumentCompatibleInfo* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLDocumentCompatibleInfo* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLDocumentCompatibleInfo* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLDocumentCompatibleInfo* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLDocumentCompatibleInfo* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLDocumentCompatibleInfo* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLDocumentCompatibleInfoVtbl;
interface DispHTMLDocumentCompatibleInfo {
    CONST_VTBL DispHTMLDocumentCompatibleInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLDocumentCompatibleInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLDocumentCompatibleInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLDocumentCompatibleInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLDocumentCompatibleInfo_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLDocumentCompatibleInfo_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLDocumentCompatibleInfo_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLDocumentCompatibleInfo_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 DispHTMLDocumentCompatibleInfo_QueryInterface(DispHTMLDocumentCompatibleInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLDocumentCompatibleInfo_AddRef(DispHTMLDocumentCompatibleInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLDocumentCompatibleInfo_Release(DispHTMLDocumentCompatibleInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLDocumentCompatibleInfo_GetTypeInfoCount(DispHTMLDocumentCompatibleInfo* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLDocumentCompatibleInfo_GetTypeInfo(DispHTMLDocumentCompatibleInfo* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLDocumentCompatibleInfo_GetIDsOfNames(DispHTMLDocumentCompatibleInfo* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLDocumentCompatibleInfo_Invoke(DispHTMLDocumentCompatibleInfo* 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  /* __DispHTMLDocumentCompatibleInfo_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLDocumentCompatibleInfo coclass
 */

DEFINE_GUID(CLSID_HTMLDocumentCompatibleInfo, 0x3051041b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3051041b-98b5-11cf-bb82-00aa00bdce0b") HTMLDocumentCompatibleInfo;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLDocumentCompatibleInfo, 0x3051041b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDocumentVersion;
/*****************************************************************************
 * DispHTMLDocumentCompatibleInfoCollection dispinterface
 */
#ifndef __DispHTMLDocumentCompatibleInfoCollection_DISPINTERFACE_DEFINED__
#define __DispHTMLDocumentCompatibleInfoCollection_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLDocumentCompatibleInfoCollection, 0x3050f53f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f53f-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLDocumentCompatibleInfoCollection : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLDocumentCompatibleInfoCollection, 0x3050f53f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLDocumentCompatibleInfoCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLDocumentCompatibleInfoCollection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLDocumentCompatibleInfoCollection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLDocumentCompatibleInfoCollection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLDocumentCompatibleInfoCollection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLDocumentCompatibleInfoCollection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLDocumentCompatibleInfoCollection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLDocumentCompatibleInfoCollection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLDocumentCompatibleInfoCollectionVtbl;
interface DispHTMLDocumentCompatibleInfoCollection {
    CONST_VTBL DispHTMLDocumentCompatibleInfoCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLDocumentCompatibleInfoCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLDocumentCompatibleInfoCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLDocumentCompatibleInfoCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLDocumentCompatibleInfoCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLDocumentCompatibleInfoCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLDocumentCompatibleInfoCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLDocumentCompatibleInfoCollection_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 DispHTMLDocumentCompatibleInfoCollection_QueryInterface(DispHTMLDocumentCompatibleInfoCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLDocumentCompatibleInfoCollection_AddRef(DispHTMLDocumentCompatibleInfoCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLDocumentCompatibleInfoCollection_Release(DispHTMLDocumentCompatibleInfoCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLDocumentCompatibleInfoCollection_GetTypeInfoCount(DispHTMLDocumentCompatibleInfoCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLDocumentCompatibleInfoCollection_GetTypeInfo(DispHTMLDocumentCompatibleInfoCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLDocumentCompatibleInfoCollection_GetIDsOfNames(DispHTMLDocumentCompatibleInfoCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLDocumentCompatibleInfoCollection_Invoke(DispHTMLDocumentCompatibleInfoCollection* 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  /* __DispHTMLDocumentCompatibleInfoCollection_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLDocumentCompatibleInfoCollection coclass
 */

DEFINE_GUID(CLSID_HTMLDocumentCompatibleInfoCollection, 0x30510419, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510419-98b5-11cf-bb82-00aa00bdce0b") HTMLDocumentCompatibleInfoCollection;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLDocumentCompatibleInfoCollection, 0x30510419, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDocumentVersionCollection;
/*****************************************************************************
 * HTMLDocumentEvents4 dispinterface
 */
#ifndef __HTMLDocumentEvents4_DISPINTERFACE_DEFINED__
#define __HTMLDocumentEvents4_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLDocumentEvents4, 0x30510737, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510737-98b5-11cf-bb82-00aa00bdce0b")
HTMLDocumentEvents4 : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLDocumentEvents4, 0x30510737, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLDocumentEvents4Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLDocumentEvents4* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLDocumentEvents4* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLDocumentEvents4* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLDocumentEvents4* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLDocumentEvents4* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLDocumentEvents4* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLDocumentEvents4* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLDocumentEvents4Vtbl;
interface HTMLDocumentEvents4 {
    CONST_VTBL HTMLDocumentEvents4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLDocumentEvents4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLDocumentEvents4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLDocumentEvents4_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLDocumentEvents4_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLDocumentEvents4_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLDocumentEvents4_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLDocumentEvents4_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 HTMLDocumentEvents4_QueryInterface(HTMLDocumentEvents4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLDocumentEvents4_AddRef(HTMLDocumentEvents4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLDocumentEvents4_Release(HTMLDocumentEvents4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLDocumentEvents4_GetTypeInfoCount(HTMLDocumentEvents4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLDocumentEvents4_GetTypeInfo(HTMLDocumentEvents4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLDocumentEvents4_GetIDsOfNames(HTMLDocumentEvents4* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLDocumentEvents4_Invoke(HTMLDocumentEvents4* 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  /* __HTMLDocumentEvents4_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLDocumentEvents3 dispinterface
 */
#ifndef __HTMLDocumentEvents3_DISPINTERFACE_DEFINED__
#define __HTMLDocumentEvents3_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLDocumentEvents3, 0x3050f5a0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f5a0-98b5-11cf-bb82-00aa00bdce0b")
HTMLDocumentEvents3 : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLDocumentEvents3, 0x3050f5a0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLDocumentEvents3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLDocumentEvents3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLDocumentEvents3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLDocumentEvents3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLDocumentEvents3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLDocumentEvents3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLDocumentEvents3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLDocumentEvents3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLDocumentEvents3Vtbl;
interface HTMLDocumentEvents3 {
    CONST_VTBL HTMLDocumentEvents3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLDocumentEvents3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLDocumentEvents3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLDocumentEvents3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLDocumentEvents3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLDocumentEvents3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLDocumentEvents3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLDocumentEvents3_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 HTMLDocumentEvents3_QueryInterface(HTMLDocumentEvents3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLDocumentEvents3_AddRef(HTMLDocumentEvents3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLDocumentEvents3_Release(HTMLDocumentEvents3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLDocumentEvents3_GetTypeInfoCount(HTMLDocumentEvents3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLDocumentEvents3_GetTypeInfo(HTMLDocumentEvents3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLDocumentEvents3_GetIDsOfNames(HTMLDocumentEvents3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLDocumentEvents3_Invoke(HTMLDocumentEvents3* 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  /* __HTMLDocumentEvents3_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLDocumentEvents2 dispinterface
 */
#ifndef __HTMLDocumentEvents2_DISPINTERFACE_DEFINED__
#define __HTMLDocumentEvents2_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLDocumentEvents2, 0x3050f613, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f613-98b5-11cf-bb82-00aa00bdce0b")
HTMLDocumentEvents2 : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLDocumentEvents2, 0x3050f613, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLDocumentEvents2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLDocumentEvents2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLDocumentEvents2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLDocumentEvents2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLDocumentEvents2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLDocumentEvents2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLDocumentEvents2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLDocumentEvents2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLDocumentEvents2Vtbl;
interface HTMLDocumentEvents2 {
    CONST_VTBL HTMLDocumentEvents2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLDocumentEvents2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLDocumentEvents2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLDocumentEvents2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLDocumentEvents2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLDocumentEvents2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLDocumentEvents2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLDocumentEvents2_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 HTMLDocumentEvents2_QueryInterface(HTMLDocumentEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLDocumentEvents2_AddRef(HTMLDocumentEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLDocumentEvents2_Release(HTMLDocumentEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLDocumentEvents2_GetTypeInfoCount(HTMLDocumentEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLDocumentEvents2_GetTypeInfo(HTMLDocumentEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLDocumentEvents2_GetIDsOfNames(HTMLDocumentEvents2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLDocumentEvents2_Invoke(HTMLDocumentEvents2* 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  /* __HTMLDocumentEvents2_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLDocumentEvents dispinterface
 */
#ifndef __HTMLDocumentEvents_DISPINTERFACE_DEFINED__
#define __HTMLDocumentEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLDocumentEvents, 0x3050f260, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f260-98b5-11cf-bb82-00aa00bdce0b")
HTMLDocumentEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLDocumentEvents, 0x3050f260, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLDocumentEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLDocumentEvents* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLDocumentEvents* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLDocumentEvents* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLDocumentEvents* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLDocumentEvents* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLDocumentEvents* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLDocumentEvents* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLDocumentEventsVtbl;
interface HTMLDocumentEvents {
    CONST_VTBL HTMLDocumentEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLDocumentEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLDocumentEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLDocumentEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLDocumentEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLDocumentEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLDocumentEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLDocumentEvents_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 HTMLDocumentEvents_QueryInterface(HTMLDocumentEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLDocumentEvents_AddRef(HTMLDocumentEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLDocumentEvents_Release(HTMLDocumentEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLDocumentEvents_GetTypeInfoCount(HTMLDocumentEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLDocumentEvents_GetTypeInfo(HTMLDocumentEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLDocumentEvents_GetIDsOfNames(HTMLDocumentEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLDocumentEvents_Invoke(HTMLDocumentEvents* 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  /* __HTMLDocumentEvents_DISPINTERFACE_DEFINED__ */

typedef enum _htmlCompatMode {
    htmlCompatModeBackCompat = 0,
    htmlCompatModeCSS1Compat = 1,
    htmlCompatMode_Max = 0x7fffffff
} htmlCompatMode;
#ifndef __ISVGSVGElement_FWD_DEFINED__
#define __ISVGSVGElement_FWD_DEFINED__
typedef interface ISVGSVGElement ISVGSVGElement;
#endif

#ifndef __IDOMNodeIterator_FWD_DEFINED__
#define __IDOMNodeIterator_FWD_DEFINED__
typedef interface IDOMNodeIterator IDOMNodeIterator;
#endif

#ifndef __IDOMTreeWalker_FWD_DEFINED__
#define __IDOMTreeWalker_FWD_DEFINED__
typedef interface IDOMTreeWalker IDOMTreeWalker;
#endif

#ifndef __IDOMProcessingInstruction_FWD_DEFINED__
#define __IDOMProcessingInstruction_FWD_DEFINED__
typedef interface IDOMProcessingInstruction IDOMProcessingInstruction;
#endif

/*****************************************************************************
 * IHTMLDocument interface
 */
#ifndef __IHTMLDocument_INTERFACE_DEFINED__
#define __IHTMLDocument_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDocument, 0x626fc520, 0xa41e, 0x11cf, 0xa7,0x31, 0x00,0xa0,0xc9,0x08,0x26,0x37);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("626fc520-a41e-11cf-a731-00a0c9082637")
IHTMLDocument : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Script(
        IDispatch **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDocument, 0x626fc520, 0xa41e, 0x11cf, 0xa7,0x31, 0x00,0xa0,0xc9,0x08,0x26,0x37)
#endif
#else
typedef struct IHTMLDocumentVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLDocument* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLDocument* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLDocument* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLDocument* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLDocument* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLDocument* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLDocument* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLDocument methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Script)(
        IHTMLDocument* This,
        IDispatch **p);

    END_INTERFACE
} IHTMLDocumentVtbl;
interface IHTMLDocument {
    CONST_VTBL IHTMLDocumentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDocument_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDocument_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDocument_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDocument_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDocument_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDocument_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDocument_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDocument methods ***/
#define IHTMLDocument_get_Script(This,p) (This)->lpVtbl->get_Script(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDocument_QueryInterface(IHTMLDocument* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDocument_AddRef(IHTMLDocument* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDocument_Release(IHTMLDocument* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDocument_GetTypeInfoCount(IHTMLDocument* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDocument_GetTypeInfo(IHTMLDocument* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDocument_GetIDsOfNames(IHTMLDocument* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDocument_Invoke(IHTMLDocument* 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);
}
/*** IHTMLDocument methods ***/
static FORCEINLINE HRESULT IHTMLDocument_get_Script(IHTMLDocument* This,IDispatch **p) {
    return This->lpVtbl->get_Script(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDocument_get_Script_Proxy(
    IHTMLDocument* This,
    IDispatch **p);
void __RPC_STUB IHTMLDocument_get_Script_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDocument_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLDocument2 interface
 */
#ifndef __IHTMLDocument2_INTERFACE_DEFINED__
#define __IHTMLDocument2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDocument2, 0x332c4425, 0x26cb, 0x11d0, 0xb4,0x83, 0x00,0xc0,0x4f,0xd9,0x01,0x19);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("332c4425-26cb-11d0-b483-00c04fd90119")
IHTMLDocument2 : public IHTMLDocument
{
    virtual HRESULT STDMETHODCALLTYPE get_all(
        IHTMLElementCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_body(
        IHTMLElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_activeElement(
        IHTMLElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_images(
        IHTMLElementCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_applets(
        IHTMLElementCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_links(
        IHTMLElementCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_forms(
        IHTMLElementCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_anchors(
        IHTMLElementCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_title(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_title(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scripts(
        IHTMLElementCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_designMode(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_designMode(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_selection(
        IHTMLSelectionObject **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_readyState(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_frames(
        IHTMLFramesCollection2 **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_embeds(
        IHTMLElementCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_plugins(
        IHTMLElementCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_alinkColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_alinkColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_bgColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_bgColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_fgColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fgColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_linkColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_linkColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_vlinkColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_vlinkColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_referrer(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_location(
        IHTMLLocation **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_lastModified(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_URL(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_URL(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_domain(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_domain(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_cookie(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cookie(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_expando(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_expando(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_charset(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_charset(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_defaultCharset(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_defaultCharset(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_mimeType(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fileSize(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fileCreatedDate(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fileModifiedDate(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fileUpdatedDate(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_security(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_protocol(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_nameProp(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE write(
        SAFEARRAY *psarray) = 0;

    virtual HRESULT STDMETHODCALLTYPE writeln(
        SAFEARRAY *psarray) = 0;

    virtual HRESULT STDMETHODCALLTYPE open(
        BSTR url,
        VARIANT name,
        VARIANT features,
        VARIANT replace,
        IDispatch **pomWindowResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE close(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE clear(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE queryCommandSupported(
        BSTR cmdID,
        VARIANT_BOOL *pfRet) = 0;

    virtual HRESULT STDMETHODCALLTYPE queryCommandEnabled(
        BSTR cmdID,
        VARIANT_BOOL *pfRet) = 0;

    virtual HRESULT STDMETHODCALLTYPE queryCommandState(
        BSTR cmdID,
        VARIANT_BOOL *pfRet) = 0;

    virtual HRESULT STDMETHODCALLTYPE queryCommandIndeterm(
        BSTR cmdID,
        VARIANT_BOOL *pfRet) = 0;

    virtual HRESULT STDMETHODCALLTYPE queryCommandText(
        BSTR cmdID,
        BSTR *pcmdText) = 0;

    virtual HRESULT STDMETHODCALLTYPE queryCommandValue(
        BSTR cmdID,
        VARIANT *pcmdValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE execCommand(
        BSTR cmdID,
        VARIANT_BOOL showUI,
        VARIANT value,
        VARIANT_BOOL *pfRet) = 0;

    virtual HRESULT STDMETHODCALLTYPE execCommandShowHelp(
        BSTR cmdID,
        VARIANT_BOOL *pfRet) = 0;

    virtual HRESULT STDMETHODCALLTYPE createElement(
        BSTR eTag,
        IHTMLElement **newElem) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onhelp(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onhelp(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onclick(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onclick(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondblclick(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondblclick(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onkeyup(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onkeyup(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onkeydown(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onkeydown(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onkeypress(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onkeypress(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmouseup(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmouseup(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmousedown(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmousedown(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmousemove(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmousemove(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmouseout(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmouseout(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmouseover(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmouseover(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onreadystatechange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onreadystatechange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onafterupdate(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onafterupdate(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onrowexit(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onrowexit(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onrowenter(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onrowenter(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondragstart(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondragstart(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onselectstart(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onselectstart(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE elementFromPoint(
        LONG x,
        LONG y,
        IHTMLElement **elementHit) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_parentWindow(
        IHTMLWindow2 **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_styleSheets(
        IHTMLStyleSheetsCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onbeforeupdate(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onbeforeupdate(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onerrorupdate(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onerrorupdate(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE toString(
        BSTR *String) = 0;

    virtual HRESULT STDMETHODCALLTYPE createStyleSheet(
        BSTR bstrHref = L"",
        LONG lIndex = -1,
        IHTMLStyleSheet **ppnewStyleSheet = 0) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDocument2, 0x332c4425, 0x26cb, 0x11d0, 0xb4,0x83, 0x00,0xc0,0x4f,0xd9,0x01,0x19)
#endif
#else
typedef struct IHTMLDocument2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLDocument2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLDocument2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLDocument2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLDocument2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLDocument2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLDocument2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLDocument2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLDocument methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Script)(
        IHTMLDocument2* This,
        IDispatch **p);

    /*** IHTMLDocument2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_all)(
        IHTMLDocument2* This,
        IHTMLElementCollection **p);

    HRESULT (STDMETHODCALLTYPE *get_body)(
        IHTMLDocument2* This,
        IHTMLElement **p);

    HRESULT (STDMETHODCALLTYPE *get_activeElement)(
        IHTMLDocument2* This,
        IHTMLElement **p);

    HRESULT (STDMETHODCALLTYPE *get_images)(
        IHTMLDocument2* This,
        IHTMLElementCollection **p);

    HRESULT (STDMETHODCALLTYPE *get_applets)(
        IHTMLDocument2* This,
        IHTMLElementCollection **p);

    HRESULT (STDMETHODCALLTYPE *get_links)(
        IHTMLDocument2* This,
        IHTMLElementCollection **p);

    HRESULT (STDMETHODCALLTYPE *get_forms)(
        IHTMLDocument2* This,
        IHTMLElementCollection **p);

    HRESULT (STDMETHODCALLTYPE *get_anchors)(
        IHTMLDocument2* This,
        IHTMLElementCollection **p);

    HRESULT (STDMETHODCALLTYPE *put_title)(
        IHTMLDocument2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_title)(
        IHTMLDocument2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_scripts)(
        IHTMLDocument2* This,
        IHTMLElementCollection **p);

    HRESULT (STDMETHODCALLTYPE *put_designMode)(
        IHTMLDocument2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_designMode)(
        IHTMLDocument2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_selection)(
        IHTMLDocument2* This,
        IHTMLSelectionObject **p);

    HRESULT (STDMETHODCALLTYPE *get_readyState)(
        IHTMLDocument2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_frames)(
        IHTMLDocument2* This,
        IHTMLFramesCollection2 **p);

    HRESULT (STDMETHODCALLTYPE *get_embeds)(
        IHTMLDocument2* This,
        IHTMLElementCollection **p);

    HRESULT (STDMETHODCALLTYPE *get_plugins)(
        IHTMLDocument2* This,
        IHTMLElementCollection **p);

    HRESULT (STDMETHODCALLTYPE *put_alinkColor)(
        IHTMLDocument2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_alinkColor)(
        IHTMLDocument2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_bgColor)(
        IHTMLDocument2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_bgColor)(
        IHTMLDocument2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_fgColor)(
        IHTMLDocument2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_fgColor)(
        IHTMLDocument2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_linkColor)(
        IHTMLDocument2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_linkColor)(
        IHTMLDocument2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_vlinkColor)(
        IHTMLDocument2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_vlinkColor)(
        IHTMLDocument2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_referrer)(
        IHTMLDocument2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_location)(
        IHTMLDocument2* This,
        IHTMLLocation **p);

    HRESULT (STDMETHODCALLTYPE *get_lastModified)(
        IHTMLDocument2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_URL)(
        IHTMLDocument2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_URL)(
        IHTMLDocument2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_domain)(
        IHTMLDocument2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_domain)(
        IHTMLDocument2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_cookie)(
        IHTMLDocument2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_cookie)(
        IHTMLDocument2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_expando)(
        IHTMLDocument2* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_expando)(
        IHTMLDocument2* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_charset)(
        IHTMLDocument2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_charset)(
        IHTMLDocument2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_defaultCharset)(
        IHTMLDocument2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_defaultCharset)(
        IHTMLDocument2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_mimeType)(
        IHTMLDocument2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_fileSize)(
        IHTMLDocument2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_fileCreatedDate)(
        IHTMLDocument2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_fileModifiedDate)(
        IHTMLDocument2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_fileUpdatedDate)(
        IHTMLDocument2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_security)(
        IHTMLDocument2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_protocol)(
        IHTMLDocument2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_nameProp)(
        IHTMLDocument2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *write)(
        IHTMLDocument2* This,
        SAFEARRAY *psarray);

    HRESULT (STDMETHODCALLTYPE *writeln)(
        IHTMLDocument2* This,
        SAFEARRAY *psarray);

    HRESULT (STDMETHODCALLTYPE *open)(
        IHTMLDocument2* This,
        BSTR url,
        VARIANT name,
        VARIANT features,
        VARIANT replace,
        IDispatch **pomWindowResult);

    HRESULT (STDMETHODCALLTYPE *close)(
        IHTMLDocument2* This);

    HRESULT (STDMETHODCALLTYPE *clear)(
        IHTMLDocument2* This);

    HRESULT (STDMETHODCALLTYPE *queryCommandSupported)(
        IHTMLDocument2* This,
        BSTR cmdID,
        VARIANT_BOOL *pfRet);

    HRESULT (STDMETHODCALLTYPE *queryCommandEnabled)(
        IHTMLDocument2* This,
        BSTR cmdID,
        VARIANT_BOOL *pfRet);

    HRESULT (STDMETHODCALLTYPE *queryCommandState)(
        IHTMLDocument2* This,
        BSTR cmdID,
        VARIANT_BOOL *pfRet);

    HRESULT (STDMETHODCALLTYPE *queryCommandIndeterm)(
        IHTMLDocument2* This,
        BSTR cmdID,
        VARIANT_BOOL *pfRet);

    HRESULT (STDMETHODCALLTYPE *queryCommandText)(
        IHTMLDocument2* This,
        BSTR cmdID,
        BSTR *pcmdText);

    HRESULT (STDMETHODCALLTYPE *queryCommandValue)(
        IHTMLDocument2* This,
        BSTR cmdID,
        VARIANT *pcmdValue);

    HRESULT (STDMETHODCALLTYPE *execCommand)(
        IHTMLDocument2* This,
        BSTR cmdID,
        VARIANT_BOOL showUI,
        VARIANT value,
        VARIANT_BOOL *pfRet);

    HRESULT (STDMETHODCALLTYPE *execCommandShowHelp)(
        IHTMLDocument2* This,
        BSTR cmdID,
        VARIANT_BOOL *pfRet);

    HRESULT (STDMETHODCALLTYPE *createElement)(
        IHTMLDocument2* This,
        BSTR eTag,
        IHTMLElement **newElem);

    HRESULT (STDMETHODCALLTYPE *put_onhelp)(
        IHTMLDocument2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onhelp)(
        IHTMLDocument2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onclick)(
        IHTMLDocument2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onclick)(
        IHTMLDocument2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondblclick)(
        IHTMLDocument2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondblclick)(
        IHTMLDocument2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onkeyup)(
        IHTMLDocument2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onkeyup)(
        IHTMLDocument2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onkeydown)(
        IHTMLDocument2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onkeydown)(
        IHTMLDocument2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onkeypress)(
        IHTMLDocument2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onkeypress)(
        IHTMLDocument2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmouseup)(
        IHTMLDocument2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmouseup)(
        IHTMLDocument2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmousedown)(
        IHTMLDocument2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmousedown)(
        IHTMLDocument2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmousemove)(
        IHTMLDocument2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmousemove)(
        IHTMLDocument2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmouseout)(
        IHTMLDocument2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmouseout)(
        IHTMLDocument2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmouseover)(
        IHTMLDocument2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmouseover)(
        IHTMLDocument2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onreadystatechange)(
        IHTMLDocument2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onreadystatechange)(
        IHTMLDocument2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onafterupdate)(
        IHTMLDocument2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onafterupdate)(
        IHTMLDocument2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onrowexit)(
        IHTMLDocument2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onrowexit)(
        IHTMLDocument2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onrowenter)(
        IHTMLDocument2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onrowenter)(
        IHTMLDocument2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondragstart)(
        IHTMLDocument2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondragstart)(
        IHTMLDocument2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onselectstart)(
        IHTMLDocument2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onselectstart)(
        IHTMLDocument2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *elementFromPoint)(
        IHTMLDocument2* This,
        LONG x,
        LONG y,
        IHTMLElement **elementHit);

    HRESULT (STDMETHODCALLTYPE *get_parentWindow)(
        IHTMLDocument2* This,
        IHTMLWindow2 **p);

    HRESULT (STDMETHODCALLTYPE *get_styleSheets)(
        IHTMLDocument2* This,
        IHTMLStyleSheetsCollection **p);

    HRESULT (STDMETHODCALLTYPE *put_onbeforeupdate)(
        IHTMLDocument2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onbeforeupdate)(
        IHTMLDocument2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onerrorupdate)(
        IHTMLDocument2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onerrorupdate)(
        IHTMLDocument2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *toString)(
        IHTMLDocument2* This,
        BSTR *String);

    HRESULT (STDMETHODCALLTYPE *createStyleSheet)(
        IHTMLDocument2* This,
        BSTR bstrHref,
        LONG lIndex,
        IHTMLStyleSheet **ppnewStyleSheet);

    END_INTERFACE
} IHTMLDocument2Vtbl;
interface IHTMLDocument2 {
    CONST_VTBL IHTMLDocument2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDocument2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDocument2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDocument2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDocument2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDocument2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDocument2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDocument2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDocument methods ***/
#define IHTMLDocument2_get_Script(This,p) (This)->lpVtbl->get_Script(This,p)
/*** IHTMLDocument2 methods ***/
#define IHTMLDocument2_get_all(This,p) (This)->lpVtbl->get_all(This,p)
#define IHTMLDocument2_get_body(This,p) (This)->lpVtbl->get_body(This,p)
#define IHTMLDocument2_get_activeElement(This,p) (This)->lpVtbl->get_activeElement(This,p)
#define IHTMLDocument2_get_images(This,p) (This)->lpVtbl->get_images(This,p)
#define IHTMLDocument2_get_applets(This,p) (This)->lpVtbl->get_applets(This,p)
#define IHTMLDocument2_get_links(This,p) (This)->lpVtbl->get_links(This,p)
#define IHTMLDocument2_get_forms(This,p) (This)->lpVtbl->get_forms(This,p)
#define IHTMLDocument2_get_anchors(This,p) (This)->lpVtbl->get_anchors(This,p)
#define IHTMLDocument2_put_title(This,v) (This)->lpVtbl->put_title(This,v)
#define IHTMLDocument2_get_title(This,p) (This)->lpVtbl->get_title(This,p)
#define IHTMLDocument2_get_scripts(This,p) (This)->lpVtbl->get_scripts(This,p)
#define IHTMLDocument2_put_designMode(This,v) (This)->lpVtbl->put_designMode(This,v)
#define IHTMLDocument2_get_designMode(This,p) (This)->lpVtbl->get_designMode(This,p)
#define IHTMLDocument2_get_selection(This,p) (This)->lpVtbl->get_selection(This,p)
#define IHTMLDocument2_get_readyState(This,p) (This)->lpVtbl->get_readyState(This,p)
#define IHTMLDocument2_get_frames(This,p) (This)->lpVtbl->get_frames(This,p)
#define IHTMLDocument2_get_embeds(This,p) (This)->lpVtbl->get_embeds(This,p)
#define IHTMLDocument2_get_plugins(This,p) (This)->lpVtbl->get_plugins(This,p)
#define IHTMLDocument2_put_alinkColor(This,v) (This)->lpVtbl->put_alinkColor(This,v)
#define IHTMLDocument2_get_alinkColor(This,p) (This)->lpVtbl->get_alinkColor(This,p)
#define IHTMLDocument2_put_bgColor(This,v) (This)->lpVtbl->put_bgColor(This,v)
#define IHTMLDocument2_get_bgColor(This,p) (This)->lpVtbl->get_bgColor(This,p)
#define IHTMLDocument2_put_fgColor(This,v) (This)->lpVtbl->put_fgColor(This,v)
#define IHTMLDocument2_get_fgColor(This,p) (This)->lpVtbl->get_fgColor(This,p)
#define IHTMLDocument2_put_linkColor(This,v) (This)->lpVtbl->put_linkColor(This,v)
#define IHTMLDocument2_get_linkColor(This,p) (This)->lpVtbl->get_linkColor(This,p)
#define IHTMLDocument2_put_vlinkColor(This,v) (This)->lpVtbl->put_vlinkColor(This,v)
#define IHTMLDocument2_get_vlinkColor(This,p) (This)->lpVtbl->get_vlinkColor(This,p)
#define IHTMLDocument2_get_referrer(This,p) (This)->lpVtbl->get_referrer(This,p)
#define IHTMLDocument2_get_location(This,p) (This)->lpVtbl->get_location(This,p)
#define IHTMLDocument2_get_lastModified(This,p) (This)->lpVtbl->get_lastModified(This,p)
#define IHTMLDocument2_put_URL(This,v) (This)->lpVtbl->put_URL(This,v)
#define IHTMLDocument2_get_URL(This,p) (This)->lpVtbl->get_URL(This,p)
#define IHTMLDocument2_put_domain(This,v) (This)->lpVtbl->put_domain(This,v)
#define IHTMLDocument2_get_domain(This,p) (This)->lpVtbl->get_domain(This,p)
#define IHTMLDocument2_put_cookie(This,v) (This)->lpVtbl->put_cookie(This,v)
#define IHTMLDocument2_get_cookie(This,p) (This)->lpVtbl->get_cookie(This,p)
#define IHTMLDocument2_put_expando(This,v) (This)->lpVtbl->put_expando(This,v)
#define IHTMLDocument2_get_expando(This,p) (This)->lpVtbl->get_expando(This,p)
#define IHTMLDocument2_put_charset(This,v) (This)->lpVtbl->put_charset(This,v)
#define IHTMLDocument2_get_charset(This,p) (This)->lpVtbl->get_charset(This,p)
#define IHTMLDocument2_put_defaultCharset(This,v) (This)->lpVtbl->put_defaultCharset(This,v)
#define IHTMLDocument2_get_defaultCharset(This,p) (This)->lpVtbl->get_defaultCharset(This,p)
#define IHTMLDocument2_get_mimeType(This,p) (This)->lpVtbl->get_mimeType(This,p)
#define IHTMLDocument2_get_fileSize(This,p) (This)->lpVtbl->get_fileSize(This,p)
#define IHTMLDocument2_get_fileCreatedDate(This,p) (This)->lpVtbl->get_fileCreatedDate(This,p)
#define IHTMLDocument2_get_fileModifiedDate(This,p) (This)->lpVtbl->get_fileModifiedDate(This,p)
#define IHTMLDocument2_get_fileUpdatedDate(This,p) (This)->lpVtbl->get_fileUpdatedDate(This,p)
#define IHTMLDocument2_get_security(This,p) (This)->lpVtbl->get_security(This,p)
#define IHTMLDocument2_get_protocol(This,p) (This)->lpVtbl->get_protocol(This,p)
#define IHTMLDocument2_get_nameProp(This,p) (This)->lpVtbl->get_nameProp(This,p)
#define IHTMLDocument2_write(This,psarray) (This)->lpVtbl->write(This,psarray)
#define IHTMLDocument2_writeln(This,psarray) (This)->lpVtbl->writeln(This,psarray)
#define IHTMLDocument2_open(This,url,name,features,replace,pomWindowResult) (This)->lpVtbl->open(This,url,name,features,replace,pomWindowResult)
#define IHTMLDocument2_close(This) (This)->lpVtbl->close(This)
#define IHTMLDocument2_clear(This) (This)->lpVtbl->clear(This)
#define IHTMLDocument2_queryCommandSupported(This,cmdID,pfRet) (This)->lpVtbl->queryCommandSupported(This,cmdID,pfRet)
#define IHTMLDocument2_queryCommandEnabled(This,cmdID,pfRet) (This)->lpVtbl->queryCommandEnabled(This,cmdID,pfRet)
#define IHTMLDocument2_queryCommandState(This,cmdID,pfRet) (This)->lpVtbl->queryCommandState(This,cmdID,pfRet)
#define IHTMLDocument2_queryCommandIndeterm(This,cmdID,pfRet) (This)->lpVtbl->queryCommandIndeterm(This,cmdID,pfRet)
#define IHTMLDocument2_queryCommandText(This,cmdID,pcmdText) (This)->lpVtbl->queryCommandText(This,cmdID,pcmdText)
#define IHTMLDocument2_queryCommandValue(This,cmdID,pcmdValue) (This)->lpVtbl->queryCommandValue(This,cmdID,pcmdValue)
#define IHTMLDocument2_execCommand(This,cmdID,showUI,value,pfRet) (This)->lpVtbl->execCommand(This,cmdID,showUI,value,pfRet)
#define IHTMLDocument2_execCommandShowHelp(This,cmdID,pfRet) (This)->lpVtbl->execCommandShowHelp(This,cmdID,pfRet)
#define IHTMLDocument2_createElement(This,eTag,newElem) (This)->lpVtbl->createElement(This,eTag,newElem)
#define IHTMLDocument2_put_onhelp(This,v) (This)->lpVtbl->put_onhelp(This,v)
#define IHTMLDocument2_get_onhelp(This,p) (This)->lpVtbl->get_onhelp(This,p)
#define IHTMLDocument2_put_onclick(This,v) (This)->lpVtbl->put_onclick(This,v)
#define IHTMLDocument2_get_onclick(This,p) (This)->lpVtbl->get_onclick(This,p)
#define IHTMLDocument2_put_ondblclick(This,v) (This)->lpVtbl->put_ondblclick(This,v)
#define IHTMLDocument2_get_ondblclick(This,p) (This)->lpVtbl->get_ondblclick(This,p)
#define IHTMLDocument2_put_onkeyup(This,v) (This)->lpVtbl->put_onkeyup(This,v)
#define IHTMLDocument2_get_onkeyup(This,p) (This)->lpVtbl->get_onkeyup(This,p)
#define IHTMLDocument2_put_onkeydown(This,v) (This)->lpVtbl->put_onkeydown(This,v)
#define IHTMLDocument2_get_onkeydown(This,p) (This)->lpVtbl->get_onkeydown(This,p)
#define IHTMLDocument2_put_onkeypress(This,v) (This)->lpVtbl->put_onkeypress(This,v)
#define IHTMLDocument2_get_onkeypress(This,p) (This)->lpVtbl->get_onkeypress(This,p)
#define IHTMLDocument2_put_onmouseup(This,v) (This)->lpVtbl->put_onmouseup(This,v)
#define IHTMLDocument2_get_onmouseup(This,p) (This)->lpVtbl->get_onmouseup(This,p)
#define IHTMLDocument2_put_onmousedown(This,v) (This)->lpVtbl->put_onmousedown(This,v)
#define IHTMLDocument2_get_onmousedown(This,p) (This)->lpVtbl->get_onmousedown(This,p)
#define IHTMLDocument2_put_onmousemove(This,v) (This)->lpVtbl->put_onmousemove(This,v)
#define IHTMLDocument2_get_onmousemove(This,p) (This)->lpVtbl->get_onmousemove(This,p)
#define IHTMLDocument2_put_onmouseout(This,v) (This)->lpVtbl->put_onmouseout(This,v)
#define IHTMLDocument2_get_onmouseout(This,p) (This)->lpVtbl->get_onmouseout(This,p)
#define IHTMLDocument2_put_onmouseover(This,v) (This)->lpVtbl->put_onmouseover(This,v)
#define IHTMLDocument2_get_onmouseover(This,p) (This)->lpVtbl->get_onmouseover(This,p)
#define IHTMLDocument2_put_onreadystatechange(This,v) (This)->lpVtbl->put_onreadystatechange(This,v)
#define IHTMLDocument2_get_onreadystatechange(This,p) (This)->lpVtbl->get_onreadystatechange(This,p)
#define IHTMLDocument2_put_onafterupdate(This,v) (This)->lpVtbl->put_onafterupdate(This,v)
#define IHTMLDocument2_get_onafterupdate(This,p) (This)->lpVtbl->get_onafterupdate(This,p)
#define IHTMLDocument2_put_onrowexit(This,v) (This)->lpVtbl->put_onrowexit(This,v)
#define IHTMLDocument2_get_onrowexit(This,p) (This)->lpVtbl->get_onrowexit(This,p)
#define IHTMLDocument2_put_onrowenter(This,v) (This)->lpVtbl->put_onrowenter(This,v)
#define IHTMLDocument2_get_onrowenter(This,p) (This)->lpVtbl->get_onrowenter(This,p)
#define IHTMLDocument2_put_ondragstart(This,v) (This)->lpVtbl->put_ondragstart(This,v)
#define IHTMLDocument2_get_ondragstart(This,p) (This)->lpVtbl->get_ondragstart(This,p)
#define IHTMLDocument2_put_onselectstart(This,v) (This)->lpVtbl->put_onselectstart(This,v)
#define IHTMLDocument2_get_onselectstart(This,p) (This)->lpVtbl->get_onselectstart(This,p)
#define IHTMLDocument2_elementFromPoint(This,x,y,elementHit) (This)->lpVtbl->elementFromPoint(This,x,y,elementHit)
#define IHTMLDocument2_get_parentWindow(This,p) (This)->lpVtbl->get_parentWindow(This,p)
#define IHTMLDocument2_get_styleSheets(This,p) (This)->lpVtbl->get_styleSheets(This,p)
#define IHTMLDocument2_put_onbeforeupdate(This,v) (This)->lpVtbl->put_onbeforeupdate(This,v)
#define IHTMLDocument2_get_onbeforeupdate(This,p) (This)->lpVtbl->get_onbeforeupdate(This,p)
#define IHTMLDocument2_put_onerrorupdate(This,v) (This)->lpVtbl->put_onerrorupdate(This,v)
#define IHTMLDocument2_get_onerrorupdate(This,p) (This)->lpVtbl->get_onerrorupdate(This,p)
#define IHTMLDocument2_toString(This,String) (This)->lpVtbl->toString(This,String)
#define IHTMLDocument2_createStyleSheet(This,bstrHref,lIndex,ppnewStyleSheet) (This)->lpVtbl->createStyleSheet(This,bstrHref,lIndex,ppnewStyleSheet)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDocument2_QueryInterface(IHTMLDocument2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDocument2_AddRef(IHTMLDocument2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDocument2_Release(IHTMLDocument2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDocument2_GetTypeInfoCount(IHTMLDocument2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDocument2_GetTypeInfo(IHTMLDocument2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDocument2_GetIDsOfNames(IHTMLDocument2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDocument2_Invoke(IHTMLDocument2* 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);
}
/*** IHTMLDocument methods ***/
static FORCEINLINE HRESULT IHTMLDocument2_get_Script(IHTMLDocument2* This,IDispatch **p) {
    return This->lpVtbl->get_Script(This,p);
}
/*** IHTMLDocument2 methods ***/
static FORCEINLINE HRESULT IHTMLDocument2_get_all(IHTMLDocument2* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_all(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_body(IHTMLDocument2* This,IHTMLElement **p) {
    return This->lpVtbl->get_body(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_activeElement(IHTMLDocument2* This,IHTMLElement **p) {
    return This->lpVtbl->get_activeElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_images(IHTMLDocument2* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_images(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_applets(IHTMLDocument2* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_applets(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_links(IHTMLDocument2* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_links(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_forms(IHTMLDocument2* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_forms(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_anchors(IHTMLDocument2* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_anchors(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_title(IHTMLDocument2* This,BSTR v) {
    return This->lpVtbl->put_title(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_title(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_title(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_scripts(IHTMLDocument2* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_scripts(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_designMode(IHTMLDocument2* This,BSTR v) {
    return This->lpVtbl->put_designMode(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_designMode(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_designMode(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_selection(IHTMLDocument2* This,IHTMLSelectionObject **p) {
    return This->lpVtbl->get_selection(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_readyState(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_readyState(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_frames(IHTMLDocument2* This,IHTMLFramesCollection2 **p) {
    return This->lpVtbl->get_frames(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_embeds(IHTMLDocument2* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_embeds(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_plugins(IHTMLDocument2* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_plugins(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_alinkColor(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_alinkColor(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_alinkColor(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_alinkColor(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_bgColor(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_bgColor(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_bgColor(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_bgColor(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_fgColor(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_fgColor(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_fgColor(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_fgColor(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_linkColor(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_linkColor(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_linkColor(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_linkColor(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_vlinkColor(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_vlinkColor(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_vlinkColor(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_vlinkColor(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_referrer(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_referrer(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_location(IHTMLDocument2* This,IHTMLLocation **p) {
    return This->lpVtbl->get_location(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_lastModified(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_lastModified(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_URL(IHTMLDocument2* This,BSTR v) {
    return This->lpVtbl->put_URL(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_URL(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_URL(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_domain(IHTMLDocument2* This,BSTR v) {
    return This->lpVtbl->put_domain(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_domain(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_domain(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_cookie(IHTMLDocument2* This,BSTR v) {
    return This->lpVtbl->put_cookie(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_cookie(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_cookie(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_expando(IHTMLDocument2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_expando(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_expando(IHTMLDocument2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_expando(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_charset(IHTMLDocument2* This,BSTR v) {
    return This->lpVtbl->put_charset(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_charset(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_charset(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_defaultCharset(IHTMLDocument2* This,BSTR v) {
    return This->lpVtbl->put_defaultCharset(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_defaultCharset(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_defaultCharset(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_mimeType(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_mimeType(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_fileSize(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_fileSize(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_fileCreatedDate(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_fileCreatedDate(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_fileModifiedDate(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_fileModifiedDate(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_fileUpdatedDate(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_fileUpdatedDate(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_security(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_security(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_protocol(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_protocol(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_nameProp(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_nameProp(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_write(IHTMLDocument2* This,SAFEARRAY *psarray) {
    return This->lpVtbl->write(This,psarray);
}
static FORCEINLINE HRESULT IHTMLDocument2_writeln(IHTMLDocument2* This,SAFEARRAY *psarray) {
    return This->lpVtbl->writeln(This,psarray);
}
static FORCEINLINE HRESULT IHTMLDocument2_open(IHTMLDocument2* This,BSTR url,VARIANT name,VARIANT features,VARIANT replace,IDispatch **pomWindowResult) {
    return This->lpVtbl->open(This,url,name,features,replace,pomWindowResult);
}
static FORCEINLINE HRESULT IHTMLDocument2_close(IHTMLDocument2* This) {
    return This->lpVtbl->close(This);
}
static FORCEINLINE HRESULT IHTMLDocument2_clear(IHTMLDocument2* This) {
    return This->lpVtbl->clear(This);
}
static FORCEINLINE HRESULT IHTMLDocument2_queryCommandSupported(IHTMLDocument2* This,BSTR cmdID,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->queryCommandSupported(This,cmdID,pfRet);
}
static FORCEINLINE HRESULT IHTMLDocument2_queryCommandEnabled(IHTMLDocument2* This,BSTR cmdID,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->queryCommandEnabled(This,cmdID,pfRet);
}
static FORCEINLINE HRESULT IHTMLDocument2_queryCommandState(IHTMLDocument2* This,BSTR cmdID,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->queryCommandState(This,cmdID,pfRet);
}
static FORCEINLINE HRESULT IHTMLDocument2_queryCommandIndeterm(IHTMLDocument2* This,BSTR cmdID,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->queryCommandIndeterm(This,cmdID,pfRet);
}
static FORCEINLINE HRESULT IHTMLDocument2_queryCommandText(IHTMLDocument2* This,BSTR cmdID,BSTR *pcmdText) {
    return This->lpVtbl->queryCommandText(This,cmdID,pcmdText);
}
static FORCEINLINE HRESULT IHTMLDocument2_queryCommandValue(IHTMLDocument2* This,BSTR cmdID,VARIANT *pcmdValue) {
    return This->lpVtbl->queryCommandValue(This,cmdID,pcmdValue);
}
static FORCEINLINE HRESULT IHTMLDocument2_execCommand(IHTMLDocument2* This,BSTR cmdID,VARIANT_BOOL showUI,VARIANT value,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->execCommand(This,cmdID,showUI,value,pfRet);
}
static FORCEINLINE HRESULT IHTMLDocument2_execCommandShowHelp(IHTMLDocument2* This,BSTR cmdID,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->execCommandShowHelp(This,cmdID,pfRet);
}
static FORCEINLINE HRESULT IHTMLDocument2_createElement(IHTMLDocument2* This,BSTR eTag,IHTMLElement **newElem) {
    return This->lpVtbl->createElement(This,eTag,newElem);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_onhelp(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onhelp(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_onhelp(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onhelp(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_onclick(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onclick(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_onclick(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onclick(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_ondblclick(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_ondblclick(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_ondblclick(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_ondblclick(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_onkeyup(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onkeyup(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_onkeyup(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onkeyup(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_onkeydown(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onkeydown(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_onkeydown(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onkeydown(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_onkeypress(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onkeypress(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_onkeypress(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onkeypress(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_onmouseup(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onmouseup(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_onmouseup(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onmouseup(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_onmousedown(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onmousedown(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_onmousedown(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onmousedown(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_onmousemove(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onmousemove(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_onmousemove(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onmousemove(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_onmouseout(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onmouseout(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_onmouseout(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onmouseout(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_onmouseover(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onmouseover(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_onmouseover(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onmouseover(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_onreadystatechange(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onreadystatechange(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_onreadystatechange(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onreadystatechange(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_onafterupdate(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onafterupdate(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_onafterupdate(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onafterupdate(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_onrowexit(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onrowexit(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_onrowexit(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onrowexit(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_onrowenter(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onrowenter(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_onrowenter(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onrowenter(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_ondragstart(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_ondragstart(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_ondragstart(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_ondragstart(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_onselectstart(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onselectstart(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_onselectstart(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onselectstart(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_elementFromPoint(IHTMLDocument2* This,LONG x,LONG y,IHTMLElement **elementHit) {
    return This->lpVtbl->elementFromPoint(This,x,y,elementHit);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_parentWindow(IHTMLDocument2* This,IHTMLWindow2 **p) {
    return This->lpVtbl->get_parentWindow(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_styleSheets(IHTMLDocument2* This,IHTMLStyleSheetsCollection **p) {
    return This->lpVtbl->get_styleSheets(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_onbeforeupdate(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onbeforeupdate(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_onbeforeupdate(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforeupdate(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_put_onerrorupdate(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onerrorupdate(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument2_get_onerrorupdate(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onerrorupdate(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument2_toString(IHTMLDocument2* This,BSTR *String) {
    return This->lpVtbl->toString(This,String);
}
static FORCEINLINE HRESULT IHTMLDocument2_createStyleSheet(IHTMLDocument2* This,BSTR bstrHref,LONG lIndex,IHTMLStyleSheet **ppnewStyleSheet) {
    return This->lpVtbl->createStyleSheet(This,bstrHref,lIndex,ppnewStyleSheet);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_all_Proxy(
    IHTMLDocument2* This,
    IHTMLElementCollection **p);
void __RPC_STUB IHTMLDocument2_get_all_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_body_Proxy(
    IHTMLDocument2* This,
    IHTMLElement **p);
void __RPC_STUB IHTMLDocument2_get_body_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_activeElement_Proxy(
    IHTMLDocument2* This,
    IHTMLElement **p);
void __RPC_STUB IHTMLDocument2_get_activeElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_images_Proxy(
    IHTMLDocument2* This,
    IHTMLElementCollection **p);
void __RPC_STUB IHTMLDocument2_get_images_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_applets_Proxy(
    IHTMLDocument2* This,
    IHTMLElementCollection **p);
void __RPC_STUB IHTMLDocument2_get_applets_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_links_Proxy(
    IHTMLDocument2* This,
    IHTMLElementCollection **p);
void __RPC_STUB IHTMLDocument2_get_links_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_forms_Proxy(
    IHTMLDocument2* This,
    IHTMLElementCollection **p);
void __RPC_STUB IHTMLDocument2_get_forms_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_anchors_Proxy(
    IHTMLDocument2* This,
    IHTMLElementCollection **p);
void __RPC_STUB IHTMLDocument2_get_anchors_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_title_Proxy(
    IHTMLDocument2* This,
    BSTR v);
void __RPC_STUB IHTMLDocument2_put_title_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_title_Proxy(
    IHTMLDocument2* This,
    BSTR *p);
void __RPC_STUB IHTMLDocument2_get_title_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_scripts_Proxy(
    IHTMLDocument2* This,
    IHTMLElementCollection **p);
void __RPC_STUB IHTMLDocument2_get_scripts_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_designMode_Proxy(
    IHTMLDocument2* This,
    BSTR v);
void __RPC_STUB IHTMLDocument2_put_designMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_designMode_Proxy(
    IHTMLDocument2* This,
    BSTR *p);
void __RPC_STUB IHTMLDocument2_get_designMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_selection_Proxy(
    IHTMLDocument2* This,
    IHTMLSelectionObject **p);
void __RPC_STUB IHTMLDocument2_get_selection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_readyState_Proxy(
    IHTMLDocument2* This,
    BSTR *p);
void __RPC_STUB IHTMLDocument2_get_readyState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_frames_Proxy(
    IHTMLDocument2* This,
    IHTMLFramesCollection2 **p);
void __RPC_STUB IHTMLDocument2_get_frames_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_embeds_Proxy(
    IHTMLDocument2* This,
    IHTMLElementCollection **p);
void __RPC_STUB IHTMLDocument2_get_embeds_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_plugins_Proxy(
    IHTMLDocument2* This,
    IHTMLElementCollection **p);
void __RPC_STUB IHTMLDocument2_get_plugins_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_alinkColor_Proxy(
    IHTMLDocument2* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument2_put_alinkColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_alinkColor_Proxy(
    IHTMLDocument2* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument2_get_alinkColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_bgColor_Proxy(
    IHTMLDocument2* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument2_put_bgColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_bgColor_Proxy(
    IHTMLDocument2* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument2_get_bgColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_fgColor_Proxy(
    IHTMLDocument2* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument2_put_fgColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_fgColor_Proxy(
    IHTMLDocument2* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument2_get_fgColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_linkColor_Proxy(
    IHTMLDocument2* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument2_put_linkColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_linkColor_Proxy(
    IHTMLDocument2* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument2_get_linkColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_vlinkColor_Proxy(
    IHTMLDocument2* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument2_put_vlinkColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_vlinkColor_Proxy(
    IHTMLDocument2* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument2_get_vlinkColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_referrer_Proxy(
    IHTMLDocument2* This,
    BSTR *p);
void __RPC_STUB IHTMLDocument2_get_referrer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_location_Proxy(
    IHTMLDocument2* This,
    IHTMLLocation **p);
void __RPC_STUB IHTMLDocument2_get_location_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_lastModified_Proxy(
    IHTMLDocument2* This,
    BSTR *p);
void __RPC_STUB IHTMLDocument2_get_lastModified_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_URL_Proxy(
    IHTMLDocument2* This,
    BSTR v);
void __RPC_STUB IHTMLDocument2_put_URL_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_URL_Proxy(
    IHTMLDocument2* This,
    BSTR *p);
void __RPC_STUB IHTMLDocument2_get_URL_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_domain_Proxy(
    IHTMLDocument2* This,
    BSTR v);
void __RPC_STUB IHTMLDocument2_put_domain_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_domain_Proxy(
    IHTMLDocument2* This,
    BSTR *p);
void __RPC_STUB IHTMLDocument2_get_domain_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_cookie_Proxy(
    IHTMLDocument2* This,
    BSTR v);
void __RPC_STUB IHTMLDocument2_put_cookie_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_cookie_Proxy(
    IHTMLDocument2* This,
    BSTR *p);
void __RPC_STUB IHTMLDocument2_get_cookie_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_expando_Proxy(
    IHTMLDocument2* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLDocument2_put_expando_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_expando_Proxy(
    IHTMLDocument2* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLDocument2_get_expando_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_charset_Proxy(
    IHTMLDocument2* This,
    BSTR v);
void __RPC_STUB IHTMLDocument2_put_charset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_charset_Proxy(
    IHTMLDocument2* This,
    BSTR *p);
void __RPC_STUB IHTMLDocument2_get_charset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_defaultCharset_Proxy(
    IHTMLDocument2* This,
    BSTR v);
void __RPC_STUB IHTMLDocument2_put_defaultCharset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_defaultCharset_Proxy(
    IHTMLDocument2* This,
    BSTR *p);
void __RPC_STUB IHTMLDocument2_get_defaultCharset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_mimeType_Proxy(
    IHTMLDocument2* This,
    BSTR *p);
void __RPC_STUB IHTMLDocument2_get_mimeType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_fileSize_Proxy(
    IHTMLDocument2* This,
    BSTR *p);
void __RPC_STUB IHTMLDocument2_get_fileSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_fileCreatedDate_Proxy(
    IHTMLDocument2* This,
    BSTR *p);
void __RPC_STUB IHTMLDocument2_get_fileCreatedDate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_fileModifiedDate_Proxy(
    IHTMLDocument2* This,
    BSTR *p);
void __RPC_STUB IHTMLDocument2_get_fileModifiedDate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_fileUpdatedDate_Proxy(
    IHTMLDocument2* This,
    BSTR *p);
void __RPC_STUB IHTMLDocument2_get_fileUpdatedDate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_security_Proxy(
    IHTMLDocument2* This,
    BSTR *p);
void __RPC_STUB IHTMLDocument2_get_security_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_protocol_Proxy(
    IHTMLDocument2* This,
    BSTR *p);
void __RPC_STUB IHTMLDocument2_get_protocol_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_nameProp_Proxy(
    IHTMLDocument2* This,
    BSTR *p);
void __RPC_STUB IHTMLDocument2_get_nameProp_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_write_Proxy(
    IHTMLDocument2* This,
    SAFEARRAY *psarray);
void __RPC_STUB IHTMLDocument2_write_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_writeln_Proxy(
    IHTMLDocument2* This,
    SAFEARRAY *psarray);
void __RPC_STUB IHTMLDocument2_writeln_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_open_Proxy(
    IHTMLDocument2* This,
    BSTR url,
    VARIANT name,
    VARIANT features,
    VARIANT replace,
    IDispatch **pomWindowResult);
void __RPC_STUB IHTMLDocument2_open_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_close_Proxy(
    IHTMLDocument2* This);
void __RPC_STUB IHTMLDocument2_close_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_clear_Proxy(
    IHTMLDocument2* This);
void __RPC_STUB IHTMLDocument2_clear_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_queryCommandSupported_Proxy(
    IHTMLDocument2* This,
    BSTR cmdID,
    VARIANT_BOOL *pfRet);
void __RPC_STUB IHTMLDocument2_queryCommandSupported_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_queryCommandEnabled_Proxy(
    IHTMLDocument2* This,
    BSTR cmdID,
    VARIANT_BOOL *pfRet);
void __RPC_STUB IHTMLDocument2_queryCommandEnabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_queryCommandState_Proxy(
    IHTMLDocument2* This,
    BSTR cmdID,
    VARIANT_BOOL *pfRet);
void __RPC_STUB IHTMLDocument2_queryCommandState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_queryCommandIndeterm_Proxy(
    IHTMLDocument2* This,
    BSTR cmdID,
    VARIANT_BOOL *pfRet);
void __RPC_STUB IHTMLDocument2_queryCommandIndeterm_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_queryCommandText_Proxy(
    IHTMLDocument2* This,
    BSTR cmdID,
    BSTR *pcmdText);
void __RPC_STUB IHTMLDocument2_queryCommandText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_queryCommandValue_Proxy(
    IHTMLDocument2* This,
    BSTR cmdID,
    VARIANT *pcmdValue);
void __RPC_STUB IHTMLDocument2_queryCommandValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_execCommand_Proxy(
    IHTMLDocument2* This,
    BSTR cmdID,
    VARIANT_BOOL showUI,
    VARIANT value,
    VARIANT_BOOL *pfRet);
void __RPC_STUB IHTMLDocument2_execCommand_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_execCommandShowHelp_Proxy(
    IHTMLDocument2* This,
    BSTR cmdID,
    VARIANT_BOOL *pfRet);
void __RPC_STUB IHTMLDocument2_execCommandShowHelp_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_createElement_Proxy(
    IHTMLDocument2* This,
    BSTR eTag,
    IHTMLElement **newElem);
void __RPC_STUB IHTMLDocument2_createElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_onhelp_Proxy(
    IHTMLDocument2* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument2_put_onhelp_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_onhelp_Proxy(
    IHTMLDocument2* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument2_get_onhelp_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_onclick_Proxy(
    IHTMLDocument2* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument2_put_onclick_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_onclick_Proxy(
    IHTMLDocument2* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument2_get_onclick_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_ondblclick_Proxy(
    IHTMLDocument2* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument2_put_ondblclick_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_ondblclick_Proxy(
    IHTMLDocument2* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument2_get_ondblclick_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_onkeyup_Proxy(
    IHTMLDocument2* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument2_put_onkeyup_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_onkeyup_Proxy(
    IHTMLDocument2* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument2_get_onkeyup_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_onkeydown_Proxy(
    IHTMLDocument2* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument2_put_onkeydown_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_onkeydown_Proxy(
    IHTMLDocument2* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument2_get_onkeydown_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_onkeypress_Proxy(
    IHTMLDocument2* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument2_put_onkeypress_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_onkeypress_Proxy(
    IHTMLDocument2* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument2_get_onkeypress_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_onmouseup_Proxy(
    IHTMLDocument2* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument2_put_onmouseup_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_onmouseup_Proxy(
    IHTMLDocument2* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument2_get_onmouseup_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_onmousedown_Proxy(
    IHTMLDocument2* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument2_put_onmousedown_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_onmousedown_Proxy(
    IHTMLDocument2* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument2_get_onmousedown_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_onmousemove_Proxy(
    IHTMLDocument2* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument2_put_onmousemove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_onmousemove_Proxy(
    IHTMLDocument2* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument2_get_onmousemove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_onmouseout_Proxy(
    IHTMLDocument2* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument2_put_onmouseout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_onmouseout_Proxy(
    IHTMLDocument2* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument2_get_onmouseout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_onmouseover_Proxy(
    IHTMLDocument2* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument2_put_onmouseover_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_onmouseover_Proxy(
    IHTMLDocument2* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument2_get_onmouseover_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_onreadystatechange_Proxy(
    IHTMLDocument2* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument2_put_onreadystatechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_onreadystatechange_Proxy(
    IHTMLDocument2* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument2_get_onreadystatechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_onafterupdate_Proxy(
    IHTMLDocument2* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument2_put_onafterupdate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_onafterupdate_Proxy(
    IHTMLDocument2* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument2_get_onafterupdate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_onrowexit_Proxy(
    IHTMLDocument2* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument2_put_onrowexit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_onrowexit_Proxy(
    IHTMLDocument2* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument2_get_onrowexit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_onrowenter_Proxy(
    IHTMLDocument2* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument2_put_onrowenter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_onrowenter_Proxy(
    IHTMLDocument2* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument2_get_onrowenter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_ondragstart_Proxy(
    IHTMLDocument2* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument2_put_ondragstart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_ondragstart_Proxy(
    IHTMLDocument2* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument2_get_ondragstart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_onselectstart_Proxy(
    IHTMLDocument2* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument2_put_onselectstart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_onselectstart_Proxy(
    IHTMLDocument2* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument2_get_onselectstart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_elementFromPoint_Proxy(
    IHTMLDocument2* This,
    LONG x,
    LONG y,
    IHTMLElement **elementHit);
void __RPC_STUB IHTMLDocument2_elementFromPoint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_parentWindow_Proxy(
    IHTMLDocument2* This,
    IHTMLWindow2 **p);
void __RPC_STUB IHTMLDocument2_get_parentWindow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_styleSheets_Proxy(
    IHTMLDocument2* This,
    IHTMLStyleSheetsCollection **p);
void __RPC_STUB IHTMLDocument2_get_styleSheets_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_onbeforeupdate_Proxy(
    IHTMLDocument2* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument2_put_onbeforeupdate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_onbeforeupdate_Proxy(
    IHTMLDocument2* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument2_get_onbeforeupdate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_put_onerrorupdate_Proxy(
    IHTMLDocument2* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument2_put_onerrorupdate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_get_onerrorupdate_Proxy(
    IHTMLDocument2* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument2_get_onerrorupdate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_toString_Proxy(
    IHTMLDocument2* This,
    BSTR *String);
void __RPC_STUB IHTMLDocument2_toString_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument2_createStyleSheet_Proxy(
    IHTMLDocument2* This,
    BSTR bstrHref,
    LONG lIndex,
    IHTMLStyleSheet **ppnewStyleSheet);
void __RPC_STUB IHTMLDocument2_createStyleSheet_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDocument2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLDocument3 interface
 */
#ifndef __IHTMLDocument3_INTERFACE_DEFINED__
#define __IHTMLDocument3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDocument3, 0x3050f485, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f485-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDocument3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE releaseCapture(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE recalc(
        VARIANT_BOOL fForce = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE createTextNode(
        BSTR text,
        IHTMLDOMNode **newTextNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_documentElement(
        IHTMLElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_uniqueID(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE attachEvent(
        BSTR event,
        IDispatch *pDisp,
        VARIANT_BOOL *pfResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE detachEvent(
        BSTR event,
        IDispatch *pDisp) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onrowsdelete(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onrowsdelete(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onrowsinserted(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onrowsinserted(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_oncellchange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_oncellchange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondatasetchanged(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondatasetchanged(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondataavailable(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondataavailable(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondatasetcomplete(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondatasetcomplete(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onpropertychange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onpropertychange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_dir(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_dir(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_oncontextmenu(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_oncontextmenu(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onstop(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onstop(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE createDocumentFragment(
        IHTMLDocument2 **pNewDoc) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_parentDocument(
        IHTMLDocument2 **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_enableDownload(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_enableDownload(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_baseUrl(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_baseUrl(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_childNodes(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_inheritStyleSheets(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_inheritStyleSheets(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onbeforeeditfocus(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onbeforeeditfocus(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE getElementsByName(
        BSTR v,
        IHTMLElementCollection **pelColl) = 0;

    virtual HRESULT STDMETHODCALLTYPE getElementById(
        BSTR v,
        IHTMLElement **pel) = 0;

    virtual HRESULT STDMETHODCALLTYPE getElementsByTagName(
        BSTR v,
        IHTMLElementCollection **pelColl) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDocument3, 0x3050f485, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDocument3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLDocument3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLDocument3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLDocument3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLDocument3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLDocument3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLDocument3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLDocument3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLDocument3 methods ***/
    HRESULT (STDMETHODCALLTYPE *releaseCapture)(
        IHTMLDocument3* This);

    HRESULT (STDMETHODCALLTYPE *recalc)(
        IHTMLDocument3* This,
        VARIANT_BOOL fForce);

    HRESULT (STDMETHODCALLTYPE *createTextNode)(
        IHTMLDocument3* This,
        BSTR text,
        IHTMLDOMNode **newTextNode);

    HRESULT (STDMETHODCALLTYPE *get_documentElement)(
        IHTMLDocument3* This,
        IHTMLElement **p);

    HRESULT (STDMETHODCALLTYPE *get_uniqueID)(
        IHTMLDocument3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *attachEvent)(
        IHTMLDocument3* This,
        BSTR event,
        IDispatch *pDisp,
        VARIANT_BOOL *pfResult);

    HRESULT (STDMETHODCALLTYPE *detachEvent)(
        IHTMLDocument3* This,
        BSTR event,
        IDispatch *pDisp);

    HRESULT (STDMETHODCALLTYPE *put_onrowsdelete)(
        IHTMLDocument3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onrowsdelete)(
        IHTMLDocument3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onrowsinserted)(
        IHTMLDocument3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onrowsinserted)(
        IHTMLDocument3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_oncellchange)(
        IHTMLDocument3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_oncellchange)(
        IHTMLDocument3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondatasetchanged)(
        IHTMLDocument3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondatasetchanged)(
        IHTMLDocument3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondataavailable)(
        IHTMLDocument3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondataavailable)(
        IHTMLDocument3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondatasetcomplete)(
        IHTMLDocument3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondatasetcomplete)(
        IHTMLDocument3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onpropertychange)(
        IHTMLDocument3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onpropertychange)(
        IHTMLDocument3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_dir)(
        IHTMLDocument3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_dir)(
        IHTMLDocument3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_oncontextmenu)(
        IHTMLDocument3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_oncontextmenu)(
        IHTMLDocument3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onstop)(
        IHTMLDocument3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onstop)(
        IHTMLDocument3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *createDocumentFragment)(
        IHTMLDocument3* This,
        IHTMLDocument2 **pNewDoc);

    HRESULT (STDMETHODCALLTYPE *get_parentDocument)(
        IHTMLDocument3* This,
        IHTMLDocument2 **p);

    HRESULT (STDMETHODCALLTYPE *put_enableDownload)(
        IHTMLDocument3* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_enableDownload)(
        IHTMLDocument3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_baseUrl)(
        IHTMLDocument3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_baseUrl)(
        IHTMLDocument3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_childNodes)(
        IHTMLDocument3* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *put_inheritStyleSheets)(
        IHTMLDocument3* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_inheritStyleSheets)(
        IHTMLDocument3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_onbeforeeditfocus)(
        IHTMLDocument3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onbeforeeditfocus)(
        IHTMLDocument3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *getElementsByName)(
        IHTMLDocument3* This,
        BSTR v,
        IHTMLElementCollection **pelColl);

    HRESULT (STDMETHODCALLTYPE *getElementById)(
        IHTMLDocument3* This,
        BSTR v,
        IHTMLElement **pel);

    HRESULT (STDMETHODCALLTYPE *getElementsByTagName)(
        IHTMLDocument3* This,
        BSTR v,
        IHTMLElementCollection **pelColl);

    END_INTERFACE
} IHTMLDocument3Vtbl;
interface IHTMLDocument3 {
    CONST_VTBL IHTMLDocument3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDocument3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDocument3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDocument3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDocument3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDocument3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDocument3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDocument3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDocument3 methods ***/
#define IHTMLDocument3_releaseCapture(This) (This)->lpVtbl->releaseCapture(This)
#define IHTMLDocument3_recalc(This,fForce) (This)->lpVtbl->recalc(This,fForce)
#define IHTMLDocument3_createTextNode(This,text,newTextNode) (This)->lpVtbl->createTextNode(This,text,newTextNode)
#define IHTMLDocument3_get_documentElement(This,p) (This)->lpVtbl->get_documentElement(This,p)
#define IHTMLDocument3_get_uniqueID(This,p) (This)->lpVtbl->get_uniqueID(This,p)
#define IHTMLDocument3_attachEvent(This,event,pDisp,pfResult) (This)->lpVtbl->attachEvent(This,event,pDisp,pfResult)
#define IHTMLDocument3_detachEvent(This,event,pDisp) (This)->lpVtbl->detachEvent(This,event,pDisp)
#define IHTMLDocument3_put_onrowsdelete(This,v) (This)->lpVtbl->put_onrowsdelete(This,v)
#define IHTMLDocument3_get_onrowsdelete(This,p) (This)->lpVtbl->get_onrowsdelete(This,p)
#define IHTMLDocument3_put_onrowsinserted(This,v) (This)->lpVtbl->put_onrowsinserted(This,v)
#define IHTMLDocument3_get_onrowsinserted(This,p) (This)->lpVtbl->get_onrowsinserted(This,p)
#define IHTMLDocument3_put_oncellchange(This,v) (This)->lpVtbl->put_oncellchange(This,v)
#define IHTMLDocument3_get_oncellchange(This,p) (This)->lpVtbl->get_oncellchange(This,p)
#define IHTMLDocument3_put_ondatasetchanged(This,v) (This)->lpVtbl->put_ondatasetchanged(This,v)
#define IHTMLDocument3_get_ondatasetchanged(This,p) (This)->lpVtbl->get_ondatasetchanged(This,p)
#define IHTMLDocument3_put_ondataavailable(This,v) (This)->lpVtbl->put_ondataavailable(This,v)
#define IHTMLDocument3_get_ondataavailable(This,p) (This)->lpVtbl->get_ondataavailable(This,p)
#define IHTMLDocument3_put_ondatasetcomplete(This,v) (This)->lpVtbl->put_ondatasetcomplete(This,v)
#define IHTMLDocument3_get_ondatasetcomplete(This,p) (This)->lpVtbl->get_ondatasetcomplete(This,p)
#define IHTMLDocument3_put_onpropertychange(This,v) (This)->lpVtbl->put_onpropertychange(This,v)
#define IHTMLDocument3_get_onpropertychange(This,p) (This)->lpVtbl->get_onpropertychange(This,p)
#define IHTMLDocument3_put_dir(This,v) (This)->lpVtbl->put_dir(This,v)
#define IHTMLDocument3_get_dir(This,p) (This)->lpVtbl->get_dir(This,p)
#define IHTMLDocument3_put_oncontextmenu(This,v) (This)->lpVtbl->put_oncontextmenu(This,v)
#define IHTMLDocument3_get_oncontextmenu(This,p) (This)->lpVtbl->get_oncontextmenu(This,p)
#define IHTMLDocument3_put_onstop(This,v) (This)->lpVtbl->put_onstop(This,v)
#define IHTMLDocument3_get_onstop(This,p) (This)->lpVtbl->get_onstop(This,p)
#define IHTMLDocument3_createDocumentFragment(This,pNewDoc) (This)->lpVtbl->createDocumentFragment(This,pNewDoc)
#define IHTMLDocument3_get_parentDocument(This,p) (This)->lpVtbl->get_parentDocument(This,p)
#define IHTMLDocument3_put_enableDownload(This,v) (This)->lpVtbl->put_enableDownload(This,v)
#define IHTMLDocument3_get_enableDownload(This,p) (This)->lpVtbl->get_enableDownload(This,p)
#define IHTMLDocument3_put_baseUrl(This,v) (This)->lpVtbl->put_baseUrl(This,v)
#define IHTMLDocument3_get_baseUrl(This,p) (This)->lpVtbl->get_baseUrl(This,p)
#define IHTMLDocument3_get_childNodes(This,p) (This)->lpVtbl->get_childNodes(This,p)
#define IHTMLDocument3_put_inheritStyleSheets(This,v) (This)->lpVtbl->put_inheritStyleSheets(This,v)
#define IHTMLDocument3_get_inheritStyleSheets(This,p) (This)->lpVtbl->get_inheritStyleSheets(This,p)
#define IHTMLDocument3_put_onbeforeeditfocus(This,v) (This)->lpVtbl->put_onbeforeeditfocus(This,v)
#define IHTMLDocument3_get_onbeforeeditfocus(This,p) (This)->lpVtbl->get_onbeforeeditfocus(This,p)
#define IHTMLDocument3_getElementsByName(This,v,pelColl) (This)->lpVtbl->getElementsByName(This,v,pelColl)
#define IHTMLDocument3_getElementById(This,v,pel) (This)->lpVtbl->getElementById(This,v,pel)
#define IHTMLDocument3_getElementsByTagName(This,v,pelColl) (This)->lpVtbl->getElementsByTagName(This,v,pelColl)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDocument3_QueryInterface(IHTMLDocument3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDocument3_AddRef(IHTMLDocument3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDocument3_Release(IHTMLDocument3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDocument3_GetTypeInfoCount(IHTMLDocument3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDocument3_GetTypeInfo(IHTMLDocument3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDocument3_GetIDsOfNames(IHTMLDocument3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDocument3_Invoke(IHTMLDocument3* 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);
}
/*** IHTMLDocument3 methods ***/
static FORCEINLINE HRESULT IHTMLDocument3_releaseCapture(IHTMLDocument3* This) {
    return This->lpVtbl->releaseCapture(This);
}
static FORCEINLINE HRESULT IHTMLDocument3_recalc(IHTMLDocument3* This,VARIANT_BOOL fForce) {
    return This->lpVtbl->recalc(This,fForce);
}
static FORCEINLINE HRESULT IHTMLDocument3_createTextNode(IHTMLDocument3* This,BSTR text,IHTMLDOMNode **newTextNode) {
    return This->lpVtbl->createTextNode(This,text,newTextNode);
}
static FORCEINLINE HRESULT IHTMLDocument3_get_documentElement(IHTMLDocument3* This,IHTMLElement **p) {
    return This->lpVtbl->get_documentElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument3_get_uniqueID(IHTMLDocument3* This,BSTR *p) {
    return This->lpVtbl->get_uniqueID(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument3_attachEvent(IHTMLDocument3* This,BSTR event,IDispatch *pDisp,VARIANT_BOOL *pfResult) {
    return This->lpVtbl->attachEvent(This,event,pDisp,pfResult);
}
static FORCEINLINE HRESULT IHTMLDocument3_detachEvent(IHTMLDocument3* This,BSTR event,IDispatch *pDisp) {
    return This->lpVtbl->detachEvent(This,event,pDisp);
}
static FORCEINLINE HRESULT IHTMLDocument3_put_onrowsdelete(IHTMLDocument3* This,VARIANT v) {
    return This->lpVtbl->put_onrowsdelete(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument3_get_onrowsdelete(IHTMLDocument3* This,VARIANT *p) {
    return This->lpVtbl->get_onrowsdelete(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument3_put_onrowsinserted(IHTMLDocument3* This,VARIANT v) {
    return This->lpVtbl->put_onrowsinserted(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument3_get_onrowsinserted(IHTMLDocument3* This,VARIANT *p) {
    return This->lpVtbl->get_onrowsinserted(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument3_put_oncellchange(IHTMLDocument3* This,VARIANT v) {
    return This->lpVtbl->put_oncellchange(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument3_get_oncellchange(IHTMLDocument3* This,VARIANT *p) {
    return This->lpVtbl->get_oncellchange(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument3_put_ondatasetchanged(IHTMLDocument3* This,VARIANT v) {
    return This->lpVtbl->put_ondatasetchanged(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument3_get_ondatasetchanged(IHTMLDocument3* This,VARIANT *p) {
    return This->lpVtbl->get_ondatasetchanged(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument3_put_ondataavailable(IHTMLDocument3* This,VARIANT v) {
    return This->lpVtbl->put_ondataavailable(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument3_get_ondataavailable(IHTMLDocument3* This,VARIANT *p) {
    return This->lpVtbl->get_ondataavailable(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument3_put_ondatasetcomplete(IHTMLDocument3* This,VARIANT v) {
    return This->lpVtbl->put_ondatasetcomplete(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument3_get_ondatasetcomplete(IHTMLDocument3* This,VARIANT *p) {
    return This->lpVtbl->get_ondatasetcomplete(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument3_put_onpropertychange(IHTMLDocument3* This,VARIANT v) {
    return This->lpVtbl->put_onpropertychange(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument3_get_onpropertychange(IHTMLDocument3* This,VARIANT *p) {
    return This->lpVtbl->get_onpropertychange(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument3_put_dir(IHTMLDocument3* This,BSTR v) {
    return This->lpVtbl->put_dir(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument3_get_dir(IHTMLDocument3* This,BSTR *p) {
    return This->lpVtbl->get_dir(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument3_put_oncontextmenu(IHTMLDocument3* This,VARIANT v) {
    return This->lpVtbl->put_oncontextmenu(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument3_get_oncontextmenu(IHTMLDocument3* This,VARIANT *p) {
    return This->lpVtbl->get_oncontextmenu(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument3_put_onstop(IHTMLDocument3* This,VARIANT v) {
    return This->lpVtbl->put_onstop(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument3_get_onstop(IHTMLDocument3* This,VARIANT *p) {
    return This->lpVtbl->get_onstop(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument3_createDocumentFragment(IHTMLDocument3* This,IHTMLDocument2 **pNewDoc) {
    return This->lpVtbl->createDocumentFragment(This,pNewDoc);
}
static FORCEINLINE HRESULT IHTMLDocument3_get_parentDocument(IHTMLDocument3* This,IHTMLDocument2 **p) {
    return This->lpVtbl->get_parentDocument(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument3_put_enableDownload(IHTMLDocument3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_enableDownload(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument3_get_enableDownload(IHTMLDocument3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_enableDownload(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument3_put_baseUrl(IHTMLDocument3* This,BSTR v) {
    return This->lpVtbl->put_baseUrl(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument3_get_baseUrl(IHTMLDocument3* This,BSTR *p) {
    return This->lpVtbl->get_baseUrl(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument3_get_childNodes(IHTMLDocument3* This,IDispatch **p) {
    return This->lpVtbl->get_childNodes(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument3_put_inheritStyleSheets(IHTMLDocument3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_inheritStyleSheets(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument3_get_inheritStyleSheets(IHTMLDocument3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_inheritStyleSheets(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument3_put_onbeforeeditfocus(IHTMLDocument3* This,VARIANT v) {
    return This->lpVtbl->put_onbeforeeditfocus(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument3_get_onbeforeeditfocus(IHTMLDocument3* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforeeditfocus(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument3_getElementsByName(IHTMLDocument3* This,BSTR v,IHTMLElementCollection **pelColl) {
    return This->lpVtbl->getElementsByName(This,v,pelColl);
}
static FORCEINLINE HRESULT IHTMLDocument3_getElementById(IHTMLDocument3* This,BSTR v,IHTMLElement **pel) {
    return This->lpVtbl->getElementById(This,v,pel);
}
static FORCEINLINE HRESULT IHTMLDocument3_getElementsByTagName(IHTMLDocument3* This,BSTR v,IHTMLElementCollection **pelColl) {
    return This->lpVtbl->getElementsByTagName(This,v,pelColl);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDocument3_releaseCapture_Proxy(
    IHTMLDocument3* This);
void __RPC_STUB IHTMLDocument3_releaseCapture_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_recalc_Proxy(
    IHTMLDocument3* This,
    VARIANT_BOOL fForce);
void __RPC_STUB IHTMLDocument3_recalc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_createTextNode_Proxy(
    IHTMLDocument3* This,
    BSTR text,
    IHTMLDOMNode **newTextNode);
void __RPC_STUB IHTMLDocument3_createTextNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_get_documentElement_Proxy(
    IHTMLDocument3* This,
    IHTMLElement **p);
void __RPC_STUB IHTMLDocument3_get_documentElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_get_uniqueID_Proxy(
    IHTMLDocument3* This,
    BSTR *p);
void __RPC_STUB IHTMLDocument3_get_uniqueID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_attachEvent_Proxy(
    IHTMLDocument3* This,
    BSTR event,
    IDispatch *pDisp,
    VARIANT_BOOL *pfResult);
void __RPC_STUB IHTMLDocument3_attachEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_detachEvent_Proxy(
    IHTMLDocument3* This,
    BSTR event,
    IDispatch *pDisp);
void __RPC_STUB IHTMLDocument3_detachEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_put_onrowsdelete_Proxy(
    IHTMLDocument3* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument3_put_onrowsdelete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_get_onrowsdelete_Proxy(
    IHTMLDocument3* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument3_get_onrowsdelete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_put_onrowsinserted_Proxy(
    IHTMLDocument3* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument3_put_onrowsinserted_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_get_onrowsinserted_Proxy(
    IHTMLDocument3* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument3_get_onrowsinserted_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_put_oncellchange_Proxy(
    IHTMLDocument3* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument3_put_oncellchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_get_oncellchange_Proxy(
    IHTMLDocument3* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument3_get_oncellchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_put_ondatasetchanged_Proxy(
    IHTMLDocument3* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument3_put_ondatasetchanged_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_get_ondatasetchanged_Proxy(
    IHTMLDocument3* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument3_get_ondatasetchanged_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_put_ondataavailable_Proxy(
    IHTMLDocument3* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument3_put_ondataavailable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_get_ondataavailable_Proxy(
    IHTMLDocument3* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument3_get_ondataavailable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_put_ondatasetcomplete_Proxy(
    IHTMLDocument3* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument3_put_ondatasetcomplete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_get_ondatasetcomplete_Proxy(
    IHTMLDocument3* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument3_get_ondatasetcomplete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_put_onpropertychange_Proxy(
    IHTMLDocument3* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument3_put_onpropertychange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_get_onpropertychange_Proxy(
    IHTMLDocument3* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument3_get_onpropertychange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_put_dir_Proxy(
    IHTMLDocument3* This,
    BSTR v);
void __RPC_STUB IHTMLDocument3_put_dir_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_get_dir_Proxy(
    IHTMLDocument3* This,
    BSTR *p);
void __RPC_STUB IHTMLDocument3_get_dir_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_put_oncontextmenu_Proxy(
    IHTMLDocument3* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument3_put_oncontextmenu_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_get_oncontextmenu_Proxy(
    IHTMLDocument3* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument3_get_oncontextmenu_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_put_onstop_Proxy(
    IHTMLDocument3* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument3_put_onstop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_get_onstop_Proxy(
    IHTMLDocument3* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument3_get_onstop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_createDocumentFragment_Proxy(
    IHTMLDocument3* This,
    IHTMLDocument2 **pNewDoc);
void __RPC_STUB IHTMLDocument3_createDocumentFragment_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_get_parentDocument_Proxy(
    IHTMLDocument3* This,
    IHTMLDocument2 **p);
void __RPC_STUB IHTMLDocument3_get_parentDocument_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_put_enableDownload_Proxy(
    IHTMLDocument3* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLDocument3_put_enableDownload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_get_enableDownload_Proxy(
    IHTMLDocument3* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLDocument3_get_enableDownload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_put_baseUrl_Proxy(
    IHTMLDocument3* This,
    BSTR v);
void __RPC_STUB IHTMLDocument3_put_baseUrl_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_get_baseUrl_Proxy(
    IHTMLDocument3* This,
    BSTR *p);
void __RPC_STUB IHTMLDocument3_get_baseUrl_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_get_childNodes_Proxy(
    IHTMLDocument3* This,
    IDispatch **p);
void __RPC_STUB IHTMLDocument3_get_childNodes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_put_inheritStyleSheets_Proxy(
    IHTMLDocument3* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLDocument3_put_inheritStyleSheets_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_get_inheritStyleSheets_Proxy(
    IHTMLDocument3* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLDocument3_get_inheritStyleSheets_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_put_onbeforeeditfocus_Proxy(
    IHTMLDocument3* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument3_put_onbeforeeditfocus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_get_onbeforeeditfocus_Proxy(
    IHTMLDocument3* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument3_get_onbeforeeditfocus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_getElementsByName_Proxy(
    IHTMLDocument3* This,
    BSTR v,
    IHTMLElementCollection **pelColl);
void __RPC_STUB IHTMLDocument3_getElementsByName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_getElementById_Proxy(
    IHTMLDocument3* This,
    BSTR v,
    IHTMLElement **pel);
void __RPC_STUB IHTMLDocument3_getElementById_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument3_getElementsByTagName_Proxy(
    IHTMLDocument3* This,
    BSTR v,
    IHTMLElementCollection **pelColl);
void __RPC_STUB IHTMLDocument3_getElementsByTagName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDocument3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLDocument4 interface
 */
#ifndef __IHTMLDocument4_INTERFACE_DEFINED__
#define __IHTMLDocument4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDocument4, 0x3050f69a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f69a-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDocument4 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE focus(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE hasFocus(
        VARIANT_BOOL *pfFocus) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onselectionchange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onselectionchange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_namespaces(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE createDocumentFromUrl(
        BSTR bstrUrl,
        BSTR bstrOptions,
        IHTMLDocument2 **newDoc) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_media(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_media(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE createEventObject(
        VARIANT *pvarEventObject,
        IHTMLEventObj **ppEventObj) = 0;

    virtual HRESULT STDMETHODCALLTYPE fireEvent(
        BSTR bstrEventName,
        VARIANT *pvarEventObject,
        VARIANT_BOOL *pfCancelled) = 0;

    virtual HRESULT STDMETHODCALLTYPE createRenderStyle(
        BSTR v,
        IHTMLRenderStyle **ppIHTMLRenderStyle) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_oncontrolselect(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_oncontrolselect(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_URLUnencoded(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDocument4, 0x3050f69a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDocument4Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLDocument4* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLDocument4* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLDocument4* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLDocument4* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLDocument4* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLDocument4* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLDocument4* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLDocument4 methods ***/
    HRESULT (STDMETHODCALLTYPE *focus)(
        IHTMLDocument4* This);

    HRESULT (STDMETHODCALLTYPE *hasFocus)(
        IHTMLDocument4* This,
        VARIANT_BOOL *pfFocus);

    HRESULT (STDMETHODCALLTYPE *put_onselectionchange)(
        IHTMLDocument4* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onselectionchange)(
        IHTMLDocument4* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_namespaces)(
        IHTMLDocument4* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *createDocumentFromUrl)(
        IHTMLDocument4* This,
        BSTR bstrUrl,
        BSTR bstrOptions,
        IHTMLDocument2 **newDoc);

    HRESULT (STDMETHODCALLTYPE *put_media)(
        IHTMLDocument4* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_media)(
        IHTMLDocument4* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *createEventObject)(
        IHTMLDocument4* This,
        VARIANT *pvarEventObject,
        IHTMLEventObj **ppEventObj);

    HRESULT (STDMETHODCALLTYPE *fireEvent)(
        IHTMLDocument4* This,
        BSTR bstrEventName,
        VARIANT *pvarEventObject,
        VARIANT_BOOL *pfCancelled);

    HRESULT (STDMETHODCALLTYPE *createRenderStyle)(
        IHTMLDocument4* This,
        BSTR v,
        IHTMLRenderStyle **ppIHTMLRenderStyle);

    HRESULT (STDMETHODCALLTYPE *put_oncontrolselect)(
        IHTMLDocument4* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_oncontrolselect)(
        IHTMLDocument4* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_URLUnencoded)(
        IHTMLDocument4* This,
        BSTR *p);

    END_INTERFACE
} IHTMLDocument4Vtbl;
interface IHTMLDocument4 {
    CONST_VTBL IHTMLDocument4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDocument4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDocument4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDocument4_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDocument4_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDocument4_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDocument4_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDocument4_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDocument4 methods ***/
#define IHTMLDocument4_focus(This) (This)->lpVtbl->focus(This)
#define IHTMLDocument4_hasFocus(This,pfFocus) (This)->lpVtbl->hasFocus(This,pfFocus)
#define IHTMLDocument4_put_onselectionchange(This,v) (This)->lpVtbl->put_onselectionchange(This,v)
#define IHTMLDocument4_get_onselectionchange(This,p) (This)->lpVtbl->get_onselectionchange(This,p)
#define IHTMLDocument4_get_namespaces(This,p) (This)->lpVtbl->get_namespaces(This,p)
#define IHTMLDocument4_createDocumentFromUrl(This,bstrUrl,bstrOptions,newDoc) (This)->lpVtbl->createDocumentFromUrl(This,bstrUrl,bstrOptions,newDoc)
#define IHTMLDocument4_put_media(This,v) (This)->lpVtbl->put_media(This,v)
#define IHTMLDocument4_get_media(This,p) (This)->lpVtbl->get_media(This,p)
#define IHTMLDocument4_createEventObject(This,pvarEventObject,ppEventObj) (This)->lpVtbl->createEventObject(This,pvarEventObject,ppEventObj)
#define IHTMLDocument4_fireEvent(This,bstrEventName,pvarEventObject,pfCancelled) (This)->lpVtbl->fireEvent(This,bstrEventName,pvarEventObject,pfCancelled)
#define IHTMLDocument4_createRenderStyle(This,v,ppIHTMLRenderStyle) (This)->lpVtbl->createRenderStyle(This,v,ppIHTMLRenderStyle)
#define IHTMLDocument4_put_oncontrolselect(This,v) (This)->lpVtbl->put_oncontrolselect(This,v)
#define IHTMLDocument4_get_oncontrolselect(This,p) (This)->lpVtbl->get_oncontrolselect(This,p)
#define IHTMLDocument4_get_URLUnencoded(This,p) (This)->lpVtbl->get_URLUnencoded(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDocument4_QueryInterface(IHTMLDocument4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDocument4_AddRef(IHTMLDocument4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDocument4_Release(IHTMLDocument4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDocument4_GetTypeInfoCount(IHTMLDocument4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDocument4_GetTypeInfo(IHTMLDocument4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDocument4_GetIDsOfNames(IHTMLDocument4* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDocument4_Invoke(IHTMLDocument4* 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);
}
/*** IHTMLDocument4 methods ***/
static FORCEINLINE HRESULT IHTMLDocument4_focus(IHTMLDocument4* This) {
    return This->lpVtbl->focus(This);
}
static FORCEINLINE HRESULT IHTMLDocument4_hasFocus(IHTMLDocument4* This,VARIANT_BOOL *pfFocus) {
    return This->lpVtbl->hasFocus(This,pfFocus);
}
static FORCEINLINE HRESULT IHTMLDocument4_put_onselectionchange(IHTMLDocument4* This,VARIANT v) {
    return This->lpVtbl->put_onselectionchange(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument4_get_onselectionchange(IHTMLDocument4* This,VARIANT *p) {
    return This->lpVtbl->get_onselectionchange(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument4_get_namespaces(IHTMLDocument4* This,IDispatch **p) {
    return This->lpVtbl->get_namespaces(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument4_createDocumentFromUrl(IHTMLDocument4* This,BSTR bstrUrl,BSTR bstrOptions,IHTMLDocument2 **newDoc) {
    return This->lpVtbl->createDocumentFromUrl(This,bstrUrl,bstrOptions,newDoc);
}
static FORCEINLINE HRESULT IHTMLDocument4_put_media(IHTMLDocument4* This,BSTR v) {
    return This->lpVtbl->put_media(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument4_get_media(IHTMLDocument4* This,BSTR *p) {
    return This->lpVtbl->get_media(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument4_createEventObject(IHTMLDocument4* This,VARIANT *pvarEventObject,IHTMLEventObj **ppEventObj) {
    return This->lpVtbl->createEventObject(This,pvarEventObject,ppEventObj);
}
static FORCEINLINE HRESULT IHTMLDocument4_fireEvent(IHTMLDocument4* This,BSTR bstrEventName,VARIANT *pvarEventObject,VARIANT_BOOL *pfCancelled) {
    return This->lpVtbl->fireEvent(This,bstrEventName,pvarEventObject,pfCancelled);
}
static FORCEINLINE HRESULT IHTMLDocument4_createRenderStyle(IHTMLDocument4* This,BSTR v,IHTMLRenderStyle **ppIHTMLRenderStyle) {
    return This->lpVtbl->createRenderStyle(This,v,ppIHTMLRenderStyle);
}
static FORCEINLINE HRESULT IHTMLDocument4_put_oncontrolselect(IHTMLDocument4* This,VARIANT v) {
    return This->lpVtbl->put_oncontrolselect(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument4_get_oncontrolselect(IHTMLDocument4* This,VARIANT *p) {
    return This->lpVtbl->get_oncontrolselect(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument4_get_URLUnencoded(IHTMLDocument4* This,BSTR *p) {
    return This->lpVtbl->get_URLUnencoded(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDocument4_focus_Proxy(
    IHTMLDocument4* This);
void __RPC_STUB IHTMLDocument4_focus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument4_hasFocus_Proxy(
    IHTMLDocument4* This,
    VARIANT_BOOL *pfFocus);
void __RPC_STUB IHTMLDocument4_hasFocus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument4_put_onselectionchange_Proxy(
    IHTMLDocument4* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument4_put_onselectionchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument4_get_onselectionchange_Proxy(
    IHTMLDocument4* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument4_get_onselectionchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument4_get_namespaces_Proxy(
    IHTMLDocument4* This,
    IDispatch **p);
void __RPC_STUB IHTMLDocument4_get_namespaces_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument4_createDocumentFromUrl_Proxy(
    IHTMLDocument4* This,
    BSTR bstrUrl,
    BSTR bstrOptions,
    IHTMLDocument2 **newDoc);
void __RPC_STUB IHTMLDocument4_createDocumentFromUrl_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument4_put_media_Proxy(
    IHTMLDocument4* This,
    BSTR v);
void __RPC_STUB IHTMLDocument4_put_media_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument4_get_media_Proxy(
    IHTMLDocument4* This,
    BSTR *p);
void __RPC_STUB IHTMLDocument4_get_media_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument4_createEventObject_Proxy(
    IHTMLDocument4* This,
    VARIANT *pvarEventObject,
    IHTMLEventObj **ppEventObj);
void __RPC_STUB IHTMLDocument4_createEventObject_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument4_fireEvent_Proxy(
    IHTMLDocument4* This,
    BSTR bstrEventName,
    VARIANT *pvarEventObject,
    VARIANT_BOOL *pfCancelled);
void __RPC_STUB IHTMLDocument4_fireEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument4_createRenderStyle_Proxy(
    IHTMLDocument4* This,
    BSTR v,
    IHTMLRenderStyle **ppIHTMLRenderStyle);
void __RPC_STUB IHTMLDocument4_createRenderStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument4_put_oncontrolselect_Proxy(
    IHTMLDocument4* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument4_put_oncontrolselect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument4_get_oncontrolselect_Proxy(
    IHTMLDocument4* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument4_get_oncontrolselect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument4_get_URLUnencoded_Proxy(
    IHTMLDocument4* This,
    BSTR *p);
void __RPC_STUB IHTMLDocument4_get_URLUnencoded_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDocument4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLDocument5 interface
 */
#ifndef __IHTMLDocument5_INTERFACE_DEFINED__
#define __IHTMLDocument5_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDocument5, 0x3050f80c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f80c-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDocument5 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_onmousewheel(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmousewheel(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_doctype(
        IHTMLDOMNode **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_implementation(
        IHTMLDOMImplementation **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE createAttribute(
        BSTR bstrattrName,
        IHTMLDOMAttribute **ppattribute) = 0;

    virtual HRESULT STDMETHODCALLTYPE createComment(
        BSTR bstrdata,
        IHTMLDOMNode **ppRetNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onfocusin(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onfocusin(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onfocusout(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onfocusout(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onactivate(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onactivate(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondeactivate(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondeactivate(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onbeforeactivate(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onbeforeactivate(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onbeforedeactivate(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onbeforedeactivate(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_compatMode(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDocument5, 0x3050f80c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDocument5Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLDocument5* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLDocument5* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLDocument5* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLDocument5* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLDocument5* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLDocument5* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLDocument5* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLDocument5 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_onmousewheel)(
        IHTMLDocument5* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmousewheel)(
        IHTMLDocument5* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_doctype)(
        IHTMLDocument5* This,
        IHTMLDOMNode **p);

    HRESULT (STDMETHODCALLTYPE *get_implementation)(
        IHTMLDocument5* This,
        IHTMLDOMImplementation **p);

    HRESULT (STDMETHODCALLTYPE *createAttribute)(
        IHTMLDocument5* This,
        BSTR bstrattrName,
        IHTMLDOMAttribute **ppattribute);

    HRESULT (STDMETHODCALLTYPE *createComment)(
        IHTMLDocument5* This,
        BSTR bstrdata,
        IHTMLDOMNode **ppRetNode);

    HRESULT (STDMETHODCALLTYPE *put_onfocusin)(
        IHTMLDocument5* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onfocusin)(
        IHTMLDocument5* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onfocusout)(
        IHTMLDocument5* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onfocusout)(
        IHTMLDocument5* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onactivate)(
        IHTMLDocument5* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onactivate)(
        IHTMLDocument5* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondeactivate)(
        IHTMLDocument5* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondeactivate)(
        IHTMLDocument5* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onbeforeactivate)(
        IHTMLDocument5* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onbeforeactivate)(
        IHTMLDocument5* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onbeforedeactivate)(
        IHTMLDocument5* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onbeforedeactivate)(
        IHTMLDocument5* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_compatMode)(
        IHTMLDocument5* This,
        BSTR *p);

    END_INTERFACE
} IHTMLDocument5Vtbl;
interface IHTMLDocument5 {
    CONST_VTBL IHTMLDocument5Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDocument5_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDocument5_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDocument5_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDocument5_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDocument5_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDocument5_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDocument5_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDocument5 methods ***/
#define IHTMLDocument5_put_onmousewheel(This,v) (This)->lpVtbl->put_onmousewheel(This,v)
#define IHTMLDocument5_get_onmousewheel(This,p) (This)->lpVtbl->get_onmousewheel(This,p)
#define IHTMLDocument5_get_doctype(This,p) (This)->lpVtbl->get_doctype(This,p)
#define IHTMLDocument5_get_implementation(This,p) (This)->lpVtbl->get_implementation(This,p)
#define IHTMLDocument5_createAttribute(This,bstrattrName,ppattribute) (This)->lpVtbl->createAttribute(This,bstrattrName,ppattribute)
#define IHTMLDocument5_createComment(This,bstrdata,ppRetNode) (This)->lpVtbl->createComment(This,bstrdata,ppRetNode)
#define IHTMLDocument5_put_onfocusin(This,v) (This)->lpVtbl->put_onfocusin(This,v)
#define IHTMLDocument5_get_onfocusin(This,p) (This)->lpVtbl->get_onfocusin(This,p)
#define IHTMLDocument5_put_onfocusout(This,v) (This)->lpVtbl->put_onfocusout(This,v)
#define IHTMLDocument5_get_onfocusout(This,p) (This)->lpVtbl->get_onfocusout(This,p)
#define IHTMLDocument5_put_onactivate(This,v) (This)->lpVtbl->put_onactivate(This,v)
#define IHTMLDocument5_get_onactivate(This,p) (This)->lpVtbl->get_onactivate(This,p)
#define IHTMLDocument5_put_ondeactivate(This,v) (This)->lpVtbl->put_ondeactivate(This,v)
#define IHTMLDocument5_get_ondeactivate(This,p) (This)->lpVtbl->get_ondeactivate(This,p)
#define IHTMLDocument5_put_onbeforeactivate(This,v) (This)->lpVtbl->put_onbeforeactivate(This,v)
#define IHTMLDocument5_get_onbeforeactivate(This,p) (This)->lpVtbl->get_onbeforeactivate(This,p)
#define IHTMLDocument5_put_onbeforedeactivate(This,v) (This)->lpVtbl->put_onbeforedeactivate(This,v)
#define IHTMLDocument5_get_onbeforedeactivate(This,p) (This)->lpVtbl->get_onbeforedeactivate(This,p)
#define IHTMLDocument5_get_compatMode(This,p) (This)->lpVtbl->get_compatMode(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDocument5_QueryInterface(IHTMLDocument5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDocument5_AddRef(IHTMLDocument5* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDocument5_Release(IHTMLDocument5* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDocument5_GetTypeInfoCount(IHTMLDocument5* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDocument5_GetTypeInfo(IHTMLDocument5* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDocument5_GetIDsOfNames(IHTMLDocument5* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDocument5_Invoke(IHTMLDocument5* 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);
}
/*** IHTMLDocument5 methods ***/
static FORCEINLINE HRESULT IHTMLDocument5_put_onmousewheel(IHTMLDocument5* This,VARIANT v) {
    return This->lpVtbl->put_onmousewheel(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument5_get_onmousewheel(IHTMLDocument5* This,VARIANT *p) {
    return This->lpVtbl->get_onmousewheel(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument5_get_doctype(IHTMLDocument5* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_doctype(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument5_get_implementation(IHTMLDocument5* This,IHTMLDOMImplementation **p) {
    return This->lpVtbl->get_implementation(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument5_createAttribute(IHTMLDocument5* This,BSTR bstrattrName,IHTMLDOMAttribute **ppattribute) {
    return This->lpVtbl->createAttribute(This,bstrattrName,ppattribute);
}
static FORCEINLINE HRESULT IHTMLDocument5_createComment(IHTMLDocument5* This,BSTR bstrdata,IHTMLDOMNode **ppRetNode) {
    return This->lpVtbl->createComment(This,bstrdata,ppRetNode);
}
static FORCEINLINE HRESULT IHTMLDocument5_put_onfocusin(IHTMLDocument5* This,VARIANT v) {
    return This->lpVtbl->put_onfocusin(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument5_get_onfocusin(IHTMLDocument5* This,VARIANT *p) {
    return This->lpVtbl->get_onfocusin(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument5_put_onfocusout(IHTMLDocument5* This,VARIANT v) {
    return This->lpVtbl->put_onfocusout(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument5_get_onfocusout(IHTMLDocument5* This,VARIANT *p) {
    return This->lpVtbl->get_onfocusout(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument5_put_onactivate(IHTMLDocument5* This,VARIANT v) {
    return This->lpVtbl->put_onactivate(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument5_get_onactivate(IHTMLDocument5* This,VARIANT *p) {
    return This->lpVtbl->get_onactivate(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument5_put_ondeactivate(IHTMLDocument5* This,VARIANT v) {
    return This->lpVtbl->put_ondeactivate(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument5_get_ondeactivate(IHTMLDocument5* This,VARIANT *p) {
    return This->lpVtbl->get_ondeactivate(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument5_put_onbeforeactivate(IHTMLDocument5* This,VARIANT v) {
    return This->lpVtbl->put_onbeforeactivate(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument5_get_onbeforeactivate(IHTMLDocument5* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforeactivate(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument5_put_onbeforedeactivate(IHTMLDocument5* This,VARIANT v) {
    return This->lpVtbl->put_onbeforedeactivate(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument5_get_onbeforedeactivate(IHTMLDocument5* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforedeactivate(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument5_get_compatMode(IHTMLDocument5* This,BSTR *p) {
    return This->lpVtbl->get_compatMode(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDocument5_put_onmousewheel_Proxy(
    IHTMLDocument5* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument5_put_onmousewheel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument5_get_onmousewheel_Proxy(
    IHTMLDocument5* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument5_get_onmousewheel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument5_get_doctype_Proxy(
    IHTMLDocument5* This,
    IHTMLDOMNode **p);
void __RPC_STUB IHTMLDocument5_get_doctype_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument5_get_implementation_Proxy(
    IHTMLDocument5* This,
    IHTMLDOMImplementation **p);
void __RPC_STUB IHTMLDocument5_get_implementation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument5_createAttribute_Proxy(
    IHTMLDocument5* This,
    BSTR bstrattrName,
    IHTMLDOMAttribute **ppattribute);
void __RPC_STUB IHTMLDocument5_createAttribute_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument5_createComment_Proxy(
    IHTMLDocument5* This,
    BSTR bstrdata,
    IHTMLDOMNode **ppRetNode);
void __RPC_STUB IHTMLDocument5_createComment_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument5_put_onfocusin_Proxy(
    IHTMLDocument5* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument5_put_onfocusin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument5_get_onfocusin_Proxy(
    IHTMLDocument5* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument5_get_onfocusin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument5_put_onfocusout_Proxy(
    IHTMLDocument5* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument5_put_onfocusout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument5_get_onfocusout_Proxy(
    IHTMLDocument5* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument5_get_onfocusout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument5_put_onactivate_Proxy(
    IHTMLDocument5* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument5_put_onactivate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument5_get_onactivate_Proxy(
    IHTMLDocument5* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument5_get_onactivate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument5_put_ondeactivate_Proxy(
    IHTMLDocument5* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument5_put_ondeactivate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument5_get_ondeactivate_Proxy(
    IHTMLDocument5* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument5_get_ondeactivate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument5_put_onbeforeactivate_Proxy(
    IHTMLDocument5* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument5_put_onbeforeactivate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument5_get_onbeforeactivate_Proxy(
    IHTMLDocument5* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument5_get_onbeforeactivate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument5_put_onbeforedeactivate_Proxy(
    IHTMLDocument5* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument5_put_onbeforedeactivate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument5_get_onbeforedeactivate_Proxy(
    IHTMLDocument5* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument5_get_onbeforedeactivate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument5_get_compatMode_Proxy(
    IHTMLDocument5* This,
    BSTR *p);
void __RPC_STUB IHTMLDocument5_get_compatMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDocument5_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLDocument6 interface
 */
#ifndef __IHTMLDocument6_INTERFACE_DEFINED__
#define __IHTMLDocument6_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDocument6, 0x30510417, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510417-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDocument6 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_compatible(
        IHTMLDocumentCompatibleInfoCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_documentMode(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onstorage(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onstorage(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onstoragecommit(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onstoragecommit(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE getElementById(
        BSTR bstrId,
        IHTMLElement2 **ppRetElement) = 0;

    virtual HRESULT STDMETHODCALLTYPE updateSettings(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDocument6, 0x30510417, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDocument6Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLDocument6* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLDocument6* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLDocument6* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLDocument6* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLDocument6* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLDocument6* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLDocument6* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLDocument6 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_compatible)(
        IHTMLDocument6* This,
        IHTMLDocumentCompatibleInfoCollection **p);

    HRESULT (STDMETHODCALLTYPE *get_documentMode)(
        IHTMLDocument6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onstorage)(
        IHTMLDocument6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onstorage)(
        IHTMLDocument6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onstoragecommit)(
        IHTMLDocument6* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onstoragecommit)(
        IHTMLDocument6* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *getElementById)(
        IHTMLDocument6* This,
        BSTR bstrId,
        IHTMLElement2 **ppRetElement);

    HRESULT (STDMETHODCALLTYPE *updateSettings)(
        IHTMLDocument6* This);

    END_INTERFACE
} IHTMLDocument6Vtbl;
interface IHTMLDocument6 {
    CONST_VTBL IHTMLDocument6Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDocument6_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDocument6_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDocument6_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDocument6_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDocument6_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDocument6_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDocument6_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDocument6 methods ***/
#define IHTMLDocument6_get_compatible(This,p) (This)->lpVtbl->get_compatible(This,p)
#define IHTMLDocument6_get_documentMode(This,p) (This)->lpVtbl->get_documentMode(This,p)
#define IHTMLDocument6_put_onstorage(This,v) (This)->lpVtbl->put_onstorage(This,v)
#define IHTMLDocument6_get_onstorage(This,p) (This)->lpVtbl->get_onstorage(This,p)
#define IHTMLDocument6_put_onstoragecommit(This,v) (This)->lpVtbl->put_onstoragecommit(This,v)
#define IHTMLDocument6_get_onstoragecommit(This,p) (This)->lpVtbl->get_onstoragecommit(This,p)
#define IHTMLDocument6_getElementById(This,bstrId,ppRetElement) (This)->lpVtbl->getElementById(This,bstrId,ppRetElement)
#define IHTMLDocument6_updateSettings(This) (This)->lpVtbl->updateSettings(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDocument6_QueryInterface(IHTMLDocument6* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDocument6_AddRef(IHTMLDocument6* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDocument6_Release(IHTMLDocument6* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDocument6_GetTypeInfoCount(IHTMLDocument6* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDocument6_GetTypeInfo(IHTMLDocument6* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDocument6_GetIDsOfNames(IHTMLDocument6* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDocument6_Invoke(IHTMLDocument6* 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);
}
/*** IHTMLDocument6 methods ***/
static FORCEINLINE HRESULT IHTMLDocument6_get_compatible(IHTMLDocument6* This,IHTMLDocumentCompatibleInfoCollection **p) {
    return This->lpVtbl->get_compatible(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument6_get_documentMode(IHTMLDocument6* This,VARIANT *p) {
    return This->lpVtbl->get_documentMode(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument6_put_onstorage(IHTMLDocument6* This,VARIANT v) {
    return This->lpVtbl->put_onstorage(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument6_get_onstorage(IHTMLDocument6* This,VARIANT *p) {
    return This->lpVtbl->get_onstorage(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument6_put_onstoragecommit(IHTMLDocument6* This,VARIANT v) {
    return This->lpVtbl->put_onstoragecommit(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument6_get_onstoragecommit(IHTMLDocument6* This,VARIANT *p) {
    return This->lpVtbl->get_onstoragecommit(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument6_getElementById(IHTMLDocument6* This,BSTR bstrId,IHTMLElement2 **ppRetElement) {
    return This->lpVtbl->getElementById(This,bstrId,ppRetElement);
}
static FORCEINLINE HRESULT IHTMLDocument6_updateSettings(IHTMLDocument6* This) {
    return This->lpVtbl->updateSettings(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDocument6_get_compatible_Proxy(
    IHTMLDocument6* This,
    IHTMLDocumentCompatibleInfoCollection **p);
void __RPC_STUB IHTMLDocument6_get_compatible_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument6_get_documentMode_Proxy(
    IHTMLDocument6* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument6_get_documentMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument6_put_onstorage_Proxy(
    IHTMLDocument6* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument6_put_onstorage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument6_get_onstorage_Proxy(
    IHTMLDocument6* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument6_get_onstorage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument6_put_onstoragecommit_Proxy(
    IHTMLDocument6* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument6_put_onstoragecommit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument6_get_onstoragecommit_Proxy(
    IHTMLDocument6* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument6_get_onstoragecommit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument6_getElementById_Proxy(
    IHTMLDocument6* This,
    BSTR bstrId,
    IHTMLElement2 **ppRetElement);
void __RPC_STUB IHTMLDocument6_getElementById_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument6_updateSettings_Proxy(
    IHTMLDocument6* This);
void __RPC_STUB IHTMLDocument6_updateSettings_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDocument6_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLDocument7 interface
 */
#ifndef __IHTMLDocument7_INTERFACE_DEFINED__
#define __IHTMLDocument7_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDocument7, 0x305104b8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104b8-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDocument7 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_defaultView(
        IHTMLWindow2 **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE createCDATASection(
        BSTR text,
        IHTMLDOMNode **newCDATASectionNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE getSelection(
        IHTMLSelection **ppIHTMLSelection) = 0;

    virtual HRESULT STDMETHODCALLTYPE getElementsByTagNameNS(
        VARIANT *pvarNS,
        BSTR bstrLocalName,
        IHTMLElementCollection **pelColl) = 0;

    virtual HRESULT STDMETHODCALLTYPE createElementNS(
        VARIANT *pvarNS,
        BSTR bstrTag,
        IHTMLElement **newElem) = 0;

    virtual HRESULT STDMETHODCALLTYPE createAttributeNS(
        VARIANT *pvarNS,
        BSTR bstrAttrName,
        IHTMLDOMAttribute **ppAttribute) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmsthumbnailclick(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmsthumbnailclick(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_characterSet(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE createElement(
        BSTR bstrTag,
        IHTMLElement **newElem) = 0;

    virtual HRESULT STDMETHODCALLTYPE createAttribute(
        BSTR bstrAttrName,
        IHTMLDOMAttribute **ppAttribute) = 0;

    virtual HRESULT STDMETHODCALLTYPE getElementsByClassName(
        BSTR v,
        IHTMLElementCollection **pel) = 0;

    virtual HRESULT STDMETHODCALLTYPE createProcessingInstruction(
        BSTR bstrTarget,
        BSTR bstrData,
        IDOMProcessingInstruction **newProcessingInstruction) = 0;

    virtual HRESULT STDMETHODCALLTYPE adoptNode(
        IHTMLDOMNode *pNodeSource,
        IHTMLDOMNode3 **ppNodeDest) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmssitemodejumplistitemremoved(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmssitemodejumplistitemremoved(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_all(
        IHTMLElementCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_inputEncoding(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_xmlEncoding(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_xmlStandalone(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_xmlStandalone(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_xmlVersion(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_xmlVersion(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE hasAttributes(
        VARIANT_BOOL *pfHasAttributes) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onabort(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onabort(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onblur(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onblur(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_oncanplay(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_oncanplay(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_oncanplaythrough(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_oncanplaythrough(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onchange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onchange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondrag(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondrag(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondragend(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondragend(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondragenter(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondragenter(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondragleave(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondragleave(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondragover(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondragover(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondrop(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondrop(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondurationchange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondurationchange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onemptied(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onemptied(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onended(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onended(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onerror(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onerror(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onfocus(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onfocus(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_oninput(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_oninput(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onload(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onload(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onloadeddata(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onloadeddata(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onloadedmetadata(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onloadedmetadata(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onloadstart(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onloadstart(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onpause(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onpause(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onplay(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onplay(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onplaying(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onplaying(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onprogress(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onprogress(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onratechange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onratechange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onreset(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onreset(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onscroll(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onscroll(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onseeked(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onseeked(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onseeking(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onseeking(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onselect(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onselect(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onstalled(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onstalled(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onsubmit(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onsubmit(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onsuspend(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onsuspend(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ontimeupdate(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ontimeupdate(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onvolumechange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onvolumechange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onwaiting(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onwaiting(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE normalize(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE importNode(
        IHTMLDOMNode *pNodeSource,
        VARIANT_BOOL fDeep,
        IHTMLDOMNode3 **ppNodeDest) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_parentWindow(
        IHTMLWindow2 **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_body(
        IHTMLElement *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_body(
        IHTMLElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_head(
        IHTMLElement **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDocument7, 0x305104b8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDocument7Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLDocument7* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLDocument7* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLDocument7* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLDocument7* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLDocument7* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLDocument7* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLDocument7* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLDocument7 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_defaultView)(
        IHTMLDocument7* This,
        IHTMLWindow2 **p);

    HRESULT (STDMETHODCALLTYPE *createCDATASection)(
        IHTMLDocument7* This,
        BSTR text,
        IHTMLDOMNode **newCDATASectionNode);

    HRESULT (STDMETHODCALLTYPE *getSelection)(
        IHTMLDocument7* This,
        IHTMLSelection **ppIHTMLSelection);

    HRESULT (STDMETHODCALLTYPE *getElementsByTagNameNS)(
        IHTMLDocument7* This,
        VARIANT *pvarNS,
        BSTR bstrLocalName,
        IHTMLElementCollection **pelColl);

    HRESULT (STDMETHODCALLTYPE *createElementNS)(
        IHTMLDocument7* This,
        VARIANT *pvarNS,
        BSTR bstrTag,
        IHTMLElement **newElem);

    HRESULT (STDMETHODCALLTYPE *createAttributeNS)(
        IHTMLDocument7* This,
        VARIANT *pvarNS,
        BSTR bstrAttrName,
        IHTMLDOMAttribute **ppAttribute);

    HRESULT (STDMETHODCALLTYPE *put_onmsthumbnailclick)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmsthumbnailclick)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_characterSet)(
        IHTMLDocument7* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *createElement)(
        IHTMLDocument7* This,
        BSTR bstrTag,
        IHTMLElement **newElem);

    HRESULT (STDMETHODCALLTYPE *createAttribute)(
        IHTMLDocument7* This,
        BSTR bstrAttrName,
        IHTMLDOMAttribute **ppAttribute);

    HRESULT (STDMETHODCALLTYPE *getElementsByClassName)(
        IHTMLDocument7* This,
        BSTR v,
        IHTMLElementCollection **pel);

    HRESULT (STDMETHODCALLTYPE *createProcessingInstruction)(
        IHTMLDocument7* This,
        BSTR bstrTarget,
        BSTR bstrData,
        IDOMProcessingInstruction **newProcessingInstruction);

    HRESULT (STDMETHODCALLTYPE *adoptNode)(
        IHTMLDocument7* This,
        IHTMLDOMNode *pNodeSource,
        IHTMLDOMNode3 **ppNodeDest);

    HRESULT (STDMETHODCALLTYPE *put_onmssitemodejumplistitemremoved)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmssitemodejumplistitemremoved)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_all)(
        IHTMLDocument7* This,
        IHTMLElementCollection **p);

    HRESULT (STDMETHODCALLTYPE *get_inputEncoding)(
        IHTMLDocument7* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_xmlEncoding)(
        IHTMLDocument7* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_xmlStandalone)(
        IHTMLDocument7* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_xmlStandalone)(
        IHTMLDocument7* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_xmlVersion)(
        IHTMLDocument7* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_xmlVersion)(
        IHTMLDocument7* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *hasAttributes)(
        IHTMLDocument7* This,
        VARIANT_BOOL *pfHasAttributes);

    HRESULT (STDMETHODCALLTYPE *put_onabort)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onabort)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onblur)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onblur)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_oncanplay)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_oncanplay)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_oncanplaythrough)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_oncanplaythrough)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onchange)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onchange)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondrag)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondrag)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondragend)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondragend)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondragenter)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondragenter)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondragleave)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondragleave)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondragover)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondragover)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondrop)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondrop)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondurationchange)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondurationchange)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onemptied)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onemptied)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onended)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onended)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onerror)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onerror)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onfocus)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onfocus)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_oninput)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_oninput)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onload)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onload)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onloadeddata)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onloadeddata)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onloadedmetadata)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onloadedmetadata)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onloadstart)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onloadstart)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onpause)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onpause)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onplay)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onplay)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onplaying)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onplaying)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onprogress)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onprogress)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onratechange)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onratechange)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onreset)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onreset)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onscroll)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onscroll)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onseeked)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onseeked)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onseeking)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onseeking)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onselect)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onselect)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onstalled)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onstalled)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onsubmit)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onsubmit)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onsuspend)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onsuspend)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ontimeupdate)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ontimeupdate)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onvolumechange)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onvolumechange)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onwaiting)(
        IHTMLDocument7* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onwaiting)(
        IHTMLDocument7* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *normalize)(
        IHTMLDocument7* This);

    HRESULT (STDMETHODCALLTYPE *importNode)(
        IHTMLDocument7* This,
        IHTMLDOMNode *pNodeSource,
        VARIANT_BOOL fDeep,
        IHTMLDOMNode3 **ppNodeDest);

    HRESULT (STDMETHODCALLTYPE *get_parentWindow)(
        IHTMLDocument7* This,
        IHTMLWindow2 **p);

    HRESULT (STDMETHODCALLTYPE *putref_body)(
        IHTMLDocument7* This,
        IHTMLElement *v);

    HRESULT (STDMETHODCALLTYPE *get_body)(
        IHTMLDocument7* This,
        IHTMLElement **p);

    HRESULT (STDMETHODCALLTYPE *get_head)(
        IHTMLDocument7* This,
        IHTMLElement **p);

    END_INTERFACE
} IHTMLDocument7Vtbl;
interface IHTMLDocument7 {
    CONST_VTBL IHTMLDocument7Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDocument7_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDocument7_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDocument7_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDocument7_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDocument7_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDocument7_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDocument7_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDocument7 methods ***/
#define IHTMLDocument7_get_defaultView(This,p) (This)->lpVtbl->get_defaultView(This,p)
#define IHTMLDocument7_createCDATASection(This,text,newCDATASectionNode) (This)->lpVtbl->createCDATASection(This,text,newCDATASectionNode)
#define IHTMLDocument7_getSelection(This,ppIHTMLSelection) (This)->lpVtbl->getSelection(This,ppIHTMLSelection)
#define IHTMLDocument7_getElementsByTagNameNS(This,pvarNS,bstrLocalName,pelColl) (This)->lpVtbl->getElementsByTagNameNS(This,pvarNS,bstrLocalName,pelColl)
#define IHTMLDocument7_createElementNS(This,pvarNS,bstrTag,newElem) (This)->lpVtbl->createElementNS(This,pvarNS,bstrTag,newElem)
#define IHTMLDocument7_createAttributeNS(This,pvarNS,bstrAttrName,ppAttribute) (This)->lpVtbl->createAttributeNS(This,pvarNS,bstrAttrName,ppAttribute)
#define IHTMLDocument7_put_onmsthumbnailclick(This,v) (This)->lpVtbl->put_onmsthumbnailclick(This,v)
#define IHTMLDocument7_get_onmsthumbnailclick(This,p) (This)->lpVtbl->get_onmsthumbnailclick(This,p)
#define IHTMLDocument7_get_characterSet(This,p) (This)->lpVtbl->get_characterSet(This,p)
#define IHTMLDocument7_createElement(This,bstrTag,newElem) (This)->lpVtbl->createElement(This,bstrTag,newElem)
#define IHTMLDocument7_createAttribute(This,bstrAttrName,ppAttribute) (This)->lpVtbl->createAttribute(This,bstrAttrName,ppAttribute)
#define IHTMLDocument7_getElementsByClassName(This,v,pel) (This)->lpVtbl->getElementsByClassName(This,v,pel)
#define IHTMLDocument7_createProcessingInstruction(This,bstrTarget,bstrData,newProcessingInstruction) (This)->lpVtbl->createProcessingInstruction(This,bstrTarget,bstrData,newProcessingInstruction)
#define IHTMLDocument7_adoptNode(This,pNodeSource,ppNodeDest) (This)->lpVtbl->adoptNode(This,pNodeSource,ppNodeDest)
#define IHTMLDocument7_put_onmssitemodejumplistitemremoved(This,v) (This)->lpVtbl->put_onmssitemodejumplistitemremoved(This,v)
#define IHTMLDocument7_get_onmssitemodejumplistitemremoved(This,p) (This)->lpVtbl->get_onmssitemodejumplistitemremoved(This,p)
#define IHTMLDocument7_get_all(This,p) (This)->lpVtbl->get_all(This,p)
#define IHTMLDocument7_get_inputEncoding(This,p) (This)->lpVtbl->get_inputEncoding(This,p)
#define IHTMLDocument7_get_xmlEncoding(This,p) (This)->lpVtbl->get_xmlEncoding(This,p)
#define IHTMLDocument7_put_xmlStandalone(This,v) (This)->lpVtbl->put_xmlStandalone(This,v)
#define IHTMLDocument7_get_xmlStandalone(This,p) (This)->lpVtbl->get_xmlStandalone(This,p)
#define IHTMLDocument7_put_xmlVersion(This,v) (This)->lpVtbl->put_xmlVersion(This,v)
#define IHTMLDocument7_get_xmlVersion(This,p) (This)->lpVtbl->get_xmlVersion(This,p)
#define IHTMLDocument7_hasAttributes(This,pfHasAttributes) (This)->lpVtbl->hasAttributes(This,pfHasAttributes)
#define IHTMLDocument7_put_onabort(This,v) (This)->lpVtbl->put_onabort(This,v)
#define IHTMLDocument7_get_onabort(This,p) (This)->lpVtbl->get_onabort(This,p)
#define IHTMLDocument7_put_onblur(This,v) (This)->lpVtbl->put_onblur(This,v)
#define IHTMLDocument7_get_onblur(This,p) (This)->lpVtbl->get_onblur(This,p)
#define IHTMLDocument7_put_oncanplay(This,v) (This)->lpVtbl->put_oncanplay(This,v)
#define IHTMLDocument7_get_oncanplay(This,p) (This)->lpVtbl->get_oncanplay(This,p)
#define IHTMLDocument7_put_oncanplaythrough(This,v) (This)->lpVtbl->put_oncanplaythrough(This,v)
#define IHTMLDocument7_get_oncanplaythrough(This,p) (This)->lpVtbl->get_oncanplaythrough(This,p)
#define IHTMLDocument7_put_onchange(This,v) (This)->lpVtbl->put_onchange(This,v)
#define IHTMLDocument7_get_onchange(This,p) (This)->lpVtbl->get_onchange(This,p)
#define IHTMLDocument7_put_ondrag(This,v) (This)->lpVtbl->put_ondrag(This,v)
#define IHTMLDocument7_get_ondrag(This,p) (This)->lpVtbl->get_ondrag(This,p)
#define IHTMLDocument7_put_ondragend(This,v) (This)->lpVtbl->put_ondragend(This,v)
#define IHTMLDocument7_get_ondragend(This,p) (This)->lpVtbl->get_ondragend(This,p)
#define IHTMLDocument7_put_ondragenter(This,v) (This)->lpVtbl->put_ondragenter(This,v)
#define IHTMLDocument7_get_ondragenter(This,p) (This)->lpVtbl->get_ondragenter(This,p)
#define IHTMLDocument7_put_ondragleave(This,v) (This)->lpVtbl->put_ondragleave(This,v)
#define IHTMLDocument7_get_ondragleave(This,p) (This)->lpVtbl->get_ondragleave(This,p)
#define IHTMLDocument7_put_ondragover(This,v) (This)->lpVtbl->put_ondragover(This,v)
#define IHTMLDocument7_get_ondragover(This,p) (This)->lpVtbl->get_ondragover(This,p)
#define IHTMLDocument7_put_ondrop(This,v) (This)->lpVtbl->put_ondrop(This,v)
#define IHTMLDocument7_get_ondrop(This,p) (This)->lpVtbl->get_ondrop(This,p)
#define IHTMLDocument7_put_ondurationchange(This,v) (This)->lpVtbl->put_ondurationchange(This,v)
#define IHTMLDocument7_get_ondurationchange(This,p) (This)->lpVtbl->get_ondurationchange(This,p)
#define IHTMLDocument7_put_onemptied(This,v) (This)->lpVtbl->put_onemptied(This,v)
#define IHTMLDocument7_get_onemptied(This,p) (This)->lpVtbl->get_onemptied(This,p)
#define IHTMLDocument7_put_onended(This,v) (This)->lpVtbl->put_onended(This,v)
#define IHTMLDocument7_get_onended(This,p) (This)->lpVtbl->get_onended(This,p)
#define IHTMLDocument7_put_onerror(This,v) (This)->lpVtbl->put_onerror(This,v)
#define IHTMLDocument7_get_onerror(This,p) (This)->lpVtbl->get_onerror(This,p)
#define IHTMLDocument7_put_onfocus(This,v) (This)->lpVtbl->put_onfocus(This,v)
#define IHTMLDocument7_get_onfocus(This,p) (This)->lpVtbl->get_onfocus(This,p)
#define IHTMLDocument7_put_oninput(This,v) (This)->lpVtbl->put_oninput(This,v)
#define IHTMLDocument7_get_oninput(This,p) (This)->lpVtbl->get_oninput(This,p)
#define IHTMLDocument7_put_onload(This,v) (This)->lpVtbl->put_onload(This,v)
#define IHTMLDocument7_get_onload(This,p) (This)->lpVtbl->get_onload(This,p)
#define IHTMLDocument7_put_onloadeddata(This,v) (This)->lpVtbl->put_onloadeddata(This,v)
#define IHTMLDocument7_get_onloadeddata(This,p) (This)->lpVtbl->get_onloadeddata(This,p)
#define IHTMLDocument7_put_onloadedmetadata(This,v) (This)->lpVtbl->put_onloadedmetadata(This,v)
#define IHTMLDocument7_get_onloadedmetadata(This,p) (This)->lpVtbl->get_onloadedmetadata(This,p)
#define IHTMLDocument7_put_onloadstart(This,v) (This)->lpVtbl->put_onloadstart(This,v)
#define IHTMLDocument7_get_onloadstart(This,p) (This)->lpVtbl->get_onloadstart(This,p)
#define IHTMLDocument7_put_onpause(This,v) (This)->lpVtbl->put_onpause(This,v)
#define IHTMLDocument7_get_onpause(This,p) (This)->lpVtbl->get_onpause(This,p)
#define IHTMLDocument7_put_onplay(This,v) (This)->lpVtbl->put_onplay(This,v)
#define IHTMLDocument7_get_onplay(This,p) (This)->lpVtbl->get_onplay(This,p)
#define IHTMLDocument7_put_onplaying(This,v) (This)->lpVtbl->put_onplaying(This,v)
#define IHTMLDocument7_get_onplaying(This,p) (This)->lpVtbl->get_onplaying(This,p)
#define IHTMLDocument7_put_onprogress(This,v) (This)->lpVtbl->put_onprogress(This,v)
#define IHTMLDocument7_get_onprogress(This,p) (This)->lpVtbl->get_onprogress(This,p)
#define IHTMLDocument7_put_onratechange(This,v) (This)->lpVtbl->put_onratechange(This,v)
#define IHTMLDocument7_get_onratechange(This,p) (This)->lpVtbl->get_onratechange(This,p)
#define IHTMLDocument7_put_onreset(This,v) (This)->lpVtbl->put_onreset(This,v)
#define IHTMLDocument7_get_onreset(This,p) (This)->lpVtbl->get_onreset(This,p)
#define IHTMLDocument7_put_onscroll(This,v) (This)->lpVtbl->put_onscroll(This,v)
#define IHTMLDocument7_get_onscroll(This,p) (This)->lpVtbl->get_onscroll(This,p)
#define IHTMLDocument7_put_onseeked(This,v) (This)->lpVtbl->put_onseeked(This,v)
#define IHTMLDocument7_get_onseeked(This,p) (This)->lpVtbl->get_onseeked(This,p)
#define IHTMLDocument7_put_onseeking(This,v) (This)->lpVtbl->put_onseeking(This,v)
#define IHTMLDocument7_get_onseeking(This,p) (This)->lpVtbl->get_onseeking(This,p)
#define IHTMLDocument7_put_onselect(This,v) (This)->lpVtbl->put_onselect(This,v)
#define IHTMLDocument7_get_onselect(This,p) (This)->lpVtbl->get_onselect(This,p)
#define IHTMLDocument7_put_onstalled(This,v) (This)->lpVtbl->put_onstalled(This,v)
#define IHTMLDocument7_get_onstalled(This,p) (This)->lpVtbl->get_onstalled(This,p)
#define IHTMLDocument7_put_onsubmit(This,v) (This)->lpVtbl->put_onsubmit(This,v)
#define IHTMLDocument7_get_onsubmit(This,p) (This)->lpVtbl->get_onsubmit(This,p)
#define IHTMLDocument7_put_onsuspend(This,v) (This)->lpVtbl->put_onsuspend(This,v)
#define IHTMLDocument7_get_onsuspend(This,p) (This)->lpVtbl->get_onsuspend(This,p)
#define IHTMLDocument7_put_ontimeupdate(This,v) (This)->lpVtbl->put_ontimeupdate(This,v)
#define IHTMLDocument7_get_ontimeupdate(This,p) (This)->lpVtbl->get_ontimeupdate(This,p)
#define IHTMLDocument7_put_onvolumechange(This,v) (This)->lpVtbl->put_onvolumechange(This,v)
#define IHTMLDocument7_get_onvolumechange(This,p) (This)->lpVtbl->get_onvolumechange(This,p)
#define IHTMLDocument7_put_onwaiting(This,v) (This)->lpVtbl->put_onwaiting(This,v)
#define IHTMLDocument7_get_onwaiting(This,p) (This)->lpVtbl->get_onwaiting(This,p)
#define IHTMLDocument7_normalize(This) (This)->lpVtbl->normalize(This)
#define IHTMLDocument7_importNode(This,pNodeSource,fDeep,ppNodeDest) (This)->lpVtbl->importNode(This,pNodeSource,fDeep,ppNodeDest)
#define IHTMLDocument7_get_parentWindow(This,p) (This)->lpVtbl->get_parentWindow(This,p)
#define IHTMLDocument7_putref_body(This,v) (This)->lpVtbl->putref_body(This,v)
#define IHTMLDocument7_get_body(This,p) (This)->lpVtbl->get_body(This,p)
#define IHTMLDocument7_get_head(This,p) (This)->lpVtbl->get_head(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDocument7_QueryInterface(IHTMLDocument7* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDocument7_AddRef(IHTMLDocument7* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDocument7_Release(IHTMLDocument7* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDocument7_GetTypeInfoCount(IHTMLDocument7* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDocument7_GetTypeInfo(IHTMLDocument7* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDocument7_GetIDsOfNames(IHTMLDocument7* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDocument7_Invoke(IHTMLDocument7* 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);
}
/*** IHTMLDocument7 methods ***/
static FORCEINLINE HRESULT IHTMLDocument7_get_defaultView(IHTMLDocument7* This,IHTMLWindow2 **p) {
    return This->lpVtbl->get_defaultView(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_createCDATASection(IHTMLDocument7* This,BSTR text,IHTMLDOMNode **newCDATASectionNode) {
    return This->lpVtbl->createCDATASection(This,text,newCDATASectionNode);
}
static FORCEINLINE HRESULT IHTMLDocument7_getSelection(IHTMLDocument7* This,IHTMLSelection **ppIHTMLSelection) {
    return This->lpVtbl->getSelection(This,ppIHTMLSelection);
}
static FORCEINLINE HRESULT IHTMLDocument7_getElementsByTagNameNS(IHTMLDocument7* This,VARIANT *pvarNS,BSTR bstrLocalName,IHTMLElementCollection **pelColl) {
    return This->lpVtbl->getElementsByTagNameNS(This,pvarNS,bstrLocalName,pelColl);
}
static FORCEINLINE HRESULT IHTMLDocument7_createElementNS(IHTMLDocument7* This,VARIANT *pvarNS,BSTR bstrTag,IHTMLElement **newElem) {
    return This->lpVtbl->createElementNS(This,pvarNS,bstrTag,newElem);
}
static FORCEINLINE HRESULT IHTMLDocument7_createAttributeNS(IHTMLDocument7* This,VARIANT *pvarNS,BSTR bstrAttrName,IHTMLDOMAttribute **ppAttribute) {
    return This->lpVtbl->createAttributeNS(This,pvarNS,bstrAttrName,ppAttribute);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_onmsthumbnailclick(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onmsthumbnailclick(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_onmsthumbnailclick(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onmsthumbnailclick(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_characterSet(IHTMLDocument7* This,BSTR *p) {
    return This->lpVtbl->get_characterSet(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_createElement(IHTMLDocument7* This,BSTR bstrTag,IHTMLElement **newElem) {
    return This->lpVtbl->createElement(This,bstrTag,newElem);
}
static FORCEINLINE HRESULT IHTMLDocument7_createAttribute(IHTMLDocument7* This,BSTR bstrAttrName,IHTMLDOMAttribute **ppAttribute) {
    return This->lpVtbl->createAttribute(This,bstrAttrName,ppAttribute);
}
static FORCEINLINE HRESULT IHTMLDocument7_getElementsByClassName(IHTMLDocument7* This,BSTR v,IHTMLElementCollection **pel) {
    return This->lpVtbl->getElementsByClassName(This,v,pel);
}
static FORCEINLINE HRESULT IHTMLDocument7_createProcessingInstruction(IHTMLDocument7* This,BSTR bstrTarget,BSTR bstrData,IDOMProcessingInstruction **newProcessingInstruction) {
    return This->lpVtbl->createProcessingInstruction(This,bstrTarget,bstrData,newProcessingInstruction);
}
static FORCEINLINE HRESULT IHTMLDocument7_adoptNode(IHTMLDocument7* This,IHTMLDOMNode *pNodeSource,IHTMLDOMNode3 **ppNodeDest) {
    return This->lpVtbl->adoptNode(This,pNodeSource,ppNodeDest);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_onmssitemodejumplistitemremoved(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onmssitemodejumplistitemremoved(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_onmssitemodejumplistitemremoved(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onmssitemodejumplistitemremoved(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_all(IHTMLDocument7* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_all(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_inputEncoding(IHTMLDocument7* This,BSTR *p) {
    return This->lpVtbl->get_inputEncoding(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_xmlEncoding(IHTMLDocument7* This,BSTR *p) {
    return This->lpVtbl->get_xmlEncoding(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_xmlStandalone(IHTMLDocument7* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_xmlStandalone(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_xmlStandalone(IHTMLDocument7* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_xmlStandalone(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_xmlVersion(IHTMLDocument7* This,BSTR v) {
    return This->lpVtbl->put_xmlVersion(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_xmlVersion(IHTMLDocument7* This,BSTR *p) {
    return This->lpVtbl->get_xmlVersion(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_hasAttributes(IHTMLDocument7* This,VARIANT_BOOL *pfHasAttributes) {
    return This->lpVtbl->hasAttributes(This,pfHasAttributes);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_onabort(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onabort(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_onabort(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onabort(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_onblur(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onblur(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_onblur(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onblur(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_oncanplay(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_oncanplay(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_oncanplay(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_oncanplay(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_oncanplaythrough(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_oncanplaythrough(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_oncanplaythrough(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_oncanplaythrough(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_onchange(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onchange(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_onchange(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onchange(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_ondrag(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_ondrag(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_ondrag(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_ondrag(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_ondragend(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_ondragend(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_ondragend(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_ondragend(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_ondragenter(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_ondragenter(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_ondragenter(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_ondragenter(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_ondragleave(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_ondragleave(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_ondragleave(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_ondragleave(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_ondragover(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_ondragover(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_ondragover(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_ondragover(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_ondrop(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_ondrop(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_ondrop(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_ondrop(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_ondurationchange(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_ondurationchange(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_ondurationchange(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_ondurationchange(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_onemptied(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onemptied(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_onemptied(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onemptied(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_onended(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onended(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_onended(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onended(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_onerror(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onerror(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_onerror(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onerror(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_onfocus(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onfocus(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_onfocus(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onfocus(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_oninput(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_oninput(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_oninput(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_oninput(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_onload(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onload(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_onload(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onload(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_onloadeddata(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onloadeddata(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_onloadeddata(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onloadeddata(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_onloadedmetadata(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onloadedmetadata(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_onloadedmetadata(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onloadedmetadata(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_onloadstart(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onloadstart(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_onloadstart(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onloadstart(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_onpause(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onpause(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_onpause(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onpause(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_onplay(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onplay(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_onplay(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onplay(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_onplaying(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onplaying(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_onplaying(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onplaying(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_onprogress(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onprogress(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_onprogress(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onprogress(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_onratechange(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onratechange(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_onratechange(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onratechange(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_onreset(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onreset(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_onreset(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onreset(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_onscroll(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onscroll(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_onscroll(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onscroll(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_onseeked(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onseeked(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_onseeked(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onseeked(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_onseeking(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onseeking(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_onseeking(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onseeking(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_onselect(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onselect(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_onselect(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onselect(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_onstalled(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onstalled(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_onstalled(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onstalled(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_onsubmit(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onsubmit(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_onsubmit(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onsubmit(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_onsuspend(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onsuspend(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_onsuspend(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onsuspend(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_ontimeupdate(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_ontimeupdate(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_ontimeupdate(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_ontimeupdate(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_onvolumechange(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onvolumechange(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_onvolumechange(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onvolumechange(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_put_onwaiting(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onwaiting(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_onwaiting(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onwaiting(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_normalize(IHTMLDocument7* This) {
    return This->lpVtbl->normalize(This);
}
static FORCEINLINE HRESULT IHTMLDocument7_importNode(IHTMLDocument7* This,IHTMLDOMNode *pNodeSource,VARIANT_BOOL fDeep,IHTMLDOMNode3 **ppNodeDest) {
    return This->lpVtbl->importNode(This,pNodeSource,fDeep,ppNodeDest);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_parentWindow(IHTMLDocument7* This,IHTMLWindow2 **p) {
    return This->lpVtbl->get_parentWindow(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_putref_body(IHTMLDocument7* This,IHTMLElement *v) {
    return This->lpVtbl->putref_body(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_body(IHTMLDocument7* This,IHTMLElement **p) {
    return This->lpVtbl->get_body(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument7_get_head(IHTMLDocument7* This,IHTMLElement **p) {
    return This->lpVtbl->get_head(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_defaultView_Proxy(
    IHTMLDocument7* This,
    IHTMLWindow2 **p);
void __RPC_STUB IHTMLDocument7_get_defaultView_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_createCDATASection_Proxy(
    IHTMLDocument7* This,
    BSTR text,
    IHTMLDOMNode **newCDATASectionNode);
void __RPC_STUB IHTMLDocument7_createCDATASection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_getSelection_Proxy(
    IHTMLDocument7* This,
    IHTMLSelection **ppIHTMLSelection);
void __RPC_STUB IHTMLDocument7_getSelection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_getElementsByTagNameNS_Proxy(
    IHTMLDocument7* This,
    VARIANT *pvarNS,
    BSTR bstrLocalName,
    IHTMLElementCollection **pelColl);
void __RPC_STUB IHTMLDocument7_getElementsByTagNameNS_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_createElementNS_Proxy(
    IHTMLDocument7* This,
    VARIANT *pvarNS,
    BSTR bstrTag,
    IHTMLElement **newElem);
void __RPC_STUB IHTMLDocument7_createElementNS_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_createAttributeNS_Proxy(
    IHTMLDocument7* This,
    VARIANT *pvarNS,
    BSTR bstrAttrName,
    IHTMLDOMAttribute **ppAttribute);
void __RPC_STUB IHTMLDocument7_createAttributeNS_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_onmsthumbnailclick_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_onmsthumbnailclick_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_onmsthumbnailclick_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_onmsthumbnailclick_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_characterSet_Proxy(
    IHTMLDocument7* This,
    BSTR *p);
void __RPC_STUB IHTMLDocument7_get_characterSet_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_createElement_Proxy(
    IHTMLDocument7* This,
    BSTR bstrTag,
    IHTMLElement **newElem);
void __RPC_STUB IHTMLDocument7_createElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_createAttribute_Proxy(
    IHTMLDocument7* This,
    BSTR bstrAttrName,
    IHTMLDOMAttribute **ppAttribute);
void __RPC_STUB IHTMLDocument7_createAttribute_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_getElementsByClassName_Proxy(
    IHTMLDocument7* This,
    BSTR v,
    IHTMLElementCollection **pel);
void __RPC_STUB IHTMLDocument7_getElementsByClassName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_createProcessingInstruction_Proxy(
    IHTMLDocument7* This,
    BSTR bstrTarget,
    BSTR bstrData,
    IDOMProcessingInstruction **newProcessingInstruction);
void __RPC_STUB IHTMLDocument7_createProcessingInstruction_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_adoptNode_Proxy(
    IHTMLDocument7* This,
    IHTMLDOMNode *pNodeSource,
    IHTMLDOMNode3 **ppNodeDest);
void __RPC_STUB IHTMLDocument7_adoptNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_onmssitemodejumplistitemremoved_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_onmssitemodejumplistitemremoved_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_onmssitemodejumplistitemremoved_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_onmssitemodejumplistitemremoved_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_all_Proxy(
    IHTMLDocument7* This,
    IHTMLElementCollection **p);
void __RPC_STUB IHTMLDocument7_get_all_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_inputEncoding_Proxy(
    IHTMLDocument7* This,
    BSTR *p);
void __RPC_STUB IHTMLDocument7_get_inputEncoding_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_xmlEncoding_Proxy(
    IHTMLDocument7* This,
    BSTR *p);
void __RPC_STUB IHTMLDocument7_get_xmlEncoding_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_xmlStandalone_Proxy(
    IHTMLDocument7* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLDocument7_put_xmlStandalone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_xmlStandalone_Proxy(
    IHTMLDocument7* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLDocument7_get_xmlStandalone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_xmlVersion_Proxy(
    IHTMLDocument7* This,
    BSTR v);
void __RPC_STUB IHTMLDocument7_put_xmlVersion_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_xmlVersion_Proxy(
    IHTMLDocument7* This,
    BSTR *p);
void __RPC_STUB IHTMLDocument7_get_xmlVersion_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_hasAttributes_Proxy(
    IHTMLDocument7* This,
    VARIANT_BOOL *pfHasAttributes);
void __RPC_STUB IHTMLDocument7_hasAttributes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_onabort_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_onabort_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_onabort_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_onabort_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_onblur_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_onblur_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_onblur_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_onblur_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_oncanplay_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_oncanplay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_oncanplay_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_oncanplay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_oncanplaythrough_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_oncanplaythrough_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_oncanplaythrough_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_oncanplaythrough_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_onchange_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_onchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_onchange_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_onchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_ondrag_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_ondrag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_ondrag_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_ondrag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_ondragend_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_ondragend_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_ondragend_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_ondragend_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_ondragenter_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_ondragenter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_ondragenter_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_ondragenter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_ondragleave_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_ondragleave_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_ondragleave_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_ondragleave_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_ondragover_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_ondragover_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_ondragover_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_ondragover_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_ondrop_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_ondrop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_ondrop_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_ondrop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_ondurationchange_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_ondurationchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_ondurationchange_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_ondurationchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_onemptied_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_onemptied_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_onemptied_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_onemptied_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_onended_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_onended_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_onended_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_onended_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_onerror_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_onerror_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_onerror_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_onerror_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_onfocus_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_onfocus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_onfocus_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_onfocus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_oninput_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_oninput_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_oninput_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_oninput_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_onload_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_onload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_onload_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_onload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_onloadeddata_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_onloadeddata_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_onloadeddata_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_onloadeddata_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_onloadedmetadata_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_onloadedmetadata_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_onloadedmetadata_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_onloadedmetadata_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_onloadstart_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_onloadstart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_onloadstart_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_onloadstart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_onpause_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_onpause_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_onpause_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_onpause_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_onplay_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_onplay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_onplay_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_onplay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_onplaying_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_onplaying_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_onplaying_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_onplaying_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_onprogress_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_onprogress_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_onprogress_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_onprogress_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_onratechange_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_onratechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_onratechange_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_onratechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_onreset_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_onreset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_onreset_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_onreset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_onscroll_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_onscroll_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_onscroll_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_onscroll_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_onseeked_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_onseeked_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_onseeked_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_onseeked_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_onseeking_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_onseeking_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_onseeking_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_onseeking_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_onselect_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_onselect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_onselect_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_onselect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_onstalled_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_onstalled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_onstalled_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_onstalled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_onsubmit_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_onsubmit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_onsubmit_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_onsubmit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_onsuspend_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_onsuspend_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_onsuspend_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_onsuspend_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_ontimeupdate_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_ontimeupdate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_ontimeupdate_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_ontimeupdate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_onvolumechange_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_onvolumechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_onvolumechange_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_onvolumechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_put_onwaiting_Proxy(
    IHTMLDocument7* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument7_put_onwaiting_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_onwaiting_Proxy(
    IHTMLDocument7* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument7_get_onwaiting_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_normalize_Proxy(
    IHTMLDocument7* This);
void __RPC_STUB IHTMLDocument7_normalize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_importNode_Proxy(
    IHTMLDocument7* This,
    IHTMLDOMNode *pNodeSource,
    VARIANT_BOOL fDeep,
    IHTMLDOMNode3 **ppNodeDest);
void __RPC_STUB IHTMLDocument7_importNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_parentWindow_Proxy(
    IHTMLDocument7* This,
    IHTMLWindow2 **p);
void __RPC_STUB IHTMLDocument7_get_parentWindow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_putref_body_Proxy(
    IHTMLDocument7* This,
    IHTMLElement *v);
void __RPC_STUB IHTMLDocument7_putref_body_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_body_Proxy(
    IHTMLDocument7* This,
    IHTMLElement **p);
void __RPC_STUB IHTMLDocument7_get_body_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument7_get_head_Proxy(
    IHTMLDocument7* This,
    IHTMLElement **p);
void __RPC_STUB IHTMLDocument7_get_head_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDocument7_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLDocument8 interface
 */
#ifndef __IHTMLDocument8_INTERFACE_DEFINED__
#define __IHTMLDocument8_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDocument8, 0x305107d0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305107d0-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDocument8 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_onmscontentzoom(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmscontentzoom(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmspointerdown(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmspointerdown(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmspointermove(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmspointermove(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmspointerup(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmspointerup(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmspointerover(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmspointerover(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmspointerout(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmspointerout(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmspointercancel(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmspointercancel(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmspointerhover(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmspointerhover(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmsgesturestart(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmsgesturestart(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmsgesturechange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmsgesturechange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmsgestureend(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmsgestureend(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmsgesturehold(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmsgesturehold(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmsgesturetap(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmsgesturetap(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmsgesturedoubletap(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmsgesturedoubletap(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmsinertiastart(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmsinertiastart(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE elementsFromPoint(
        float x,
        float y,
        IHTMLDOMChildrenCollection **elementsHit) = 0;

    virtual HRESULT STDMETHODCALLTYPE elementsFromRect(
        float left,
        float top,
        float width,
        float height,
        IHTMLDOMChildrenCollection **elementsHit) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmsmanipulationstatechanged(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmsmanipulationstatechanged(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msCapsLockWarningOff(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msCapsLockWarningOff(
        VARIANT_BOOL *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDocument8, 0x305107d0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDocument8Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLDocument8* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLDocument8* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLDocument8* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLDocument8* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLDocument8* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLDocument8* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLDocument8* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLDocument8 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_onmscontentzoom)(
        IHTMLDocument8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmscontentzoom)(
        IHTMLDocument8* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmspointerdown)(
        IHTMLDocument8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmspointerdown)(
        IHTMLDocument8* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmspointermove)(
        IHTMLDocument8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmspointermove)(
        IHTMLDocument8* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmspointerup)(
        IHTMLDocument8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmspointerup)(
        IHTMLDocument8* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmspointerover)(
        IHTMLDocument8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmspointerover)(
        IHTMLDocument8* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmspointerout)(
        IHTMLDocument8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmspointerout)(
        IHTMLDocument8* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmspointercancel)(
        IHTMLDocument8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmspointercancel)(
        IHTMLDocument8* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmspointerhover)(
        IHTMLDocument8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmspointerhover)(
        IHTMLDocument8* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmsgesturestart)(
        IHTMLDocument8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmsgesturestart)(
        IHTMLDocument8* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmsgesturechange)(
        IHTMLDocument8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmsgesturechange)(
        IHTMLDocument8* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmsgestureend)(
        IHTMLDocument8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmsgestureend)(
        IHTMLDocument8* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmsgesturehold)(
        IHTMLDocument8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmsgesturehold)(
        IHTMLDocument8* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmsgesturetap)(
        IHTMLDocument8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmsgesturetap)(
        IHTMLDocument8* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmsgesturedoubletap)(
        IHTMLDocument8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmsgesturedoubletap)(
        IHTMLDocument8* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmsinertiastart)(
        IHTMLDocument8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmsinertiastart)(
        IHTMLDocument8* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *elementsFromPoint)(
        IHTMLDocument8* This,
        float x,
        float y,
        IHTMLDOMChildrenCollection **elementsHit);

    HRESULT (STDMETHODCALLTYPE *elementsFromRect)(
        IHTMLDocument8* This,
        float left,
        float top,
        float width,
        float height,
        IHTMLDOMChildrenCollection **elementsHit);

    HRESULT (STDMETHODCALLTYPE *put_onmsmanipulationstatechanged)(
        IHTMLDocument8* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmsmanipulationstatechanged)(
        IHTMLDocument8* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_msCapsLockWarningOff)(
        IHTMLDocument8* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_msCapsLockWarningOff)(
        IHTMLDocument8* This,
        VARIANT_BOOL *p);

    END_INTERFACE
} IHTMLDocument8Vtbl;
interface IHTMLDocument8 {
    CONST_VTBL IHTMLDocument8Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDocument8_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDocument8_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDocument8_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDocument8_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDocument8_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDocument8_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDocument8_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDocument8 methods ***/
#define IHTMLDocument8_put_onmscontentzoom(This,v) (This)->lpVtbl->put_onmscontentzoom(This,v)
#define IHTMLDocument8_get_onmscontentzoom(This,p) (This)->lpVtbl->get_onmscontentzoom(This,p)
#define IHTMLDocument8_put_onmspointerdown(This,v) (This)->lpVtbl->put_onmspointerdown(This,v)
#define IHTMLDocument8_get_onmspointerdown(This,p) (This)->lpVtbl->get_onmspointerdown(This,p)
#define IHTMLDocument8_put_onmspointermove(This,v) (This)->lpVtbl->put_onmspointermove(This,v)
#define IHTMLDocument8_get_onmspointermove(This,p) (This)->lpVtbl->get_onmspointermove(This,p)
#define IHTMLDocument8_put_onmspointerup(This,v) (This)->lpVtbl->put_onmspointerup(This,v)
#define IHTMLDocument8_get_onmspointerup(This,p) (This)->lpVtbl->get_onmspointerup(This,p)
#define IHTMLDocument8_put_onmspointerover(This,v) (This)->lpVtbl->put_onmspointerover(This,v)
#define IHTMLDocument8_get_onmspointerover(This,p) (This)->lpVtbl->get_onmspointerover(This,p)
#define IHTMLDocument8_put_onmspointerout(This,v) (This)->lpVtbl->put_onmspointerout(This,v)
#define IHTMLDocument8_get_onmspointerout(This,p) (This)->lpVtbl->get_onmspointerout(This,p)
#define IHTMLDocument8_put_onmspointercancel(This,v) (This)->lpVtbl->put_onmspointercancel(This,v)
#define IHTMLDocument8_get_onmspointercancel(This,p) (This)->lpVtbl->get_onmspointercancel(This,p)
#define IHTMLDocument8_put_onmspointerhover(This,v) (This)->lpVtbl->put_onmspointerhover(This,v)
#define IHTMLDocument8_get_onmspointerhover(This,p) (This)->lpVtbl->get_onmspointerhover(This,p)
#define IHTMLDocument8_put_onmsgesturestart(This,v) (This)->lpVtbl->put_onmsgesturestart(This,v)
#define IHTMLDocument8_get_onmsgesturestart(This,p) (This)->lpVtbl->get_onmsgesturestart(This,p)
#define IHTMLDocument8_put_onmsgesturechange(This,v) (This)->lpVtbl->put_onmsgesturechange(This,v)
#define IHTMLDocument8_get_onmsgesturechange(This,p) (This)->lpVtbl->get_onmsgesturechange(This,p)
#define IHTMLDocument8_put_onmsgestureend(This,v) (This)->lpVtbl->put_onmsgestureend(This,v)
#define IHTMLDocument8_get_onmsgestureend(This,p) (This)->lpVtbl->get_onmsgestureend(This,p)
#define IHTMLDocument8_put_onmsgesturehold(This,v) (This)->lpVtbl->put_onmsgesturehold(This,v)
#define IHTMLDocument8_get_onmsgesturehold(This,p) (This)->lpVtbl->get_onmsgesturehold(This,p)
#define IHTMLDocument8_put_onmsgesturetap(This,v) (This)->lpVtbl->put_onmsgesturetap(This,v)
#define IHTMLDocument8_get_onmsgesturetap(This,p) (This)->lpVtbl->get_onmsgesturetap(This,p)
#define IHTMLDocument8_put_onmsgesturedoubletap(This,v) (This)->lpVtbl->put_onmsgesturedoubletap(This,v)
#define IHTMLDocument8_get_onmsgesturedoubletap(This,p) (This)->lpVtbl->get_onmsgesturedoubletap(This,p)
#define IHTMLDocument8_put_onmsinertiastart(This,v) (This)->lpVtbl->put_onmsinertiastart(This,v)
#define IHTMLDocument8_get_onmsinertiastart(This,p) (This)->lpVtbl->get_onmsinertiastart(This,p)
#define IHTMLDocument8_elementsFromPoint(This,x,y,elementsHit) (This)->lpVtbl->elementsFromPoint(This,x,y,elementsHit)
#define IHTMLDocument8_elementsFromRect(This,left,top,width,height,elementsHit) (This)->lpVtbl->elementsFromRect(This,left,top,width,height,elementsHit)
#define IHTMLDocument8_put_onmsmanipulationstatechanged(This,v) (This)->lpVtbl->put_onmsmanipulationstatechanged(This,v)
#define IHTMLDocument8_get_onmsmanipulationstatechanged(This,p) (This)->lpVtbl->get_onmsmanipulationstatechanged(This,p)
#define IHTMLDocument8_put_msCapsLockWarningOff(This,v) (This)->lpVtbl->put_msCapsLockWarningOff(This,v)
#define IHTMLDocument8_get_msCapsLockWarningOff(This,p) (This)->lpVtbl->get_msCapsLockWarningOff(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDocument8_QueryInterface(IHTMLDocument8* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDocument8_AddRef(IHTMLDocument8* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDocument8_Release(IHTMLDocument8* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDocument8_GetTypeInfoCount(IHTMLDocument8* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDocument8_GetTypeInfo(IHTMLDocument8* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDocument8_GetIDsOfNames(IHTMLDocument8* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDocument8_Invoke(IHTMLDocument8* 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);
}
/*** IHTMLDocument8 methods ***/
static FORCEINLINE HRESULT IHTMLDocument8_put_onmscontentzoom(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmscontentzoom(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument8_get_onmscontentzoom(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmscontentzoom(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument8_put_onmspointerdown(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmspointerdown(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument8_get_onmspointerdown(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointerdown(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument8_put_onmspointermove(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmspointermove(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument8_get_onmspointermove(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointermove(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument8_put_onmspointerup(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmspointerup(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument8_get_onmspointerup(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointerup(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument8_put_onmspointerover(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmspointerover(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument8_get_onmspointerover(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointerover(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument8_put_onmspointerout(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmspointerout(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument8_get_onmspointerout(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointerout(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument8_put_onmspointercancel(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmspointercancel(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument8_get_onmspointercancel(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointercancel(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument8_put_onmspointerhover(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmspointerhover(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument8_get_onmspointerhover(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointerhover(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument8_put_onmsgesturestart(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmsgesturestart(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument8_get_onmsgesturestart(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgesturestart(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument8_put_onmsgesturechange(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmsgesturechange(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument8_get_onmsgesturechange(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgesturechange(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument8_put_onmsgestureend(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmsgestureend(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument8_get_onmsgestureend(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgestureend(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument8_put_onmsgesturehold(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmsgesturehold(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument8_get_onmsgesturehold(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgesturehold(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument8_put_onmsgesturetap(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmsgesturetap(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument8_get_onmsgesturetap(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgesturetap(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument8_put_onmsgesturedoubletap(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmsgesturedoubletap(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument8_get_onmsgesturedoubletap(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgesturedoubletap(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument8_put_onmsinertiastart(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmsinertiastart(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument8_get_onmsinertiastart(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmsinertiastart(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument8_elementsFromPoint(IHTMLDocument8* This,float x,float y,IHTMLDOMChildrenCollection **elementsHit) {
    return This->lpVtbl->elementsFromPoint(This,x,y,elementsHit);
}
static FORCEINLINE HRESULT IHTMLDocument8_elementsFromRect(IHTMLDocument8* This,float left,float top,float width,float height,IHTMLDOMChildrenCollection **elementsHit) {
    return This->lpVtbl->elementsFromRect(This,left,top,width,height,elementsHit);
}
static FORCEINLINE HRESULT IHTMLDocument8_put_onmsmanipulationstatechanged(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmsmanipulationstatechanged(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument8_get_onmsmanipulationstatechanged(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmsmanipulationstatechanged(This,p);
}
static FORCEINLINE HRESULT IHTMLDocument8_put_msCapsLockWarningOff(IHTMLDocument8* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_msCapsLockWarningOff(This,v);
}
static FORCEINLINE HRESULT IHTMLDocument8_get_msCapsLockWarningOff(IHTMLDocument8* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_msCapsLockWarningOff(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDocument8_put_onmscontentzoom_Proxy(
    IHTMLDocument8* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument8_put_onmscontentzoom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_get_onmscontentzoom_Proxy(
    IHTMLDocument8* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument8_get_onmscontentzoom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_put_onmspointerdown_Proxy(
    IHTMLDocument8* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument8_put_onmspointerdown_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_get_onmspointerdown_Proxy(
    IHTMLDocument8* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument8_get_onmspointerdown_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_put_onmspointermove_Proxy(
    IHTMLDocument8* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument8_put_onmspointermove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_get_onmspointermove_Proxy(
    IHTMLDocument8* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument8_get_onmspointermove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_put_onmspointerup_Proxy(
    IHTMLDocument8* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument8_put_onmspointerup_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_get_onmspointerup_Proxy(
    IHTMLDocument8* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument8_get_onmspointerup_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_put_onmspointerover_Proxy(
    IHTMLDocument8* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument8_put_onmspointerover_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_get_onmspointerover_Proxy(
    IHTMLDocument8* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument8_get_onmspointerover_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_put_onmspointerout_Proxy(
    IHTMLDocument8* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument8_put_onmspointerout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_get_onmspointerout_Proxy(
    IHTMLDocument8* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument8_get_onmspointerout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_put_onmspointercancel_Proxy(
    IHTMLDocument8* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument8_put_onmspointercancel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_get_onmspointercancel_Proxy(
    IHTMLDocument8* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument8_get_onmspointercancel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_put_onmspointerhover_Proxy(
    IHTMLDocument8* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument8_put_onmspointerhover_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_get_onmspointerhover_Proxy(
    IHTMLDocument8* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument8_get_onmspointerhover_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_put_onmsgesturestart_Proxy(
    IHTMLDocument8* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument8_put_onmsgesturestart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_get_onmsgesturestart_Proxy(
    IHTMLDocument8* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument8_get_onmsgesturestart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_put_onmsgesturechange_Proxy(
    IHTMLDocument8* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument8_put_onmsgesturechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_get_onmsgesturechange_Proxy(
    IHTMLDocument8* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument8_get_onmsgesturechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_put_onmsgestureend_Proxy(
    IHTMLDocument8* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument8_put_onmsgestureend_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_get_onmsgestureend_Proxy(
    IHTMLDocument8* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument8_get_onmsgestureend_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_put_onmsgesturehold_Proxy(
    IHTMLDocument8* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument8_put_onmsgesturehold_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_get_onmsgesturehold_Proxy(
    IHTMLDocument8* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument8_get_onmsgesturehold_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_put_onmsgesturetap_Proxy(
    IHTMLDocument8* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument8_put_onmsgesturetap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_get_onmsgesturetap_Proxy(
    IHTMLDocument8* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument8_get_onmsgesturetap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_put_onmsgesturedoubletap_Proxy(
    IHTMLDocument8* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument8_put_onmsgesturedoubletap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_get_onmsgesturedoubletap_Proxy(
    IHTMLDocument8* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument8_get_onmsgesturedoubletap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_put_onmsinertiastart_Proxy(
    IHTMLDocument8* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument8_put_onmsinertiastart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_get_onmsinertiastart_Proxy(
    IHTMLDocument8* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument8_get_onmsinertiastart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_elementsFromPoint_Proxy(
    IHTMLDocument8* This,
    float x,
    float y,
    IHTMLDOMChildrenCollection **elementsHit);
void __RPC_STUB IHTMLDocument8_elementsFromPoint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_elementsFromRect_Proxy(
    IHTMLDocument8* This,
    float left,
    float top,
    float width,
    float height,
    IHTMLDOMChildrenCollection **elementsHit);
void __RPC_STUB IHTMLDocument8_elementsFromRect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_put_onmsmanipulationstatechanged_Proxy(
    IHTMLDocument8* This,
    VARIANT v);
void __RPC_STUB IHTMLDocument8_put_onmsmanipulationstatechanged_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_get_onmsmanipulationstatechanged_Proxy(
    IHTMLDocument8* This,
    VARIANT *p);
void __RPC_STUB IHTMLDocument8_get_onmsmanipulationstatechanged_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_put_msCapsLockWarningOff_Proxy(
    IHTMLDocument8* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLDocument8_put_msCapsLockWarningOff_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDocument8_get_msCapsLockWarningOff_Proxy(
    IHTMLDocument8* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLDocument8_get_msCapsLockWarningOff_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDocument8_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDocumentEvent interface
 */
#ifndef __IDocumentEvent_INTERFACE_DEFINED__
#define __IDocumentEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDocumentEvent, 0x305104bc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104bc-98b5-11cf-bb82-00aa00bdce0b")
IDocumentEvent : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE createEvent(
        BSTR eventType,
        IDOMEvent **ppEvent) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDocumentEvent, 0x305104bc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDocumentEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDocumentEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDocumentEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDocumentEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDocumentEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDocumentEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDocumentEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDocumentEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDocumentEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *createEvent)(
        IDocumentEvent* This,
        BSTR eventType,
        IDOMEvent **ppEvent);

    END_INTERFACE
} IDocumentEventVtbl;
interface IDocumentEvent {
    CONST_VTBL IDocumentEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDocumentEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDocumentEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDocumentEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDocumentEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDocumentEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDocumentEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDocumentEvent_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDocumentEvent methods ***/
#define IDocumentEvent_createEvent(This,eventType,ppEvent) (This)->lpVtbl->createEvent(This,eventType,ppEvent)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDocumentEvent_QueryInterface(IDocumentEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDocumentEvent_AddRef(IDocumentEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDocumentEvent_Release(IDocumentEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDocumentEvent_GetTypeInfoCount(IDocumentEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDocumentEvent_GetTypeInfo(IDocumentEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDocumentEvent_GetIDsOfNames(IDocumentEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDocumentEvent_Invoke(IDocumentEvent* 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);
}
/*** IDocumentEvent methods ***/
static FORCEINLINE HRESULT IDocumentEvent_createEvent(IDocumentEvent* This,BSTR eventType,IDOMEvent **ppEvent) {
    return This->lpVtbl->createEvent(This,eventType,ppEvent);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDocumentEvent_createEvent_Proxy(
    IDocumentEvent* This,
    BSTR eventType,
    IDOMEvent **ppEvent);
void __RPC_STUB IDocumentEvent_createEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDocumentEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDocumentRange interface
 */
#ifndef __IDocumentRange_INTERFACE_DEFINED__
#define __IDocumentRange_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDocumentRange, 0x305104af, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104af-98b5-11cf-bb82-00aa00bdce0b")
IDocumentRange : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE createRange(
        IHTMLDOMRange **ppIHTMLDOMRange) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDocumentRange, 0x305104af, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDocumentRangeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDocumentRange* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDocumentRange* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDocumentRange* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDocumentRange* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDocumentRange* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDocumentRange* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDocumentRange* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDocumentRange methods ***/
    HRESULT (STDMETHODCALLTYPE *createRange)(
        IDocumentRange* This,
        IHTMLDOMRange **ppIHTMLDOMRange);

    END_INTERFACE
} IDocumentRangeVtbl;
interface IDocumentRange {
    CONST_VTBL IDocumentRangeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDocumentRange_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDocumentRange_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDocumentRange_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDocumentRange_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDocumentRange_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDocumentRange_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDocumentRange_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDocumentRange methods ***/
#define IDocumentRange_createRange(This,ppIHTMLDOMRange) (This)->lpVtbl->createRange(This,ppIHTMLDOMRange)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDocumentRange_QueryInterface(IDocumentRange* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDocumentRange_AddRef(IDocumentRange* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDocumentRange_Release(IDocumentRange* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDocumentRange_GetTypeInfoCount(IDocumentRange* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDocumentRange_GetTypeInfo(IDocumentRange* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDocumentRange_GetIDsOfNames(IDocumentRange* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDocumentRange_Invoke(IDocumentRange* 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);
}
/*** IDocumentRange methods ***/
static FORCEINLINE HRESULT IDocumentRange_createRange(IDocumentRange* This,IHTMLDOMRange **ppIHTMLDOMRange) {
    return This->lpVtbl->createRange(This,ppIHTMLDOMRange);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDocumentRange_createRange_Proxy(
    IDocumentRange* This,
    IHTMLDOMRange **ppIHTMLDOMRange);
void __RPC_STUB IDocumentRange_createRange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDocumentRange_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDocumentSelector interface
 */
#ifndef __IDocumentSelector_INTERFACE_DEFINED__
#define __IDocumentSelector_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDocumentSelector, 0x30510462, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510462-98b5-11cf-bb82-00aa00bdce0b")
IDocumentSelector : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE querySelector(
        BSTR v,
        IHTMLElement **pel) = 0;

    virtual HRESULT STDMETHODCALLTYPE querySelectorAll(
        BSTR v,
        IHTMLDOMChildrenCollection **pel) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDocumentSelector, 0x30510462, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDocumentSelectorVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDocumentSelector* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDocumentSelector* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDocumentSelector* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDocumentSelector* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDocumentSelector* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDocumentSelector* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDocumentSelector* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDocumentSelector methods ***/
    HRESULT (STDMETHODCALLTYPE *querySelector)(
        IDocumentSelector* This,
        BSTR v,
        IHTMLElement **pel);

    HRESULT (STDMETHODCALLTYPE *querySelectorAll)(
        IDocumentSelector* This,
        BSTR v,
        IHTMLDOMChildrenCollection **pel);

    END_INTERFACE
} IDocumentSelectorVtbl;
interface IDocumentSelector {
    CONST_VTBL IDocumentSelectorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDocumentSelector_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDocumentSelector_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDocumentSelector_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDocumentSelector_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDocumentSelector_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDocumentSelector_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDocumentSelector_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDocumentSelector methods ***/
#define IDocumentSelector_querySelector(This,v,pel) (This)->lpVtbl->querySelector(This,v,pel)
#define IDocumentSelector_querySelectorAll(This,v,pel) (This)->lpVtbl->querySelectorAll(This,v,pel)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDocumentSelector_QueryInterface(IDocumentSelector* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDocumentSelector_AddRef(IDocumentSelector* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDocumentSelector_Release(IDocumentSelector* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDocumentSelector_GetTypeInfoCount(IDocumentSelector* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDocumentSelector_GetTypeInfo(IDocumentSelector* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDocumentSelector_GetIDsOfNames(IDocumentSelector* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDocumentSelector_Invoke(IDocumentSelector* 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);
}
/*** IDocumentSelector methods ***/
static FORCEINLINE HRESULT IDocumentSelector_querySelector(IDocumentSelector* This,BSTR v,IHTMLElement **pel) {
    return This->lpVtbl->querySelector(This,v,pel);
}
static FORCEINLINE HRESULT IDocumentSelector_querySelectorAll(IDocumentSelector* This,BSTR v,IHTMLDOMChildrenCollection **pel) {
    return This->lpVtbl->querySelectorAll(This,v,pel);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDocumentSelector_querySelector_Proxy(
    IDocumentSelector* This,
    BSTR v,
    IHTMLElement **pel);
void __RPC_STUB IDocumentSelector_querySelector_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDocumentSelector_querySelectorAll_Proxy(
    IDocumentSelector* This,
    BSTR v,
    IHTMLDOMChildrenCollection **pel);
void __RPC_STUB IDocumentSelector_querySelectorAll_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDocumentSelector_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDocumentTraversal interface
 */
#ifndef __IDocumentTraversal_INTERFACE_DEFINED__
#define __IDocumentTraversal_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDocumentTraversal, 0x30510744, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510744-98b5-11cf-bb82-00aa00bdce0b")
IDocumentTraversal : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE createNodeIterator(
        IDispatch *pRootNode,
        LONG ulWhatToShow,
        VARIANT *pFilter,
        VARIANT_BOOL fEntityReferenceExpansion,
        IDOMNodeIterator **ppNodeIterator) = 0;

    virtual HRESULT STDMETHODCALLTYPE createTreeWalker(
        IDispatch *pRootNode,
        LONG ulWhatToShow,
        VARIANT *pFilter,
        VARIANT_BOOL fEntityReferenceExpansion,
        IDOMTreeWalker **ppTreeWalker) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDocumentTraversal, 0x30510744, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDocumentTraversalVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDocumentTraversal* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDocumentTraversal* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDocumentTraversal* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDocumentTraversal* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDocumentTraversal* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDocumentTraversal* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDocumentTraversal* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDocumentTraversal methods ***/
    HRESULT (STDMETHODCALLTYPE *createNodeIterator)(
        IDocumentTraversal* This,
        IDispatch *pRootNode,
        LONG ulWhatToShow,
        VARIANT *pFilter,
        VARIANT_BOOL fEntityReferenceExpansion,
        IDOMNodeIterator **ppNodeIterator);

    HRESULT (STDMETHODCALLTYPE *createTreeWalker)(
        IDocumentTraversal* This,
        IDispatch *pRootNode,
        LONG ulWhatToShow,
        VARIANT *pFilter,
        VARIANT_BOOL fEntityReferenceExpansion,
        IDOMTreeWalker **ppTreeWalker);

    END_INTERFACE
} IDocumentTraversalVtbl;
interface IDocumentTraversal {
    CONST_VTBL IDocumentTraversalVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDocumentTraversal_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDocumentTraversal_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDocumentTraversal_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDocumentTraversal_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDocumentTraversal_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDocumentTraversal_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDocumentTraversal_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDocumentTraversal methods ***/
#define IDocumentTraversal_createNodeIterator(This,pRootNode,ulWhatToShow,pFilter,fEntityReferenceExpansion,ppNodeIterator) (This)->lpVtbl->createNodeIterator(This,pRootNode,ulWhatToShow,pFilter,fEntityReferenceExpansion,ppNodeIterator)
#define IDocumentTraversal_createTreeWalker(This,pRootNode,ulWhatToShow,pFilter,fEntityReferenceExpansion,ppTreeWalker) (This)->lpVtbl->createTreeWalker(This,pRootNode,ulWhatToShow,pFilter,fEntityReferenceExpansion,ppTreeWalker)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDocumentTraversal_QueryInterface(IDocumentTraversal* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDocumentTraversal_AddRef(IDocumentTraversal* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDocumentTraversal_Release(IDocumentTraversal* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDocumentTraversal_GetTypeInfoCount(IDocumentTraversal* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDocumentTraversal_GetTypeInfo(IDocumentTraversal* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDocumentTraversal_GetIDsOfNames(IDocumentTraversal* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDocumentTraversal_Invoke(IDocumentTraversal* 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);
}
/*** IDocumentTraversal methods ***/
static FORCEINLINE HRESULT IDocumentTraversal_createNodeIterator(IDocumentTraversal* This,IDispatch *pRootNode,LONG ulWhatToShow,VARIANT *pFilter,VARIANT_BOOL fEntityReferenceExpansion,IDOMNodeIterator **ppNodeIterator) {
    return This->lpVtbl->createNodeIterator(This,pRootNode,ulWhatToShow,pFilter,fEntityReferenceExpansion,ppNodeIterator);
}
static FORCEINLINE HRESULT IDocumentTraversal_createTreeWalker(IDocumentTraversal* This,IDispatch *pRootNode,LONG ulWhatToShow,VARIANT *pFilter,VARIANT_BOOL fEntityReferenceExpansion,IDOMTreeWalker **ppTreeWalker) {
    return This->lpVtbl->createTreeWalker(This,pRootNode,ulWhatToShow,pFilter,fEntityReferenceExpansion,ppTreeWalker);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDocumentTraversal_createNodeIterator_Proxy(
    IDocumentTraversal* This,
    IDispatch *pRootNode,
    LONG ulWhatToShow,
    VARIANT *pFilter,
    VARIANT_BOOL fEntityReferenceExpansion,
    IDOMNodeIterator **ppNodeIterator);
void __RPC_STUB IDocumentTraversal_createNodeIterator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDocumentTraversal_createTreeWalker_Proxy(
    IDocumentTraversal* This,
    IDispatch *pRootNode,
    LONG ulWhatToShow,
    VARIANT *pFilter,
    VARIANT_BOOL fEntityReferenceExpansion,
    IDOMTreeWalker **ppTreeWalker);
void __RPC_STUB IDocumentTraversal_createTreeWalker_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDocumentTraversal_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLDocument dispinterface
 */
#ifndef __DispHTMLDocument_DISPINTERFACE_DEFINED__
#define __DispHTMLDocument_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLDocument, 0x3050f55f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f55f-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLDocument : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLDocument, 0x3050f55f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLDocumentVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLDocument* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLDocument* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLDocument* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLDocument* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLDocument* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLDocument* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLDocument* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLDocumentVtbl;
interface DispHTMLDocument {
    CONST_VTBL DispHTMLDocumentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLDocument_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLDocument_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLDocument_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLDocument_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLDocument_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLDocument_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLDocument_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 DispHTMLDocument_QueryInterface(DispHTMLDocument* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLDocument_AddRef(DispHTMLDocument* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLDocument_Release(DispHTMLDocument* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLDocument_GetTypeInfoCount(DispHTMLDocument* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLDocument_GetTypeInfo(DispHTMLDocument* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLDocument_GetIDsOfNames(DispHTMLDocument* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLDocument_Invoke(DispHTMLDocument* 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  /* __DispHTMLDocument_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLDocument coclass
 */

DEFINE_GUID(CLSID_HTMLDocument, 0x25336920, 0x03f9, 0x11cf, 0x8f,0xd0, 0x00,0xaa,0x00,0x68,0x6f,0x13);

#ifdef __cplusplus
class DECLSPEC_UUID("25336920-03f9-11cf-8fd0-00aa00686f13") HTMLDocument;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLDocument, 0x25336920, 0x03f9, 0x11cf, 0x8f,0xd0, 0x00,0xaa,0x00,0x68,0x6f,0x13)
#endif
#endif

EXTERN_C const GUID CLSID_CDocument;
/*****************************************************************************
 * DWebBridgeEvents dispinterface
 */
#ifndef __DWebBridgeEvents_DISPINTERFACE_DEFINED__
#define __DWebBridgeEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DWebBridgeEvents, 0xa6d897ff, 0x0a95, 0x11d1, 0xb0,0xba, 0x00,0x60,0x08,0x16,0x6e,0x11);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a6d897ff-0a95-11d1-b0ba-006008166e11")
DWebBridgeEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DWebBridgeEvents, 0xa6d897ff, 0x0a95, 0x11d1, 0xb0,0xba, 0x00,0x60,0x08,0x16,0x6e,0x11)
#endif
#else
typedef struct DWebBridgeEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DWebBridgeEvents* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DWebBridgeEvents* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DWebBridgeEvents* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DWebBridgeEvents* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DWebBridgeEvents* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DWebBridgeEvents* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DWebBridgeEvents* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DWebBridgeEventsVtbl;
interface DWebBridgeEvents {
    CONST_VTBL DWebBridgeEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DWebBridgeEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DWebBridgeEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DWebBridgeEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DWebBridgeEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DWebBridgeEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DWebBridgeEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DWebBridgeEvents_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 DWebBridgeEvents_QueryInterface(DWebBridgeEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DWebBridgeEvents_AddRef(DWebBridgeEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DWebBridgeEvents_Release(DWebBridgeEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DWebBridgeEvents_GetTypeInfoCount(DWebBridgeEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DWebBridgeEvents_GetTypeInfo(DWebBridgeEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DWebBridgeEvents_GetIDsOfNames(DWebBridgeEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DWebBridgeEvents_Invoke(DWebBridgeEvents* 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  /* __DWebBridgeEvents_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * IWebBridge interface
 */
#ifndef __IWebBridge_INTERFACE_DEFINED__
#define __IWebBridge_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWebBridge, 0xae24fdad, 0x03c6, 0x11d1, 0x8b,0x76, 0x00,0x80,0xc7,0x44,0xf3,0x89);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ae24fdad-03c6-11d1-8b76-0080c744f389")
IWebBridge : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_URL(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_URL(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Scrollbar(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Scrollbar(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_embed(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_embed(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_event(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_readyState(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE AboutBox(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWebBridge, 0xae24fdad, 0x03c6, 0x11d1, 0x8b,0x76, 0x00,0x80,0xc7,0x44,0xf3,0x89)
#endif
#else
typedef struct IWebBridgeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWebBridge* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWebBridge* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWebBridge* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IWebBridge* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IWebBridge* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IWebBridge* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IWebBridge* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IWebBridge methods ***/
    HRESULT (STDMETHODCALLTYPE *put_URL)(
        IWebBridge* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_URL)(
        IWebBridge* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_Scrollbar)(
        IWebBridge* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_Scrollbar)(
        IWebBridge* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_embed)(
        IWebBridge* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_embed)(
        IWebBridge* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_event)(
        IWebBridge* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_readyState)(
        IWebBridge* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *AboutBox)(
        IWebBridge* This);

    END_INTERFACE
} IWebBridgeVtbl;
interface IWebBridge {
    CONST_VTBL IWebBridgeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWebBridge_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWebBridge_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWebBridge_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWebBridge_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWebBridge_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWebBridge_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWebBridge_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWebBridge methods ***/
#define IWebBridge_put_URL(This,v) (This)->lpVtbl->put_URL(This,v)
#define IWebBridge_get_URL(This,p) (This)->lpVtbl->get_URL(This,p)
#define IWebBridge_put_Scrollbar(This,v) (This)->lpVtbl->put_Scrollbar(This,v)
#define IWebBridge_get_Scrollbar(This,p) (This)->lpVtbl->get_Scrollbar(This,p)
#define IWebBridge_put_embed(This,v) (This)->lpVtbl->put_embed(This,v)
#define IWebBridge_get_embed(This,p) (This)->lpVtbl->get_embed(This,p)
#define IWebBridge_get_event(This,p) (This)->lpVtbl->get_event(This,p)
#define IWebBridge_get_readyState(This,p) (This)->lpVtbl->get_readyState(This,p)
#define IWebBridge_AboutBox(This) (This)->lpVtbl->AboutBox(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWebBridge_QueryInterface(IWebBridge* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWebBridge_AddRef(IWebBridge* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWebBridge_Release(IWebBridge* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWebBridge_GetTypeInfoCount(IWebBridge* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWebBridge_GetTypeInfo(IWebBridge* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IWebBridge_GetIDsOfNames(IWebBridge* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IWebBridge_Invoke(IWebBridge* 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);
}
/*** IWebBridge methods ***/
static FORCEINLINE HRESULT IWebBridge_put_URL(IWebBridge* This,BSTR v) {
    return This->lpVtbl->put_URL(This,v);
}
static FORCEINLINE HRESULT IWebBridge_get_URL(IWebBridge* This,BSTR *p) {
    return This->lpVtbl->get_URL(This,p);
}
static FORCEINLINE HRESULT IWebBridge_put_Scrollbar(IWebBridge* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_Scrollbar(This,v);
}
static FORCEINLINE HRESULT IWebBridge_get_Scrollbar(IWebBridge* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_Scrollbar(This,p);
}
static FORCEINLINE HRESULT IWebBridge_put_embed(IWebBridge* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_embed(This,v);
}
static FORCEINLINE HRESULT IWebBridge_get_embed(IWebBridge* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_embed(This,p);
}
static FORCEINLINE HRESULT IWebBridge_get_event(IWebBridge* This,IDispatch **p) {
    return This->lpVtbl->get_event(This,p);
}
static FORCEINLINE HRESULT IWebBridge_get_readyState(IWebBridge* This,LONG *p) {
    return This->lpVtbl->get_readyState(This,p);
}
static FORCEINLINE HRESULT IWebBridge_AboutBox(IWebBridge* This) {
    return This->lpVtbl->AboutBox(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWebBridge_put_URL_Proxy(
    IWebBridge* This,
    BSTR v);
void __RPC_STUB IWebBridge_put_URL_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWebBridge_get_URL_Proxy(
    IWebBridge* This,
    BSTR *p);
void __RPC_STUB IWebBridge_get_URL_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWebBridge_put_Scrollbar_Proxy(
    IWebBridge* This,
    VARIANT_BOOL v);
void __RPC_STUB IWebBridge_put_Scrollbar_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWebBridge_get_Scrollbar_Proxy(
    IWebBridge* This,
    VARIANT_BOOL *p);
void __RPC_STUB IWebBridge_get_Scrollbar_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWebBridge_put_embed_Proxy(
    IWebBridge* This,
    VARIANT_BOOL v);
void __RPC_STUB IWebBridge_put_embed_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWebBridge_get_embed_Proxy(
    IWebBridge* This,
    VARIANT_BOOL *p);
void __RPC_STUB IWebBridge_get_embed_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWebBridge_get_event_Proxy(
    IWebBridge* This,
    IDispatch **p);
void __RPC_STUB IWebBridge_get_event_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWebBridge_get_readyState_Proxy(
    IWebBridge* This,
    LONG *p);
void __RPC_STUB IWebBridge_get_readyState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWebBridge_AboutBox_Proxy(
    IWebBridge* This);
void __RPC_STUB IWebBridge_AboutBox_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWebBridge_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWBScriptControl interface
 */
#ifndef __IWBScriptControl_INTERFACE_DEFINED__
#define __IWBScriptControl_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWBScriptControl, 0xa5170870, 0x0cf8, 0x11d1, 0x8b,0x91, 0x00,0x80,0xc7,0x44,0xf3,0x89);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a5170870-0cf8-11d1-8b91-0080c744f389")
IWBScriptControl : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE raiseEvent(
        BSTR name,
        VARIANT eventData) = 0;

    virtual HRESULT STDMETHODCALLTYPE bubbleEvent(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE setContextMenu(
        VARIANT menuItemPairs) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_selectableContent(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_selectableContent(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_frozen(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollbar(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollbar(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_version(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_visibility(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onvisibilitychange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onvisibilitychange(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWBScriptControl, 0xa5170870, 0x0cf8, 0x11d1, 0x8b,0x91, 0x00,0x80,0xc7,0x44,0xf3,0x89)
#endif
#else
typedef struct IWBScriptControlVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWBScriptControl* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWBScriptControl* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWBScriptControl* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IWBScriptControl* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IWBScriptControl* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IWBScriptControl* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IWBScriptControl* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IWBScriptControl methods ***/
    HRESULT (STDMETHODCALLTYPE *raiseEvent)(
        IWBScriptControl* This,
        BSTR name,
        VARIANT eventData);

    HRESULT (STDMETHODCALLTYPE *bubbleEvent)(
        IWBScriptControl* This);

    HRESULT (STDMETHODCALLTYPE *setContextMenu)(
        IWBScriptControl* This,
        VARIANT menuItemPairs);

    HRESULT (STDMETHODCALLTYPE *put_selectableContent)(
        IWBScriptControl* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_selectableContent)(
        IWBScriptControl* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_frozen)(
        IWBScriptControl* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollbar)(
        IWBScriptControl* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_scrollbar)(
        IWBScriptControl* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_version)(
        IWBScriptControl* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_visibility)(
        IWBScriptControl* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_onvisibilitychange)(
        IWBScriptControl* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onvisibilitychange)(
        IWBScriptControl* This,
        VARIANT *p);

    END_INTERFACE
} IWBScriptControlVtbl;
interface IWBScriptControl {
    CONST_VTBL IWBScriptControlVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWBScriptControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWBScriptControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWBScriptControl_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWBScriptControl_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWBScriptControl_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWBScriptControl_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWBScriptControl_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWBScriptControl methods ***/
#define IWBScriptControl_raiseEvent(This,name,eventData) (This)->lpVtbl->raiseEvent(This,name,eventData)
#define IWBScriptControl_bubbleEvent(This) (This)->lpVtbl->bubbleEvent(This)
#define IWBScriptControl_setContextMenu(This,menuItemPairs) (This)->lpVtbl->setContextMenu(This,menuItemPairs)
#define IWBScriptControl_put_selectableContent(This,v) (This)->lpVtbl->put_selectableContent(This,v)
#define IWBScriptControl_get_selectableContent(This,p) (This)->lpVtbl->get_selectableContent(This,p)
#define IWBScriptControl_get_frozen(This,p) (This)->lpVtbl->get_frozen(This,p)
#define IWBScriptControl_put_scrollbar(This,v) (This)->lpVtbl->put_scrollbar(This,v)
#define IWBScriptControl_get_scrollbar(This,p) (This)->lpVtbl->get_scrollbar(This,p)
#define IWBScriptControl_get_version(This,p) (This)->lpVtbl->get_version(This,p)
#define IWBScriptControl_get_visibility(This,p) (This)->lpVtbl->get_visibility(This,p)
#define IWBScriptControl_put_onvisibilitychange(This,v) (This)->lpVtbl->put_onvisibilitychange(This,v)
#define IWBScriptControl_get_onvisibilitychange(This,p) (This)->lpVtbl->get_onvisibilitychange(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWBScriptControl_QueryInterface(IWBScriptControl* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWBScriptControl_AddRef(IWBScriptControl* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWBScriptControl_Release(IWBScriptControl* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWBScriptControl_GetTypeInfoCount(IWBScriptControl* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWBScriptControl_GetTypeInfo(IWBScriptControl* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IWBScriptControl_GetIDsOfNames(IWBScriptControl* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IWBScriptControl_Invoke(IWBScriptControl* 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);
}
/*** IWBScriptControl methods ***/
static FORCEINLINE HRESULT IWBScriptControl_raiseEvent(IWBScriptControl* This,BSTR name,VARIANT eventData) {
    return This->lpVtbl->raiseEvent(This,name,eventData);
}
static FORCEINLINE HRESULT IWBScriptControl_bubbleEvent(IWBScriptControl* This) {
    return This->lpVtbl->bubbleEvent(This);
}
static FORCEINLINE HRESULT IWBScriptControl_setContextMenu(IWBScriptControl* This,VARIANT menuItemPairs) {
    return This->lpVtbl->setContextMenu(This,menuItemPairs);
}
static FORCEINLINE HRESULT IWBScriptControl_put_selectableContent(IWBScriptControl* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_selectableContent(This,v);
}
static FORCEINLINE HRESULT IWBScriptControl_get_selectableContent(IWBScriptControl* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_selectableContent(This,p);
}
static FORCEINLINE HRESULT IWBScriptControl_get_frozen(IWBScriptControl* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_frozen(This,p);
}
static FORCEINLINE HRESULT IWBScriptControl_put_scrollbar(IWBScriptControl* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_scrollbar(This,v);
}
static FORCEINLINE HRESULT IWBScriptControl_get_scrollbar(IWBScriptControl* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_scrollbar(This,p);
}
static FORCEINLINE HRESULT IWBScriptControl_get_version(IWBScriptControl* This,BSTR *p) {
    return This->lpVtbl->get_version(This,p);
}
static FORCEINLINE HRESULT IWBScriptControl_get_visibility(IWBScriptControl* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_visibility(This,p);
}
static FORCEINLINE HRESULT IWBScriptControl_put_onvisibilitychange(IWBScriptControl* This,VARIANT v) {
    return This->lpVtbl->put_onvisibilitychange(This,v);
}
static FORCEINLINE HRESULT IWBScriptControl_get_onvisibilitychange(IWBScriptControl* This,VARIANT *p) {
    return This->lpVtbl->get_onvisibilitychange(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWBScriptControl_raiseEvent_Proxy(
    IWBScriptControl* This,
    BSTR name,
    VARIANT eventData);
void __RPC_STUB IWBScriptControl_raiseEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWBScriptControl_bubbleEvent_Proxy(
    IWBScriptControl* This);
void __RPC_STUB IWBScriptControl_bubbleEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWBScriptControl_setContextMenu_Proxy(
    IWBScriptControl* This,
    VARIANT menuItemPairs);
void __RPC_STUB IWBScriptControl_setContextMenu_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWBScriptControl_put_selectableContent_Proxy(
    IWBScriptControl* This,
    VARIANT_BOOL v);
void __RPC_STUB IWBScriptControl_put_selectableContent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWBScriptControl_get_selectableContent_Proxy(
    IWBScriptControl* This,
    VARIANT_BOOL *p);
void __RPC_STUB IWBScriptControl_get_selectableContent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWBScriptControl_get_frozen_Proxy(
    IWBScriptControl* This,
    VARIANT_BOOL *p);
void __RPC_STUB IWBScriptControl_get_frozen_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWBScriptControl_put_scrollbar_Proxy(
    IWBScriptControl* This,
    VARIANT_BOOL v);
void __RPC_STUB IWBScriptControl_put_scrollbar_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWBScriptControl_get_scrollbar_Proxy(
    IWBScriptControl* This,
    VARIANT_BOOL *p);
void __RPC_STUB IWBScriptControl_get_scrollbar_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWBScriptControl_get_version_Proxy(
    IWBScriptControl* This,
    BSTR *p);
void __RPC_STUB IWBScriptControl_get_version_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWBScriptControl_get_visibility_Proxy(
    IWBScriptControl* This,
    VARIANT_BOOL *p);
void __RPC_STUB IWBScriptControl_get_visibility_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWBScriptControl_put_onvisibilitychange_Proxy(
    IWBScriptControl* This,
    VARIANT v);
void __RPC_STUB IWBScriptControl_put_onvisibilitychange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWBScriptControl_get_onvisibilitychange_Proxy(
    IWBScriptControl* This,
    VARIANT *p);
void __RPC_STUB IWBScriptControl_get_onvisibilitychange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWBScriptControl_INTERFACE_DEFINED__ */

/*****************************************************************************
 * Scriptlet coclass
 */

DEFINE_GUID(CLSID_Scriptlet, 0xae24fdae, 0x03c6, 0x11d1, 0x8b,0x76, 0x00,0x80,0xc7,0x44,0xf3,0x89);

#ifdef __cplusplus
class DECLSPEC_UUID("ae24fdae-03c6-11d1-8b76-0080c744f389") Scriptlet;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(Scriptlet, 0xae24fdae, 0x03c6, 0x11d1, 0x8b,0x76, 0x00,0x80,0xc7,0x44,0xf3,0x89)
#endif
#endif

EXTERN_C const GUID CLSID_CScriptlet;
typedef enum _BoolValue {
    True = 1,
    False = 0,
    BoolValue_Max = 0x7fffffff
} BoolValue;
/*****************************************************************************
 * IHTMLEmbedElement interface
 */
#ifndef __IHTMLEmbedElement_INTERFACE_DEFINED__
#define __IHTMLEmbedElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLEmbedElement, 0x3050f25f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f25f-98b5-11cf-bb82-00aa00bdce0b")
IHTMLEmbedElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_hidden(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_hidden(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_palette(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pluginspage(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_src(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_src(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_units(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_units(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_name(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_width(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_width(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_height(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_height(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLEmbedElement, 0x3050f25f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLEmbedElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLEmbedElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLEmbedElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLEmbedElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLEmbedElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLEmbedElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLEmbedElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLEmbedElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLEmbedElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_hidden)(
        IHTMLEmbedElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_hidden)(
        IHTMLEmbedElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_palette)(
        IHTMLEmbedElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_pluginspage)(
        IHTMLEmbedElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_src)(
        IHTMLEmbedElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_src)(
        IHTMLEmbedElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_units)(
        IHTMLEmbedElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_units)(
        IHTMLEmbedElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_name)(
        IHTMLEmbedElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_name)(
        IHTMLEmbedElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_width)(
        IHTMLEmbedElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_width)(
        IHTMLEmbedElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_height)(
        IHTMLEmbedElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_height)(
        IHTMLEmbedElement* This,
        VARIANT *p);

    END_INTERFACE
} IHTMLEmbedElementVtbl;
interface IHTMLEmbedElement {
    CONST_VTBL IHTMLEmbedElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLEmbedElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLEmbedElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLEmbedElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLEmbedElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLEmbedElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLEmbedElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLEmbedElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLEmbedElement methods ***/
#define IHTMLEmbedElement_put_hidden(This,v) (This)->lpVtbl->put_hidden(This,v)
#define IHTMLEmbedElement_get_hidden(This,p) (This)->lpVtbl->get_hidden(This,p)
#define IHTMLEmbedElement_get_palette(This,p) (This)->lpVtbl->get_palette(This,p)
#define IHTMLEmbedElement_get_pluginspage(This,p) (This)->lpVtbl->get_pluginspage(This,p)
#define IHTMLEmbedElement_put_src(This,v) (This)->lpVtbl->put_src(This,v)
#define IHTMLEmbedElement_get_src(This,p) (This)->lpVtbl->get_src(This,p)
#define IHTMLEmbedElement_put_units(This,v) (This)->lpVtbl->put_units(This,v)
#define IHTMLEmbedElement_get_units(This,p) (This)->lpVtbl->get_units(This,p)
#define IHTMLEmbedElement_put_name(This,v) (This)->lpVtbl->put_name(This,v)
#define IHTMLEmbedElement_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#define IHTMLEmbedElement_put_width(This,v) (This)->lpVtbl->put_width(This,v)
#define IHTMLEmbedElement_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#define IHTMLEmbedElement_put_height(This,v) (This)->lpVtbl->put_height(This,v)
#define IHTMLEmbedElement_get_height(This,p) (This)->lpVtbl->get_height(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLEmbedElement_QueryInterface(IHTMLEmbedElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLEmbedElement_AddRef(IHTMLEmbedElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLEmbedElement_Release(IHTMLEmbedElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLEmbedElement_GetTypeInfoCount(IHTMLEmbedElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLEmbedElement_GetTypeInfo(IHTMLEmbedElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLEmbedElement_GetIDsOfNames(IHTMLEmbedElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLEmbedElement_Invoke(IHTMLEmbedElement* 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);
}
/*** IHTMLEmbedElement methods ***/
static FORCEINLINE HRESULT IHTMLEmbedElement_put_hidden(IHTMLEmbedElement* This,BSTR v) {
    return This->lpVtbl->put_hidden(This,v);
}
static FORCEINLINE HRESULT IHTMLEmbedElement_get_hidden(IHTMLEmbedElement* This,BSTR *p) {
    return This->lpVtbl->get_hidden(This,p);
}
static FORCEINLINE HRESULT IHTMLEmbedElement_get_palette(IHTMLEmbedElement* This,BSTR *p) {
    return This->lpVtbl->get_palette(This,p);
}
static FORCEINLINE HRESULT IHTMLEmbedElement_get_pluginspage(IHTMLEmbedElement* This,BSTR *p) {
    return This->lpVtbl->get_pluginspage(This,p);
}
static FORCEINLINE HRESULT IHTMLEmbedElement_put_src(IHTMLEmbedElement* This,BSTR v) {
    return This->lpVtbl->put_src(This,v);
}
static FORCEINLINE HRESULT IHTMLEmbedElement_get_src(IHTMLEmbedElement* This,BSTR *p) {
    return This->lpVtbl->get_src(This,p);
}
static FORCEINLINE HRESULT IHTMLEmbedElement_put_units(IHTMLEmbedElement* This,BSTR v) {
    return This->lpVtbl->put_units(This,v);
}
static FORCEINLINE HRESULT IHTMLEmbedElement_get_units(IHTMLEmbedElement* This,BSTR *p) {
    return This->lpVtbl->get_units(This,p);
}
static FORCEINLINE HRESULT IHTMLEmbedElement_put_name(IHTMLEmbedElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static FORCEINLINE HRESULT IHTMLEmbedElement_get_name(IHTMLEmbedElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static FORCEINLINE HRESULT IHTMLEmbedElement_put_width(IHTMLEmbedElement* This,VARIANT v) {
    return This->lpVtbl->put_width(This,v);
}
static FORCEINLINE HRESULT IHTMLEmbedElement_get_width(IHTMLEmbedElement* This,VARIANT *p) {
    return This->lpVtbl->get_width(This,p);
}
static FORCEINLINE HRESULT IHTMLEmbedElement_put_height(IHTMLEmbedElement* This,VARIANT v) {
    return This->lpVtbl->put_height(This,v);
}
static FORCEINLINE HRESULT IHTMLEmbedElement_get_height(IHTMLEmbedElement* This,VARIANT *p) {
    return This->lpVtbl->get_height(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLEmbedElement_put_hidden_Proxy(
    IHTMLEmbedElement* This,
    BSTR v);
void __RPC_STUB IHTMLEmbedElement_put_hidden_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEmbedElement_get_hidden_Proxy(
    IHTMLEmbedElement* This,
    BSTR *p);
void __RPC_STUB IHTMLEmbedElement_get_hidden_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEmbedElement_get_palette_Proxy(
    IHTMLEmbedElement* This,
    BSTR *p);
void __RPC_STUB IHTMLEmbedElement_get_palette_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEmbedElement_get_pluginspage_Proxy(
    IHTMLEmbedElement* This,
    BSTR *p);
void __RPC_STUB IHTMLEmbedElement_get_pluginspage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEmbedElement_put_src_Proxy(
    IHTMLEmbedElement* This,
    BSTR v);
void __RPC_STUB IHTMLEmbedElement_put_src_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEmbedElement_get_src_Proxy(
    IHTMLEmbedElement* This,
    BSTR *p);
void __RPC_STUB IHTMLEmbedElement_get_src_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEmbedElement_put_units_Proxy(
    IHTMLEmbedElement* This,
    BSTR v);
void __RPC_STUB IHTMLEmbedElement_put_units_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEmbedElement_get_units_Proxy(
    IHTMLEmbedElement* This,
    BSTR *p);
void __RPC_STUB IHTMLEmbedElement_get_units_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEmbedElement_put_name_Proxy(
    IHTMLEmbedElement* This,
    BSTR v);
void __RPC_STUB IHTMLEmbedElement_put_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEmbedElement_get_name_Proxy(
    IHTMLEmbedElement* This,
    BSTR *p);
void __RPC_STUB IHTMLEmbedElement_get_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEmbedElement_put_width_Proxy(
    IHTMLEmbedElement* This,
    VARIANT v);
void __RPC_STUB IHTMLEmbedElement_put_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEmbedElement_get_width_Proxy(
    IHTMLEmbedElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLEmbedElement_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEmbedElement_put_height_Proxy(
    IHTMLEmbedElement* This,
    VARIANT v);
void __RPC_STUB IHTMLEmbedElement_put_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEmbedElement_get_height_Proxy(
    IHTMLEmbedElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLEmbedElement_get_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLEmbedElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLEmbedElement2 interface
 */
#ifndef __IHTMLEmbedElement2_INTERFACE_DEFINED__
#define __IHTMLEmbedElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLEmbedElement2, 0x30510493, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510493-98b5-11cf-bb82-00aa00bdce0b")
IHTMLEmbedElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_src(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_src(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pluginspage(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLEmbedElement2, 0x30510493, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLEmbedElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLEmbedElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLEmbedElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLEmbedElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLEmbedElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLEmbedElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLEmbedElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLEmbedElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLEmbedElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_src)(
        IHTMLEmbedElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_src)(
        IHTMLEmbedElement2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_pluginspage)(
        IHTMLEmbedElement2* This,
        BSTR *p);

    END_INTERFACE
} IHTMLEmbedElement2Vtbl;
interface IHTMLEmbedElement2 {
    CONST_VTBL IHTMLEmbedElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLEmbedElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLEmbedElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLEmbedElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLEmbedElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLEmbedElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLEmbedElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLEmbedElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLEmbedElement2 methods ***/
#define IHTMLEmbedElement2_put_src(This,v) (This)->lpVtbl->put_src(This,v)
#define IHTMLEmbedElement2_get_src(This,p) (This)->lpVtbl->get_src(This,p)
#define IHTMLEmbedElement2_get_pluginspage(This,p) (This)->lpVtbl->get_pluginspage(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLEmbedElement2_QueryInterface(IHTMLEmbedElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLEmbedElement2_AddRef(IHTMLEmbedElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLEmbedElement2_Release(IHTMLEmbedElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLEmbedElement2_GetTypeInfoCount(IHTMLEmbedElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLEmbedElement2_GetTypeInfo(IHTMLEmbedElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLEmbedElement2_GetIDsOfNames(IHTMLEmbedElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLEmbedElement2_Invoke(IHTMLEmbedElement2* 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);
}
/*** IHTMLEmbedElement2 methods ***/
static FORCEINLINE HRESULT IHTMLEmbedElement2_put_src(IHTMLEmbedElement2* This,BSTR v) {
    return This->lpVtbl->put_src(This,v);
}
static FORCEINLINE HRESULT IHTMLEmbedElement2_get_src(IHTMLEmbedElement2* This,BSTR *p) {
    return This->lpVtbl->get_src(This,p);
}
static FORCEINLINE HRESULT IHTMLEmbedElement2_get_pluginspage(IHTMLEmbedElement2* This,BSTR *p) {
    return This->lpVtbl->get_pluginspage(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLEmbedElement2_put_src_Proxy(
    IHTMLEmbedElement2* This,
    BSTR v);
void __RPC_STUB IHTMLEmbedElement2_put_src_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEmbedElement2_get_src_Proxy(
    IHTMLEmbedElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLEmbedElement2_get_src_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEmbedElement2_get_pluginspage_Proxy(
    IHTMLEmbedElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLEmbedElement2_get_pluginspage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLEmbedElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLEmbed dispinterface
 */
#ifndef __DispHTMLEmbed_DISPINTERFACE_DEFINED__
#define __DispHTMLEmbed_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLEmbed, 0x3050f52e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f52e-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLEmbed : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLEmbed, 0x3050f52e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLEmbedVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLEmbed* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLEmbed* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLEmbed* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLEmbed* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLEmbed* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLEmbed* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLEmbed* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLEmbedVtbl;
interface DispHTMLEmbed {
    CONST_VTBL DispHTMLEmbedVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLEmbed_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLEmbed_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLEmbed_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLEmbed_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLEmbed_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLEmbed_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLEmbed_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 DispHTMLEmbed_QueryInterface(DispHTMLEmbed* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLEmbed_AddRef(DispHTMLEmbed* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLEmbed_Release(DispHTMLEmbed* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLEmbed_GetTypeInfoCount(DispHTMLEmbed* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLEmbed_GetTypeInfo(DispHTMLEmbed* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLEmbed_GetIDsOfNames(DispHTMLEmbed* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLEmbed_Invoke(DispHTMLEmbed* 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  /* __DispHTMLEmbed_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLEmbed coclass
 */

DEFINE_GUID(CLSID_HTMLEmbed, 0x3050f25d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f25d-98b5-11cf-bb82-00aa00bdce0b") HTMLEmbed;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLEmbed, 0x3050f25d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CPluginSite;
/*****************************************************************************
 * HTMLMapEvents2 dispinterface
 */
#ifndef __HTMLMapEvents2_DISPINTERFACE_DEFINED__
#define __HTMLMapEvents2_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLMapEvents2, 0x3050f61e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f61e-98b5-11cf-bb82-00aa00bdce0b")
HTMLMapEvents2 : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLMapEvents2, 0x3050f61e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLMapEvents2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLMapEvents2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLMapEvents2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLMapEvents2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLMapEvents2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLMapEvents2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLMapEvents2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLMapEvents2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLMapEvents2Vtbl;
interface HTMLMapEvents2 {
    CONST_VTBL HTMLMapEvents2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLMapEvents2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLMapEvents2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLMapEvents2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLMapEvents2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLMapEvents2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLMapEvents2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLMapEvents2_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 HTMLMapEvents2_QueryInterface(HTMLMapEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLMapEvents2_AddRef(HTMLMapEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLMapEvents2_Release(HTMLMapEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLMapEvents2_GetTypeInfoCount(HTMLMapEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLMapEvents2_GetTypeInfo(HTMLMapEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLMapEvents2_GetIDsOfNames(HTMLMapEvents2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLMapEvents2_Invoke(HTMLMapEvents2* 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  /* __HTMLMapEvents2_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLMapEvents dispinterface
 */
#ifndef __HTMLMapEvents_DISPINTERFACE_DEFINED__
#define __HTMLMapEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLMapEvents, 0x3050f3ba, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f3ba-98b5-11cf-bb82-00aa00bdce0b")
HTMLMapEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLMapEvents, 0x3050f3ba, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLMapEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLMapEvents* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLMapEvents* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLMapEvents* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLMapEvents* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLMapEvents* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLMapEvents* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLMapEvents* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLMapEventsVtbl;
interface HTMLMapEvents {
    CONST_VTBL HTMLMapEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLMapEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLMapEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLMapEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLMapEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLMapEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLMapEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLMapEvents_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 HTMLMapEvents_QueryInterface(HTMLMapEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLMapEvents_AddRef(HTMLMapEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLMapEvents_Release(HTMLMapEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLMapEvents_GetTypeInfoCount(HTMLMapEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLMapEvents_GetTypeInfo(HTMLMapEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLMapEvents_GetIDsOfNames(HTMLMapEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLMapEvents_Invoke(HTMLMapEvents* 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  /* __HTMLMapEvents_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLAreasCollection interface
 */
#ifndef __IHTMLAreasCollection_INTERFACE_DEFINED__
#define __IHTMLAreasCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLAreasCollection, 0x3050f383, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f383-98b5-11cf-bb82-00aa00bdce0b")
IHTMLAreasCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_length(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__newEnum(
        IUnknown **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE item(
        VARIANT name,
        VARIANT index,
        IDispatch **pdisp) = 0;

    virtual HRESULT STDMETHODCALLTYPE tags(
        VARIANT tagName,
        IDispatch **pdisp) = 0;

    virtual HRESULT STDMETHODCALLTYPE add(
        IHTMLElement *element,
        VARIANT before) = 0;

    virtual HRESULT STDMETHODCALLTYPE remove(
        LONG index = -1) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLAreasCollection, 0x3050f383, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLAreasCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLAreasCollection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLAreasCollection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLAreasCollection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLAreasCollection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLAreasCollection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLAreasCollection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLAreasCollection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLAreasCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *put_length)(
        IHTMLAreasCollection* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLAreasCollection* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get__newEnum)(
        IHTMLAreasCollection* This,
        IUnknown **p);

    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLAreasCollection* This,
        VARIANT name,
        VARIANT index,
        IDispatch **pdisp);

    HRESULT (STDMETHODCALLTYPE *tags)(
        IHTMLAreasCollection* This,
        VARIANT tagName,
        IDispatch **pdisp);

    HRESULT (STDMETHODCALLTYPE *add)(
        IHTMLAreasCollection* This,
        IHTMLElement *element,
        VARIANT before);

    HRESULT (STDMETHODCALLTYPE *remove)(
        IHTMLAreasCollection* This,
        LONG index);

    END_INTERFACE
} IHTMLAreasCollectionVtbl;
interface IHTMLAreasCollection {
    CONST_VTBL IHTMLAreasCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLAreasCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLAreasCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLAreasCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLAreasCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLAreasCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLAreasCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLAreasCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLAreasCollection methods ***/
#define IHTMLAreasCollection_put_length(This,v) (This)->lpVtbl->put_length(This,v)
#define IHTMLAreasCollection_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLAreasCollection_get__newEnum(This,p) (This)->lpVtbl->get__newEnum(This,p)
#define IHTMLAreasCollection_item(This,name,index,pdisp) (This)->lpVtbl->item(This,name,index,pdisp)
#define IHTMLAreasCollection_tags(This,tagName,pdisp) (This)->lpVtbl->tags(This,tagName,pdisp)
#define IHTMLAreasCollection_add(This,element,before) (This)->lpVtbl->add(This,element,before)
#define IHTMLAreasCollection_remove(This,index) (This)->lpVtbl->remove(This,index)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLAreasCollection_QueryInterface(IHTMLAreasCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLAreasCollection_AddRef(IHTMLAreasCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLAreasCollection_Release(IHTMLAreasCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLAreasCollection_GetTypeInfoCount(IHTMLAreasCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLAreasCollection_GetTypeInfo(IHTMLAreasCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLAreasCollection_GetIDsOfNames(IHTMLAreasCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLAreasCollection_Invoke(IHTMLAreasCollection* 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);
}
/*** IHTMLAreasCollection methods ***/
static FORCEINLINE HRESULT IHTMLAreasCollection_put_length(IHTMLAreasCollection* This,LONG v) {
    return This->lpVtbl->put_length(This,v);
}
static FORCEINLINE HRESULT IHTMLAreasCollection_get_length(IHTMLAreasCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IHTMLAreasCollection_get__newEnum(IHTMLAreasCollection* This,IUnknown **p) {
    return This->lpVtbl->get__newEnum(This,p);
}
static FORCEINLINE HRESULT IHTMLAreasCollection_item(IHTMLAreasCollection* This,VARIANT name,VARIANT index,IDispatch **pdisp) {
    return This->lpVtbl->item(This,name,index,pdisp);
}
static FORCEINLINE HRESULT IHTMLAreasCollection_tags(IHTMLAreasCollection* This,VARIANT tagName,IDispatch **pdisp) {
    return This->lpVtbl->tags(This,tagName,pdisp);
}
static FORCEINLINE HRESULT IHTMLAreasCollection_add(IHTMLAreasCollection* This,IHTMLElement *element,VARIANT before) {
    return This->lpVtbl->add(This,element,before);
}
static FORCEINLINE HRESULT IHTMLAreasCollection_remove(IHTMLAreasCollection* This,LONG index) {
    return This->lpVtbl->remove(This,index);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLAreasCollection_put_length_Proxy(
    IHTMLAreasCollection* This,
    LONG v);
void __RPC_STUB IHTMLAreasCollection_put_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreasCollection_get_length_Proxy(
    IHTMLAreasCollection* This,
    LONG *p);
void __RPC_STUB IHTMLAreasCollection_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreasCollection_get__newEnum_Proxy(
    IHTMLAreasCollection* This,
    IUnknown **p);
void __RPC_STUB IHTMLAreasCollection_get__newEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreasCollection_item_Proxy(
    IHTMLAreasCollection* This,
    VARIANT name,
    VARIANT index,
    IDispatch **pdisp);
void __RPC_STUB IHTMLAreasCollection_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreasCollection_tags_Proxy(
    IHTMLAreasCollection* This,
    VARIANT tagName,
    IDispatch **pdisp);
void __RPC_STUB IHTMLAreasCollection_tags_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreasCollection_add_Proxy(
    IHTMLAreasCollection* This,
    IHTMLElement *element,
    VARIANT before);
void __RPC_STUB IHTMLAreasCollection_add_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreasCollection_remove_Proxy(
    IHTMLAreasCollection* This,
    LONG index);
void __RPC_STUB IHTMLAreasCollection_remove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLAreasCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLAreasCollection2 interface
 */
#ifndef __IHTMLAreasCollection2_INTERFACE_DEFINED__
#define __IHTMLAreasCollection2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLAreasCollection2, 0x3050f5ec, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f5ec-98b5-11cf-bb82-00aa00bdce0b")
IHTMLAreasCollection2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE urns(
        VARIANT urn,
        IDispatch **pdisp) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLAreasCollection2, 0x3050f5ec, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLAreasCollection2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLAreasCollection2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLAreasCollection2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLAreasCollection2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLAreasCollection2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLAreasCollection2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLAreasCollection2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLAreasCollection2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLAreasCollection2 methods ***/
    HRESULT (STDMETHODCALLTYPE *urns)(
        IHTMLAreasCollection2* This,
        VARIANT urn,
        IDispatch **pdisp);

    END_INTERFACE
} IHTMLAreasCollection2Vtbl;
interface IHTMLAreasCollection2 {
    CONST_VTBL IHTMLAreasCollection2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLAreasCollection2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLAreasCollection2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLAreasCollection2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLAreasCollection2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLAreasCollection2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLAreasCollection2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLAreasCollection2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLAreasCollection2 methods ***/
#define IHTMLAreasCollection2_urns(This,urn,pdisp) (This)->lpVtbl->urns(This,urn,pdisp)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLAreasCollection2_QueryInterface(IHTMLAreasCollection2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLAreasCollection2_AddRef(IHTMLAreasCollection2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLAreasCollection2_Release(IHTMLAreasCollection2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLAreasCollection2_GetTypeInfoCount(IHTMLAreasCollection2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLAreasCollection2_GetTypeInfo(IHTMLAreasCollection2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLAreasCollection2_GetIDsOfNames(IHTMLAreasCollection2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLAreasCollection2_Invoke(IHTMLAreasCollection2* 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);
}
/*** IHTMLAreasCollection2 methods ***/
static FORCEINLINE HRESULT IHTMLAreasCollection2_urns(IHTMLAreasCollection2* This,VARIANT urn,IDispatch **pdisp) {
    return This->lpVtbl->urns(This,urn,pdisp);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLAreasCollection2_urns_Proxy(
    IHTMLAreasCollection2* This,
    VARIANT urn,
    IDispatch **pdisp);
void __RPC_STUB IHTMLAreasCollection2_urns_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLAreasCollection2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLAreasCollection3 interface
 */
#ifndef __IHTMLAreasCollection3_INTERFACE_DEFINED__
#define __IHTMLAreasCollection3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLAreasCollection3, 0x3050f837, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f837-98b5-11cf-bb82-00aa00bdce0b")
IHTMLAreasCollection3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE namedItem(
        BSTR name,
        IDispatch **pdisp) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLAreasCollection3, 0x3050f837, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLAreasCollection3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLAreasCollection3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLAreasCollection3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLAreasCollection3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLAreasCollection3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLAreasCollection3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLAreasCollection3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLAreasCollection3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLAreasCollection3 methods ***/
    HRESULT (STDMETHODCALLTYPE *namedItem)(
        IHTMLAreasCollection3* This,
        BSTR name,
        IDispatch **pdisp);

    END_INTERFACE
} IHTMLAreasCollection3Vtbl;
interface IHTMLAreasCollection3 {
    CONST_VTBL IHTMLAreasCollection3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLAreasCollection3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLAreasCollection3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLAreasCollection3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLAreasCollection3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLAreasCollection3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLAreasCollection3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLAreasCollection3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLAreasCollection3 methods ***/
#define IHTMLAreasCollection3_namedItem(This,name,pdisp) (This)->lpVtbl->namedItem(This,name,pdisp)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLAreasCollection3_QueryInterface(IHTMLAreasCollection3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLAreasCollection3_AddRef(IHTMLAreasCollection3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLAreasCollection3_Release(IHTMLAreasCollection3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLAreasCollection3_GetTypeInfoCount(IHTMLAreasCollection3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLAreasCollection3_GetTypeInfo(IHTMLAreasCollection3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLAreasCollection3_GetIDsOfNames(IHTMLAreasCollection3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLAreasCollection3_Invoke(IHTMLAreasCollection3* 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);
}
/*** IHTMLAreasCollection3 methods ***/
static FORCEINLINE HRESULT IHTMLAreasCollection3_namedItem(IHTMLAreasCollection3* This,BSTR name,IDispatch **pdisp) {
    return This->lpVtbl->namedItem(This,name,pdisp);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLAreasCollection3_namedItem_Proxy(
    IHTMLAreasCollection3* This,
    BSTR name,
    IDispatch **pdisp);
void __RPC_STUB IHTMLAreasCollection3_namedItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLAreasCollection3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLAreasCollection4 interface
 */
#ifndef __IHTMLAreasCollection4_INTERFACE_DEFINED__
#define __IHTMLAreasCollection4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLAreasCollection4, 0x30510492, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510492-98b5-11cf-bb82-00aa00bdce0b")
IHTMLAreasCollection4 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE item(
        LONG index,
        IHTMLElement2 **pNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE namedItem(
        BSTR name,
        IHTMLElement2 **pNode) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLAreasCollection4, 0x30510492, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLAreasCollection4Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLAreasCollection4* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLAreasCollection4* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLAreasCollection4* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLAreasCollection4* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLAreasCollection4* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLAreasCollection4* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLAreasCollection4* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLAreasCollection4 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLAreasCollection4* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLAreasCollection4* This,
        LONG index,
        IHTMLElement2 **pNode);

    HRESULT (STDMETHODCALLTYPE *namedItem)(
        IHTMLAreasCollection4* This,
        BSTR name,
        IHTMLElement2 **pNode);

    END_INTERFACE
} IHTMLAreasCollection4Vtbl;
interface IHTMLAreasCollection4 {
    CONST_VTBL IHTMLAreasCollection4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLAreasCollection4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLAreasCollection4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLAreasCollection4_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLAreasCollection4_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLAreasCollection4_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLAreasCollection4_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLAreasCollection4_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLAreasCollection4 methods ***/
#define IHTMLAreasCollection4_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLAreasCollection4_item(This,index,pNode) (This)->lpVtbl->item(This,index,pNode)
#define IHTMLAreasCollection4_namedItem(This,name,pNode) (This)->lpVtbl->namedItem(This,name,pNode)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLAreasCollection4_QueryInterface(IHTMLAreasCollection4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLAreasCollection4_AddRef(IHTMLAreasCollection4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLAreasCollection4_Release(IHTMLAreasCollection4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLAreasCollection4_GetTypeInfoCount(IHTMLAreasCollection4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLAreasCollection4_GetTypeInfo(IHTMLAreasCollection4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLAreasCollection4_GetIDsOfNames(IHTMLAreasCollection4* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLAreasCollection4_Invoke(IHTMLAreasCollection4* 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);
}
/*** IHTMLAreasCollection4 methods ***/
static FORCEINLINE HRESULT IHTMLAreasCollection4_get_length(IHTMLAreasCollection4* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IHTMLAreasCollection4_item(IHTMLAreasCollection4* This,LONG index,IHTMLElement2 **pNode) {
    return This->lpVtbl->item(This,index,pNode);
}
static FORCEINLINE HRESULT IHTMLAreasCollection4_namedItem(IHTMLAreasCollection4* This,BSTR name,IHTMLElement2 **pNode) {
    return This->lpVtbl->namedItem(This,name,pNode);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLAreasCollection4_get_length_Proxy(
    IHTMLAreasCollection4* This,
    LONG *p);
void __RPC_STUB IHTMLAreasCollection4_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreasCollection4_item_Proxy(
    IHTMLAreasCollection4* This,
    LONG index,
    IHTMLElement2 **pNode);
void __RPC_STUB IHTMLAreasCollection4_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreasCollection4_namedItem_Proxy(
    IHTMLAreasCollection4* This,
    BSTR name,
    IHTMLElement2 **pNode);
void __RPC_STUB IHTMLAreasCollection4_namedItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLAreasCollection4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLMapElement interface
 */
#ifndef __IHTMLMapElement_INTERFACE_DEFINED__
#define __IHTMLMapElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLMapElement, 0x3050f266, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f266-98b5-11cf-bb82-00aa00bdce0b")
IHTMLMapElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_areas(
        IHTMLAreasCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_name(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLMapElement, 0x3050f266, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLMapElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLMapElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLMapElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLMapElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLMapElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLMapElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLMapElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLMapElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLMapElement methods ***/
    HRESULT (STDMETHODCALLTYPE *get_areas)(
        IHTMLMapElement* This,
        IHTMLAreasCollection **p);

    HRESULT (STDMETHODCALLTYPE *put_name)(
        IHTMLMapElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_name)(
        IHTMLMapElement* This,
        BSTR *p);

    END_INTERFACE
} IHTMLMapElementVtbl;
interface IHTMLMapElement {
    CONST_VTBL IHTMLMapElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLMapElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLMapElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLMapElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLMapElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLMapElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLMapElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLMapElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLMapElement methods ***/
#define IHTMLMapElement_get_areas(This,p) (This)->lpVtbl->get_areas(This,p)
#define IHTMLMapElement_put_name(This,v) (This)->lpVtbl->put_name(This,v)
#define IHTMLMapElement_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLMapElement_QueryInterface(IHTMLMapElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLMapElement_AddRef(IHTMLMapElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLMapElement_Release(IHTMLMapElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLMapElement_GetTypeInfoCount(IHTMLMapElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLMapElement_GetTypeInfo(IHTMLMapElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLMapElement_GetIDsOfNames(IHTMLMapElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLMapElement_Invoke(IHTMLMapElement* 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);
}
/*** IHTMLMapElement methods ***/
static FORCEINLINE HRESULT IHTMLMapElement_get_areas(IHTMLMapElement* This,IHTMLAreasCollection **p) {
    return This->lpVtbl->get_areas(This,p);
}
static FORCEINLINE HRESULT IHTMLMapElement_put_name(IHTMLMapElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static FORCEINLINE HRESULT IHTMLMapElement_get_name(IHTMLMapElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLMapElement_get_areas_Proxy(
    IHTMLMapElement* This,
    IHTMLAreasCollection **p);
void __RPC_STUB IHTMLMapElement_get_areas_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMapElement_put_name_Proxy(
    IHTMLMapElement* This,
    BSTR v);
void __RPC_STUB IHTMLMapElement_put_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMapElement_get_name_Proxy(
    IHTMLMapElement* This,
    BSTR *p);
void __RPC_STUB IHTMLMapElement_get_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLMapElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLAreasCollection dispinterface
 */
#ifndef __DispHTMLAreasCollection_DISPINTERFACE_DEFINED__
#define __DispHTMLAreasCollection_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLAreasCollection, 0x3050f56a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f56a-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLAreasCollection : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLAreasCollection, 0x3050f56a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLAreasCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLAreasCollection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLAreasCollection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLAreasCollection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLAreasCollection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLAreasCollection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLAreasCollection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLAreasCollection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLAreasCollectionVtbl;
interface DispHTMLAreasCollection {
    CONST_VTBL DispHTMLAreasCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLAreasCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLAreasCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLAreasCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLAreasCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLAreasCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLAreasCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLAreasCollection_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 DispHTMLAreasCollection_QueryInterface(DispHTMLAreasCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLAreasCollection_AddRef(DispHTMLAreasCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLAreasCollection_Release(DispHTMLAreasCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLAreasCollection_GetTypeInfoCount(DispHTMLAreasCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLAreasCollection_GetTypeInfo(DispHTMLAreasCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLAreasCollection_GetIDsOfNames(DispHTMLAreasCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLAreasCollection_Invoke(DispHTMLAreasCollection* 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  /* __DispHTMLAreasCollection_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLAreasCollection coclass
 */

DEFINE_GUID(CLSID_HTMLAreasCollection, 0x3050f4ca, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f4ca-98b5-11cf-bb82-00aa00bdce0b") HTMLAreasCollection;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLAreasCollection, 0x3050f4ca, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CAreasCollection;
/*****************************************************************************
 * DispHTMLMapElement dispinterface
 */
#ifndef __DispHTMLMapElement_DISPINTERFACE_DEFINED__
#define __DispHTMLMapElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLMapElement, 0x3050f526, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f526-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLMapElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLMapElement, 0x3050f526, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLMapElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLMapElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLMapElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLMapElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLMapElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLMapElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLMapElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLMapElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLMapElementVtbl;
interface DispHTMLMapElement {
    CONST_VTBL DispHTMLMapElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLMapElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLMapElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLMapElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLMapElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLMapElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLMapElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLMapElement_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 DispHTMLMapElement_QueryInterface(DispHTMLMapElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLMapElement_AddRef(DispHTMLMapElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLMapElement_Release(DispHTMLMapElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLMapElement_GetTypeInfoCount(DispHTMLMapElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLMapElement_GetTypeInfo(DispHTMLMapElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLMapElement_GetIDsOfNames(DispHTMLMapElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLMapElement_Invoke(DispHTMLMapElement* 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  /* __DispHTMLMapElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLMapElement coclass
 */

DEFINE_GUID(CLSID_HTMLMapElement, 0x3050f271, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f271-98b5-11cf-bb82-00aa00bdce0b") HTMLMapElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLMapElement, 0x3050f271, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CMapElement;
/*****************************************************************************
 * HTMLAreaEvents2 dispinterface
 */
#ifndef __HTMLAreaEvents2_DISPINTERFACE_DEFINED__
#define __HTMLAreaEvents2_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLAreaEvents2, 0x3050f611, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f611-98b5-11cf-bb82-00aa00bdce0b")
HTMLAreaEvents2 : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLAreaEvents2, 0x3050f611, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLAreaEvents2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLAreaEvents2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLAreaEvents2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLAreaEvents2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLAreaEvents2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLAreaEvents2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLAreaEvents2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLAreaEvents2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLAreaEvents2Vtbl;
interface HTMLAreaEvents2 {
    CONST_VTBL HTMLAreaEvents2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLAreaEvents2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLAreaEvents2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLAreaEvents2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLAreaEvents2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLAreaEvents2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLAreaEvents2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLAreaEvents2_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 HTMLAreaEvents2_QueryInterface(HTMLAreaEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLAreaEvents2_AddRef(HTMLAreaEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLAreaEvents2_Release(HTMLAreaEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLAreaEvents2_GetTypeInfoCount(HTMLAreaEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLAreaEvents2_GetTypeInfo(HTMLAreaEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLAreaEvents2_GetIDsOfNames(HTMLAreaEvents2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLAreaEvents2_Invoke(HTMLAreaEvents2* 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  /* __HTMLAreaEvents2_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLAreaEvents dispinterface
 */
#ifndef __HTMLAreaEvents_DISPINTERFACE_DEFINED__
#define __HTMLAreaEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLAreaEvents, 0x3050f366, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f366-98b5-11cf-bb82-00aa00bdce0b")
HTMLAreaEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLAreaEvents, 0x3050f366, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLAreaEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLAreaEvents* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLAreaEvents* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLAreaEvents* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLAreaEvents* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLAreaEvents* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLAreaEvents* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLAreaEvents* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLAreaEventsVtbl;
interface HTMLAreaEvents {
    CONST_VTBL HTMLAreaEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLAreaEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLAreaEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLAreaEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLAreaEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLAreaEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLAreaEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLAreaEvents_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 HTMLAreaEvents_QueryInterface(HTMLAreaEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLAreaEvents_AddRef(HTMLAreaEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLAreaEvents_Release(HTMLAreaEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLAreaEvents_GetTypeInfoCount(HTMLAreaEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLAreaEvents_GetTypeInfo(HTMLAreaEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLAreaEvents_GetIDsOfNames(HTMLAreaEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLAreaEvents_Invoke(HTMLAreaEvents* 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  /* __HTMLAreaEvents_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLAreaElement interface
 */
#ifndef __IHTMLAreaElement_INTERFACE_DEFINED__
#define __IHTMLAreaElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLAreaElement, 0x3050f265, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f265-98b5-11cf-bb82-00aa00bdce0b")
IHTMLAreaElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_shape(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_shape(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_coords(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_coords(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_href(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_href(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_target(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_target(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_alt(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_alt(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_noHref(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_noHref(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_host(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_host(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_hostname(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_hostname(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_pathname(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pathname(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_port(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_port(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_protocol(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_protocol(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_search(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_search(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_hash(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_hash(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onblur(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onblur(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onfocus(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onfocus(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_tabIndex(
        short v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_tabIndex(
        short *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE focus(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE blur(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLAreaElement, 0x3050f265, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLAreaElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLAreaElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLAreaElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLAreaElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLAreaElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLAreaElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLAreaElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLAreaElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLAreaElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_shape)(
        IHTMLAreaElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_shape)(
        IHTMLAreaElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_coords)(
        IHTMLAreaElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_coords)(
        IHTMLAreaElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_href)(
        IHTMLAreaElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_href)(
        IHTMLAreaElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_target)(
        IHTMLAreaElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_target)(
        IHTMLAreaElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_alt)(
        IHTMLAreaElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_alt)(
        IHTMLAreaElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_noHref)(
        IHTMLAreaElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_noHref)(
        IHTMLAreaElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_host)(
        IHTMLAreaElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_host)(
        IHTMLAreaElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_hostname)(
        IHTMLAreaElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_hostname)(
        IHTMLAreaElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_pathname)(
        IHTMLAreaElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_pathname)(
        IHTMLAreaElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_port)(
        IHTMLAreaElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_port)(
        IHTMLAreaElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_protocol)(
        IHTMLAreaElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_protocol)(
        IHTMLAreaElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_search)(
        IHTMLAreaElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_search)(
        IHTMLAreaElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_hash)(
        IHTMLAreaElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_hash)(
        IHTMLAreaElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_onblur)(
        IHTMLAreaElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onblur)(
        IHTMLAreaElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onfocus)(
        IHTMLAreaElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onfocus)(
        IHTMLAreaElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_tabIndex)(
        IHTMLAreaElement* This,
        short v);

    HRESULT (STDMETHODCALLTYPE *get_tabIndex)(
        IHTMLAreaElement* This,
        short *p);

    HRESULT (STDMETHODCALLTYPE *focus)(
        IHTMLAreaElement* This);

    HRESULT (STDMETHODCALLTYPE *blur)(
        IHTMLAreaElement* This);

    END_INTERFACE
} IHTMLAreaElementVtbl;
interface IHTMLAreaElement {
    CONST_VTBL IHTMLAreaElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLAreaElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLAreaElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLAreaElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLAreaElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLAreaElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLAreaElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLAreaElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLAreaElement methods ***/
#define IHTMLAreaElement_put_shape(This,v) (This)->lpVtbl->put_shape(This,v)
#define IHTMLAreaElement_get_shape(This,p) (This)->lpVtbl->get_shape(This,p)
#define IHTMLAreaElement_put_coords(This,v) (This)->lpVtbl->put_coords(This,v)
#define IHTMLAreaElement_get_coords(This,p) (This)->lpVtbl->get_coords(This,p)
#define IHTMLAreaElement_put_href(This,v) (This)->lpVtbl->put_href(This,v)
#define IHTMLAreaElement_get_href(This,p) (This)->lpVtbl->get_href(This,p)
#define IHTMLAreaElement_put_target(This,v) (This)->lpVtbl->put_target(This,v)
#define IHTMLAreaElement_get_target(This,p) (This)->lpVtbl->get_target(This,p)
#define IHTMLAreaElement_put_alt(This,v) (This)->lpVtbl->put_alt(This,v)
#define IHTMLAreaElement_get_alt(This,p) (This)->lpVtbl->get_alt(This,p)
#define IHTMLAreaElement_put_noHref(This,v) (This)->lpVtbl->put_noHref(This,v)
#define IHTMLAreaElement_get_noHref(This,p) (This)->lpVtbl->get_noHref(This,p)
#define IHTMLAreaElement_put_host(This,v) (This)->lpVtbl->put_host(This,v)
#define IHTMLAreaElement_get_host(This,p) (This)->lpVtbl->get_host(This,p)
#define IHTMLAreaElement_put_hostname(This,v) (This)->lpVtbl->put_hostname(This,v)
#define IHTMLAreaElement_get_hostname(This,p) (This)->lpVtbl->get_hostname(This,p)
#define IHTMLAreaElement_put_pathname(This,v) (This)->lpVtbl->put_pathname(This,v)
#define IHTMLAreaElement_get_pathname(This,p) (This)->lpVtbl->get_pathname(This,p)
#define IHTMLAreaElement_put_port(This,v) (This)->lpVtbl->put_port(This,v)
#define IHTMLAreaElement_get_port(This,p) (This)->lpVtbl->get_port(This,p)
#define IHTMLAreaElement_put_protocol(This,v) (This)->lpVtbl->put_protocol(This,v)
#define IHTMLAreaElement_get_protocol(This,p) (This)->lpVtbl->get_protocol(This,p)
#define IHTMLAreaElement_put_search(This,v) (This)->lpVtbl->put_search(This,v)
#define IHTMLAreaElement_get_search(This,p) (This)->lpVtbl->get_search(This,p)
#define IHTMLAreaElement_put_hash(This,v) (This)->lpVtbl->put_hash(This,v)
#define IHTMLAreaElement_get_hash(This,p) (This)->lpVtbl->get_hash(This,p)
#define IHTMLAreaElement_put_onblur(This,v) (This)->lpVtbl->put_onblur(This,v)
#define IHTMLAreaElement_get_onblur(This,p) (This)->lpVtbl->get_onblur(This,p)
#define IHTMLAreaElement_put_onfocus(This,v) (This)->lpVtbl->put_onfocus(This,v)
#define IHTMLAreaElement_get_onfocus(This,p) (This)->lpVtbl->get_onfocus(This,p)
#define IHTMLAreaElement_put_tabIndex(This,v) (This)->lpVtbl->put_tabIndex(This,v)
#define IHTMLAreaElement_get_tabIndex(This,p) (This)->lpVtbl->get_tabIndex(This,p)
#define IHTMLAreaElement_focus(This) (This)->lpVtbl->focus(This)
#define IHTMLAreaElement_blur(This) (This)->lpVtbl->blur(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLAreaElement_QueryInterface(IHTMLAreaElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLAreaElement_AddRef(IHTMLAreaElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLAreaElement_Release(IHTMLAreaElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLAreaElement_GetTypeInfoCount(IHTMLAreaElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLAreaElement_GetTypeInfo(IHTMLAreaElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLAreaElement_GetIDsOfNames(IHTMLAreaElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLAreaElement_Invoke(IHTMLAreaElement* 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);
}
/*** IHTMLAreaElement methods ***/
static FORCEINLINE HRESULT IHTMLAreaElement_put_shape(IHTMLAreaElement* This,BSTR v) {
    return This->lpVtbl->put_shape(This,v);
}
static FORCEINLINE HRESULT IHTMLAreaElement_get_shape(IHTMLAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_shape(This,p);
}
static FORCEINLINE HRESULT IHTMLAreaElement_put_coords(IHTMLAreaElement* This,BSTR v) {
    return This->lpVtbl->put_coords(This,v);
}
static FORCEINLINE HRESULT IHTMLAreaElement_get_coords(IHTMLAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_coords(This,p);
}
static FORCEINLINE HRESULT IHTMLAreaElement_put_href(IHTMLAreaElement* This,BSTR v) {
    return This->lpVtbl->put_href(This,v);
}
static FORCEINLINE HRESULT IHTMLAreaElement_get_href(IHTMLAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_href(This,p);
}
static FORCEINLINE HRESULT IHTMLAreaElement_put_target(IHTMLAreaElement* This,BSTR v) {
    return This->lpVtbl->put_target(This,v);
}
static FORCEINLINE HRESULT IHTMLAreaElement_get_target(IHTMLAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_target(This,p);
}
static FORCEINLINE HRESULT IHTMLAreaElement_put_alt(IHTMLAreaElement* This,BSTR v) {
    return This->lpVtbl->put_alt(This,v);
}
static FORCEINLINE HRESULT IHTMLAreaElement_get_alt(IHTMLAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_alt(This,p);
}
static FORCEINLINE HRESULT IHTMLAreaElement_put_noHref(IHTMLAreaElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_noHref(This,v);
}
static FORCEINLINE HRESULT IHTMLAreaElement_get_noHref(IHTMLAreaElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_noHref(This,p);
}
static FORCEINLINE HRESULT IHTMLAreaElement_put_host(IHTMLAreaElement* This,BSTR v) {
    return This->lpVtbl->put_host(This,v);
}
static FORCEINLINE HRESULT IHTMLAreaElement_get_host(IHTMLAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_host(This,p);
}
static FORCEINLINE HRESULT IHTMLAreaElement_put_hostname(IHTMLAreaElement* This,BSTR v) {
    return This->lpVtbl->put_hostname(This,v);
}
static FORCEINLINE HRESULT IHTMLAreaElement_get_hostname(IHTMLAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_hostname(This,p);
}
static FORCEINLINE HRESULT IHTMLAreaElement_put_pathname(IHTMLAreaElement* This,BSTR v) {
    return This->lpVtbl->put_pathname(This,v);
}
static FORCEINLINE HRESULT IHTMLAreaElement_get_pathname(IHTMLAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_pathname(This,p);
}
static FORCEINLINE HRESULT IHTMLAreaElement_put_port(IHTMLAreaElement* This,BSTR v) {
    return This->lpVtbl->put_port(This,v);
}
static FORCEINLINE HRESULT IHTMLAreaElement_get_port(IHTMLAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_port(This,p);
}
static FORCEINLINE HRESULT IHTMLAreaElement_put_protocol(IHTMLAreaElement* This,BSTR v) {
    return This->lpVtbl->put_protocol(This,v);
}
static FORCEINLINE HRESULT IHTMLAreaElement_get_protocol(IHTMLAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_protocol(This,p);
}
static FORCEINLINE HRESULT IHTMLAreaElement_put_search(IHTMLAreaElement* This,BSTR v) {
    return This->lpVtbl->put_search(This,v);
}
static FORCEINLINE HRESULT IHTMLAreaElement_get_search(IHTMLAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_search(This,p);
}
static FORCEINLINE HRESULT IHTMLAreaElement_put_hash(IHTMLAreaElement* This,BSTR v) {
    return This->lpVtbl->put_hash(This,v);
}
static FORCEINLINE HRESULT IHTMLAreaElement_get_hash(IHTMLAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_hash(This,p);
}
static FORCEINLINE HRESULT IHTMLAreaElement_put_onblur(IHTMLAreaElement* This,VARIANT v) {
    return This->lpVtbl->put_onblur(This,v);
}
static FORCEINLINE HRESULT IHTMLAreaElement_get_onblur(IHTMLAreaElement* This,VARIANT *p) {
    return This->lpVtbl->get_onblur(This,p);
}
static FORCEINLINE HRESULT IHTMLAreaElement_put_onfocus(IHTMLAreaElement* This,VARIANT v) {
    return This->lpVtbl->put_onfocus(This,v);
}
static FORCEINLINE HRESULT IHTMLAreaElement_get_onfocus(IHTMLAreaElement* This,VARIANT *p) {
    return This->lpVtbl->get_onfocus(This,p);
}
static FORCEINLINE HRESULT IHTMLAreaElement_put_tabIndex(IHTMLAreaElement* This,short v) {
    return This->lpVtbl->put_tabIndex(This,v);
}
static FORCEINLINE HRESULT IHTMLAreaElement_get_tabIndex(IHTMLAreaElement* This,short *p) {
    return This->lpVtbl->get_tabIndex(This,p);
}
static FORCEINLINE HRESULT IHTMLAreaElement_focus(IHTMLAreaElement* This) {
    return This->lpVtbl->focus(This);
}
static FORCEINLINE HRESULT IHTMLAreaElement_blur(IHTMLAreaElement* This) {
    return This->lpVtbl->blur(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLAreaElement_put_shape_Proxy(
    IHTMLAreaElement* This,
    BSTR v);
void __RPC_STUB IHTMLAreaElement_put_shape_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_get_shape_Proxy(
    IHTMLAreaElement* This,
    BSTR *p);
void __RPC_STUB IHTMLAreaElement_get_shape_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_put_coords_Proxy(
    IHTMLAreaElement* This,
    BSTR v);
void __RPC_STUB IHTMLAreaElement_put_coords_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_get_coords_Proxy(
    IHTMLAreaElement* This,
    BSTR *p);
void __RPC_STUB IHTMLAreaElement_get_coords_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_put_href_Proxy(
    IHTMLAreaElement* This,
    BSTR v);
void __RPC_STUB IHTMLAreaElement_put_href_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_get_href_Proxy(
    IHTMLAreaElement* This,
    BSTR *p);
void __RPC_STUB IHTMLAreaElement_get_href_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_put_target_Proxy(
    IHTMLAreaElement* This,
    BSTR v);
void __RPC_STUB IHTMLAreaElement_put_target_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_get_target_Proxy(
    IHTMLAreaElement* This,
    BSTR *p);
void __RPC_STUB IHTMLAreaElement_get_target_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_put_alt_Proxy(
    IHTMLAreaElement* This,
    BSTR v);
void __RPC_STUB IHTMLAreaElement_put_alt_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_get_alt_Proxy(
    IHTMLAreaElement* This,
    BSTR *p);
void __RPC_STUB IHTMLAreaElement_get_alt_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_put_noHref_Proxy(
    IHTMLAreaElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLAreaElement_put_noHref_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_get_noHref_Proxy(
    IHTMLAreaElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLAreaElement_get_noHref_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_put_host_Proxy(
    IHTMLAreaElement* This,
    BSTR v);
void __RPC_STUB IHTMLAreaElement_put_host_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_get_host_Proxy(
    IHTMLAreaElement* This,
    BSTR *p);
void __RPC_STUB IHTMLAreaElement_get_host_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_put_hostname_Proxy(
    IHTMLAreaElement* This,
    BSTR v);
void __RPC_STUB IHTMLAreaElement_put_hostname_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_get_hostname_Proxy(
    IHTMLAreaElement* This,
    BSTR *p);
void __RPC_STUB IHTMLAreaElement_get_hostname_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_put_pathname_Proxy(
    IHTMLAreaElement* This,
    BSTR v);
void __RPC_STUB IHTMLAreaElement_put_pathname_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_get_pathname_Proxy(
    IHTMLAreaElement* This,
    BSTR *p);
void __RPC_STUB IHTMLAreaElement_get_pathname_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_put_port_Proxy(
    IHTMLAreaElement* This,
    BSTR v);
void __RPC_STUB IHTMLAreaElement_put_port_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_get_port_Proxy(
    IHTMLAreaElement* This,
    BSTR *p);
void __RPC_STUB IHTMLAreaElement_get_port_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_put_protocol_Proxy(
    IHTMLAreaElement* This,
    BSTR v);
void __RPC_STUB IHTMLAreaElement_put_protocol_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_get_protocol_Proxy(
    IHTMLAreaElement* This,
    BSTR *p);
void __RPC_STUB IHTMLAreaElement_get_protocol_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_put_search_Proxy(
    IHTMLAreaElement* This,
    BSTR v);
void __RPC_STUB IHTMLAreaElement_put_search_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_get_search_Proxy(
    IHTMLAreaElement* This,
    BSTR *p);
void __RPC_STUB IHTMLAreaElement_get_search_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_put_hash_Proxy(
    IHTMLAreaElement* This,
    BSTR v);
void __RPC_STUB IHTMLAreaElement_put_hash_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_get_hash_Proxy(
    IHTMLAreaElement* This,
    BSTR *p);
void __RPC_STUB IHTMLAreaElement_get_hash_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_put_onblur_Proxy(
    IHTMLAreaElement* This,
    VARIANT v);
void __RPC_STUB IHTMLAreaElement_put_onblur_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_get_onblur_Proxy(
    IHTMLAreaElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLAreaElement_get_onblur_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_put_onfocus_Proxy(
    IHTMLAreaElement* This,
    VARIANT v);
void __RPC_STUB IHTMLAreaElement_put_onfocus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_get_onfocus_Proxy(
    IHTMLAreaElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLAreaElement_get_onfocus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_put_tabIndex_Proxy(
    IHTMLAreaElement* This,
    short v);
void __RPC_STUB IHTMLAreaElement_put_tabIndex_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_get_tabIndex_Proxy(
    IHTMLAreaElement* This,
    short *p);
void __RPC_STUB IHTMLAreaElement_get_tabIndex_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_focus_Proxy(
    IHTMLAreaElement* This);
void __RPC_STUB IHTMLAreaElement_focus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement_blur_Proxy(
    IHTMLAreaElement* This);
void __RPC_STUB IHTMLAreaElement_blur_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLAreaElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLAreaElement2 interface
 */
#ifndef __IHTMLAreaElement2_INTERFACE_DEFINED__
#define __IHTMLAreaElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLAreaElement2, 0x3051041f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051041f-98b5-11cf-bb82-00aa00bdce0b")
IHTMLAreaElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_shape(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_shape(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_coords(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_coords(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_href(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_href(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLAreaElement2, 0x3051041f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLAreaElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLAreaElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLAreaElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLAreaElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLAreaElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLAreaElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLAreaElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLAreaElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLAreaElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_shape)(
        IHTMLAreaElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_shape)(
        IHTMLAreaElement2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_coords)(
        IHTMLAreaElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_coords)(
        IHTMLAreaElement2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_href)(
        IHTMLAreaElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_href)(
        IHTMLAreaElement2* This,
        BSTR *p);

    END_INTERFACE
} IHTMLAreaElement2Vtbl;
interface IHTMLAreaElement2 {
    CONST_VTBL IHTMLAreaElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLAreaElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLAreaElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLAreaElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLAreaElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLAreaElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLAreaElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLAreaElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLAreaElement2 methods ***/
#define IHTMLAreaElement2_put_shape(This,v) (This)->lpVtbl->put_shape(This,v)
#define IHTMLAreaElement2_get_shape(This,p) (This)->lpVtbl->get_shape(This,p)
#define IHTMLAreaElement2_put_coords(This,v) (This)->lpVtbl->put_coords(This,v)
#define IHTMLAreaElement2_get_coords(This,p) (This)->lpVtbl->get_coords(This,p)
#define IHTMLAreaElement2_put_href(This,v) (This)->lpVtbl->put_href(This,v)
#define IHTMLAreaElement2_get_href(This,p) (This)->lpVtbl->get_href(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLAreaElement2_QueryInterface(IHTMLAreaElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLAreaElement2_AddRef(IHTMLAreaElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLAreaElement2_Release(IHTMLAreaElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLAreaElement2_GetTypeInfoCount(IHTMLAreaElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLAreaElement2_GetTypeInfo(IHTMLAreaElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLAreaElement2_GetIDsOfNames(IHTMLAreaElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLAreaElement2_Invoke(IHTMLAreaElement2* 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);
}
/*** IHTMLAreaElement2 methods ***/
static FORCEINLINE HRESULT IHTMLAreaElement2_put_shape(IHTMLAreaElement2* This,BSTR v) {
    return This->lpVtbl->put_shape(This,v);
}
static FORCEINLINE HRESULT IHTMLAreaElement2_get_shape(IHTMLAreaElement2* This,BSTR *p) {
    return This->lpVtbl->get_shape(This,p);
}
static FORCEINLINE HRESULT IHTMLAreaElement2_put_coords(IHTMLAreaElement2* This,BSTR v) {
    return This->lpVtbl->put_coords(This,v);
}
static FORCEINLINE HRESULT IHTMLAreaElement2_get_coords(IHTMLAreaElement2* This,BSTR *p) {
    return This->lpVtbl->get_coords(This,p);
}
static FORCEINLINE HRESULT IHTMLAreaElement2_put_href(IHTMLAreaElement2* This,BSTR v) {
    return This->lpVtbl->put_href(This,v);
}
static FORCEINLINE HRESULT IHTMLAreaElement2_get_href(IHTMLAreaElement2* This,BSTR *p) {
    return This->lpVtbl->get_href(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLAreaElement2_put_shape_Proxy(
    IHTMLAreaElement2* This,
    BSTR v);
void __RPC_STUB IHTMLAreaElement2_put_shape_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement2_get_shape_Proxy(
    IHTMLAreaElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLAreaElement2_get_shape_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement2_put_coords_Proxy(
    IHTMLAreaElement2* This,
    BSTR v);
void __RPC_STUB IHTMLAreaElement2_put_coords_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement2_get_coords_Proxy(
    IHTMLAreaElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLAreaElement2_get_coords_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement2_put_href_Proxy(
    IHTMLAreaElement2* This,
    BSTR v);
void __RPC_STUB IHTMLAreaElement2_put_href_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAreaElement2_get_href_Proxy(
    IHTMLAreaElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLAreaElement2_get_href_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLAreaElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLAreaElement dispinterface
 */
#ifndef __DispHTMLAreaElement_DISPINTERFACE_DEFINED__
#define __DispHTMLAreaElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLAreaElement, 0x3050f503, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f503-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLAreaElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLAreaElement, 0x3050f503, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLAreaElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLAreaElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLAreaElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLAreaElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLAreaElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLAreaElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLAreaElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLAreaElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLAreaElementVtbl;
interface DispHTMLAreaElement {
    CONST_VTBL DispHTMLAreaElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLAreaElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLAreaElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLAreaElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLAreaElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLAreaElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLAreaElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLAreaElement_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 DispHTMLAreaElement_QueryInterface(DispHTMLAreaElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLAreaElement_AddRef(DispHTMLAreaElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLAreaElement_Release(DispHTMLAreaElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLAreaElement_GetTypeInfoCount(DispHTMLAreaElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLAreaElement_GetTypeInfo(DispHTMLAreaElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLAreaElement_GetIDsOfNames(DispHTMLAreaElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLAreaElement_Invoke(DispHTMLAreaElement* 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  /* __DispHTMLAreaElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLAreaElement coclass
 */

DEFINE_GUID(CLSID_HTMLAreaElement, 0x3050f283, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f283-98b5-11cf-bb82-00aa00bdce0b") HTMLAreaElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLAreaElement, 0x3050f283, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CAreaElement;
typedef enum _htmlCaptionAlign {
    htmlCaptionAlignNotSet = 0,
    htmlCaptionAlignLeft = 1,
    htmlCaptionAlignCenter = 2,
    htmlCaptionAlignRight = 3,
    htmlCaptionAlignJustify = 4,
    htmlCaptionAlignTop = 5,
    htmlCaptionAlignBottom = 6,
    htmlCaptionAlign_Max = 0x7fffffff
} htmlCaptionAlign;
typedef enum _htmlCaptionVAlign {
    htmlCaptionVAlignNotSet = 0,
    htmlCaptionVAlignTop = 1,
    htmlCaptionVAlignBottom = 2,
    htmlCaptionVAlign_Max = 0x7fffffff
} htmlCaptionVAlign;
/*****************************************************************************
 * IHTMLTableCaption interface
 */
#ifndef __IHTMLTableCaption_INTERFACE_DEFINED__
#define __IHTMLTableCaption_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTableCaption, 0x3050f2eb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f2eb-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTableCaption : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_align(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_align(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_vAlign(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_vAlign(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTableCaption, 0x3050f2eb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTableCaptionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTableCaption* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTableCaption* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTableCaption* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTableCaption* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTableCaption* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTableCaption* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTableCaption* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLTableCaption methods ***/
    HRESULT (STDMETHODCALLTYPE *put_align)(
        IHTMLTableCaption* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_align)(
        IHTMLTableCaption* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_vAlign)(
        IHTMLTableCaption* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_vAlign)(
        IHTMLTableCaption* This,
        BSTR *p);

    END_INTERFACE
} IHTMLTableCaptionVtbl;
interface IHTMLTableCaption {
    CONST_VTBL IHTMLTableCaptionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTableCaption_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTableCaption_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTableCaption_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTableCaption_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTableCaption_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTableCaption_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTableCaption_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLTableCaption methods ***/
#define IHTMLTableCaption_put_align(This,v) (This)->lpVtbl->put_align(This,v)
#define IHTMLTableCaption_get_align(This,p) (This)->lpVtbl->get_align(This,p)
#define IHTMLTableCaption_put_vAlign(This,v) (This)->lpVtbl->put_vAlign(This,v)
#define IHTMLTableCaption_get_vAlign(This,p) (This)->lpVtbl->get_vAlign(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLTableCaption_QueryInterface(IHTMLTableCaption* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTableCaption_AddRef(IHTMLTableCaption* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTableCaption_Release(IHTMLTableCaption* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTableCaption_GetTypeInfoCount(IHTMLTableCaption* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTableCaption_GetTypeInfo(IHTMLTableCaption* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTableCaption_GetIDsOfNames(IHTMLTableCaption* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTableCaption_Invoke(IHTMLTableCaption* 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);
}
/*** IHTMLTableCaption methods ***/
static FORCEINLINE HRESULT IHTMLTableCaption_put_align(IHTMLTableCaption* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static FORCEINLINE HRESULT IHTMLTableCaption_get_align(IHTMLTableCaption* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
static FORCEINLINE HRESULT IHTMLTableCaption_put_vAlign(IHTMLTableCaption* This,BSTR v) {
    return This->lpVtbl->put_vAlign(This,v);
}
static FORCEINLINE HRESULT IHTMLTableCaption_get_vAlign(IHTMLTableCaption* This,BSTR *p) {
    return This->lpVtbl->get_vAlign(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLTableCaption_put_align_Proxy(
    IHTMLTableCaption* This,
    BSTR v);
void __RPC_STUB IHTMLTableCaption_put_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCaption_get_align_Proxy(
    IHTMLTableCaption* This,
    BSTR *p);
void __RPC_STUB IHTMLTableCaption_get_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCaption_put_vAlign_Proxy(
    IHTMLTableCaption* This,
    BSTR v);
void __RPC_STUB IHTMLTableCaption_put_vAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCaption_get_vAlign_Proxy(
    IHTMLTableCaption* This,
    BSTR *p);
void __RPC_STUB IHTMLTableCaption_get_vAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLTableCaption_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLTableCaption dispinterface
 */
#ifndef __DispHTMLTableCaption_DISPINTERFACE_DEFINED__
#define __DispHTMLTableCaption_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLTableCaption, 0x3050f508, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f508-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLTableCaption : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLTableCaption, 0x3050f508, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLTableCaptionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLTableCaption* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLTableCaption* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLTableCaption* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLTableCaption* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLTableCaption* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLTableCaption* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLTableCaption* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLTableCaptionVtbl;
interface DispHTMLTableCaption {
    CONST_VTBL DispHTMLTableCaptionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLTableCaption_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLTableCaption_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLTableCaption_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLTableCaption_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLTableCaption_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLTableCaption_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLTableCaption_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 DispHTMLTableCaption_QueryInterface(DispHTMLTableCaption* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLTableCaption_AddRef(DispHTMLTableCaption* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLTableCaption_Release(DispHTMLTableCaption* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLTableCaption_GetTypeInfoCount(DispHTMLTableCaption* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLTableCaption_GetTypeInfo(DispHTMLTableCaption* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLTableCaption_GetIDsOfNames(DispHTMLTableCaption* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLTableCaption_Invoke(DispHTMLTableCaption* 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  /* __DispHTMLTableCaption_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLTableCaption coclass
 */

DEFINE_GUID(CLSID_HTMLTableCaption, 0x3050f2ec, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f2ec-98b5-11cf-bb82-00aa00bdce0b") HTMLTableCaption;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLTableCaption, 0x3050f2ec, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CTableCaption;
/*****************************************************************************
 * IHTMLCommentElement interface
 */
#ifndef __IHTMLCommentElement_INTERFACE_DEFINED__
#define __IHTMLCommentElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLCommentElement, 0x3050f20c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f20c-98b5-11cf-bb82-00aa00bdce0b")
IHTMLCommentElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_text(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_text(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_atomic(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_atomic(
        LONG *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLCommentElement, 0x3050f20c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLCommentElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLCommentElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLCommentElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLCommentElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLCommentElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLCommentElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLCommentElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLCommentElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLCommentElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_text)(
        IHTMLCommentElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_text)(
        IHTMLCommentElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_atomic)(
        IHTMLCommentElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_atomic)(
        IHTMLCommentElement* This,
        LONG *p);

    END_INTERFACE
} IHTMLCommentElementVtbl;
interface IHTMLCommentElement {
    CONST_VTBL IHTMLCommentElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLCommentElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLCommentElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLCommentElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLCommentElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLCommentElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLCommentElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLCommentElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLCommentElement methods ***/
#define IHTMLCommentElement_put_text(This,v) (This)->lpVtbl->put_text(This,v)
#define IHTMLCommentElement_get_text(This,p) (This)->lpVtbl->get_text(This,p)
#define IHTMLCommentElement_put_atomic(This,v) (This)->lpVtbl->put_atomic(This,v)
#define IHTMLCommentElement_get_atomic(This,p) (This)->lpVtbl->get_atomic(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLCommentElement_QueryInterface(IHTMLCommentElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLCommentElement_AddRef(IHTMLCommentElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLCommentElement_Release(IHTMLCommentElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLCommentElement_GetTypeInfoCount(IHTMLCommentElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLCommentElement_GetTypeInfo(IHTMLCommentElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLCommentElement_GetIDsOfNames(IHTMLCommentElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLCommentElement_Invoke(IHTMLCommentElement* 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);
}
/*** IHTMLCommentElement methods ***/
static FORCEINLINE HRESULT IHTMLCommentElement_put_text(IHTMLCommentElement* This,BSTR v) {
    return This->lpVtbl->put_text(This,v);
}
static FORCEINLINE HRESULT IHTMLCommentElement_get_text(IHTMLCommentElement* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static FORCEINLINE HRESULT IHTMLCommentElement_put_atomic(IHTMLCommentElement* This,LONG v) {
    return This->lpVtbl->put_atomic(This,v);
}
static FORCEINLINE HRESULT IHTMLCommentElement_get_atomic(IHTMLCommentElement* This,LONG *p) {
    return This->lpVtbl->get_atomic(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLCommentElement_put_text_Proxy(
    IHTMLCommentElement* This,
    BSTR v);
void __RPC_STUB IHTMLCommentElement_put_text_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCommentElement_get_text_Proxy(
    IHTMLCommentElement* This,
    BSTR *p);
void __RPC_STUB IHTMLCommentElement_get_text_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCommentElement_put_atomic_Proxy(
    IHTMLCommentElement* This,
    LONG v);
void __RPC_STUB IHTMLCommentElement_put_atomic_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCommentElement_get_atomic_Proxy(
    IHTMLCommentElement* This,
    LONG *p);
void __RPC_STUB IHTMLCommentElement_get_atomic_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLCommentElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLCommentElement2 interface
 */
#ifndef __IHTMLCommentElement2_INTERFACE_DEFINED__
#define __IHTMLCommentElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLCommentElement2, 0x3050f813, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f813-98b5-11cf-bb82-00aa00bdce0b")
IHTMLCommentElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_data(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_data(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE substringData(
        LONG offset,
        LONG Count,
        BSTR *pbstrsubString) = 0;

    virtual HRESULT STDMETHODCALLTYPE appendData(
        BSTR bstrstring) = 0;

    virtual HRESULT STDMETHODCALLTYPE insertData(
        LONG offset,
        BSTR bstrstring) = 0;

    virtual HRESULT STDMETHODCALLTYPE deleteData(
        LONG offset,
        LONG Count) = 0;

    virtual HRESULT STDMETHODCALLTYPE replaceData(
        LONG offset,
        LONG Count,
        BSTR bstrstring) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLCommentElement2, 0x3050f813, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLCommentElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLCommentElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLCommentElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLCommentElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLCommentElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLCommentElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLCommentElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLCommentElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLCommentElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_data)(
        IHTMLCommentElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_data)(
        IHTMLCommentElement2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLCommentElement2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *substringData)(
        IHTMLCommentElement2* This,
        LONG offset,
        LONG Count,
        BSTR *pbstrsubString);

    HRESULT (STDMETHODCALLTYPE *appendData)(
        IHTMLCommentElement2* This,
        BSTR bstrstring);

    HRESULT (STDMETHODCALLTYPE *insertData)(
        IHTMLCommentElement2* This,
        LONG offset,
        BSTR bstrstring);

    HRESULT (STDMETHODCALLTYPE *deleteData)(
        IHTMLCommentElement2* This,
        LONG offset,
        LONG Count);

    HRESULT (STDMETHODCALLTYPE *replaceData)(
        IHTMLCommentElement2* This,
        LONG offset,
        LONG Count,
        BSTR bstrstring);

    END_INTERFACE
} IHTMLCommentElement2Vtbl;
interface IHTMLCommentElement2 {
    CONST_VTBL IHTMLCommentElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLCommentElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLCommentElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLCommentElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLCommentElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLCommentElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLCommentElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLCommentElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLCommentElement2 methods ***/
#define IHTMLCommentElement2_put_data(This,v) (This)->lpVtbl->put_data(This,v)
#define IHTMLCommentElement2_get_data(This,p) (This)->lpVtbl->get_data(This,p)
#define IHTMLCommentElement2_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLCommentElement2_substringData(This,offset,Count,pbstrsubString) (This)->lpVtbl->substringData(This,offset,Count,pbstrsubString)
#define IHTMLCommentElement2_appendData(This,bstrstring) (This)->lpVtbl->appendData(This,bstrstring)
#define IHTMLCommentElement2_insertData(This,offset,bstrstring) (This)->lpVtbl->insertData(This,offset,bstrstring)
#define IHTMLCommentElement2_deleteData(This,offset,Count) (This)->lpVtbl->deleteData(This,offset,Count)
#define IHTMLCommentElement2_replaceData(This,offset,Count,bstrstring) (This)->lpVtbl->replaceData(This,offset,Count,bstrstring)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLCommentElement2_QueryInterface(IHTMLCommentElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLCommentElement2_AddRef(IHTMLCommentElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLCommentElement2_Release(IHTMLCommentElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLCommentElement2_GetTypeInfoCount(IHTMLCommentElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLCommentElement2_GetTypeInfo(IHTMLCommentElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLCommentElement2_GetIDsOfNames(IHTMLCommentElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLCommentElement2_Invoke(IHTMLCommentElement2* 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);
}
/*** IHTMLCommentElement2 methods ***/
static FORCEINLINE HRESULT IHTMLCommentElement2_put_data(IHTMLCommentElement2* This,BSTR v) {
    return This->lpVtbl->put_data(This,v);
}
static FORCEINLINE HRESULT IHTMLCommentElement2_get_data(IHTMLCommentElement2* This,BSTR *p) {
    return This->lpVtbl->get_data(This,p);
}
static FORCEINLINE HRESULT IHTMLCommentElement2_get_length(IHTMLCommentElement2* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IHTMLCommentElement2_substringData(IHTMLCommentElement2* This,LONG offset,LONG Count,BSTR *pbstrsubString) {
    return This->lpVtbl->substringData(This,offset,Count,pbstrsubString);
}
static FORCEINLINE HRESULT IHTMLCommentElement2_appendData(IHTMLCommentElement2* This,BSTR bstrstring) {
    return This->lpVtbl->appendData(This,bstrstring);
}
static FORCEINLINE HRESULT IHTMLCommentElement2_insertData(IHTMLCommentElement2* This,LONG offset,BSTR bstrstring) {
    return This->lpVtbl->insertData(This,offset,bstrstring);
}
static FORCEINLINE HRESULT IHTMLCommentElement2_deleteData(IHTMLCommentElement2* This,LONG offset,LONG Count) {
    return This->lpVtbl->deleteData(This,offset,Count);
}
static FORCEINLINE HRESULT IHTMLCommentElement2_replaceData(IHTMLCommentElement2* This,LONG offset,LONG Count,BSTR bstrstring) {
    return This->lpVtbl->replaceData(This,offset,Count,bstrstring);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLCommentElement2_put_data_Proxy(
    IHTMLCommentElement2* This,
    BSTR v);
void __RPC_STUB IHTMLCommentElement2_put_data_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCommentElement2_get_data_Proxy(
    IHTMLCommentElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLCommentElement2_get_data_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCommentElement2_get_length_Proxy(
    IHTMLCommentElement2* This,
    LONG *p);
void __RPC_STUB IHTMLCommentElement2_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCommentElement2_substringData_Proxy(
    IHTMLCommentElement2* This,
    LONG offset,
    LONG Count,
    BSTR *pbstrsubString);
void __RPC_STUB IHTMLCommentElement2_substringData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCommentElement2_appendData_Proxy(
    IHTMLCommentElement2* This,
    BSTR bstrstring);
void __RPC_STUB IHTMLCommentElement2_appendData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCommentElement2_insertData_Proxy(
    IHTMLCommentElement2* This,
    LONG offset,
    BSTR bstrstring);
void __RPC_STUB IHTMLCommentElement2_insertData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCommentElement2_deleteData_Proxy(
    IHTMLCommentElement2* This,
    LONG offset,
    LONG Count);
void __RPC_STUB IHTMLCommentElement2_deleteData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCommentElement2_replaceData_Proxy(
    IHTMLCommentElement2* This,
    LONG offset,
    LONG Count,
    BSTR bstrstring);
void __RPC_STUB IHTMLCommentElement2_replaceData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLCommentElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLCommentElement3 interface
 */
#ifndef __IHTMLCommentElement3_INTERFACE_DEFINED__
#define __IHTMLCommentElement3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLCommentElement3, 0x3051073f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051073f-98b5-11cf-bb82-00aa00bdce0b")
IHTMLCommentElement3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE substringData(
        LONG offset,
        LONG Count,
        BSTR *pbstrsubString) = 0;

    virtual HRESULT STDMETHODCALLTYPE insertData(
        LONG offset,
        BSTR bstrstring) = 0;

    virtual HRESULT STDMETHODCALLTYPE deleteData(
        LONG offset,
        LONG Count) = 0;

    virtual HRESULT STDMETHODCALLTYPE replaceData(
        LONG offset,
        LONG Count,
        BSTR bstrstring) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLCommentElement3, 0x3051073f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLCommentElement3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLCommentElement3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLCommentElement3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLCommentElement3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLCommentElement3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLCommentElement3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLCommentElement3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLCommentElement3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLCommentElement3 methods ***/
    HRESULT (STDMETHODCALLTYPE *substringData)(
        IHTMLCommentElement3* This,
        LONG offset,
        LONG Count,
        BSTR *pbstrsubString);

    HRESULT (STDMETHODCALLTYPE *insertData)(
        IHTMLCommentElement3* This,
        LONG offset,
        BSTR bstrstring);

    HRESULT (STDMETHODCALLTYPE *deleteData)(
        IHTMLCommentElement3* This,
        LONG offset,
        LONG Count);

    HRESULT (STDMETHODCALLTYPE *replaceData)(
        IHTMLCommentElement3* This,
        LONG offset,
        LONG Count,
        BSTR bstrstring);

    END_INTERFACE
} IHTMLCommentElement3Vtbl;
interface IHTMLCommentElement3 {
    CONST_VTBL IHTMLCommentElement3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLCommentElement3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLCommentElement3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLCommentElement3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLCommentElement3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLCommentElement3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLCommentElement3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLCommentElement3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLCommentElement3 methods ***/
#define IHTMLCommentElement3_substringData(This,offset,Count,pbstrsubString) (This)->lpVtbl->substringData(This,offset,Count,pbstrsubString)
#define IHTMLCommentElement3_insertData(This,offset,bstrstring) (This)->lpVtbl->insertData(This,offset,bstrstring)
#define IHTMLCommentElement3_deleteData(This,offset,Count) (This)->lpVtbl->deleteData(This,offset,Count)
#define IHTMLCommentElement3_replaceData(This,offset,Count,bstrstring) (This)->lpVtbl->replaceData(This,offset,Count,bstrstring)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLCommentElement3_QueryInterface(IHTMLCommentElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLCommentElement3_AddRef(IHTMLCommentElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLCommentElement3_Release(IHTMLCommentElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLCommentElement3_GetTypeInfoCount(IHTMLCommentElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLCommentElement3_GetTypeInfo(IHTMLCommentElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLCommentElement3_GetIDsOfNames(IHTMLCommentElement3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLCommentElement3_Invoke(IHTMLCommentElement3* 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);
}
/*** IHTMLCommentElement3 methods ***/
static FORCEINLINE HRESULT IHTMLCommentElement3_substringData(IHTMLCommentElement3* This,LONG offset,LONG Count,BSTR *pbstrsubString) {
    return This->lpVtbl->substringData(This,offset,Count,pbstrsubString);
}
static FORCEINLINE HRESULT IHTMLCommentElement3_insertData(IHTMLCommentElement3* This,LONG offset,BSTR bstrstring) {
    return This->lpVtbl->insertData(This,offset,bstrstring);
}
static FORCEINLINE HRESULT IHTMLCommentElement3_deleteData(IHTMLCommentElement3* This,LONG offset,LONG Count) {
    return This->lpVtbl->deleteData(This,offset,Count);
}
static FORCEINLINE HRESULT IHTMLCommentElement3_replaceData(IHTMLCommentElement3* This,LONG offset,LONG Count,BSTR bstrstring) {
    return This->lpVtbl->replaceData(This,offset,Count,bstrstring);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLCommentElement3_substringData_Proxy(
    IHTMLCommentElement3* This,
    LONG offset,
    LONG Count,
    BSTR *pbstrsubString);
void __RPC_STUB IHTMLCommentElement3_substringData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCommentElement3_insertData_Proxy(
    IHTMLCommentElement3* This,
    LONG offset,
    BSTR bstrstring);
void __RPC_STUB IHTMLCommentElement3_insertData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCommentElement3_deleteData_Proxy(
    IHTMLCommentElement3* This,
    LONG offset,
    LONG Count);
void __RPC_STUB IHTMLCommentElement3_deleteData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCommentElement3_replaceData_Proxy(
    IHTMLCommentElement3* This,
    LONG offset,
    LONG Count,
    BSTR bstrstring);
void __RPC_STUB IHTMLCommentElement3_replaceData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLCommentElement3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLCommentElement dispinterface
 */
#ifndef __DispHTMLCommentElement_DISPINTERFACE_DEFINED__
#define __DispHTMLCommentElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLCommentElement, 0x3050f50a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f50a-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLCommentElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLCommentElement, 0x3050f50a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLCommentElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLCommentElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLCommentElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLCommentElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLCommentElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLCommentElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLCommentElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLCommentElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLCommentElementVtbl;
interface DispHTMLCommentElement {
    CONST_VTBL DispHTMLCommentElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLCommentElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLCommentElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLCommentElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLCommentElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLCommentElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLCommentElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLCommentElement_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 DispHTMLCommentElement_QueryInterface(DispHTMLCommentElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLCommentElement_AddRef(DispHTMLCommentElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLCommentElement_Release(DispHTMLCommentElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLCommentElement_GetTypeInfoCount(DispHTMLCommentElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLCommentElement_GetTypeInfo(DispHTMLCommentElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLCommentElement_GetIDsOfNames(DispHTMLCommentElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLCommentElement_Invoke(DispHTMLCommentElement* 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  /* __DispHTMLCommentElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLCommentElement coclass
 */

DEFINE_GUID(CLSID_HTMLCommentElement, 0x3050f317, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f317-98b5-11cf-bb82-00aa00bdce0b") HTMLCommentElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLCommentElement, 0x3050f317, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CCommentElement;
/*****************************************************************************
 * IHTMLPhraseElement interface
 */
#ifndef __IHTMLPhraseElement_INTERFACE_DEFINED__
#define __IHTMLPhraseElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLPhraseElement, 0x3050f20a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f20a-98b5-11cf-bb82-00aa00bdce0b")
IHTMLPhraseElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLPhraseElement, 0x3050f20a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLPhraseElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLPhraseElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLPhraseElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLPhraseElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLPhraseElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLPhraseElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLPhraseElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLPhraseElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} IHTMLPhraseElementVtbl;
interface IHTMLPhraseElement {
    CONST_VTBL IHTMLPhraseElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLPhraseElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLPhraseElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLPhraseElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLPhraseElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLPhraseElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLPhraseElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLPhraseElement_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 IHTMLPhraseElement_QueryInterface(IHTMLPhraseElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLPhraseElement_AddRef(IHTMLPhraseElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLPhraseElement_Release(IHTMLPhraseElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLPhraseElement_GetTypeInfoCount(IHTMLPhraseElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLPhraseElement_GetTypeInfo(IHTMLPhraseElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLPhraseElement_GetIDsOfNames(IHTMLPhraseElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLPhraseElement_Invoke(IHTMLPhraseElement* 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  /* __IHTMLPhraseElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLPhraseElement2 interface
 */
#ifndef __IHTMLPhraseElement2_INTERFACE_DEFINED__
#define __IHTMLPhraseElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLPhraseElement2, 0x3050f824, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f824-98b5-11cf-bb82-00aa00bdce0b")
IHTMLPhraseElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_cite(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cite(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_dateTime(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_dateTime(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLPhraseElement2, 0x3050f824, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLPhraseElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLPhraseElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLPhraseElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLPhraseElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLPhraseElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLPhraseElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLPhraseElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLPhraseElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLPhraseElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_cite)(
        IHTMLPhraseElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_cite)(
        IHTMLPhraseElement2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_dateTime)(
        IHTMLPhraseElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_dateTime)(
        IHTMLPhraseElement2* This,
        BSTR *p);

    END_INTERFACE
} IHTMLPhraseElement2Vtbl;
interface IHTMLPhraseElement2 {
    CONST_VTBL IHTMLPhraseElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLPhraseElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLPhraseElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLPhraseElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLPhraseElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLPhraseElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLPhraseElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLPhraseElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLPhraseElement2 methods ***/
#define IHTMLPhraseElement2_put_cite(This,v) (This)->lpVtbl->put_cite(This,v)
#define IHTMLPhraseElement2_get_cite(This,p) (This)->lpVtbl->get_cite(This,p)
#define IHTMLPhraseElement2_put_dateTime(This,v) (This)->lpVtbl->put_dateTime(This,v)
#define IHTMLPhraseElement2_get_dateTime(This,p) (This)->lpVtbl->get_dateTime(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLPhraseElement2_QueryInterface(IHTMLPhraseElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLPhraseElement2_AddRef(IHTMLPhraseElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLPhraseElement2_Release(IHTMLPhraseElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLPhraseElement2_GetTypeInfoCount(IHTMLPhraseElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLPhraseElement2_GetTypeInfo(IHTMLPhraseElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLPhraseElement2_GetIDsOfNames(IHTMLPhraseElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLPhraseElement2_Invoke(IHTMLPhraseElement2* 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);
}
/*** IHTMLPhraseElement2 methods ***/
static FORCEINLINE HRESULT IHTMLPhraseElement2_put_cite(IHTMLPhraseElement2* This,BSTR v) {
    return This->lpVtbl->put_cite(This,v);
}
static FORCEINLINE HRESULT IHTMLPhraseElement2_get_cite(IHTMLPhraseElement2* This,BSTR *p) {
    return This->lpVtbl->get_cite(This,p);
}
static FORCEINLINE HRESULT IHTMLPhraseElement2_put_dateTime(IHTMLPhraseElement2* This,BSTR v) {
    return This->lpVtbl->put_dateTime(This,v);
}
static FORCEINLINE HRESULT IHTMLPhraseElement2_get_dateTime(IHTMLPhraseElement2* This,BSTR *p) {
    return This->lpVtbl->get_dateTime(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLPhraseElement2_put_cite_Proxy(
    IHTMLPhraseElement2* This,
    BSTR v);
void __RPC_STUB IHTMLPhraseElement2_put_cite_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPhraseElement2_get_cite_Proxy(
    IHTMLPhraseElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLPhraseElement2_get_cite_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPhraseElement2_put_dateTime_Proxy(
    IHTMLPhraseElement2* This,
    BSTR v);
void __RPC_STUB IHTMLPhraseElement2_put_dateTime_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPhraseElement2_get_dateTime_Proxy(
    IHTMLPhraseElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLPhraseElement2_get_dateTime_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLPhraseElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLPhraseElement3 interface
 */
#ifndef __IHTMLPhraseElement3_INTERFACE_DEFINED__
#define __IHTMLPhraseElement3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLPhraseElement3, 0x3051043d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051043d-98b5-11cf-bb82-00aa00bdce0b")
IHTMLPhraseElement3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_cite(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cite(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLPhraseElement3, 0x3051043d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLPhraseElement3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLPhraseElement3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLPhraseElement3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLPhraseElement3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLPhraseElement3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLPhraseElement3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLPhraseElement3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLPhraseElement3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLPhraseElement3 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_cite)(
        IHTMLPhraseElement3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_cite)(
        IHTMLPhraseElement3* This,
        BSTR *p);

    END_INTERFACE
} IHTMLPhraseElement3Vtbl;
interface IHTMLPhraseElement3 {
    CONST_VTBL IHTMLPhraseElement3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLPhraseElement3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLPhraseElement3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLPhraseElement3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLPhraseElement3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLPhraseElement3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLPhraseElement3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLPhraseElement3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLPhraseElement3 methods ***/
#define IHTMLPhraseElement3_put_cite(This,v) (This)->lpVtbl->put_cite(This,v)
#define IHTMLPhraseElement3_get_cite(This,p) (This)->lpVtbl->get_cite(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLPhraseElement3_QueryInterface(IHTMLPhraseElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLPhraseElement3_AddRef(IHTMLPhraseElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLPhraseElement3_Release(IHTMLPhraseElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLPhraseElement3_GetTypeInfoCount(IHTMLPhraseElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLPhraseElement3_GetTypeInfo(IHTMLPhraseElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLPhraseElement3_GetIDsOfNames(IHTMLPhraseElement3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLPhraseElement3_Invoke(IHTMLPhraseElement3* 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);
}
/*** IHTMLPhraseElement3 methods ***/
static FORCEINLINE HRESULT IHTMLPhraseElement3_put_cite(IHTMLPhraseElement3* This,BSTR v) {
    return This->lpVtbl->put_cite(This,v);
}
static FORCEINLINE HRESULT IHTMLPhraseElement3_get_cite(IHTMLPhraseElement3* This,BSTR *p) {
    return This->lpVtbl->get_cite(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLPhraseElement3_put_cite_Proxy(
    IHTMLPhraseElement3* This,
    BSTR v);
void __RPC_STUB IHTMLPhraseElement3_put_cite_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPhraseElement3_get_cite_Proxy(
    IHTMLPhraseElement3* This,
    BSTR *p);
void __RPC_STUB IHTMLPhraseElement3_get_cite_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLPhraseElement3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLSpanElement interface
 */
#ifndef __IHTMLSpanElement_INTERFACE_DEFINED__
#define __IHTMLSpanElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLSpanElement, 0x3050f3f3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f3f3-98b5-11cf-bb82-00aa00bdce0b")
IHTMLSpanElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLSpanElement, 0x3050f3f3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLSpanElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLSpanElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLSpanElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLSpanElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLSpanElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLSpanElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLSpanElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLSpanElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} IHTMLSpanElementVtbl;
interface IHTMLSpanElement {
    CONST_VTBL IHTMLSpanElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLSpanElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLSpanElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLSpanElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLSpanElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLSpanElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLSpanElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLSpanElement_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 IHTMLSpanElement_QueryInterface(IHTMLSpanElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLSpanElement_AddRef(IHTMLSpanElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLSpanElement_Release(IHTMLSpanElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLSpanElement_GetTypeInfoCount(IHTMLSpanElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLSpanElement_GetTypeInfo(IHTMLSpanElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLSpanElement_GetIDsOfNames(IHTMLSpanElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLSpanElement_Invoke(IHTMLSpanElement* 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  /* __IHTMLSpanElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLPhraseElement dispinterface
 */
#ifndef __DispHTMLPhraseElement_DISPINTERFACE_DEFINED__
#define __DispHTMLPhraseElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLPhraseElement, 0x3050f52d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f52d-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLPhraseElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLPhraseElement, 0x3050f52d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLPhraseElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLPhraseElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLPhraseElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLPhraseElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLPhraseElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLPhraseElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLPhraseElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLPhraseElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLPhraseElementVtbl;
interface DispHTMLPhraseElement {
    CONST_VTBL DispHTMLPhraseElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLPhraseElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLPhraseElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLPhraseElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLPhraseElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLPhraseElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLPhraseElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLPhraseElement_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 DispHTMLPhraseElement_QueryInterface(DispHTMLPhraseElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLPhraseElement_AddRef(DispHTMLPhraseElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLPhraseElement_Release(DispHTMLPhraseElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLPhraseElement_GetTypeInfoCount(DispHTMLPhraseElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLPhraseElement_GetTypeInfo(DispHTMLPhraseElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLPhraseElement_GetIDsOfNames(DispHTMLPhraseElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLPhraseElement_Invoke(DispHTMLPhraseElement* 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  /* __DispHTMLPhraseElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLPhraseElement coclass
 */

DEFINE_GUID(CLSID_HTMLPhraseElement, 0x3050f26e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f26e-98b5-11cf-bb82-00aa00bdce0b") HTMLPhraseElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLPhraseElement, 0x3050f26e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CPhraseElement;
/*****************************************************************************
 * DispHTMLSpanElement dispinterface
 */
#ifndef __DispHTMLSpanElement_DISPINTERFACE_DEFINED__
#define __DispHTMLSpanElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLSpanElement, 0x3050f548, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f548-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLSpanElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLSpanElement, 0x3050f548, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLSpanElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLSpanElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLSpanElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLSpanElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLSpanElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLSpanElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLSpanElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLSpanElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLSpanElementVtbl;
interface DispHTMLSpanElement {
    CONST_VTBL DispHTMLSpanElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLSpanElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLSpanElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLSpanElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLSpanElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLSpanElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLSpanElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLSpanElement_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 DispHTMLSpanElement_QueryInterface(DispHTMLSpanElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLSpanElement_AddRef(DispHTMLSpanElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLSpanElement_Release(DispHTMLSpanElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLSpanElement_GetTypeInfoCount(DispHTMLSpanElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLSpanElement_GetTypeInfo(DispHTMLSpanElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLSpanElement_GetIDsOfNames(DispHTMLSpanElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLSpanElement_Invoke(DispHTMLSpanElement* 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  /* __DispHTMLSpanElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLSpanElement coclass
 */

DEFINE_GUID(CLSID_HTMLSpanElement, 0x3050f3f5, 0x98b4, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f3f5-98b4-11cf-bb82-00aa00bdce0b") HTMLSpanElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLSpanElement, 0x3050f3f5, 0x98b4, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSpanElement;
/*****************************************************************************
 * HTMLTableEvents2 dispinterface
 */
#ifndef __HTMLTableEvents2_DISPINTERFACE_DEFINED__
#define __HTMLTableEvents2_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLTableEvents2, 0x3050f623, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f623-98b5-11cf-bb82-00aa00bdce0b")
HTMLTableEvents2 : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLTableEvents2, 0x3050f623, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLTableEvents2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLTableEvents2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLTableEvents2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLTableEvents2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLTableEvents2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLTableEvents2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLTableEvents2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLTableEvents2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLTableEvents2Vtbl;
interface HTMLTableEvents2 {
    CONST_VTBL HTMLTableEvents2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLTableEvents2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLTableEvents2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLTableEvents2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLTableEvents2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLTableEvents2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLTableEvents2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLTableEvents2_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 HTMLTableEvents2_QueryInterface(HTMLTableEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLTableEvents2_AddRef(HTMLTableEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLTableEvents2_Release(HTMLTableEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLTableEvents2_GetTypeInfoCount(HTMLTableEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLTableEvents2_GetTypeInfo(HTMLTableEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLTableEvents2_GetIDsOfNames(HTMLTableEvents2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLTableEvents2_Invoke(HTMLTableEvents2* 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  /* __HTMLTableEvents2_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLTableEvents dispinterface
 */
#ifndef __HTMLTableEvents_DISPINTERFACE_DEFINED__
#define __HTMLTableEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLTableEvents, 0x3050f407, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f407-98b5-11cf-bb82-00aa00bdce0b")
HTMLTableEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLTableEvents, 0x3050f407, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLTableEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLTableEvents* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLTableEvents* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLTableEvents* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLTableEvents* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLTableEvents* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLTableEvents* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLTableEvents* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLTableEventsVtbl;
interface HTMLTableEvents {
    CONST_VTBL HTMLTableEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLTableEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLTableEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLTableEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLTableEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLTableEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLTableEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLTableEvents_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 HTMLTableEvents_QueryInterface(HTMLTableEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLTableEvents_AddRef(HTMLTableEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLTableEvents_Release(HTMLTableEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLTableEvents_GetTypeInfoCount(HTMLTableEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLTableEvents_GetTypeInfo(HTMLTableEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLTableEvents_GetIDsOfNames(HTMLTableEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLTableEvents_Invoke(HTMLTableEvents* 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  /* __HTMLTableEvents_DISPINTERFACE_DEFINED__ */

typedef enum _htmlFrame {
    htmlFrameNotSet = 0,
    htmlFramevoid = 1,
    htmlFrameabove = 2,
    htmlFramebelow = 3,
    htmlFramehsides = 4,
    htmlFramelhs = 5,
    htmlFramerhs = 6,
    htmlFramevsides = 7,
    htmlFramebox = 8,
    htmlFrameborder = 9,
    htmlFrame_Max = 0x7fffffff
} htmlFrame;
typedef enum _htmlRules {
    htmlRulesNotSet = 0,
    htmlRulesnone = 1,
    htmlRulesgroups = 2,
    htmlRulesrows = 3,
    htmlRulescols = 4,
    htmlRulesall = 5,
    htmlRules_Max = 0x7fffffff
} htmlRules;
typedef enum _htmlCellAlign {
    htmlCellAlignNotSet = 0,
    htmlCellAlignLeft = 1,
    htmlCellAlignCenter = 2,
    htmlCellAlignRight = 3,
    htmlCellAlignMiddle = htmlCellAlignCenter,
    htmlCellAlign_Max = 0x7fffffff
} htmlCellAlign;
typedef enum _htmlCellVAlign {
    htmlCellVAlignNotSet = 0,
    htmlCellVAlignTop = 1,
    htmlCellVAlignMiddle = 2,
    htmlCellVAlignBottom = 3,
    htmlCellVAlignBaseline = 4,
    htmlCellVAlignCenter = htmlCellVAlignMiddle,
    htmlCellVAlign_Max = 0x7fffffff
} htmlCellVAlign;
#ifndef __IHTMLTableSection_FWD_DEFINED__
#define __IHTMLTableSection_FWD_DEFINED__
typedef interface IHTMLTableSection IHTMLTableSection;
#endif

/*****************************************************************************
 * IHTMLTable interface
 */
#ifndef __IHTMLTable_INTERFACE_DEFINED__
#define __IHTMLTable_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTable, 0x3050f21e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f21e-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTable : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_cols(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cols(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_border(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_border(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_frame(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_frame(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_rules(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_rules(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_cellSpacing(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cellSpacing(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_cellPadding(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cellPadding(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_background(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_background(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_bgColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_bgColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderColorLight(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderColorLight(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderColorDark(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderColorDark(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_align(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_align(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE refresh(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_rows(
        IHTMLElementCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_width(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_width(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_height(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_height(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_dataPageSize(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_dataPageSize(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE nextPage(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE previousPage(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_tHead(
        IHTMLTableSection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_tFoot(
        IHTMLTableSection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_tBodies(
        IHTMLElementCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_caption(
        IHTMLTableCaption **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE createTHead(
        IDispatch **head) = 0;

    virtual HRESULT STDMETHODCALLTYPE deleteTHead(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE createTFoot(
        IDispatch **foot) = 0;

    virtual HRESULT STDMETHODCALLTYPE deleteTFoot(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE createCaption(
        IHTMLTableCaption **caption) = 0;

    virtual HRESULT STDMETHODCALLTYPE deleteCaption(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE insertRow(
        LONG index = -1,
        IDispatch **row = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE deleteRow(
        LONG index = -1) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_readyState(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onreadystatechange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onreadystatechange(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTable, 0x3050f21e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTableVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTable* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTable* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTable* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTable* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTable* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTable* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTable* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLTable methods ***/
    HRESULT (STDMETHODCALLTYPE *put_cols)(
        IHTMLTable* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_cols)(
        IHTMLTable* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_border)(
        IHTMLTable* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_border)(
        IHTMLTable* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_frame)(
        IHTMLTable* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_frame)(
        IHTMLTable* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_rules)(
        IHTMLTable* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_rules)(
        IHTMLTable* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_cellSpacing)(
        IHTMLTable* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_cellSpacing)(
        IHTMLTable* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_cellPadding)(
        IHTMLTable* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_cellPadding)(
        IHTMLTable* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_background)(
        IHTMLTable* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_background)(
        IHTMLTable* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_bgColor)(
        IHTMLTable* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_bgColor)(
        IHTMLTable* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderColor)(
        IHTMLTable* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderColor)(
        IHTMLTable* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderColorLight)(
        IHTMLTable* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderColorLight)(
        IHTMLTable* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderColorDark)(
        IHTMLTable* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderColorDark)(
        IHTMLTable* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_align)(
        IHTMLTable* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_align)(
        IHTMLTable* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *refresh)(
        IHTMLTable* This);

    HRESULT (STDMETHODCALLTYPE *get_rows)(
        IHTMLTable* This,
        IHTMLElementCollection **p);

    HRESULT (STDMETHODCALLTYPE *put_width)(
        IHTMLTable* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_width)(
        IHTMLTable* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_height)(
        IHTMLTable* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_height)(
        IHTMLTable* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_dataPageSize)(
        IHTMLTable* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_dataPageSize)(
        IHTMLTable* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *nextPage)(
        IHTMLTable* This);

    HRESULT (STDMETHODCALLTYPE *previousPage)(
        IHTMLTable* This);

    HRESULT (STDMETHODCALLTYPE *get_tHead)(
        IHTMLTable* This,
        IHTMLTableSection **p);

    HRESULT (STDMETHODCALLTYPE *get_tFoot)(
        IHTMLTable* This,
        IHTMLTableSection **p);

    HRESULT (STDMETHODCALLTYPE *get_tBodies)(
        IHTMLTable* This,
        IHTMLElementCollection **p);

    HRESULT (STDMETHODCALLTYPE *get_caption)(
        IHTMLTable* This,
        IHTMLTableCaption **p);

    HRESULT (STDMETHODCALLTYPE *createTHead)(
        IHTMLTable* This,
        IDispatch **head);

    HRESULT (STDMETHODCALLTYPE *deleteTHead)(
        IHTMLTable* This);

    HRESULT (STDMETHODCALLTYPE *createTFoot)(
        IHTMLTable* This,
        IDispatch **foot);

    HRESULT (STDMETHODCALLTYPE *deleteTFoot)(
        IHTMLTable* This);

    HRESULT (STDMETHODCALLTYPE *createCaption)(
        IHTMLTable* This,
        IHTMLTableCaption **caption);

    HRESULT (STDMETHODCALLTYPE *deleteCaption)(
        IHTMLTable* This);

    HRESULT (STDMETHODCALLTYPE *insertRow)(
        IHTMLTable* This,
        LONG index,
        IDispatch **row);

    HRESULT (STDMETHODCALLTYPE *deleteRow)(
        IHTMLTable* This,
        LONG index);

    HRESULT (STDMETHODCALLTYPE *get_readyState)(
        IHTMLTable* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_onreadystatechange)(
        IHTMLTable* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onreadystatechange)(
        IHTMLTable* This,
        VARIANT *p);

    END_INTERFACE
} IHTMLTableVtbl;
interface IHTMLTable {
    CONST_VTBL IHTMLTableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTable_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTable_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTable_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTable_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTable_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLTable methods ***/
#define IHTMLTable_put_cols(This,v) (This)->lpVtbl->put_cols(This,v)
#define IHTMLTable_get_cols(This,p) (This)->lpVtbl->get_cols(This,p)
#define IHTMLTable_put_border(This,v) (This)->lpVtbl->put_border(This,v)
#define IHTMLTable_get_border(This,p) (This)->lpVtbl->get_border(This,p)
#define IHTMLTable_put_frame(This,v) (This)->lpVtbl->put_frame(This,v)
#define IHTMLTable_get_frame(This,p) (This)->lpVtbl->get_frame(This,p)
#define IHTMLTable_put_rules(This,v) (This)->lpVtbl->put_rules(This,v)
#define IHTMLTable_get_rules(This,p) (This)->lpVtbl->get_rules(This,p)
#define IHTMLTable_put_cellSpacing(This,v) (This)->lpVtbl->put_cellSpacing(This,v)
#define IHTMLTable_get_cellSpacing(This,p) (This)->lpVtbl->get_cellSpacing(This,p)
#define IHTMLTable_put_cellPadding(This,v) (This)->lpVtbl->put_cellPadding(This,v)
#define IHTMLTable_get_cellPadding(This,p) (This)->lpVtbl->get_cellPadding(This,p)
#define IHTMLTable_put_background(This,v) (This)->lpVtbl->put_background(This,v)
#define IHTMLTable_get_background(This,p) (This)->lpVtbl->get_background(This,p)
#define IHTMLTable_put_bgColor(This,v) (This)->lpVtbl->put_bgColor(This,v)
#define IHTMLTable_get_bgColor(This,p) (This)->lpVtbl->get_bgColor(This,p)
#define IHTMLTable_put_borderColor(This,v) (This)->lpVtbl->put_borderColor(This,v)
#define IHTMLTable_get_borderColor(This,p) (This)->lpVtbl->get_borderColor(This,p)
#define IHTMLTable_put_borderColorLight(This,v) (This)->lpVtbl->put_borderColorLight(This,v)
#define IHTMLTable_get_borderColorLight(This,p) (This)->lpVtbl->get_borderColorLight(This,p)
#define IHTMLTable_put_borderColorDark(This,v) (This)->lpVtbl->put_borderColorDark(This,v)
#define IHTMLTable_get_borderColorDark(This,p) (This)->lpVtbl->get_borderColorDark(This,p)
#define IHTMLTable_put_align(This,v) (This)->lpVtbl->put_align(This,v)
#define IHTMLTable_get_align(This,p) (This)->lpVtbl->get_align(This,p)
#define IHTMLTable_refresh(This) (This)->lpVtbl->refresh(This)
#define IHTMLTable_get_rows(This,p) (This)->lpVtbl->get_rows(This,p)
#define IHTMLTable_put_width(This,v) (This)->lpVtbl->put_width(This,v)
#define IHTMLTable_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#define IHTMLTable_put_height(This,v) (This)->lpVtbl->put_height(This,v)
#define IHTMLTable_get_height(This,p) (This)->lpVtbl->get_height(This,p)
#define IHTMLTable_put_dataPageSize(This,v) (This)->lpVtbl->put_dataPageSize(This,v)
#define IHTMLTable_get_dataPageSize(This,p) (This)->lpVtbl->get_dataPageSize(This,p)
#define IHTMLTable_nextPage(This) (This)->lpVtbl->nextPage(This)
#define IHTMLTable_previousPage(This) (This)->lpVtbl->previousPage(This)
#define IHTMLTable_get_tHead(This,p) (This)->lpVtbl->get_tHead(This,p)
#define IHTMLTable_get_tFoot(This,p) (This)->lpVtbl->get_tFoot(This,p)
#define IHTMLTable_get_tBodies(This,p) (This)->lpVtbl->get_tBodies(This,p)
#define IHTMLTable_get_caption(This,p) (This)->lpVtbl->get_caption(This,p)
#define IHTMLTable_createTHead(This,head) (This)->lpVtbl->createTHead(This,head)
#define IHTMLTable_deleteTHead(This) (This)->lpVtbl->deleteTHead(This)
#define IHTMLTable_createTFoot(This,foot) (This)->lpVtbl->createTFoot(This,foot)
#define IHTMLTable_deleteTFoot(This) (This)->lpVtbl->deleteTFoot(This)
#define IHTMLTable_createCaption(This,caption) (This)->lpVtbl->createCaption(This,caption)
#define IHTMLTable_deleteCaption(This) (This)->lpVtbl->deleteCaption(This)
#define IHTMLTable_insertRow(This,index,row) (This)->lpVtbl->insertRow(This,index,row)
#define IHTMLTable_deleteRow(This,index) (This)->lpVtbl->deleteRow(This,index)
#define IHTMLTable_get_readyState(This,p) (This)->lpVtbl->get_readyState(This,p)
#define IHTMLTable_put_onreadystatechange(This,v) (This)->lpVtbl->put_onreadystatechange(This,v)
#define IHTMLTable_get_onreadystatechange(This,p) (This)->lpVtbl->get_onreadystatechange(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLTable_QueryInterface(IHTMLTable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTable_AddRef(IHTMLTable* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTable_Release(IHTMLTable* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTable_GetTypeInfoCount(IHTMLTable* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTable_GetTypeInfo(IHTMLTable* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTable_GetIDsOfNames(IHTMLTable* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTable_Invoke(IHTMLTable* 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);
}
/*** IHTMLTable methods ***/
static FORCEINLINE HRESULT IHTMLTable_put_cols(IHTMLTable* This,LONG v) {
    return This->lpVtbl->put_cols(This,v);
}
static FORCEINLINE HRESULT IHTMLTable_get_cols(IHTMLTable* This,LONG *p) {
    return This->lpVtbl->get_cols(This,p);
}
static FORCEINLINE HRESULT IHTMLTable_put_border(IHTMLTable* This,VARIANT v) {
    return This->lpVtbl->put_border(This,v);
}
static FORCEINLINE HRESULT IHTMLTable_get_border(IHTMLTable* This,VARIANT *p) {
    return This->lpVtbl->get_border(This,p);
}
static FORCEINLINE HRESULT IHTMLTable_put_frame(IHTMLTable* This,BSTR v) {
    return This->lpVtbl->put_frame(This,v);
}
static FORCEINLINE HRESULT IHTMLTable_get_frame(IHTMLTable* This,BSTR *p) {
    return This->lpVtbl->get_frame(This,p);
}
static FORCEINLINE HRESULT IHTMLTable_put_rules(IHTMLTable* This,BSTR v) {
    return This->lpVtbl->put_rules(This,v);
}
static FORCEINLINE HRESULT IHTMLTable_get_rules(IHTMLTable* This,BSTR *p) {
    return This->lpVtbl->get_rules(This,p);
}
static FORCEINLINE HRESULT IHTMLTable_put_cellSpacing(IHTMLTable* This,VARIANT v) {
    return This->lpVtbl->put_cellSpacing(This,v);
}
static FORCEINLINE HRESULT IHTMLTable_get_cellSpacing(IHTMLTable* This,VARIANT *p) {
    return This->lpVtbl->get_cellSpacing(This,p);
}
static FORCEINLINE HRESULT IHTMLTable_put_cellPadding(IHTMLTable* This,VARIANT v) {
    return This->lpVtbl->put_cellPadding(This,v);
}
static FORCEINLINE HRESULT IHTMLTable_get_cellPadding(IHTMLTable* This,VARIANT *p) {
    return This->lpVtbl->get_cellPadding(This,p);
}
static FORCEINLINE HRESULT IHTMLTable_put_background(IHTMLTable* This,BSTR v) {
    return This->lpVtbl->put_background(This,v);
}
static FORCEINLINE HRESULT IHTMLTable_get_background(IHTMLTable* This,BSTR *p) {
    return This->lpVtbl->get_background(This,p);
}
static FORCEINLINE HRESULT IHTMLTable_put_bgColor(IHTMLTable* This,VARIANT v) {
    return This->lpVtbl->put_bgColor(This,v);
}
static FORCEINLINE HRESULT IHTMLTable_get_bgColor(IHTMLTable* This,VARIANT *p) {
    return This->lpVtbl->get_bgColor(This,p);
}
static FORCEINLINE HRESULT IHTMLTable_put_borderColor(IHTMLTable* This,VARIANT v) {
    return This->lpVtbl->put_borderColor(This,v);
}
static FORCEINLINE HRESULT IHTMLTable_get_borderColor(IHTMLTable* This,VARIANT *p) {
    return This->lpVtbl->get_borderColor(This,p);
}
static FORCEINLINE HRESULT IHTMLTable_put_borderColorLight(IHTMLTable* This,VARIANT v) {
    return This->lpVtbl->put_borderColorLight(This,v);
}
static FORCEINLINE HRESULT IHTMLTable_get_borderColorLight(IHTMLTable* This,VARIANT *p) {
    return This->lpVtbl->get_borderColorLight(This,p);
}
static FORCEINLINE HRESULT IHTMLTable_put_borderColorDark(IHTMLTable* This,VARIANT v) {
    return This->lpVtbl->put_borderColorDark(This,v);
}
static FORCEINLINE HRESULT IHTMLTable_get_borderColorDark(IHTMLTable* This,VARIANT *p) {
    return This->lpVtbl->get_borderColorDark(This,p);
}
static FORCEINLINE HRESULT IHTMLTable_put_align(IHTMLTable* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static FORCEINLINE HRESULT IHTMLTable_get_align(IHTMLTable* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
static FORCEINLINE HRESULT IHTMLTable_refresh(IHTMLTable* This) {
    return This->lpVtbl->refresh(This);
}
static FORCEINLINE HRESULT IHTMLTable_get_rows(IHTMLTable* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_rows(This,p);
}
static FORCEINLINE HRESULT IHTMLTable_put_width(IHTMLTable* This,VARIANT v) {
    return This->lpVtbl->put_width(This,v);
}
static FORCEINLINE HRESULT IHTMLTable_get_width(IHTMLTable* This,VARIANT *p) {
    return This->lpVtbl->get_width(This,p);
}
static FORCEINLINE HRESULT IHTMLTable_put_height(IHTMLTable* This,VARIANT v) {
    return This->lpVtbl->put_height(This,v);
}
static FORCEINLINE HRESULT IHTMLTable_get_height(IHTMLTable* This,VARIANT *p) {
    return This->lpVtbl->get_height(This,p);
}
static FORCEINLINE HRESULT IHTMLTable_put_dataPageSize(IHTMLTable* This,LONG v) {
    return This->lpVtbl->put_dataPageSize(This,v);
}
static FORCEINLINE HRESULT IHTMLTable_get_dataPageSize(IHTMLTable* This,LONG *p) {
    return This->lpVtbl->get_dataPageSize(This,p);
}
static FORCEINLINE HRESULT IHTMLTable_nextPage(IHTMLTable* This) {
    return This->lpVtbl->nextPage(This);
}
static FORCEINLINE HRESULT IHTMLTable_previousPage(IHTMLTable* This) {
    return This->lpVtbl->previousPage(This);
}
static FORCEINLINE HRESULT IHTMLTable_get_tHead(IHTMLTable* This,IHTMLTableSection **p) {
    return This->lpVtbl->get_tHead(This,p);
}
static FORCEINLINE HRESULT IHTMLTable_get_tFoot(IHTMLTable* This,IHTMLTableSection **p) {
    return This->lpVtbl->get_tFoot(This,p);
}
static FORCEINLINE HRESULT IHTMLTable_get_tBodies(IHTMLTable* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_tBodies(This,p);
}
static FORCEINLINE HRESULT IHTMLTable_get_caption(IHTMLTable* This,IHTMLTableCaption **p) {
    return This->lpVtbl->get_caption(This,p);
}
static FORCEINLINE HRESULT IHTMLTable_createTHead(IHTMLTable* This,IDispatch **head) {
    return This->lpVtbl->createTHead(This,head);
}
static FORCEINLINE HRESULT IHTMLTable_deleteTHead(IHTMLTable* This) {
    return This->lpVtbl->deleteTHead(This);
}
static FORCEINLINE HRESULT IHTMLTable_createTFoot(IHTMLTable* This,IDispatch **foot) {
    return This->lpVtbl->createTFoot(This,foot);
}
static FORCEINLINE HRESULT IHTMLTable_deleteTFoot(IHTMLTable* This) {
    return This->lpVtbl->deleteTFoot(This);
}
static FORCEINLINE HRESULT IHTMLTable_createCaption(IHTMLTable* This,IHTMLTableCaption **caption) {
    return This->lpVtbl->createCaption(This,caption);
}
static FORCEINLINE HRESULT IHTMLTable_deleteCaption(IHTMLTable* This) {
    return This->lpVtbl->deleteCaption(This);
}
static FORCEINLINE HRESULT IHTMLTable_insertRow(IHTMLTable* This,LONG index,IDispatch **row) {
    return This->lpVtbl->insertRow(This,index,row);
}
static FORCEINLINE HRESULT IHTMLTable_deleteRow(IHTMLTable* This,LONG index) {
    return This->lpVtbl->deleteRow(This,index);
}
static FORCEINLINE HRESULT IHTMLTable_get_readyState(IHTMLTable* This,BSTR *p) {
    return This->lpVtbl->get_readyState(This,p);
}
static FORCEINLINE HRESULT IHTMLTable_put_onreadystatechange(IHTMLTable* This,VARIANT v) {
    return This->lpVtbl->put_onreadystatechange(This,v);
}
static FORCEINLINE HRESULT IHTMLTable_get_onreadystatechange(IHTMLTable* This,VARIANT *p) {
    return This->lpVtbl->get_onreadystatechange(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLTable_put_cols_Proxy(
    IHTMLTable* This,
    LONG v);
void __RPC_STUB IHTMLTable_put_cols_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_get_cols_Proxy(
    IHTMLTable* This,
    LONG *p);
void __RPC_STUB IHTMLTable_get_cols_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_put_border_Proxy(
    IHTMLTable* This,
    VARIANT v);
void __RPC_STUB IHTMLTable_put_border_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_get_border_Proxy(
    IHTMLTable* This,
    VARIANT *p);
void __RPC_STUB IHTMLTable_get_border_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_put_frame_Proxy(
    IHTMLTable* This,
    BSTR v);
void __RPC_STUB IHTMLTable_put_frame_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_get_frame_Proxy(
    IHTMLTable* This,
    BSTR *p);
void __RPC_STUB IHTMLTable_get_frame_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_put_rules_Proxy(
    IHTMLTable* This,
    BSTR v);
void __RPC_STUB IHTMLTable_put_rules_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_get_rules_Proxy(
    IHTMLTable* This,
    BSTR *p);
void __RPC_STUB IHTMLTable_get_rules_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_put_cellSpacing_Proxy(
    IHTMLTable* This,
    VARIANT v);
void __RPC_STUB IHTMLTable_put_cellSpacing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_get_cellSpacing_Proxy(
    IHTMLTable* This,
    VARIANT *p);
void __RPC_STUB IHTMLTable_get_cellSpacing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_put_cellPadding_Proxy(
    IHTMLTable* This,
    VARIANT v);
void __RPC_STUB IHTMLTable_put_cellPadding_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_get_cellPadding_Proxy(
    IHTMLTable* This,
    VARIANT *p);
void __RPC_STUB IHTMLTable_get_cellPadding_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_put_background_Proxy(
    IHTMLTable* This,
    BSTR v);
void __RPC_STUB IHTMLTable_put_background_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_get_background_Proxy(
    IHTMLTable* This,
    BSTR *p);
void __RPC_STUB IHTMLTable_get_background_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_put_bgColor_Proxy(
    IHTMLTable* This,
    VARIANT v);
void __RPC_STUB IHTMLTable_put_bgColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_get_bgColor_Proxy(
    IHTMLTable* This,
    VARIANT *p);
void __RPC_STUB IHTMLTable_get_bgColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_put_borderColor_Proxy(
    IHTMLTable* This,
    VARIANT v);
void __RPC_STUB IHTMLTable_put_borderColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_get_borderColor_Proxy(
    IHTMLTable* This,
    VARIANT *p);
void __RPC_STUB IHTMLTable_get_borderColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_put_borderColorLight_Proxy(
    IHTMLTable* This,
    VARIANT v);
void __RPC_STUB IHTMLTable_put_borderColorLight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_get_borderColorLight_Proxy(
    IHTMLTable* This,
    VARIANT *p);
void __RPC_STUB IHTMLTable_get_borderColorLight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_put_borderColorDark_Proxy(
    IHTMLTable* This,
    VARIANT v);
void __RPC_STUB IHTMLTable_put_borderColorDark_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_get_borderColorDark_Proxy(
    IHTMLTable* This,
    VARIANT *p);
void __RPC_STUB IHTMLTable_get_borderColorDark_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_put_align_Proxy(
    IHTMLTable* This,
    BSTR v);
void __RPC_STUB IHTMLTable_put_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_get_align_Proxy(
    IHTMLTable* This,
    BSTR *p);
void __RPC_STUB IHTMLTable_get_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_refresh_Proxy(
    IHTMLTable* This);
void __RPC_STUB IHTMLTable_refresh_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_get_rows_Proxy(
    IHTMLTable* This,
    IHTMLElementCollection **p);
void __RPC_STUB IHTMLTable_get_rows_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_put_width_Proxy(
    IHTMLTable* This,
    VARIANT v);
void __RPC_STUB IHTMLTable_put_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_get_width_Proxy(
    IHTMLTable* This,
    VARIANT *p);
void __RPC_STUB IHTMLTable_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_put_height_Proxy(
    IHTMLTable* This,
    VARIANT v);
void __RPC_STUB IHTMLTable_put_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_get_height_Proxy(
    IHTMLTable* This,
    VARIANT *p);
void __RPC_STUB IHTMLTable_get_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_put_dataPageSize_Proxy(
    IHTMLTable* This,
    LONG v);
void __RPC_STUB IHTMLTable_put_dataPageSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_get_dataPageSize_Proxy(
    IHTMLTable* This,
    LONG *p);
void __RPC_STUB IHTMLTable_get_dataPageSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_nextPage_Proxy(
    IHTMLTable* This);
void __RPC_STUB IHTMLTable_nextPage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_previousPage_Proxy(
    IHTMLTable* This);
void __RPC_STUB IHTMLTable_previousPage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_get_tHead_Proxy(
    IHTMLTable* This,
    IHTMLTableSection **p);
void __RPC_STUB IHTMLTable_get_tHead_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_get_tFoot_Proxy(
    IHTMLTable* This,
    IHTMLTableSection **p);
void __RPC_STUB IHTMLTable_get_tFoot_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_get_tBodies_Proxy(
    IHTMLTable* This,
    IHTMLElementCollection **p);
void __RPC_STUB IHTMLTable_get_tBodies_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_get_caption_Proxy(
    IHTMLTable* This,
    IHTMLTableCaption **p);
void __RPC_STUB IHTMLTable_get_caption_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_createTHead_Proxy(
    IHTMLTable* This,
    IDispatch **head);
void __RPC_STUB IHTMLTable_createTHead_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_deleteTHead_Proxy(
    IHTMLTable* This);
void __RPC_STUB IHTMLTable_deleteTHead_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_createTFoot_Proxy(
    IHTMLTable* This,
    IDispatch **foot);
void __RPC_STUB IHTMLTable_createTFoot_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_deleteTFoot_Proxy(
    IHTMLTable* This);
void __RPC_STUB IHTMLTable_deleteTFoot_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_createCaption_Proxy(
    IHTMLTable* This,
    IHTMLTableCaption **caption);
void __RPC_STUB IHTMLTable_createCaption_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_deleteCaption_Proxy(
    IHTMLTable* This);
void __RPC_STUB IHTMLTable_deleteCaption_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_insertRow_Proxy(
    IHTMLTable* This,
    LONG index,
    IDispatch **row);
void __RPC_STUB IHTMLTable_insertRow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_deleteRow_Proxy(
    IHTMLTable* This,
    LONG index);
void __RPC_STUB IHTMLTable_deleteRow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_get_readyState_Proxy(
    IHTMLTable* This,
    BSTR *p);
void __RPC_STUB IHTMLTable_get_readyState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_put_onreadystatechange_Proxy(
    IHTMLTable* This,
    VARIANT v);
void __RPC_STUB IHTMLTable_put_onreadystatechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable_get_onreadystatechange_Proxy(
    IHTMLTable* This,
    VARIANT *p);
void __RPC_STUB IHTMLTable_get_onreadystatechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLTable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLTable2 interface
 */
#ifndef __IHTMLTable2_INTERFACE_DEFINED__
#define __IHTMLTable2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTable2, 0x3050f4ad, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f4ad-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTable2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE firstPage(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE lastPage(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cells(
        IHTMLElementCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE moveRow(
        LONG indexFrom = -1,
        LONG indexTo = -1,
        IDispatch **row = 0) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTable2, 0x3050f4ad, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTable2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTable2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTable2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTable2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTable2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTable2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTable2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTable2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLTable2 methods ***/
    HRESULT (STDMETHODCALLTYPE *firstPage)(
        IHTMLTable2* This);

    HRESULT (STDMETHODCALLTYPE *lastPage)(
        IHTMLTable2* This);

    HRESULT (STDMETHODCALLTYPE *get_cells)(
        IHTMLTable2* This,
        IHTMLElementCollection **p);

    HRESULT (STDMETHODCALLTYPE *moveRow)(
        IHTMLTable2* This,
        LONG indexFrom,
        LONG indexTo,
        IDispatch **row);

    END_INTERFACE
} IHTMLTable2Vtbl;
interface IHTMLTable2 {
    CONST_VTBL IHTMLTable2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTable2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTable2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTable2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTable2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTable2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTable2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTable2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLTable2 methods ***/
#define IHTMLTable2_firstPage(This) (This)->lpVtbl->firstPage(This)
#define IHTMLTable2_lastPage(This) (This)->lpVtbl->lastPage(This)
#define IHTMLTable2_get_cells(This,p) (This)->lpVtbl->get_cells(This,p)
#define IHTMLTable2_moveRow(This,indexFrom,indexTo,row) (This)->lpVtbl->moveRow(This,indexFrom,indexTo,row)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLTable2_QueryInterface(IHTMLTable2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTable2_AddRef(IHTMLTable2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTable2_Release(IHTMLTable2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTable2_GetTypeInfoCount(IHTMLTable2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTable2_GetTypeInfo(IHTMLTable2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTable2_GetIDsOfNames(IHTMLTable2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTable2_Invoke(IHTMLTable2* 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);
}
/*** IHTMLTable2 methods ***/
static FORCEINLINE HRESULT IHTMLTable2_firstPage(IHTMLTable2* This) {
    return This->lpVtbl->firstPage(This);
}
static FORCEINLINE HRESULT IHTMLTable2_lastPage(IHTMLTable2* This) {
    return This->lpVtbl->lastPage(This);
}
static FORCEINLINE HRESULT IHTMLTable2_get_cells(IHTMLTable2* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_cells(This,p);
}
static FORCEINLINE HRESULT IHTMLTable2_moveRow(IHTMLTable2* This,LONG indexFrom,LONG indexTo,IDispatch **row) {
    return This->lpVtbl->moveRow(This,indexFrom,indexTo,row);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLTable2_firstPage_Proxy(
    IHTMLTable2* This);
void __RPC_STUB IHTMLTable2_firstPage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable2_lastPage_Proxy(
    IHTMLTable2* This);
void __RPC_STUB IHTMLTable2_lastPage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable2_get_cells_Proxy(
    IHTMLTable2* This,
    IHTMLElementCollection **p);
void __RPC_STUB IHTMLTable2_get_cells_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable2_moveRow_Proxy(
    IHTMLTable2* This,
    LONG indexFrom,
    LONG indexTo,
    IDispatch **row);
void __RPC_STUB IHTMLTable2_moveRow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLTable2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLTable3 interface
 */
#ifndef __IHTMLTable3_INTERFACE_DEFINED__
#define __IHTMLTable3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTable3, 0x3050f829, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f829-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTable3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_summary(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_summary(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTable3, 0x3050f829, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTable3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTable3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTable3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTable3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTable3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTable3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTable3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTable3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLTable3 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_summary)(
        IHTMLTable3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_summary)(
        IHTMLTable3* This,
        BSTR *p);

    END_INTERFACE
} IHTMLTable3Vtbl;
interface IHTMLTable3 {
    CONST_VTBL IHTMLTable3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTable3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTable3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTable3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTable3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTable3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTable3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTable3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLTable3 methods ***/
#define IHTMLTable3_put_summary(This,v) (This)->lpVtbl->put_summary(This,v)
#define IHTMLTable3_get_summary(This,p) (This)->lpVtbl->get_summary(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLTable3_QueryInterface(IHTMLTable3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTable3_AddRef(IHTMLTable3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTable3_Release(IHTMLTable3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTable3_GetTypeInfoCount(IHTMLTable3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTable3_GetTypeInfo(IHTMLTable3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTable3_GetIDsOfNames(IHTMLTable3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTable3_Invoke(IHTMLTable3* 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);
}
/*** IHTMLTable3 methods ***/
static FORCEINLINE HRESULT IHTMLTable3_put_summary(IHTMLTable3* This,BSTR v) {
    return This->lpVtbl->put_summary(This,v);
}
static FORCEINLINE HRESULT IHTMLTable3_get_summary(IHTMLTable3* This,BSTR *p) {
    return This->lpVtbl->get_summary(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLTable3_put_summary_Proxy(
    IHTMLTable3* This,
    BSTR v);
void __RPC_STUB IHTMLTable3_put_summary_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable3_get_summary_Proxy(
    IHTMLTable3* This,
    BSTR *p);
void __RPC_STUB IHTMLTable3_get_summary_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLTable3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLTable4 interface
 */
#ifndef __IHTMLTable4_INTERFACE_DEFINED__
#define __IHTMLTable4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTable4, 0x305106c2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106c2-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTable4 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_tHead(
        IHTMLTableSection *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_tHead(
        IHTMLTableSection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_tFoot(
        IHTMLTableSection *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_tFoot(
        IHTMLTableSection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_caption(
        IHTMLTableCaption *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_caption(
        IHTMLTableCaption **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE insertRow(
        LONG index = -1,
        IDispatch **row = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE deleteRow(
        LONG index = -1) = 0;

    virtual HRESULT STDMETHODCALLTYPE createTBody(
        IHTMLTableSection **tbody) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTable4, 0x305106c2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTable4Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTable4* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTable4* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTable4* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTable4* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTable4* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTable4* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTable4* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLTable4 methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_tHead)(
        IHTMLTable4* This,
        IHTMLTableSection *v);

    HRESULT (STDMETHODCALLTYPE *get_tHead)(
        IHTMLTable4* This,
        IHTMLTableSection **p);

    HRESULT (STDMETHODCALLTYPE *putref_tFoot)(
        IHTMLTable4* This,
        IHTMLTableSection *v);

    HRESULT (STDMETHODCALLTYPE *get_tFoot)(
        IHTMLTable4* This,
        IHTMLTableSection **p);

    HRESULT (STDMETHODCALLTYPE *putref_caption)(
        IHTMLTable4* This,
        IHTMLTableCaption *v);

    HRESULT (STDMETHODCALLTYPE *get_caption)(
        IHTMLTable4* This,
        IHTMLTableCaption **p);

    HRESULT (STDMETHODCALLTYPE *insertRow)(
        IHTMLTable4* This,
        LONG index,
        IDispatch **row);

    HRESULT (STDMETHODCALLTYPE *deleteRow)(
        IHTMLTable4* This,
        LONG index);

    HRESULT (STDMETHODCALLTYPE *createTBody)(
        IHTMLTable4* This,
        IHTMLTableSection **tbody);

    END_INTERFACE
} IHTMLTable4Vtbl;
interface IHTMLTable4 {
    CONST_VTBL IHTMLTable4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTable4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTable4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTable4_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTable4_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTable4_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTable4_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTable4_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLTable4 methods ***/
#define IHTMLTable4_putref_tHead(This,v) (This)->lpVtbl->putref_tHead(This,v)
#define IHTMLTable4_get_tHead(This,p) (This)->lpVtbl->get_tHead(This,p)
#define IHTMLTable4_putref_tFoot(This,v) (This)->lpVtbl->putref_tFoot(This,v)
#define IHTMLTable4_get_tFoot(This,p) (This)->lpVtbl->get_tFoot(This,p)
#define IHTMLTable4_putref_caption(This,v) (This)->lpVtbl->putref_caption(This,v)
#define IHTMLTable4_get_caption(This,p) (This)->lpVtbl->get_caption(This,p)
#define IHTMLTable4_insertRow(This,index,row) (This)->lpVtbl->insertRow(This,index,row)
#define IHTMLTable4_deleteRow(This,index) (This)->lpVtbl->deleteRow(This,index)
#define IHTMLTable4_createTBody(This,tbody) (This)->lpVtbl->createTBody(This,tbody)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLTable4_QueryInterface(IHTMLTable4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTable4_AddRef(IHTMLTable4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTable4_Release(IHTMLTable4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTable4_GetTypeInfoCount(IHTMLTable4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTable4_GetTypeInfo(IHTMLTable4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTable4_GetIDsOfNames(IHTMLTable4* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTable4_Invoke(IHTMLTable4* 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);
}
/*** IHTMLTable4 methods ***/
static FORCEINLINE HRESULT IHTMLTable4_putref_tHead(IHTMLTable4* This,IHTMLTableSection *v) {
    return This->lpVtbl->putref_tHead(This,v);
}
static FORCEINLINE HRESULT IHTMLTable4_get_tHead(IHTMLTable4* This,IHTMLTableSection **p) {
    return This->lpVtbl->get_tHead(This,p);
}
static FORCEINLINE HRESULT IHTMLTable4_putref_tFoot(IHTMLTable4* This,IHTMLTableSection *v) {
    return This->lpVtbl->putref_tFoot(This,v);
}
static FORCEINLINE HRESULT IHTMLTable4_get_tFoot(IHTMLTable4* This,IHTMLTableSection **p) {
    return This->lpVtbl->get_tFoot(This,p);
}
static FORCEINLINE HRESULT IHTMLTable4_putref_caption(IHTMLTable4* This,IHTMLTableCaption *v) {
    return This->lpVtbl->putref_caption(This,v);
}
static FORCEINLINE HRESULT IHTMLTable4_get_caption(IHTMLTable4* This,IHTMLTableCaption **p) {
    return This->lpVtbl->get_caption(This,p);
}
static FORCEINLINE HRESULT IHTMLTable4_insertRow(IHTMLTable4* This,LONG index,IDispatch **row) {
    return This->lpVtbl->insertRow(This,index,row);
}
static FORCEINLINE HRESULT IHTMLTable4_deleteRow(IHTMLTable4* This,LONG index) {
    return This->lpVtbl->deleteRow(This,index);
}
static FORCEINLINE HRESULT IHTMLTable4_createTBody(IHTMLTable4* This,IHTMLTableSection **tbody) {
    return This->lpVtbl->createTBody(This,tbody);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLTable4_putref_tHead_Proxy(
    IHTMLTable4* This,
    IHTMLTableSection *v);
void __RPC_STUB IHTMLTable4_putref_tHead_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable4_get_tHead_Proxy(
    IHTMLTable4* This,
    IHTMLTableSection **p);
void __RPC_STUB IHTMLTable4_get_tHead_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable4_putref_tFoot_Proxy(
    IHTMLTable4* This,
    IHTMLTableSection *v);
void __RPC_STUB IHTMLTable4_putref_tFoot_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable4_get_tFoot_Proxy(
    IHTMLTable4* This,
    IHTMLTableSection **p);
void __RPC_STUB IHTMLTable4_get_tFoot_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable4_putref_caption_Proxy(
    IHTMLTable4* This,
    IHTMLTableCaption *v);
void __RPC_STUB IHTMLTable4_putref_caption_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable4_get_caption_Proxy(
    IHTMLTable4* This,
    IHTMLTableCaption **p);
void __RPC_STUB IHTMLTable4_get_caption_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable4_insertRow_Proxy(
    IHTMLTable4* This,
    LONG index,
    IDispatch **row);
void __RPC_STUB IHTMLTable4_insertRow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable4_deleteRow_Proxy(
    IHTMLTable4* This,
    LONG index);
void __RPC_STUB IHTMLTable4_deleteRow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTable4_createTBody_Proxy(
    IHTMLTable4* This,
    IHTMLTableSection **tbody);
void __RPC_STUB IHTMLTable4_createTBody_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLTable4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLTableCol interface
 */
#ifndef __IHTMLTableCol_INTERFACE_DEFINED__
#define __IHTMLTableCol_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTableCol, 0x3050f23a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f23a-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTableCol : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_span(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_span(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_width(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_width(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_align(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_align(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_vAlign(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_vAlign(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTableCol, 0x3050f23a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTableColVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTableCol* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTableCol* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTableCol* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTableCol* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTableCol* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTableCol* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTableCol* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLTableCol methods ***/
    HRESULT (STDMETHODCALLTYPE *put_span)(
        IHTMLTableCol* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_span)(
        IHTMLTableCol* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_width)(
        IHTMLTableCol* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_width)(
        IHTMLTableCol* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_align)(
        IHTMLTableCol* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_align)(
        IHTMLTableCol* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_vAlign)(
        IHTMLTableCol* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_vAlign)(
        IHTMLTableCol* This,
        BSTR *p);

    END_INTERFACE
} IHTMLTableColVtbl;
interface IHTMLTableCol {
    CONST_VTBL IHTMLTableColVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTableCol_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTableCol_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTableCol_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTableCol_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTableCol_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTableCol_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTableCol_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLTableCol methods ***/
#define IHTMLTableCol_put_span(This,v) (This)->lpVtbl->put_span(This,v)
#define IHTMLTableCol_get_span(This,p) (This)->lpVtbl->get_span(This,p)
#define IHTMLTableCol_put_width(This,v) (This)->lpVtbl->put_width(This,v)
#define IHTMLTableCol_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#define IHTMLTableCol_put_align(This,v) (This)->lpVtbl->put_align(This,v)
#define IHTMLTableCol_get_align(This,p) (This)->lpVtbl->get_align(This,p)
#define IHTMLTableCol_put_vAlign(This,v) (This)->lpVtbl->put_vAlign(This,v)
#define IHTMLTableCol_get_vAlign(This,p) (This)->lpVtbl->get_vAlign(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLTableCol_QueryInterface(IHTMLTableCol* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTableCol_AddRef(IHTMLTableCol* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTableCol_Release(IHTMLTableCol* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTableCol_GetTypeInfoCount(IHTMLTableCol* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTableCol_GetTypeInfo(IHTMLTableCol* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTableCol_GetIDsOfNames(IHTMLTableCol* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTableCol_Invoke(IHTMLTableCol* 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);
}
/*** IHTMLTableCol methods ***/
static FORCEINLINE HRESULT IHTMLTableCol_put_span(IHTMLTableCol* This,LONG v) {
    return This->lpVtbl->put_span(This,v);
}
static FORCEINLINE HRESULT IHTMLTableCol_get_span(IHTMLTableCol* This,LONG *p) {
    return This->lpVtbl->get_span(This,p);
}
static FORCEINLINE HRESULT IHTMLTableCol_put_width(IHTMLTableCol* This,VARIANT v) {
    return This->lpVtbl->put_width(This,v);
}
static FORCEINLINE HRESULT IHTMLTableCol_get_width(IHTMLTableCol* This,VARIANT *p) {
    return This->lpVtbl->get_width(This,p);
}
static FORCEINLINE HRESULT IHTMLTableCol_put_align(IHTMLTableCol* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static FORCEINLINE HRESULT IHTMLTableCol_get_align(IHTMLTableCol* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
static FORCEINLINE HRESULT IHTMLTableCol_put_vAlign(IHTMLTableCol* This,BSTR v) {
    return This->lpVtbl->put_vAlign(This,v);
}
static FORCEINLINE HRESULT IHTMLTableCol_get_vAlign(IHTMLTableCol* This,BSTR *p) {
    return This->lpVtbl->get_vAlign(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLTableCol_put_span_Proxy(
    IHTMLTableCol* This,
    LONG v);
void __RPC_STUB IHTMLTableCol_put_span_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCol_get_span_Proxy(
    IHTMLTableCol* This,
    LONG *p);
void __RPC_STUB IHTMLTableCol_get_span_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCol_put_width_Proxy(
    IHTMLTableCol* This,
    VARIANT v);
void __RPC_STUB IHTMLTableCol_put_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCol_get_width_Proxy(
    IHTMLTableCol* This,
    VARIANT *p);
void __RPC_STUB IHTMLTableCol_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCol_put_align_Proxy(
    IHTMLTableCol* This,
    BSTR v);
void __RPC_STUB IHTMLTableCol_put_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCol_get_align_Proxy(
    IHTMLTableCol* This,
    BSTR *p);
void __RPC_STUB IHTMLTableCol_get_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCol_put_vAlign_Proxy(
    IHTMLTableCol* This,
    BSTR v);
void __RPC_STUB IHTMLTableCol_put_vAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCol_get_vAlign_Proxy(
    IHTMLTableCol* This,
    BSTR *p);
void __RPC_STUB IHTMLTableCol_get_vAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLTableCol_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLTableCol2 interface
 */
#ifndef __IHTMLTableCol2_INTERFACE_DEFINED__
#define __IHTMLTableCol2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTableCol2, 0x3050f82a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f82a-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTableCol2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_ch(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ch(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_chOff(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_chOff(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTableCol2, 0x3050f82a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTableCol2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTableCol2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTableCol2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTableCol2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTableCol2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTableCol2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTableCol2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTableCol2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLTableCol2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_ch)(
        IHTMLTableCol2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ch)(
        IHTMLTableCol2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_chOff)(
        IHTMLTableCol2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_chOff)(
        IHTMLTableCol2* This,
        BSTR *p);

    END_INTERFACE
} IHTMLTableCol2Vtbl;
interface IHTMLTableCol2 {
    CONST_VTBL IHTMLTableCol2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTableCol2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTableCol2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTableCol2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTableCol2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTableCol2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTableCol2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTableCol2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLTableCol2 methods ***/
#define IHTMLTableCol2_put_ch(This,v) (This)->lpVtbl->put_ch(This,v)
#define IHTMLTableCol2_get_ch(This,p) (This)->lpVtbl->get_ch(This,p)
#define IHTMLTableCol2_put_chOff(This,v) (This)->lpVtbl->put_chOff(This,v)
#define IHTMLTableCol2_get_chOff(This,p) (This)->lpVtbl->get_chOff(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLTableCol2_QueryInterface(IHTMLTableCol2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTableCol2_AddRef(IHTMLTableCol2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTableCol2_Release(IHTMLTableCol2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTableCol2_GetTypeInfoCount(IHTMLTableCol2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTableCol2_GetTypeInfo(IHTMLTableCol2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTableCol2_GetIDsOfNames(IHTMLTableCol2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTableCol2_Invoke(IHTMLTableCol2* 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);
}
/*** IHTMLTableCol2 methods ***/
static FORCEINLINE HRESULT IHTMLTableCol2_put_ch(IHTMLTableCol2* This,BSTR v) {
    return This->lpVtbl->put_ch(This,v);
}
static FORCEINLINE HRESULT IHTMLTableCol2_get_ch(IHTMLTableCol2* This,BSTR *p) {
    return This->lpVtbl->get_ch(This,p);
}
static FORCEINLINE HRESULT IHTMLTableCol2_put_chOff(IHTMLTableCol2* This,BSTR v) {
    return This->lpVtbl->put_chOff(This,v);
}
static FORCEINLINE HRESULT IHTMLTableCol2_get_chOff(IHTMLTableCol2* This,BSTR *p) {
    return This->lpVtbl->get_chOff(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLTableCol2_put_ch_Proxy(
    IHTMLTableCol2* This,
    BSTR v);
void __RPC_STUB IHTMLTableCol2_put_ch_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCol2_get_ch_Proxy(
    IHTMLTableCol2* This,
    BSTR *p);
void __RPC_STUB IHTMLTableCol2_get_ch_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCol2_put_chOff_Proxy(
    IHTMLTableCol2* This,
    BSTR v);
void __RPC_STUB IHTMLTableCol2_put_chOff_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCol2_get_chOff_Proxy(
    IHTMLTableCol2* This,
    BSTR *p);
void __RPC_STUB IHTMLTableCol2_get_chOff_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLTableCol2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLTableCol3 interface
 */
#ifndef __IHTMLTableCol3_INTERFACE_DEFINED__
#define __IHTMLTableCol3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTableCol3, 0x305106c4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106c4-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTableCol3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_ch(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ch(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_chOff(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_chOff(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTableCol3, 0x305106c4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTableCol3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTableCol3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTableCol3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTableCol3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTableCol3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTableCol3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTableCol3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTableCol3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLTableCol3 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_ch)(
        IHTMLTableCol3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ch)(
        IHTMLTableCol3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_chOff)(
        IHTMLTableCol3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_chOff)(
        IHTMLTableCol3* This,
        BSTR *p);

    END_INTERFACE
} IHTMLTableCol3Vtbl;
interface IHTMLTableCol3 {
    CONST_VTBL IHTMLTableCol3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTableCol3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTableCol3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTableCol3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTableCol3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTableCol3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTableCol3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTableCol3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLTableCol3 methods ***/
#define IHTMLTableCol3_put_ch(This,v) (This)->lpVtbl->put_ch(This,v)
#define IHTMLTableCol3_get_ch(This,p) (This)->lpVtbl->get_ch(This,p)
#define IHTMLTableCol3_put_chOff(This,v) (This)->lpVtbl->put_chOff(This,v)
#define IHTMLTableCol3_get_chOff(This,p) (This)->lpVtbl->get_chOff(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLTableCol3_QueryInterface(IHTMLTableCol3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTableCol3_AddRef(IHTMLTableCol3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTableCol3_Release(IHTMLTableCol3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTableCol3_GetTypeInfoCount(IHTMLTableCol3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTableCol3_GetTypeInfo(IHTMLTableCol3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTableCol3_GetIDsOfNames(IHTMLTableCol3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTableCol3_Invoke(IHTMLTableCol3* 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);
}
/*** IHTMLTableCol3 methods ***/
static FORCEINLINE HRESULT IHTMLTableCol3_put_ch(IHTMLTableCol3* This,BSTR v) {
    return This->lpVtbl->put_ch(This,v);
}
static FORCEINLINE HRESULT IHTMLTableCol3_get_ch(IHTMLTableCol3* This,BSTR *p) {
    return This->lpVtbl->get_ch(This,p);
}
static FORCEINLINE HRESULT IHTMLTableCol3_put_chOff(IHTMLTableCol3* This,BSTR v) {
    return This->lpVtbl->put_chOff(This,v);
}
static FORCEINLINE HRESULT IHTMLTableCol3_get_chOff(IHTMLTableCol3* This,BSTR *p) {
    return This->lpVtbl->get_chOff(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLTableCol3_put_ch_Proxy(
    IHTMLTableCol3* This,
    BSTR v);
void __RPC_STUB IHTMLTableCol3_put_ch_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCol3_get_ch_Proxy(
    IHTMLTableCol3* This,
    BSTR *p);
void __RPC_STUB IHTMLTableCol3_get_ch_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCol3_put_chOff_Proxy(
    IHTMLTableCol3* This,
    BSTR v);
void __RPC_STUB IHTMLTableCol3_put_chOff_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCol3_get_chOff_Proxy(
    IHTMLTableCol3* This,
    BSTR *p);
void __RPC_STUB IHTMLTableCol3_get_chOff_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLTableCol3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLTableSection interface
 */
#ifndef __IHTMLTableSection_INTERFACE_DEFINED__
#define __IHTMLTableSection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTableSection, 0x3050f23b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f23b-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTableSection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_align(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_align(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_vAlign(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_vAlign(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_bgColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_bgColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_rows(
        IHTMLElementCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE insertRow(
        LONG index = -1,
        IDispatch **row = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE deleteRow(
        LONG index = -1) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTableSection, 0x3050f23b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTableSectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTableSection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTableSection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTableSection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTableSection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTableSection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTableSection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTableSection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLTableSection methods ***/
    HRESULT (STDMETHODCALLTYPE *put_align)(
        IHTMLTableSection* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_align)(
        IHTMLTableSection* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_vAlign)(
        IHTMLTableSection* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_vAlign)(
        IHTMLTableSection* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_bgColor)(
        IHTMLTableSection* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_bgColor)(
        IHTMLTableSection* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_rows)(
        IHTMLTableSection* This,
        IHTMLElementCollection **p);

    HRESULT (STDMETHODCALLTYPE *insertRow)(
        IHTMLTableSection* This,
        LONG index,
        IDispatch **row);

    HRESULT (STDMETHODCALLTYPE *deleteRow)(
        IHTMLTableSection* This,
        LONG index);

    END_INTERFACE
} IHTMLTableSectionVtbl;
interface IHTMLTableSection {
    CONST_VTBL IHTMLTableSectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTableSection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTableSection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTableSection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTableSection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTableSection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTableSection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTableSection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLTableSection methods ***/
#define IHTMLTableSection_put_align(This,v) (This)->lpVtbl->put_align(This,v)
#define IHTMLTableSection_get_align(This,p) (This)->lpVtbl->get_align(This,p)
#define IHTMLTableSection_put_vAlign(This,v) (This)->lpVtbl->put_vAlign(This,v)
#define IHTMLTableSection_get_vAlign(This,p) (This)->lpVtbl->get_vAlign(This,p)
#define IHTMLTableSection_put_bgColor(This,v) (This)->lpVtbl->put_bgColor(This,v)
#define IHTMLTableSection_get_bgColor(This,p) (This)->lpVtbl->get_bgColor(This,p)
#define IHTMLTableSection_get_rows(This,p) (This)->lpVtbl->get_rows(This,p)
#define IHTMLTableSection_insertRow(This,index,row) (This)->lpVtbl->insertRow(This,index,row)
#define IHTMLTableSection_deleteRow(This,index) (This)->lpVtbl->deleteRow(This,index)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLTableSection_QueryInterface(IHTMLTableSection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTableSection_AddRef(IHTMLTableSection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTableSection_Release(IHTMLTableSection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTableSection_GetTypeInfoCount(IHTMLTableSection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTableSection_GetTypeInfo(IHTMLTableSection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTableSection_GetIDsOfNames(IHTMLTableSection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTableSection_Invoke(IHTMLTableSection* 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);
}
/*** IHTMLTableSection methods ***/
static FORCEINLINE HRESULT IHTMLTableSection_put_align(IHTMLTableSection* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static FORCEINLINE HRESULT IHTMLTableSection_get_align(IHTMLTableSection* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
static FORCEINLINE HRESULT IHTMLTableSection_put_vAlign(IHTMLTableSection* This,BSTR v) {
    return This->lpVtbl->put_vAlign(This,v);
}
static FORCEINLINE HRESULT IHTMLTableSection_get_vAlign(IHTMLTableSection* This,BSTR *p) {
    return This->lpVtbl->get_vAlign(This,p);
}
static FORCEINLINE HRESULT IHTMLTableSection_put_bgColor(IHTMLTableSection* This,VARIANT v) {
    return This->lpVtbl->put_bgColor(This,v);
}
static FORCEINLINE HRESULT IHTMLTableSection_get_bgColor(IHTMLTableSection* This,VARIANT *p) {
    return This->lpVtbl->get_bgColor(This,p);
}
static FORCEINLINE HRESULT IHTMLTableSection_get_rows(IHTMLTableSection* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_rows(This,p);
}
static FORCEINLINE HRESULT IHTMLTableSection_insertRow(IHTMLTableSection* This,LONG index,IDispatch **row) {
    return This->lpVtbl->insertRow(This,index,row);
}
static FORCEINLINE HRESULT IHTMLTableSection_deleteRow(IHTMLTableSection* This,LONG index) {
    return This->lpVtbl->deleteRow(This,index);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLTableSection_put_align_Proxy(
    IHTMLTableSection* This,
    BSTR v);
void __RPC_STUB IHTMLTableSection_put_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableSection_get_align_Proxy(
    IHTMLTableSection* This,
    BSTR *p);
void __RPC_STUB IHTMLTableSection_get_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableSection_put_vAlign_Proxy(
    IHTMLTableSection* This,
    BSTR v);
void __RPC_STUB IHTMLTableSection_put_vAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableSection_get_vAlign_Proxy(
    IHTMLTableSection* This,
    BSTR *p);
void __RPC_STUB IHTMLTableSection_get_vAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableSection_put_bgColor_Proxy(
    IHTMLTableSection* This,
    VARIANT v);
void __RPC_STUB IHTMLTableSection_put_bgColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableSection_get_bgColor_Proxy(
    IHTMLTableSection* This,
    VARIANT *p);
void __RPC_STUB IHTMLTableSection_get_bgColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableSection_get_rows_Proxy(
    IHTMLTableSection* This,
    IHTMLElementCollection **p);
void __RPC_STUB IHTMLTableSection_get_rows_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableSection_insertRow_Proxy(
    IHTMLTableSection* This,
    LONG index,
    IDispatch **row);
void __RPC_STUB IHTMLTableSection_insertRow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableSection_deleteRow_Proxy(
    IHTMLTableSection* This,
    LONG index);
void __RPC_STUB IHTMLTableSection_deleteRow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLTableSection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLTableSection2 interface
 */
#ifndef __IHTMLTableSection2_INTERFACE_DEFINED__
#define __IHTMLTableSection2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTableSection2, 0x3050f5c7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f5c7-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTableSection2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE moveRow(
        LONG indexFrom = -1,
        LONG indexTo = -1,
        IDispatch **row = 0) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTableSection2, 0x3050f5c7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTableSection2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTableSection2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTableSection2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTableSection2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTableSection2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTableSection2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTableSection2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTableSection2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLTableSection2 methods ***/
    HRESULT (STDMETHODCALLTYPE *moveRow)(
        IHTMLTableSection2* This,
        LONG indexFrom,
        LONG indexTo,
        IDispatch **row);

    END_INTERFACE
} IHTMLTableSection2Vtbl;
interface IHTMLTableSection2 {
    CONST_VTBL IHTMLTableSection2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTableSection2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTableSection2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTableSection2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTableSection2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTableSection2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTableSection2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTableSection2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLTableSection2 methods ***/
#define IHTMLTableSection2_moveRow(This,indexFrom,indexTo,row) (This)->lpVtbl->moveRow(This,indexFrom,indexTo,row)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLTableSection2_QueryInterface(IHTMLTableSection2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTableSection2_AddRef(IHTMLTableSection2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTableSection2_Release(IHTMLTableSection2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTableSection2_GetTypeInfoCount(IHTMLTableSection2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTableSection2_GetTypeInfo(IHTMLTableSection2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTableSection2_GetIDsOfNames(IHTMLTableSection2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTableSection2_Invoke(IHTMLTableSection2* 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);
}
/*** IHTMLTableSection2 methods ***/
static FORCEINLINE HRESULT IHTMLTableSection2_moveRow(IHTMLTableSection2* This,LONG indexFrom,LONG indexTo,IDispatch **row) {
    return This->lpVtbl->moveRow(This,indexFrom,indexTo,row);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLTableSection2_moveRow_Proxy(
    IHTMLTableSection2* This,
    LONG indexFrom,
    LONG indexTo,
    IDispatch **row);
void __RPC_STUB IHTMLTableSection2_moveRow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLTableSection2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLTableSection3 interface
 */
#ifndef __IHTMLTableSection3_INTERFACE_DEFINED__
#define __IHTMLTableSection3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTableSection3, 0x3050f82b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f82b-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTableSection3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_ch(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ch(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_chOff(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_chOff(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTableSection3, 0x3050f82b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTableSection3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTableSection3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTableSection3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTableSection3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTableSection3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTableSection3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTableSection3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTableSection3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLTableSection3 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_ch)(
        IHTMLTableSection3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ch)(
        IHTMLTableSection3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_chOff)(
        IHTMLTableSection3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_chOff)(
        IHTMLTableSection3* This,
        BSTR *p);

    END_INTERFACE
} IHTMLTableSection3Vtbl;
interface IHTMLTableSection3 {
    CONST_VTBL IHTMLTableSection3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTableSection3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTableSection3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTableSection3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTableSection3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTableSection3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTableSection3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTableSection3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLTableSection3 methods ***/
#define IHTMLTableSection3_put_ch(This,v) (This)->lpVtbl->put_ch(This,v)
#define IHTMLTableSection3_get_ch(This,p) (This)->lpVtbl->get_ch(This,p)
#define IHTMLTableSection3_put_chOff(This,v) (This)->lpVtbl->put_chOff(This,v)
#define IHTMLTableSection3_get_chOff(This,p) (This)->lpVtbl->get_chOff(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLTableSection3_QueryInterface(IHTMLTableSection3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTableSection3_AddRef(IHTMLTableSection3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTableSection3_Release(IHTMLTableSection3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTableSection3_GetTypeInfoCount(IHTMLTableSection3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTableSection3_GetTypeInfo(IHTMLTableSection3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTableSection3_GetIDsOfNames(IHTMLTableSection3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTableSection3_Invoke(IHTMLTableSection3* 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);
}
/*** IHTMLTableSection3 methods ***/
static FORCEINLINE HRESULT IHTMLTableSection3_put_ch(IHTMLTableSection3* This,BSTR v) {
    return This->lpVtbl->put_ch(This,v);
}
static FORCEINLINE HRESULT IHTMLTableSection3_get_ch(IHTMLTableSection3* This,BSTR *p) {
    return This->lpVtbl->get_ch(This,p);
}
static FORCEINLINE HRESULT IHTMLTableSection3_put_chOff(IHTMLTableSection3* This,BSTR v) {
    return This->lpVtbl->put_chOff(This,v);
}
static FORCEINLINE HRESULT IHTMLTableSection3_get_chOff(IHTMLTableSection3* This,BSTR *p) {
    return This->lpVtbl->get_chOff(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLTableSection3_put_ch_Proxy(
    IHTMLTableSection3* This,
    BSTR v);
void __RPC_STUB IHTMLTableSection3_put_ch_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableSection3_get_ch_Proxy(
    IHTMLTableSection3* This,
    BSTR *p);
void __RPC_STUB IHTMLTableSection3_get_ch_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableSection3_put_chOff_Proxy(
    IHTMLTableSection3* This,
    BSTR v);
void __RPC_STUB IHTMLTableSection3_put_chOff_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableSection3_get_chOff_Proxy(
    IHTMLTableSection3* This,
    BSTR *p);
void __RPC_STUB IHTMLTableSection3_get_chOff_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLTableSection3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLTableSection4 interface
 */
#ifndef __IHTMLTableSection4_INTERFACE_DEFINED__
#define __IHTMLTableSection4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTableSection4, 0x305106c5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106c5-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTableSection4 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_ch(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ch(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_chOff(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_chOff(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE insertRow(
        LONG index = -1,
        IDispatch **row = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE deleteRow(
        LONG index = -1) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTableSection4, 0x305106c5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTableSection4Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTableSection4* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTableSection4* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTableSection4* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTableSection4* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTableSection4* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTableSection4* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTableSection4* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLTableSection4 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_ch)(
        IHTMLTableSection4* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ch)(
        IHTMLTableSection4* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_chOff)(
        IHTMLTableSection4* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_chOff)(
        IHTMLTableSection4* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *insertRow)(
        IHTMLTableSection4* This,
        LONG index,
        IDispatch **row);

    HRESULT (STDMETHODCALLTYPE *deleteRow)(
        IHTMLTableSection4* This,
        LONG index);

    END_INTERFACE
} IHTMLTableSection4Vtbl;
interface IHTMLTableSection4 {
    CONST_VTBL IHTMLTableSection4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTableSection4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTableSection4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTableSection4_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTableSection4_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTableSection4_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTableSection4_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTableSection4_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLTableSection4 methods ***/
#define IHTMLTableSection4_put_ch(This,v) (This)->lpVtbl->put_ch(This,v)
#define IHTMLTableSection4_get_ch(This,p) (This)->lpVtbl->get_ch(This,p)
#define IHTMLTableSection4_put_chOff(This,v) (This)->lpVtbl->put_chOff(This,v)
#define IHTMLTableSection4_get_chOff(This,p) (This)->lpVtbl->get_chOff(This,p)
#define IHTMLTableSection4_insertRow(This,index,row) (This)->lpVtbl->insertRow(This,index,row)
#define IHTMLTableSection4_deleteRow(This,index) (This)->lpVtbl->deleteRow(This,index)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLTableSection4_QueryInterface(IHTMLTableSection4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTableSection4_AddRef(IHTMLTableSection4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTableSection4_Release(IHTMLTableSection4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTableSection4_GetTypeInfoCount(IHTMLTableSection4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTableSection4_GetTypeInfo(IHTMLTableSection4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTableSection4_GetIDsOfNames(IHTMLTableSection4* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTableSection4_Invoke(IHTMLTableSection4* 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);
}
/*** IHTMLTableSection4 methods ***/
static FORCEINLINE HRESULT IHTMLTableSection4_put_ch(IHTMLTableSection4* This,BSTR v) {
    return This->lpVtbl->put_ch(This,v);
}
static FORCEINLINE HRESULT IHTMLTableSection4_get_ch(IHTMLTableSection4* This,BSTR *p) {
    return This->lpVtbl->get_ch(This,p);
}
static FORCEINLINE HRESULT IHTMLTableSection4_put_chOff(IHTMLTableSection4* This,BSTR v) {
    return This->lpVtbl->put_chOff(This,v);
}
static FORCEINLINE HRESULT IHTMLTableSection4_get_chOff(IHTMLTableSection4* This,BSTR *p) {
    return This->lpVtbl->get_chOff(This,p);
}
static FORCEINLINE HRESULT IHTMLTableSection4_insertRow(IHTMLTableSection4* This,LONG index,IDispatch **row) {
    return This->lpVtbl->insertRow(This,index,row);
}
static FORCEINLINE HRESULT IHTMLTableSection4_deleteRow(IHTMLTableSection4* This,LONG index) {
    return This->lpVtbl->deleteRow(This,index);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLTableSection4_put_ch_Proxy(
    IHTMLTableSection4* This,
    BSTR v);
void __RPC_STUB IHTMLTableSection4_put_ch_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableSection4_get_ch_Proxy(
    IHTMLTableSection4* This,
    BSTR *p);
void __RPC_STUB IHTMLTableSection4_get_ch_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableSection4_put_chOff_Proxy(
    IHTMLTableSection4* This,
    BSTR v);
void __RPC_STUB IHTMLTableSection4_put_chOff_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableSection4_get_chOff_Proxy(
    IHTMLTableSection4* This,
    BSTR *p);
void __RPC_STUB IHTMLTableSection4_get_chOff_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableSection4_insertRow_Proxy(
    IHTMLTableSection4* This,
    LONG index,
    IDispatch **row);
void __RPC_STUB IHTMLTableSection4_insertRow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableSection4_deleteRow_Proxy(
    IHTMLTableSection4* This,
    LONG index);
void __RPC_STUB IHTMLTableSection4_deleteRow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLTableSection4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLTableRow interface
 */
#ifndef __IHTMLTableRow_INTERFACE_DEFINED__
#define __IHTMLTableRow_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTableRow, 0x3050f23c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f23c-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTableRow : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_align(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_align(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_vAlign(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_vAlign(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_bgColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_bgColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderColorLight(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderColorLight(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderColorDark(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderColorDark(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_rowIndex(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_sectionRowIndex(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cells(
        IHTMLElementCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE insertCell(
        LONG index = -1,
        IDispatch **row = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE deleteCell(
        LONG index = -1) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTableRow, 0x3050f23c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTableRowVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTableRow* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTableRow* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTableRow* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTableRow* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTableRow* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTableRow* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTableRow* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLTableRow methods ***/
    HRESULT (STDMETHODCALLTYPE *put_align)(
        IHTMLTableRow* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_align)(
        IHTMLTableRow* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_vAlign)(
        IHTMLTableRow* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_vAlign)(
        IHTMLTableRow* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_bgColor)(
        IHTMLTableRow* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_bgColor)(
        IHTMLTableRow* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderColor)(
        IHTMLTableRow* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderColor)(
        IHTMLTableRow* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderColorLight)(
        IHTMLTableRow* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderColorLight)(
        IHTMLTableRow* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderColorDark)(
        IHTMLTableRow* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderColorDark)(
        IHTMLTableRow* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_rowIndex)(
        IHTMLTableRow* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_sectionRowIndex)(
        IHTMLTableRow* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_cells)(
        IHTMLTableRow* This,
        IHTMLElementCollection **p);

    HRESULT (STDMETHODCALLTYPE *insertCell)(
        IHTMLTableRow* This,
        LONG index,
        IDispatch **row);

    HRESULT (STDMETHODCALLTYPE *deleteCell)(
        IHTMLTableRow* This,
        LONG index);

    END_INTERFACE
} IHTMLTableRowVtbl;
interface IHTMLTableRow {
    CONST_VTBL IHTMLTableRowVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTableRow_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTableRow_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTableRow_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTableRow_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTableRow_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTableRow_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTableRow_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLTableRow methods ***/
#define IHTMLTableRow_put_align(This,v) (This)->lpVtbl->put_align(This,v)
#define IHTMLTableRow_get_align(This,p) (This)->lpVtbl->get_align(This,p)
#define IHTMLTableRow_put_vAlign(This,v) (This)->lpVtbl->put_vAlign(This,v)
#define IHTMLTableRow_get_vAlign(This,p) (This)->lpVtbl->get_vAlign(This,p)
#define IHTMLTableRow_put_bgColor(This,v) (This)->lpVtbl->put_bgColor(This,v)
#define IHTMLTableRow_get_bgColor(This,p) (This)->lpVtbl->get_bgColor(This,p)
#define IHTMLTableRow_put_borderColor(This,v) (This)->lpVtbl->put_borderColor(This,v)
#define IHTMLTableRow_get_borderColor(This,p) (This)->lpVtbl->get_borderColor(This,p)
#define IHTMLTableRow_put_borderColorLight(This,v) (This)->lpVtbl->put_borderColorLight(This,v)
#define IHTMLTableRow_get_borderColorLight(This,p) (This)->lpVtbl->get_borderColorLight(This,p)
#define IHTMLTableRow_put_borderColorDark(This,v) (This)->lpVtbl->put_borderColorDark(This,v)
#define IHTMLTableRow_get_borderColorDark(This,p) (This)->lpVtbl->get_borderColorDark(This,p)
#define IHTMLTableRow_get_rowIndex(This,p) (This)->lpVtbl->get_rowIndex(This,p)
#define IHTMLTableRow_get_sectionRowIndex(This,p) (This)->lpVtbl->get_sectionRowIndex(This,p)
#define IHTMLTableRow_get_cells(This,p) (This)->lpVtbl->get_cells(This,p)
#define IHTMLTableRow_insertCell(This,index,row) (This)->lpVtbl->insertCell(This,index,row)
#define IHTMLTableRow_deleteCell(This,index) (This)->lpVtbl->deleteCell(This,index)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLTableRow_QueryInterface(IHTMLTableRow* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTableRow_AddRef(IHTMLTableRow* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTableRow_Release(IHTMLTableRow* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTableRow_GetTypeInfoCount(IHTMLTableRow* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTableRow_GetTypeInfo(IHTMLTableRow* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTableRow_GetIDsOfNames(IHTMLTableRow* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTableRow_Invoke(IHTMLTableRow* 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);
}
/*** IHTMLTableRow methods ***/
static FORCEINLINE HRESULT IHTMLTableRow_put_align(IHTMLTableRow* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static FORCEINLINE HRESULT IHTMLTableRow_get_align(IHTMLTableRow* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
static FORCEINLINE HRESULT IHTMLTableRow_put_vAlign(IHTMLTableRow* This,BSTR v) {
    return This->lpVtbl->put_vAlign(This,v);
}
static FORCEINLINE HRESULT IHTMLTableRow_get_vAlign(IHTMLTableRow* This,BSTR *p) {
    return This->lpVtbl->get_vAlign(This,p);
}
static FORCEINLINE HRESULT IHTMLTableRow_put_bgColor(IHTMLTableRow* This,VARIANT v) {
    return This->lpVtbl->put_bgColor(This,v);
}
static FORCEINLINE HRESULT IHTMLTableRow_get_bgColor(IHTMLTableRow* This,VARIANT *p) {
    return This->lpVtbl->get_bgColor(This,p);
}
static FORCEINLINE HRESULT IHTMLTableRow_put_borderColor(IHTMLTableRow* This,VARIANT v) {
    return This->lpVtbl->put_borderColor(This,v);
}
static FORCEINLINE HRESULT IHTMLTableRow_get_borderColor(IHTMLTableRow* This,VARIANT *p) {
    return This->lpVtbl->get_borderColor(This,p);
}
static FORCEINLINE HRESULT IHTMLTableRow_put_borderColorLight(IHTMLTableRow* This,VARIANT v) {
    return This->lpVtbl->put_borderColorLight(This,v);
}
static FORCEINLINE HRESULT IHTMLTableRow_get_borderColorLight(IHTMLTableRow* This,VARIANT *p) {
    return This->lpVtbl->get_borderColorLight(This,p);
}
static FORCEINLINE HRESULT IHTMLTableRow_put_borderColorDark(IHTMLTableRow* This,VARIANT v) {
    return This->lpVtbl->put_borderColorDark(This,v);
}
static FORCEINLINE HRESULT IHTMLTableRow_get_borderColorDark(IHTMLTableRow* This,VARIANT *p) {
    return This->lpVtbl->get_borderColorDark(This,p);
}
static FORCEINLINE HRESULT IHTMLTableRow_get_rowIndex(IHTMLTableRow* This,LONG *p) {
    return This->lpVtbl->get_rowIndex(This,p);
}
static FORCEINLINE HRESULT IHTMLTableRow_get_sectionRowIndex(IHTMLTableRow* This,LONG *p) {
    return This->lpVtbl->get_sectionRowIndex(This,p);
}
static FORCEINLINE HRESULT IHTMLTableRow_get_cells(IHTMLTableRow* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_cells(This,p);
}
static FORCEINLINE HRESULT IHTMLTableRow_insertCell(IHTMLTableRow* This,LONG index,IDispatch **row) {
    return This->lpVtbl->insertCell(This,index,row);
}
static FORCEINLINE HRESULT IHTMLTableRow_deleteCell(IHTMLTableRow* This,LONG index) {
    return This->lpVtbl->deleteCell(This,index);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLTableRow_put_align_Proxy(
    IHTMLTableRow* This,
    BSTR v);
void __RPC_STUB IHTMLTableRow_put_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableRow_get_align_Proxy(
    IHTMLTableRow* This,
    BSTR *p);
void __RPC_STUB IHTMLTableRow_get_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableRow_put_vAlign_Proxy(
    IHTMLTableRow* This,
    BSTR v);
void __RPC_STUB IHTMLTableRow_put_vAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableRow_get_vAlign_Proxy(
    IHTMLTableRow* This,
    BSTR *p);
void __RPC_STUB IHTMLTableRow_get_vAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableRow_put_bgColor_Proxy(
    IHTMLTableRow* This,
    VARIANT v);
void __RPC_STUB IHTMLTableRow_put_bgColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableRow_get_bgColor_Proxy(
    IHTMLTableRow* This,
    VARIANT *p);
void __RPC_STUB IHTMLTableRow_get_bgColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableRow_put_borderColor_Proxy(
    IHTMLTableRow* This,
    VARIANT v);
void __RPC_STUB IHTMLTableRow_put_borderColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableRow_get_borderColor_Proxy(
    IHTMLTableRow* This,
    VARIANT *p);
void __RPC_STUB IHTMLTableRow_get_borderColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableRow_put_borderColorLight_Proxy(
    IHTMLTableRow* This,
    VARIANT v);
void __RPC_STUB IHTMLTableRow_put_borderColorLight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableRow_get_borderColorLight_Proxy(
    IHTMLTableRow* This,
    VARIANT *p);
void __RPC_STUB IHTMLTableRow_get_borderColorLight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableRow_put_borderColorDark_Proxy(
    IHTMLTableRow* This,
    VARIANT v);
void __RPC_STUB IHTMLTableRow_put_borderColorDark_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableRow_get_borderColorDark_Proxy(
    IHTMLTableRow* This,
    VARIANT *p);
void __RPC_STUB IHTMLTableRow_get_borderColorDark_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableRow_get_rowIndex_Proxy(
    IHTMLTableRow* This,
    LONG *p);
void __RPC_STUB IHTMLTableRow_get_rowIndex_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableRow_get_sectionRowIndex_Proxy(
    IHTMLTableRow* This,
    LONG *p);
void __RPC_STUB IHTMLTableRow_get_sectionRowIndex_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableRow_get_cells_Proxy(
    IHTMLTableRow* This,
    IHTMLElementCollection **p);
void __RPC_STUB IHTMLTableRow_get_cells_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableRow_insertCell_Proxy(
    IHTMLTableRow* This,
    LONG index,
    IDispatch **row);
void __RPC_STUB IHTMLTableRow_insertCell_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableRow_deleteCell_Proxy(
    IHTMLTableRow* This,
    LONG index);
void __RPC_STUB IHTMLTableRow_deleteCell_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLTableRow_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLTableRow2 interface
 */
#ifndef __IHTMLTableRow2_INTERFACE_DEFINED__
#define __IHTMLTableRow2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTableRow2, 0x3050f4a1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f4a1-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTableRow2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_height(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_height(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTableRow2, 0x3050f4a1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTableRow2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTableRow2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTableRow2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTableRow2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTableRow2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTableRow2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTableRow2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTableRow2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLTableRow2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_height)(
        IHTMLTableRow2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_height)(
        IHTMLTableRow2* This,
        VARIANT *p);

    END_INTERFACE
} IHTMLTableRow2Vtbl;
interface IHTMLTableRow2 {
    CONST_VTBL IHTMLTableRow2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTableRow2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTableRow2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTableRow2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTableRow2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTableRow2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTableRow2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTableRow2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLTableRow2 methods ***/
#define IHTMLTableRow2_put_height(This,v) (This)->lpVtbl->put_height(This,v)
#define IHTMLTableRow2_get_height(This,p) (This)->lpVtbl->get_height(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLTableRow2_QueryInterface(IHTMLTableRow2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTableRow2_AddRef(IHTMLTableRow2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTableRow2_Release(IHTMLTableRow2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTableRow2_GetTypeInfoCount(IHTMLTableRow2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTableRow2_GetTypeInfo(IHTMLTableRow2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTableRow2_GetIDsOfNames(IHTMLTableRow2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTableRow2_Invoke(IHTMLTableRow2* 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);
}
/*** IHTMLTableRow2 methods ***/
static FORCEINLINE HRESULT IHTMLTableRow2_put_height(IHTMLTableRow2* This,VARIANT v) {
    return This->lpVtbl->put_height(This,v);
}
static FORCEINLINE HRESULT IHTMLTableRow2_get_height(IHTMLTableRow2* This,VARIANT *p) {
    return This->lpVtbl->get_height(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLTableRow2_put_height_Proxy(
    IHTMLTableRow2* This,
    VARIANT v);
void __RPC_STUB IHTMLTableRow2_put_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableRow2_get_height_Proxy(
    IHTMLTableRow2* This,
    VARIANT *p);
void __RPC_STUB IHTMLTableRow2_get_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLTableRow2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLTableRow3 interface
 */
#ifndef __IHTMLTableRow3_INTERFACE_DEFINED__
#define __IHTMLTableRow3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTableRow3, 0x3050f82c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f82c-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTableRow3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_ch(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ch(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_chOff(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_chOff(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTableRow3, 0x3050f82c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTableRow3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTableRow3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTableRow3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTableRow3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTableRow3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTableRow3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTableRow3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTableRow3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLTableRow3 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_ch)(
        IHTMLTableRow3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ch)(
        IHTMLTableRow3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_chOff)(
        IHTMLTableRow3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_chOff)(
        IHTMLTableRow3* This,
        BSTR *p);

    END_INTERFACE
} IHTMLTableRow3Vtbl;
interface IHTMLTableRow3 {
    CONST_VTBL IHTMLTableRow3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTableRow3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTableRow3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTableRow3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTableRow3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTableRow3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTableRow3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTableRow3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLTableRow3 methods ***/
#define IHTMLTableRow3_put_ch(This,v) (This)->lpVtbl->put_ch(This,v)
#define IHTMLTableRow3_get_ch(This,p) (This)->lpVtbl->get_ch(This,p)
#define IHTMLTableRow3_put_chOff(This,v) (This)->lpVtbl->put_chOff(This,v)
#define IHTMLTableRow3_get_chOff(This,p) (This)->lpVtbl->get_chOff(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLTableRow3_QueryInterface(IHTMLTableRow3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTableRow3_AddRef(IHTMLTableRow3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTableRow3_Release(IHTMLTableRow3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTableRow3_GetTypeInfoCount(IHTMLTableRow3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTableRow3_GetTypeInfo(IHTMLTableRow3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTableRow3_GetIDsOfNames(IHTMLTableRow3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTableRow3_Invoke(IHTMLTableRow3* 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);
}
/*** IHTMLTableRow3 methods ***/
static FORCEINLINE HRESULT IHTMLTableRow3_put_ch(IHTMLTableRow3* This,BSTR v) {
    return This->lpVtbl->put_ch(This,v);
}
static FORCEINLINE HRESULT IHTMLTableRow3_get_ch(IHTMLTableRow3* This,BSTR *p) {
    return This->lpVtbl->get_ch(This,p);
}
static FORCEINLINE HRESULT IHTMLTableRow3_put_chOff(IHTMLTableRow3* This,BSTR v) {
    return This->lpVtbl->put_chOff(This,v);
}
static FORCEINLINE HRESULT IHTMLTableRow3_get_chOff(IHTMLTableRow3* This,BSTR *p) {
    return This->lpVtbl->get_chOff(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLTableRow3_put_ch_Proxy(
    IHTMLTableRow3* This,
    BSTR v);
void __RPC_STUB IHTMLTableRow3_put_ch_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableRow3_get_ch_Proxy(
    IHTMLTableRow3* This,
    BSTR *p);
void __RPC_STUB IHTMLTableRow3_get_ch_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableRow3_put_chOff_Proxy(
    IHTMLTableRow3* This,
    BSTR v);
void __RPC_STUB IHTMLTableRow3_put_chOff_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableRow3_get_chOff_Proxy(
    IHTMLTableRow3* This,
    BSTR *p);
void __RPC_STUB IHTMLTableRow3_get_chOff_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLTableRow3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLTableRow4 interface
 */
#ifndef __IHTMLTableRow4_INTERFACE_DEFINED__
#define __IHTMLTableRow4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTableRow4, 0x305106c6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106c6-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTableRow4 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_ch(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ch(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_chOff(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_chOff(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE insertCell(
        LONG index = -1,
        IDispatch **row = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE deleteCell(
        LONG index = -1) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTableRow4, 0x305106c6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTableRow4Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTableRow4* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTableRow4* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTableRow4* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTableRow4* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTableRow4* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTableRow4* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTableRow4* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLTableRow4 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_ch)(
        IHTMLTableRow4* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ch)(
        IHTMLTableRow4* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_chOff)(
        IHTMLTableRow4* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_chOff)(
        IHTMLTableRow4* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *insertCell)(
        IHTMLTableRow4* This,
        LONG index,
        IDispatch **row);

    HRESULT (STDMETHODCALLTYPE *deleteCell)(
        IHTMLTableRow4* This,
        LONG index);

    END_INTERFACE
} IHTMLTableRow4Vtbl;
interface IHTMLTableRow4 {
    CONST_VTBL IHTMLTableRow4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTableRow4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTableRow4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTableRow4_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTableRow4_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTableRow4_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTableRow4_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTableRow4_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLTableRow4 methods ***/
#define IHTMLTableRow4_put_ch(This,v) (This)->lpVtbl->put_ch(This,v)
#define IHTMLTableRow4_get_ch(This,p) (This)->lpVtbl->get_ch(This,p)
#define IHTMLTableRow4_put_chOff(This,v) (This)->lpVtbl->put_chOff(This,v)
#define IHTMLTableRow4_get_chOff(This,p) (This)->lpVtbl->get_chOff(This,p)
#define IHTMLTableRow4_insertCell(This,index,row) (This)->lpVtbl->insertCell(This,index,row)
#define IHTMLTableRow4_deleteCell(This,index) (This)->lpVtbl->deleteCell(This,index)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLTableRow4_QueryInterface(IHTMLTableRow4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTableRow4_AddRef(IHTMLTableRow4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTableRow4_Release(IHTMLTableRow4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTableRow4_GetTypeInfoCount(IHTMLTableRow4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTableRow4_GetTypeInfo(IHTMLTableRow4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTableRow4_GetIDsOfNames(IHTMLTableRow4* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTableRow4_Invoke(IHTMLTableRow4* 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);
}
/*** IHTMLTableRow4 methods ***/
static FORCEINLINE HRESULT IHTMLTableRow4_put_ch(IHTMLTableRow4* This,BSTR v) {
    return This->lpVtbl->put_ch(This,v);
}
static FORCEINLINE HRESULT IHTMLTableRow4_get_ch(IHTMLTableRow4* This,BSTR *p) {
    return This->lpVtbl->get_ch(This,p);
}
static FORCEINLINE HRESULT IHTMLTableRow4_put_chOff(IHTMLTableRow4* This,BSTR v) {
    return This->lpVtbl->put_chOff(This,v);
}
static FORCEINLINE HRESULT IHTMLTableRow4_get_chOff(IHTMLTableRow4* This,BSTR *p) {
    return This->lpVtbl->get_chOff(This,p);
}
static FORCEINLINE HRESULT IHTMLTableRow4_insertCell(IHTMLTableRow4* This,LONG index,IDispatch **row) {
    return This->lpVtbl->insertCell(This,index,row);
}
static FORCEINLINE HRESULT IHTMLTableRow4_deleteCell(IHTMLTableRow4* This,LONG index) {
    return This->lpVtbl->deleteCell(This,index);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLTableRow4_put_ch_Proxy(
    IHTMLTableRow4* This,
    BSTR v);
void __RPC_STUB IHTMLTableRow4_put_ch_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableRow4_get_ch_Proxy(
    IHTMLTableRow4* This,
    BSTR *p);
void __RPC_STUB IHTMLTableRow4_get_ch_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableRow4_put_chOff_Proxy(
    IHTMLTableRow4* This,
    BSTR v);
void __RPC_STUB IHTMLTableRow4_put_chOff_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableRow4_get_chOff_Proxy(
    IHTMLTableRow4* This,
    BSTR *p);
void __RPC_STUB IHTMLTableRow4_get_chOff_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableRow4_insertCell_Proxy(
    IHTMLTableRow4* This,
    LONG index,
    IDispatch **row);
void __RPC_STUB IHTMLTableRow4_insertCell_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableRow4_deleteCell_Proxy(
    IHTMLTableRow4* This,
    LONG index);
void __RPC_STUB IHTMLTableRow4_deleteCell_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLTableRow4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLTableRowMetrics interface
 */
#ifndef __IHTMLTableRowMetrics_INTERFACE_DEFINED__
#define __IHTMLTableRowMetrics_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTableRowMetrics, 0x3050f413, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f413-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTableRowMetrics : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_clientHeight(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clientWidth(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clientTop(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clientLeft(
        LONG *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTableRowMetrics, 0x3050f413, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTableRowMetricsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTableRowMetrics* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTableRowMetrics* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTableRowMetrics* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTableRowMetrics* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTableRowMetrics* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTableRowMetrics* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTableRowMetrics* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLTableRowMetrics methods ***/
    HRESULT (STDMETHODCALLTYPE *get_clientHeight)(
        IHTMLTableRowMetrics* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_clientWidth)(
        IHTMLTableRowMetrics* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_clientTop)(
        IHTMLTableRowMetrics* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_clientLeft)(
        IHTMLTableRowMetrics* This,
        LONG *p);

    END_INTERFACE
} IHTMLTableRowMetricsVtbl;
interface IHTMLTableRowMetrics {
    CONST_VTBL IHTMLTableRowMetricsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTableRowMetrics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTableRowMetrics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTableRowMetrics_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTableRowMetrics_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTableRowMetrics_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTableRowMetrics_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTableRowMetrics_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLTableRowMetrics methods ***/
#define IHTMLTableRowMetrics_get_clientHeight(This,p) (This)->lpVtbl->get_clientHeight(This,p)
#define IHTMLTableRowMetrics_get_clientWidth(This,p) (This)->lpVtbl->get_clientWidth(This,p)
#define IHTMLTableRowMetrics_get_clientTop(This,p) (This)->lpVtbl->get_clientTop(This,p)
#define IHTMLTableRowMetrics_get_clientLeft(This,p) (This)->lpVtbl->get_clientLeft(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLTableRowMetrics_QueryInterface(IHTMLTableRowMetrics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTableRowMetrics_AddRef(IHTMLTableRowMetrics* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTableRowMetrics_Release(IHTMLTableRowMetrics* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTableRowMetrics_GetTypeInfoCount(IHTMLTableRowMetrics* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTableRowMetrics_GetTypeInfo(IHTMLTableRowMetrics* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTableRowMetrics_GetIDsOfNames(IHTMLTableRowMetrics* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTableRowMetrics_Invoke(IHTMLTableRowMetrics* 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);
}
/*** IHTMLTableRowMetrics methods ***/
static FORCEINLINE HRESULT IHTMLTableRowMetrics_get_clientHeight(IHTMLTableRowMetrics* This,LONG *p) {
    return This->lpVtbl->get_clientHeight(This,p);
}
static FORCEINLINE HRESULT IHTMLTableRowMetrics_get_clientWidth(IHTMLTableRowMetrics* This,LONG *p) {
    return This->lpVtbl->get_clientWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLTableRowMetrics_get_clientTop(IHTMLTableRowMetrics* This,LONG *p) {
    return This->lpVtbl->get_clientTop(This,p);
}
static FORCEINLINE HRESULT IHTMLTableRowMetrics_get_clientLeft(IHTMLTableRowMetrics* This,LONG *p) {
    return This->lpVtbl->get_clientLeft(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLTableRowMetrics_get_clientHeight_Proxy(
    IHTMLTableRowMetrics* This,
    LONG *p);
void __RPC_STUB IHTMLTableRowMetrics_get_clientHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableRowMetrics_get_clientWidth_Proxy(
    IHTMLTableRowMetrics* This,
    LONG *p);
void __RPC_STUB IHTMLTableRowMetrics_get_clientWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableRowMetrics_get_clientTop_Proxy(
    IHTMLTableRowMetrics* This,
    LONG *p);
void __RPC_STUB IHTMLTableRowMetrics_get_clientTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableRowMetrics_get_clientLeft_Proxy(
    IHTMLTableRowMetrics* This,
    LONG *p);
void __RPC_STUB IHTMLTableRowMetrics_get_clientLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLTableRowMetrics_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLTableCell interface
 */
#ifndef __IHTMLTableCell_INTERFACE_DEFINED__
#define __IHTMLTableCell_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTableCell, 0x3050f23d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f23d-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTableCell : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_rowSpan(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_rowSpan(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_colSpan(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_colSpan(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_align(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_align(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_vAlign(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_vAlign(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_bgColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_bgColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_noWrap(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_noWrap(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_background(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_background(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderColorLight(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderColorLight(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderColorDark(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderColorDark(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_width(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_width(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_height(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_height(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cellIndex(
        LONG *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTableCell, 0x3050f23d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTableCellVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTableCell* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTableCell* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTableCell* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTableCell* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTableCell* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTableCell* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTableCell* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLTableCell methods ***/
    HRESULT (STDMETHODCALLTYPE *put_rowSpan)(
        IHTMLTableCell* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_rowSpan)(
        IHTMLTableCell* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_colSpan)(
        IHTMLTableCell* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_colSpan)(
        IHTMLTableCell* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_align)(
        IHTMLTableCell* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_align)(
        IHTMLTableCell* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_vAlign)(
        IHTMLTableCell* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_vAlign)(
        IHTMLTableCell* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_bgColor)(
        IHTMLTableCell* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_bgColor)(
        IHTMLTableCell* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_noWrap)(
        IHTMLTableCell* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_noWrap)(
        IHTMLTableCell* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_background)(
        IHTMLTableCell* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_background)(
        IHTMLTableCell* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderColor)(
        IHTMLTableCell* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderColor)(
        IHTMLTableCell* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderColorLight)(
        IHTMLTableCell* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderColorLight)(
        IHTMLTableCell* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderColorDark)(
        IHTMLTableCell* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderColorDark)(
        IHTMLTableCell* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_width)(
        IHTMLTableCell* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_width)(
        IHTMLTableCell* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_height)(
        IHTMLTableCell* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_height)(
        IHTMLTableCell* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_cellIndex)(
        IHTMLTableCell* This,
        LONG *p);

    END_INTERFACE
} IHTMLTableCellVtbl;
interface IHTMLTableCell {
    CONST_VTBL IHTMLTableCellVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTableCell_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTableCell_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTableCell_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTableCell_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTableCell_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTableCell_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTableCell_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLTableCell methods ***/
#define IHTMLTableCell_put_rowSpan(This,v) (This)->lpVtbl->put_rowSpan(This,v)
#define IHTMLTableCell_get_rowSpan(This,p) (This)->lpVtbl->get_rowSpan(This,p)
#define IHTMLTableCell_put_colSpan(This,v) (This)->lpVtbl->put_colSpan(This,v)
#define IHTMLTableCell_get_colSpan(This,p) (This)->lpVtbl->get_colSpan(This,p)
#define IHTMLTableCell_put_align(This,v) (This)->lpVtbl->put_align(This,v)
#define IHTMLTableCell_get_align(This,p) (This)->lpVtbl->get_align(This,p)
#define IHTMLTableCell_put_vAlign(This,v) (This)->lpVtbl->put_vAlign(This,v)
#define IHTMLTableCell_get_vAlign(This,p) (This)->lpVtbl->get_vAlign(This,p)
#define IHTMLTableCell_put_bgColor(This,v) (This)->lpVtbl->put_bgColor(This,v)
#define IHTMLTableCell_get_bgColor(This,p) (This)->lpVtbl->get_bgColor(This,p)
#define IHTMLTableCell_put_noWrap(This,v) (This)->lpVtbl->put_noWrap(This,v)
#define IHTMLTableCell_get_noWrap(This,p) (This)->lpVtbl->get_noWrap(This,p)
#define IHTMLTableCell_put_background(This,v) (This)->lpVtbl->put_background(This,v)
#define IHTMLTableCell_get_background(This,p) (This)->lpVtbl->get_background(This,p)
#define IHTMLTableCell_put_borderColor(This,v) (This)->lpVtbl->put_borderColor(This,v)
#define IHTMLTableCell_get_borderColor(This,p) (This)->lpVtbl->get_borderColor(This,p)
#define IHTMLTableCell_put_borderColorLight(This,v) (This)->lpVtbl->put_borderColorLight(This,v)
#define IHTMLTableCell_get_borderColorLight(This,p) (This)->lpVtbl->get_borderColorLight(This,p)
#define IHTMLTableCell_put_borderColorDark(This,v) (This)->lpVtbl->put_borderColorDark(This,v)
#define IHTMLTableCell_get_borderColorDark(This,p) (This)->lpVtbl->get_borderColorDark(This,p)
#define IHTMLTableCell_put_width(This,v) (This)->lpVtbl->put_width(This,v)
#define IHTMLTableCell_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#define IHTMLTableCell_put_height(This,v) (This)->lpVtbl->put_height(This,v)
#define IHTMLTableCell_get_height(This,p) (This)->lpVtbl->get_height(This,p)
#define IHTMLTableCell_get_cellIndex(This,p) (This)->lpVtbl->get_cellIndex(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLTableCell_QueryInterface(IHTMLTableCell* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTableCell_AddRef(IHTMLTableCell* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTableCell_Release(IHTMLTableCell* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTableCell_GetTypeInfoCount(IHTMLTableCell* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTableCell_GetTypeInfo(IHTMLTableCell* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTableCell_GetIDsOfNames(IHTMLTableCell* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTableCell_Invoke(IHTMLTableCell* 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);
}
/*** IHTMLTableCell methods ***/
static FORCEINLINE HRESULT IHTMLTableCell_put_rowSpan(IHTMLTableCell* This,LONG v) {
    return This->lpVtbl->put_rowSpan(This,v);
}
static FORCEINLINE HRESULT IHTMLTableCell_get_rowSpan(IHTMLTableCell* This,LONG *p) {
    return This->lpVtbl->get_rowSpan(This,p);
}
static FORCEINLINE HRESULT IHTMLTableCell_put_colSpan(IHTMLTableCell* This,LONG v) {
    return This->lpVtbl->put_colSpan(This,v);
}
static FORCEINLINE HRESULT IHTMLTableCell_get_colSpan(IHTMLTableCell* This,LONG *p) {
    return This->lpVtbl->get_colSpan(This,p);
}
static FORCEINLINE HRESULT IHTMLTableCell_put_align(IHTMLTableCell* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static FORCEINLINE HRESULT IHTMLTableCell_get_align(IHTMLTableCell* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
static FORCEINLINE HRESULT IHTMLTableCell_put_vAlign(IHTMLTableCell* This,BSTR v) {
    return This->lpVtbl->put_vAlign(This,v);
}
static FORCEINLINE HRESULT IHTMLTableCell_get_vAlign(IHTMLTableCell* This,BSTR *p) {
    return This->lpVtbl->get_vAlign(This,p);
}
static FORCEINLINE HRESULT IHTMLTableCell_put_bgColor(IHTMLTableCell* This,VARIANT v) {
    return This->lpVtbl->put_bgColor(This,v);
}
static FORCEINLINE HRESULT IHTMLTableCell_get_bgColor(IHTMLTableCell* This,VARIANT *p) {
    return This->lpVtbl->get_bgColor(This,p);
}
static FORCEINLINE HRESULT IHTMLTableCell_put_noWrap(IHTMLTableCell* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_noWrap(This,v);
}
static FORCEINLINE HRESULT IHTMLTableCell_get_noWrap(IHTMLTableCell* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_noWrap(This,p);
}
static FORCEINLINE HRESULT IHTMLTableCell_put_background(IHTMLTableCell* This,BSTR v) {
    return This->lpVtbl->put_background(This,v);
}
static FORCEINLINE HRESULT IHTMLTableCell_get_background(IHTMLTableCell* This,BSTR *p) {
    return This->lpVtbl->get_background(This,p);
}
static FORCEINLINE HRESULT IHTMLTableCell_put_borderColor(IHTMLTableCell* This,VARIANT v) {
    return This->lpVtbl->put_borderColor(This,v);
}
static FORCEINLINE HRESULT IHTMLTableCell_get_borderColor(IHTMLTableCell* This,VARIANT *p) {
    return This->lpVtbl->get_borderColor(This,p);
}
static FORCEINLINE HRESULT IHTMLTableCell_put_borderColorLight(IHTMLTableCell* This,VARIANT v) {
    return This->lpVtbl->put_borderColorLight(This,v);
}
static FORCEINLINE HRESULT IHTMLTableCell_get_borderColorLight(IHTMLTableCell* This,VARIANT *p) {
    return This->lpVtbl->get_borderColorLight(This,p);
}
static FORCEINLINE HRESULT IHTMLTableCell_put_borderColorDark(IHTMLTableCell* This,VARIANT v) {
    return This->lpVtbl->put_borderColorDark(This,v);
}
static FORCEINLINE HRESULT IHTMLTableCell_get_borderColorDark(IHTMLTableCell* This,VARIANT *p) {
    return This->lpVtbl->get_borderColorDark(This,p);
}
static FORCEINLINE HRESULT IHTMLTableCell_put_width(IHTMLTableCell* This,VARIANT v) {
    return This->lpVtbl->put_width(This,v);
}
static FORCEINLINE HRESULT IHTMLTableCell_get_width(IHTMLTableCell* This,VARIANT *p) {
    return This->lpVtbl->get_width(This,p);
}
static FORCEINLINE HRESULT IHTMLTableCell_put_height(IHTMLTableCell* This,VARIANT v) {
    return This->lpVtbl->put_height(This,v);
}
static FORCEINLINE HRESULT IHTMLTableCell_get_height(IHTMLTableCell* This,VARIANT *p) {
    return This->lpVtbl->get_height(This,p);
}
static FORCEINLINE HRESULT IHTMLTableCell_get_cellIndex(IHTMLTableCell* This,LONG *p) {
    return This->lpVtbl->get_cellIndex(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLTableCell_put_rowSpan_Proxy(
    IHTMLTableCell* This,
    LONG v);
void __RPC_STUB IHTMLTableCell_put_rowSpan_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell_get_rowSpan_Proxy(
    IHTMLTableCell* This,
    LONG *p);
void __RPC_STUB IHTMLTableCell_get_rowSpan_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell_put_colSpan_Proxy(
    IHTMLTableCell* This,
    LONG v);
void __RPC_STUB IHTMLTableCell_put_colSpan_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell_get_colSpan_Proxy(
    IHTMLTableCell* This,
    LONG *p);
void __RPC_STUB IHTMLTableCell_get_colSpan_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell_put_align_Proxy(
    IHTMLTableCell* This,
    BSTR v);
void __RPC_STUB IHTMLTableCell_put_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell_get_align_Proxy(
    IHTMLTableCell* This,
    BSTR *p);
void __RPC_STUB IHTMLTableCell_get_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell_put_vAlign_Proxy(
    IHTMLTableCell* This,
    BSTR v);
void __RPC_STUB IHTMLTableCell_put_vAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell_get_vAlign_Proxy(
    IHTMLTableCell* This,
    BSTR *p);
void __RPC_STUB IHTMLTableCell_get_vAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell_put_bgColor_Proxy(
    IHTMLTableCell* This,
    VARIANT v);
void __RPC_STUB IHTMLTableCell_put_bgColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell_get_bgColor_Proxy(
    IHTMLTableCell* This,
    VARIANT *p);
void __RPC_STUB IHTMLTableCell_get_bgColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell_put_noWrap_Proxy(
    IHTMLTableCell* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLTableCell_put_noWrap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell_get_noWrap_Proxy(
    IHTMLTableCell* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLTableCell_get_noWrap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell_put_background_Proxy(
    IHTMLTableCell* This,
    BSTR v);
void __RPC_STUB IHTMLTableCell_put_background_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell_get_background_Proxy(
    IHTMLTableCell* This,
    BSTR *p);
void __RPC_STUB IHTMLTableCell_get_background_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell_put_borderColor_Proxy(
    IHTMLTableCell* This,
    VARIANT v);
void __RPC_STUB IHTMLTableCell_put_borderColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell_get_borderColor_Proxy(
    IHTMLTableCell* This,
    VARIANT *p);
void __RPC_STUB IHTMLTableCell_get_borderColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell_put_borderColorLight_Proxy(
    IHTMLTableCell* This,
    VARIANT v);
void __RPC_STUB IHTMLTableCell_put_borderColorLight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell_get_borderColorLight_Proxy(
    IHTMLTableCell* This,
    VARIANT *p);
void __RPC_STUB IHTMLTableCell_get_borderColorLight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell_put_borderColorDark_Proxy(
    IHTMLTableCell* This,
    VARIANT v);
void __RPC_STUB IHTMLTableCell_put_borderColorDark_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell_get_borderColorDark_Proxy(
    IHTMLTableCell* This,
    VARIANT *p);
void __RPC_STUB IHTMLTableCell_get_borderColorDark_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell_put_width_Proxy(
    IHTMLTableCell* This,
    VARIANT v);
void __RPC_STUB IHTMLTableCell_put_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell_get_width_Proxy(
    IHTMLTableCell* This,
    VARIANT *p);
void __RPC_STUB IHTMLTableCell_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell_put_height_Proxy(
    IHTMLTableCell* This,
    VARIANT v);
void __RPC_STUB IHTMLTableCell_put_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell_get_height_Proxy(
    IHTMLTableCell* This,
    VARIANT *p);
void __RPC_STUB IHTMLTableCell_get_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell_get_cellIndex_Proxy(
    IHTMLTableCell* This,
    LONG *p);
void __RPC_STUB IHTMLTableCell_get_cellIndex_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLTableCell_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLTableCell2 interface
 */
#ifndef __IHTMLTableCell2_INTERFACE_DEFINED__
#define __IHTMLTableCell2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTableCell2, 0x3050f82d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f82d-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTableCell2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_abbr(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_abbr(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_axis(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_axis(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ch(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ch(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_chOff(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_chOff(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_headers(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_headers(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scope(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scope(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTableCell2, 0x3050f82d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTableCell2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTableCell2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTableCell2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTableCell2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTableCell2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTableCell2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTableCell2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTableCell2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLTableCell2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_abbr)(
        IHTMLTableCell2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_abbr)(
        IHTMLTableCell2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_axis)(
        IHTMLTableCell2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_axis)(
        IHTMLTableCell2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_ch)(
        IHTMLTableCell2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ch)(
        IHTMLTableCell2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_chOff)(
        IHTMLTableCell2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_chOff)(
        IHTMLTableCell2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_headers)(
        IHTMLTableCell2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_headers)(
        IHTMLTableCell2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_scope)(
        IHTMLTableCell2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_scope)(
        IHTMLTableCell2* This,
        BSTR *p);

    END_INTERFACE
} IHTMLTableCell2Vtbl;
interface IHTMLTableCell2 {
    CONST_VTBL IHTMLTableCell2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTableCell2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTableCell2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTableCell2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTableCell2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTableCell2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTableCell2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTableCell2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLTableCell2 methods ***/
#define IHTMLTableCell2_put_abbr(This,v) (This)->lpVtbl->put_abbr(This,v)
#define IHTMLTableCell2_get_abbr(This,p) (This)->lpVtbl->get_abbr(This,p)
#define IHTMLTableCell2_put_axis(This,v) (This)->lpVtbl->put_axis(This,v)
#define IHTMLTableCell2_get_axis(This,p) (This)->lpVtbl->get_axis(This,p)
#define IHTMLTableCell2_put_ch(This,v) (This)->lpVtbl->put_ch(This,v)
#define IHTMLTableCell2_get_ch(This,p) (This)->lpVtbl->get_ch(This,p)
#define IHTMLTableCell2_put_chOff(This,v) (This)->lpVtbl->put_chOff(This,v)
#define IHTMLTableCell2_get_chOff(This,p) (This)->lpVtbl->get_chOff(This,p)
#define IHTMLTableCell2_put_headers(This,v) (This)->lpVtbl->put_headers(This,v)
#define IHTMLTableCell2_get_headers(This,p) (This)->lpVtbl->get_headers(This,p)
#define IHTMLTableCell2_put_scope(This,v) (This)->lpVtbl->put_scope(This,v)
#define IHTMLTableCell2_get_scope(This,p) (This)->lpVtbl->get_scope(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLTableCell2_QueryInterface(IHTMLTableCell2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTableCell2_AddRef(IHTMLTableCell2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTableCell2_Release(IHTMLTableCell2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTableCell2_GetTypeInfoCount(IHTMLTableCell2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTableCell2_GetTypeInfo(IHTMLTableCell2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTableCell2_GetIDsOfNames(IHTMLTableCell2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTableCell2_Invoke(IHTMLTableCell2* 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);
}
/*** IHTMLTableCell2 methods ***/
static FORCEINLINE HRESULT IHTMLTableCell2_put_abbr(IHTMLTableCell2* This,BSTR v) {
    return This->lpVtbl->put_abbr(This,v);
}
static FORCEINLINE HRESULT IHTMLTableCell2_get_abbr(IHTMLTableCell2* This,BSTR *p) {
    return This->lpVtbl->get_abbr(This,p);
}
static FORCEINLINE HRESULT IHTMLTableCell2_put_axis(IHTMLTableCell2* This,BSTR v) {
    return This->lpVtbl->put_axis(This,v);
}
static FORCEINLINE HRESULT IHTMLTableCell2_get_axis(IHTMLTableCell2* This,BSTR *p) {
    return This->lpVtbl->get_axis(This,p);
}
static FORCEINLINE HRESULT IHTMLTableCell2_put_ch(IHTMLTableCell2* This,BSTR v) {
    return This->lpVtbl->put_ch(This,v);
}
static FORCEINLINE HRESULT IHTMLTableCell2_get_ch(IHTMLTableCell2* This,BSTR *p) {
    return This->lpVtbl->get_ch(This,p);
}
static FORCEINLINE HRESULT IHTMLTableCell2_put_chOff(IHTMLTableCell2* This,BSTR v) {
    return This->lpVtbl->put_chOff(This,v);
}
static FORCEINLINE HRESULT IHTMLTableCell2_get_chOff(IHTMLTableCell2* This,BSTR *p) {
    return This->lpVtbl->get_chOff(This,p);
}
static FORCEINLINE HRESULT IHTMLTableCell2_put_headers(IHTMLTableCell2* This,BSTR v) {
    return This->lpVtbl->put_headers(This,v);
}
static FORCEINLINE HRESULT IHTMLTableCell2_get_headers(IHTMLTableCell2* This,BSTR *p) {
    return This->lpVtbl->get_headers(This,p);
}
static FORCEINLINE HRESULT IHTMLTableCell2_put_scope(IHTMLTableCell2* This,BSTR v) {
    return This->lpVtbl->put_scope(This,v);
}
static FORCEINLINE HRESULT IHTMLTableCell2_get_scope(IHTMLTableCell2* This,BSTR *p) {
    return This->lpVtbl->get_scope(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLTableCell2_put_abbr_Proxy(
    IHTMLTableCell2* This,
    BSTR v);
void __RPC_STUB IHTMLTableCell2_put_abbr_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell2_get_abbr_Proxy(
    IHTMLTableCell2* This,
    BSTR *p);
void __RPC_STUB IHTMLTableCell2_get_abbr_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell2_put_axis_Proxy(
    IHTMLTableCell2* This,
    BSTR v);
void __RPC_STUB IHTMLTableCell2_put_axis_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell2_get_axis_Proxy(
    IHTMLTableCell2* This,
    BSTR *p);
void __RPC_STUB IHTMLTableCell2_get_axis_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell2_put_ch_Proxy(
    IHTMLTableCell2* This,
    BSTR v);
void __RPC_STUB IHTMLTableCell2_put_ch_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell2_get_ch_Proxy(
    IHTMLTableCell2* This,
    BSTR *p);
void __RPC_STUB IHTMLTableCell2_get_ch_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell2_put_chOff_Proxy(
    IHTMLTableCell2* This,
    BSTR v);
void __RPC_STUB IHTMLTableCell2_put_chOff_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell2_get_chOff_Proxy(
    IHTMLTableCell2* This,
    BSTR *p);
void __RPC_STUB IHTMLTableCell2_get_chOff_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell2_put_headers_Proxy(
    IHTMLTableCell2* This,
    BSTR v);
void __RPC_STUB IHTMLTableCell2_put_headers_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell2_get_headers_Proxy(
    IHTMLTableCell2* This,
    BSTR *p);
void __RPC_STUB IHTMLTableCell2_get_headers_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell2_put_scope_Proxy(
    IHTMLTableCell2* This,
    BSTR v);
void __RPC_STUB IHTMLTableCell2_put_scope_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell2_get_scope_Proxy(
    IHTMLTableCell2* This,
    BSTR *p);
void __RPC_STUB IHTMLTableCell2_get_scope_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLTableCell2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLTableCell3 interface
 */
#ifndef __IHTMLTableCell3_INTERFACE_DEFINED__
#define __IHTMLTableCell3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTableCell3, 0x305106c7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106c7-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTableCell3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_ch(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ch(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_chOff(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_chOff(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTableCell3, 0x305106c7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTableCell3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTableCell3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTableCell3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTableCell3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTableCell3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTableCell3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTableCell3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTableCell3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLTableCell3 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_ch)(
        IHTMLTableCell3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_ch)(
        IHTMLTableCell3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_chOff)(
        IHTMLTableCell3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_chOff)(
        IHTMLTableCell3* This,
        BSTR *p);

    END_INTERFACE
} IHTMLTableCell3Vtbl;
interface IHTMLTableCell3 {
    CONST_VTBL IHTMLTableCell3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTableCell3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTableCell3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTableCell3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTableCell3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTableCell3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTableCell3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTableCell3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLTableCell3 methods ***/
#define IHTMLTableCell3_put_ch(This,v) (This)->lpVtbl->put_ch(This,v)
#define IHTMLTableCell3_get_ch(This,p) (This)->lpVtbl->get_ch(This,p)
#define IHTMLTableCell3_put_chOff(This,v) (This)->lpVtbl->put_chOff(This,v)
#define IHTMLTableCell3_get_chOff(This,p) (This)->lpVtbl->get_chOff(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLTableCell3_QueryInterface(IHTMLTableCell3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTableCell3_AddRef(IHTMLTableCell3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTableCell3_Release(IHTMLTableCell3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTableCell3_GetTypeInfoCount(IHTMLTableCell3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTableCell3_GetTypeInfo(IHTMLTableCell3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTableCell3_GetIDsOfNames(IHTMLTableCell3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTableCell3_Invoke(IHTMLTableCell3* 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);
}
/*** IHTMLTableCell3 methods ***/
static FORCEINLINE HRESULT IHTMLTableCell3_put_ch(IHTMLTableCell3* This,BSTR v) {
    return This->lpVtbl->put_ch(This,v);
}
static FORCEINLINE HRESULT IHTMLTableCell3_get_ch(IHTMLTableCell3* This,BSTR *p) {
    return This->lpVtbl->get_ch(This,p);
}
static FORCEINLINE HRESULT IHTMLTableCell3_put_chOff(IHTMLTableCell3* This,BSTR v) {
    return This->lpVtbl->put_chOff(This,v);
}
static FORCEINLINE HRESULT IHTMLTableCell3_get_chOff(IHTMLTableCell3* This,BSTR *p) {
    return This->lpVtbl->get_chOff(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLTableCell3_put_ch_Proxy(
    IHTMLTableCell3* This,
    BSTR v);
void __RPC_STUB IHTMLTableCell3_put_ch_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell3_get_ch_Proxy(
    IHTMLTableCell3* This,
    BSTR *p);
void __RPC_STUB IHTMLTableCell3_get_ch_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell3_put_chOff_Proxy(
    IHTMLTableCell3* This,
    BSTR v);
void __RPC_STUB IHTMLTableCell3_put_chOff_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTableCell3_get_chOff_Proxy(
    IHTMLTableCell3* This,
    BSTR *p);
void __RPC_STUB IHTMLTableCell3_get_chOff_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLTableCell3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLTable dispinterface
 */
#ifndef __DispHTMLTable_DISPINTERFACE_DEFINED__
#define __DispHTMLTable_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLTable, 0x3050f532, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f532-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLTable : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLTable, 0x3050f532, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLTableVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLTable* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLTable* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLTable* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLTable* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLTable* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLTable* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLTable* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLTableVtbl;
interface DispHTMLTable {
    CONST_VTBL DispHTMLTableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLTable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLTable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLTable_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLTable_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLTable_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLTable_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLTable_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 DispHTMLTable_QueryInterface(DispHTMLTable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLTable_AddRef(DispHTMLTable* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLTable_Release(DispHTMLTable* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLTable_GetTypeInfoCount(DispHTMLTable* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLTable_GetTypeInfo(DispHTMLTable* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLTable_GetIDsOfNames(DispHTMLTable* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLTable_Invoke(DispHTMLTable* 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  /* __DispHTMLTable_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLTable coclass
 */

DEFINE_GUID(CLSID_HTMLTable, 0x3050f26b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f26b-98b5-11cf-bb82-00aa00bdce0b") HTMLTable;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLTable, 0x3050f26b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CTable;
/*****************************************************************************
 * DispHTMLTableCol dispinterface
 */
#ifndef __DispHTMLTableCol_DISPINTERFACE_DEFINED__
#define __DispHTMLTableCol_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLTableCol, 0x3050f533, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f533-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLTableCol : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLTableCol, 0x3050f533, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLTableColVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLTableCol* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLTableCol* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLTableCol* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLTableCol* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLTableCol* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLTableCol* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLTableCol* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLTableColVtbl;
interface DispHTMLTableCol {
    CONST_VTBL DispHTMLTableColVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLTableCol_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLTableCol_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLTableCol_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLTableCol_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLTableCol_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLTableCol_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLTableCol_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 DispHTMLTableCol_QueryInterface(DispHTMLTableCol* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLTableCol_AddRef(DispHTMLTableCol* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLTableCol_Release(DispHTMLTableCol* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLTableCol_GetTypeInfoCount(DispHTMLTableCol* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLTableCol_GetTypeInfo(DispHTMLTableCol* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLTableCol_GetIDsOfNames(DispHTMLTableCol* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLTableCol_Invoke(DispHTMLTableCol* 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  /* __DispHTMLTableCol_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLTableCol coclass
 */

DEFINE_GUID(CLSID_HTMLTableCol, 0x3050f26c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f26c-98b5-11cf-bb82-00aa00bdce0b") HTMLTableCol;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLTableCol, 0x3050f26c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CTableCol;
/*****************************************************************************
 * DispHTMLTableSection dispinterface
 */
#ifndef __DispHTMLTableSection_DISPINTERFACE_DEFINED__
#define __DispHTMLTableSection_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLTableSection, 0x3050f534, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f534-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLTableSection : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLTableSection, 0x3050f534, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLTableSectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLTableSection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLTableSection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLTableSection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLTableSection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLTableSection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLTableSection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLTableSection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLTableSectionVtbl;
interface DispHTMLTableSection {
    CONST_VTBL DispHTMLTableSectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLTableSection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLTableSection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLTableSection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLTableSection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLTableSection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLTableSection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLTableSection_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 DispHTMLTableSection_QueryInterface(DispHTMLTableSection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLTableSection_AddRef(DispHTMLTableSection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLTableSection_Release(DispHTMLTableSection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLTableSection_GetTypeInfoCount(DispHTMLTableSection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLTableSection_GetTypeInfo(DispHTMLTableSection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLTableSection_GetIDsOfNames(DispHTMLTableSection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLTableSection_Invoke(DispHTMLTableSection* 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  /* __DispHTMLTableSection_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLTableSection coclass
 */

DEFINE_GUID(CLSID_HTMLTableSection, 0x3050f2e9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f2e9-98b5-11cf-bb82-00aa00bdce0b") HTMLTableSection;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLTableSection, 0x3050f2e9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CTableSection;
/*****************************************************************************
 * DispHTMLTableRow dispinterface
 */
#ifndef __DispHTMLTableRow_DISPINTERFACE_DEFINED__
#define __DispHTMLTableRow_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLTableRow, 0x3050f535, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f535-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLTableRow : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLTableRow, 0x3050f535, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLTableRowVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLTableRow* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLTableRow* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLTableRow* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLTableRow* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLTableRow* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLTableRow* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLTableRow* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLTableRowVtbl;
interface DispHTMLTableRow {
    CONST_VTBL DispHTMLTableRowVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLTableRow_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLTableRow_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLTableRow_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLTableRow_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLTableRow_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLTableRow_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLTableRow_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 DispHTMLTableRow_QueryInterface(DispHTMLTableRow* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLTableRow_AddRef(DispHTMLTableRow* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLTableRow_Release(DispHTMLTableRow* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLTableRow_GetTypeInfoCount(DispHTMLTableRow* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLTableRow_GetTypeInfo(DispHTMLTableRow* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLTableRow_GetIDsOfNames(DispHTMLTableRow* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLTableRow_Invoke(DispHTMLTableRow* 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  /* __DispHTMLTableRow_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLTableRow coclass
 */

DEFINE_GUID(CLSID_HTMLTableRow, 0x3050f26d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f26d-98b5-11cf-bb82-00aa00bdce0b") HTMLTableRow;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLTableRow, 0x3050f26d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CTableRow;
/*****************************************************************************
 * DispHTMLTableCell dispinterface
 */
#ifndef __DispHTMLTableCell_DISPINTERFACE_DEFINED__
#define __DispHTMLTableCell_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLTableCell, 0x3050f536, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f536-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLTableCell : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLTableCell, 0x3050f536, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLTableCellVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLTableCell* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLTableCell* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLTableCell* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLTableCell* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLTableCell* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLTableCell* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLTableCell* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLTableCellVtbl;
interface DispHTMLTableCell {
    CONST_VTBL DispHTMLTableCellVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLTableCell_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLTableCell_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLTableCell_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLTableCell_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLTableCell_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLTableCell_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLTableCell_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 DispHTMLTableCell_QueryInterface(DispHTMLTableCell* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLTableCell_AddRef(DispHTMLTableCell* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLTableCell_Release(DispHTMLTableCell* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLTableCell_GetTypeInfoCount(DispHTMLTableCell* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLTableCell_GetTypeInfo(DispHTMLTableCell* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLTableCell_GetIDsOfNames(DispHTMLTableCell* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLTableCell_Invoke(DispHTMLTableCell* 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  /* __DispHTMLTableCell_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLTableCell coclass
 */

DEFINE_GUID(CLSID_HTMLTableCell, 0x3050f246, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f246-98b5-11cf-bb82-00aa00bdce0b") HTMLTableCell;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLTableCell, 0x3050f246, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CTableCell;
/*****************************************************************************
 * HTMLScriptEvents2 dispinterface
 */
#ifndef __HTMLScriptEvents2_DISPINTERFACE_DEFINED__
#define __HTMLScriptEvents2_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLScriptEvents2, 0x3050f621, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f621-98b5-11cf-bb82-00aa00bdce0b")
HTMLScriptEvents2 : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLScriptEvents2, 0x3050f621, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLScriptEvents2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLScriptEvents2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLScriptEvents2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLScriptEvents2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLScriptEvents2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLScriptEvents2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLScriptEvents2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLScriptEvents2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLScriptEvents2Vtbl;
interface HTMLScriptEvents2 {
    CONST_VTBL HTMLScriptEvents2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLScriptEvents2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLScriptEvents2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLScriptEvents2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLScriptEvents2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLScriptEvents2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLScriptEvents2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLScriptEvents2_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 HTMLScriptEvents2_QueryInterface(HTMLScriptEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLScriptEvents2_AddRef(HTMLScriptEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLScriptEvents2_Release(HTMLScriptEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLScriptEvents2_GetTypeInfoCount(HTMLScriptEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLScriptEvents2_GetTypeInfo(HTMLScriptEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLScriptEvents2_GetIDsOfNames(HTMLScriptEvents2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLScriptEvents2_Invoke(HTMLScriptEvents2* 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  /* __HTMLScriptEvents2_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLScriptEvents dispinterface
 */
#ifndef __HTMLScriptEvents_DISPINTERFACE_DEFINED__
#define __HTMLScriptEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLScriptEvents, 0x3050f3e2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f3e2-98b5-11cf-bb82-00aa00bdce0b")
HTMLScriptEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLScriptEvents, 0x3050f3e2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLScriptEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLScriptEvents* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLScriptEvents* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLScriptEvents* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLScriptEvents* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLScriptEvents* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLScriptEvents* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLScriptEvents* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLScriptEventsVtbl;
interface HTMLScriptEvents {
    CONST_VTBL HTMLScriptEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLScriptEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLScriptEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLScriptEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLScriptEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLScriptEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLScriptEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLScriptEvents_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 HTMLScriptEvents_QueryInterface(HTMLScriptEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLScriptEvents_AddRef(HTMLScriptEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLScriptEvents_Release(HTMLScriptEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLScriptEvents_GetTypeInfoCount(HTMLScriptEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLScriptEvents_GetTypeInfo(HTMLScriptEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLScriptEvents_GetIDsOfNames(HTMLScriptEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLScriptEvents_Invoke(HTMLScriptEvents* 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  /* __HTMLScriptEvents_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLScriptElement interface
 */
#ifndef __IHTMLScriptElement_INTERFACE_DEFINED__
#define __IHTMLScriptElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLScriptElement, 0x3050f28b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f28b-98b5-11cf-bb82-00aa00bdce0b")
IHTMLScriptElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_src(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_src(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_htmlFor(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_htmlFor(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_event(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_event(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_text(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_text(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_defer(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_defer(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_readyState(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onerror(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onerror(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_type(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLScriptElement, 0x3050f28b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLScriptElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLScriptElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLScriptElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLScriptElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLScriptElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLScriptElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLScriptElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLScriptElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLScriptElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_src)(
        IHTMLScriptElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_src)(
        IHTMLScriptElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_htmlFor)(
        IHTMLScriptElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_htmlFor)(
        IHTMLScriptElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_event)(
        IHTMLScriptElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_event)(
        IHTMLScriptElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_text)(
        IHTMLScriptElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_text)(
        IHTMLScriptElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_defer)(
        IHTMLScriptElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_defer)(
        IHTMLScriptElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_readyState)(
        IHTMLScriptElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_onerror)(
        IHTMLScriptElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onerror)(
        IHTMLScriptElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_type)(
        IHTMLScriptElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLScriptElement* This,
        BSTR *p);

    END_INTERFACE
} IHTMLScriptElementVtbl;
interface IHTMLScriptElement {
    CONST_VTBL IHTMLScriptElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLScriptElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLScriptElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLScriptElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLScriptElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLScriptElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLScriptElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLScriptElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLScriptElement methods ***/
#define IHTMLScriptElement_put_src(This,v) (This)->lpVtbl->put_src(This,v)
#define IHTMLScriptElement_get_src(This,p) (This)->lpVtbl->get_src(This,p)
#define IHTMLScriptElement_put_htmlFor(This,v) (This)->lpVtbl->put_htmlFor(This,v)
#define IHTMLScriptElement_get_htmlFor(This,p) (This)->lpVtbl->get_htmlFor(This,p)
#define IHTMLScriptElement_put_event(This,v) (This)->lpVtbl->put_event(This,v)
#define IHTMLScriptElement_get_event(This,p) (This)->lpVtbl->get_event(This,p)
#define IHTMLScriptElement_put_text(This,v) (This)->lpVtbl->put_text(This,v)
#define IHTMLScriptElement_get_text(This,p) (This)->lpVtbl->get_text(This,p)
#define IHTMLScriptElement_put_defer(This,v) (This)->lpVtbl->put_defer(This,v)
#define IHTMLScriptElement_get_defer(This,p) (This)->lpVtbl->get_defer(This,p)
#define IHTMLScriptElement_get_readyState(This,p) (This)->lpVtbl->get_readyState(This,p)
#define IHTMLScriptElement_put_onerror(This,v) (This)->lpVtbl->put_onerror(This,v)
#define IHTMLScriptElement_get_onerror(This,p) (This)->lpVtbl->get_onerror(This,p)
#define IHTMLScriptElement_put_type(This,v) (This)->lpVtbl->put_type(This,v)
#define IHTMLScriptElement_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLScriptElement_QueryInterface(IHTMLScriptElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLScriptElement_AddRef(IHTMLScriptElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLScriptElement_Release(IHTMLScriptElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLScriptElement_GetTypeInfoCount(IHTMLScriptElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLScriptElement_GetTypeInfo(IHTMLScriptElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLScriptElement_GetIDsOfNames(IHTMLScriptElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLScriptElement_Invoke(IHTMLScriptElement* 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);
}
/*** IHTMLScriptElement methods ***/
static FORCEINLINE HRESULT IHTMLScriptElement_put_src(IHTMLScriptElement* This,BSTR v) {
    return This->lpVtbl->put_src(This,v);
}
static FORCEINLINE HRESULT IHTMLScriptElement_get_src(IHTMLScriptElement* This,BSTR *p) {
    return This->lpVtbl->get_src(This,p);
}
static FORCEINLINE HRESULT IHTMLScriptElement_put_htmlFor(IHTMLScriptElement* This,BSTR v) {
    return This->lpVtbl->put_htmlFor(This,v);
}
static FORCEINLINE HRESULT IHTMLScriptElement_get_htmlFor(IHTMLScriptElement* This,BSTR *p) {
    return This->lpVtbl->get_htmlFor(This,p);
}
static FORCEINLINE HRESULT IHTMLScriptElement_put_event(IHTMLScriptElement* This,BSTR v) {
    return This->lpVtbl->put_event(This,v);
}
static FORCEINLINE HRESULT IHTMLScriptElement_get_event(IHTMLScriptElement* This,BSTR *p) {
    return This->lpVtbl->get_event(This,p);
}
static FORCEINLINE HRESULT IHTMLScriptElement_put_text(IHTMLScriptElement* This,BSTR v) {
    return This->lpVtbl->put_text(This,v);
}
static FORCEINLINE HRESULT IHTMLScriptElement_get_text(IHTMLScriptElement* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static FORCEINLINE HRESULT IHTMLScriptElement_put_defer(IHTMLScriptElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_defer(This,v);
}
static FORCEINLINE HRESULT IHTMLScriptElement_get_defer(IHTMLScriptElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_defer(This,p);
}
static FORCEINLINE HRESULT IHTMLScriptElement_get_readyState(IHTMLScriptElement* This,BSTR *p) {
    return This->lpVtbl->get_readyState(This,p);
}
static FORCEINLINE HRESULT IHTMLScriptElement_put_onerror(IHTMLScriptElement* This,VARIANT v) {
    return This->lpVtbl->put_onerror(This,v);
}
static FORCEINLINE HRESULT IHTMLScriptElement_get_onerror(IHTMLScriptElement* This,VARIANT *p) {
    return This->lpVtbl->get_onerror(This,p);
}
static FORCEINLINE HRESULT IHTMLScriptElement_put_type(IHTMLScriptElement* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static FORCEINLINE HRESULT IHTMLScriptElement_get_type(IHTMLScriptElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLScriptElement_put_src_Proxy(
    IHTMLScriptElement* This,
    BSTR v);
void __RPC_STUB IHTMLScriptElement_put_src_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLScriptElement_get_src_Proxy(
    IHTMLScriptElement* This,
    BSTR *p);
void __RPC_STUB IHTMLScriptElement_get_src_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLScriptElement_put_htmlFor_Proxy(
    IHTMLScriptElement* This,
    BSTR v);
void __RPC_STUB IHTMLScriptElement_put_htmlFor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLScriptElement_get_htmlFor_Proxy(
    IHTMLScriptElement* This,
    BSTR *p);
void __RPC_STUB IHTMLScriptElement_get_htmlFor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLScriptElement_put_event_Proxy(
    IHTMLScriptElement* This,
    BSTR v);
void __RPC_STUB IHTMLScriptElement_put_event_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLScriptElement_get_event_Proxy(
    IHTMLScriptElement* This,
    BSTR *p);
void __RPC_STUB IHTMLScriptElement_get_event_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLScriptElement_put_text_Proxy(
    IHTMLScriptElement* This,
    BSTR v);
void __RPC_STUB IHTMLScriptElement_put_text_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLScriptElement_get_text_Proxy(
    IHTMLScriptElement* This,
    BSTR *p);
void __RPC_STUB IHTMLScriptElement_get_text_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLScriptElement_put_defer_Proxy(
    IHTMLScriptElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLScriptElement_put_defer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLScriptElement_get_defer_Proxy(
    IHTMLScriptElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLScriptElement_get_defer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLScriptElement_get_readyState_Proxy(
    IHTMLScriptElement* This,
    BSTR *p);
void __RPC_STUB IHTMLScriptElement_get_readyState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLScriptElement_put_onerror_Proxy(
    IHTMLScriptElement* This,
    VARIANT v);
void __RPC_STUB IHTMLScriptElement_put_onerror_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLScriptElement_get_onerror_Proxy(
    IHTMLScriptElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLScriptElement_get_onerror_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLScriptElement_put_type_Proxy(
    IHTMLScriptElement* This,
    BSTR v);
void __RPC_STUB IHTMLScriptElement_put_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLScriptElement_get_type_Proxy(
    IHTMLScriptElement* This,
    BSTR *p);
void __RPC_STUB IHTMLScriptElement_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLScriptElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLScriptElement2 interface
 */
#ifndef __IHTMLScriptElement2_INTERFACE_DEFINED__
#define __IHTMLScriptElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLScriptElement2, 0x3050f828, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f828-98b5-11cf-bb82-00aa00bdce0b")
IHTMLScriptElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_charset(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_charset(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLScriptElement2, 0x3050f828, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLScriptElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLScriptElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLScriptElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLScriptElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLScriptElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLScriptElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLScriptElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLScriptElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLScriptElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_charset)(
        IHTMLScriptElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_charset)(
        IHTMLScriptElement2* This,
        BSTR *p);

    END_INTERFACE
} IHTMLScriptElement2Vtbl;
interface IHTMLScriptElement2 {
    CONST_VTBL IHTMLScriptElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLScriptElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLScriptElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLScriptElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLScriptElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLScriptElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLScriptElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLScriptElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLScriptElement2 methods ***/
#define IHTMLScriptElement2_put_charset(This,v) (This)->lpVtbl->put_charset(This,v)
#define IHTMLScriptElement2_get_charset(This,p) (This)->lpVtbl->get_charset(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLScriptElement2_QueryInterface(IHTMLScriptElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLScriptElement2_AddRef(IHTMLScriptElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLScriptElement2_Release(IHTMLScriptElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLScriptElement2_GetTypeInfoCount(IHTMLScriptElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLScriptElement2_GetTypeInfo(IHTMLScriptElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLScriptElement2_GetIDsOfNames(IHTMLScriptElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLScriptElement2_Invoke(IHTMLScriptElement2* 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);
}
/*** IHTMLScriptElement2 methods ***/
static FORCEINLINE HRESULT IHTMLScriptElement2_put_charset(IHTMLScriptElement2* This,BSTR v) {
    return This->lpVtbl->put_charset(This,v);
}
static FORCEINLINE HRESULT IHTMLScriptElement2_get_charset(IHTMLScriptElement2* This,BSTR *p) {
    return This->lpVtbl->get_charset(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLScriptElement2_put_charset_Proxy(
    IHTMLScriptElement2* This,
    BSTR v);
void __RPC_STUB IHTMLScriptElement2_put_charset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLScriptElement2_get_charset_Proxy(
    IHTMLScriptElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLScriptElement2_get_charset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLScriptElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLScriptElement3 interface
 */
#ifndef __IHTMLScriptElement3_INTERFACE_DEFINED__
#define __IHTMLScriptElement3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLScriptElement3, 0x30510447, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510447-98b5-11cf-bb82-00aa00bdce0b")
IHTMLScriptElement3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_src(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_src(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLScriptElement3, 0x30510447, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLScriptElement3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLScriptElement3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLScriptElement3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLScriptElement3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLScriptElement3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLScriptElement3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLScriptElement3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLScriptElement3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLScriptElement3 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_src)(
        IHTMLScriptElement3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_src)(
        IHTMLScriptElement3* This,
        BSTR *p);

    END_INTERFACE
} IHTMLScriptElement3Vtbl;
interface IHTMLScriptElement3 {
    CONST_VTBL IHTMLScriptElement3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLScriptElement3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLScriptElement3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLScriptElement3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLScriptElement3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLScriptElement3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLScriptElement3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLScriptElement3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLScriptElement3 methods ***/
#define IHTMLScriptElement3_put_src(This,v) (This)->lpVtbl->put_src(This,v)
#define IHTMLScriptElement3_get_src(This,p) (This)->lpVtbl->get_src(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLScriptElement3_QueryInterface(IHTMLScriptElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLScriptElement3_AddRef(IHTMLScriptElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLScriptElement3_Release(IHTMLScriptElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLScriptElement3_GetTypeInfoCount(IHTMLScriptElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLScriptElement3_GetTypeInfo(IHTMLScriptElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLScriptElement3_GetIDsOfNames(IHTMLScriptElement3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLScriptElement3_Invoke(IHTMLScriptElement3* 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);
}
/*** IHTMLScriptElement3 methods ***/
static FORCEINLINE HRESULT IHTMLScriptElement3_put_src(IHTMLScriptElement3* This,BSTR v) {
    return This->lpVtbl->put_src(This,v);
}
static FORCEINLINE HRESULT IHTMLScriptElement3_get_src(IHTMLScriptElement3* This,BSTR *p) {
    return This->lpVtbl->get_src(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLScriptElement3_put_src_Proxy(
    IHTMLScriptElement3* This,
    BSTR v);
void __RPC_STUB IHTMLScriptElement3_put_src_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLScriptElement3_get_src_Proxy(
    IHTMLScriptElement3* This,
    BSTR *p);
void __RPC_STUB IHTMLScriptElement3_get_src_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLScriptElement3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLScriptElement4 interface
 */
#ifndef __IHTMLScriptElement4_INTERFACE_DEFINED__
#define __IHTMLScriptElement4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLScriptElement4, 0x30510801, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510801-98b5-11cf-bb82-00aa00bdce0b")
IHTMLScriptElement4 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_usedCharset(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLScriptElement4, 0x30510801, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLScriptElement4Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLScriptElement4* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLScriptElement4* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLScriptElement4* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLScriptElement4* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLScriptElement4* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLScriptElement4* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLScriptElement4* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLScriptElement4 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_usedCharset)(
        IHTMLScriptElement4* This,
        BSTR *p);

    END_INTERFACE
} IHTMLScriptElement4Vtbl;
interface IHTMLScriptElement4 {
    CONST_VTBL IHTMLScriptElement4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLScriptElement4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLScriptElement4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLScriptElement4_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLScriptElement4_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLScriptElement4_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLScriptElement4_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLScriptElement4_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLScriptElement4 methods ***/
#define IHTMLScriptElement4_get_usedCharset(This,p) (This)->lpVtbl->get_usedCharset(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLScriptElement4_QueryInterface(IHTMLScriptElement4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLScriptElement4_AddRef(IHTMLScriptElement4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLScriptElement4_Release(IHTMLScriptElement4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLScriptElement4_GetTypeInfoCount(IHTMLScriptElement4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLScriptElement4_GetTypeInfo(IHTMLScriptElement4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLScriptElement4_GetIDsOfNames(IHTMLScriptElement4* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLScriptElement4_Invoke(IHTMLScriptElement4* 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);
}
/*** IHTMLScriptElement4 methods ***/
static FORCEINLINE HRESULT IHTMLScriptElement4_get_usedCharset(IHTMLScriptElement4* This,BSTR *p) {
    return This->lpVtbl->get_usedCharset(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLScriptElement4_get_usedCharset_Proxy(
    IHTMLScriptElement4* This,
    BSTR *p);
void __RPC_STUB IHTMLScriptElement4_get_usedCharset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLScriptElement4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLScriptElement dispinterface
 */
#ifndef __DispHTMLScriptElement_DISPINTERFACE_DEFINED__
#define __DispHTMLScriptElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLScriptElement, 0x3050f530, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f530-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLScriptElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLScriptElement, 0x3050f530, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLScriptElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLScriptElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLScriptElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLScriptElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLScriptElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLScriptElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLScriptElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLScriptElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLScriptElementVtbl;
interface DispHTMLScriptElement {
    CONST_VTBL DispHTMLScriptElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLScriptElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLScriptElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLScriptElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLScriptElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLScriptElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLScriptElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLScriptElement_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 DispHTMLScriptElement_QueryInterface(DispHTMLScriptElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLScriptElement_AddRef(DispHTMLScriptElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLScriptElement_Release(DispHTMLScriptElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLScriptElement_GetTypeInfoCount(DispHTMLScriptElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLScriptElement_GetTypeInfo(DispHTMLScriptElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLScriptElement_GetIDsOfNames(DispHTMLScriptElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLScriptElement_Invoke(DispHTMLScriptElement* 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  /* __DispHTMLScriptElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLScriptElement coclass
 */

DEFINE_GUID(CLSID_HTMLScriptElement, 0x3050f28c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f28c-98b5-11cf-bb82-00aa00bdce0b") HTMLScriptElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLScriptElement, 0x3050f28c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CScriptElement;
/*****************************************************************************
 * IHTMLNoShowElement interface
 */
#ifndef __IHTMLNoShowElement_INTERFACE_DEFINED__
#define __IHTMLNoShowElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLNoShowElement, 0x3050f38a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f38a-98b5-11cf-bb82-00aa00bdce0b")
IHTMLNoShowElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLNoShowElement, 0x3050f38a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLNoShowElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLNoShowElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLNoShowElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLNoShowElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLNoShowElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLNoShowElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLNoShowElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLNoShowElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} IHTMLNoShowElementVtbl;
interface IHTMLNoShowElement {
    CONST_VTBL IHTMLNoShowElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLNoShowElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLNoShowElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLNoShowElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLNoShowElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLNoShowElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLNoShowElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLNoShowElement_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 IHTMLNoShowElement_QueryInterface(IHTMLNoShowElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLNoShowElement_AddRef(IHTMLNoShowElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLNoShowElement_Release(IHTMLNoShowElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLNoShowElement_GetTypeInfoCount(IHTMLNoShowElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLNoShowElement_GetTypeInfo(IHTMLNoShowElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLNoShowElement_GetIDsOfNames(IHTMLNoShowElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLNoShowElement_Invoke(IHTMLNoShowElement* 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  /* __IHTMLNoShowElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLNoShowElement dispinterface
 */
#ifndef __DispHTMLNoShowElement_DISPINTERFACE_DEFINED__
#define __DispHTMLNoShowElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLNoShowElement, 0x3050f528, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f528-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLNoShowElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLNoShowElement, 0x3050f528, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLNoShowElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLNoShowElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLNoShowElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLNoShowElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLNoShowElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLNoShowElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLNoShowElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLNoShowElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLNoShowElementVtbl;
interface DispHTMLNoShowElement {
    CONST_VTBL DispHTMLNoShowElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLNoShowElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLNoShowElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLNoShowElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLNoShowElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLNoShowElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLNoShowElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLNoShowElement_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 DispHTMLNoShowElement_QueryInterface(DispHTMLNoShowElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLNoShowElement_AddRef(DispHTMLNoShowElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLNoShowElement_Release(DispHTMLNoShowElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLNoShowElement_GetTypeInfoCount(DispHTMLNoShowElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLNoShowElement_GetTypeInfo(DispHTMLNoShowElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLNoShowElement_GetIDsOfNames(DispHTMLNoShowElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLNoShowElement_Invoke(DispHTMLNoShowElement* 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  /* __DispHTMLNoShowElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLNoShowElement coclass
 */

DEFINE_GUID(CLSID_HTMLNoShowElement, 0x3050f38b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f38b-98b5-11cf-bb82-00aa00bdce0b") HTMLNoShowElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLNoShowElement, 0x3050f38b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CNoShowElement;
/*****************************************************************************
 * HTMLObjectElementEvents2 dispinterface
 */
#ifndef __HTMLObjectElementEvents2_DISPINTERFACE_DEFINED__
#define __HTMLObjectElementEvents2_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLObjectElementEvents2, 0x3050f620, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f620-98b5-11cf-bb82-00aa00bdce0b")
HTMLObjectElementEvents2 : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLObjectElementEvents2, 0x3050f620, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLObjectElementEvents2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLObjectElementEvents2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLObjectElementEvents2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLObjectElementEvents2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLObjectElementEvents2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLObjectElementEvents2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLObjectElementEvents2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLObjectElementEvents2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLObjectElementEvents2Vtbl;
interface HTMLObjectElementEvents2 {
    CONST_VTBL HTMLObjectElementEvents2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLObjectElementEvents2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLObjectElementEvents2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLObjectElementEvents2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLObjectElementEvents2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLObjectElementEvents2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLObjectElementEvents2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLObjectElementEvents2_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 HTMLObjectElementEvents2_QueryInterface(HTMLObjectElementEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLObjectElementEvents2_AddRef(HTMLObjectElementEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLObjectElementEvents2_Release(HTMLObjectElementEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLObjectElementEvents2_GetTypeInfoCount(HTMLObjectElementEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLObjectElementEvents2_GetTypeInfo(HTMLObjectElementEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLObjectElementEvents2_GetIDsOfNames(HTMLObjectElementEvents2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLObjectElementEvents2_Invoke(HTMLObjectElementEvents2* 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  /* __HTMLObjectElementEvents2_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLObjectElementEvents dispinterface
 */
#ifndef __HTMLObjectElementEvents_DISPINTERFACE_DEFINED__
#define __HTMLObjectElementEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLObjectElementEvents, 0x3050f3c4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f3c4-98b5-11cf-bb82-00aa00bdce0b")
HTMLObjectElementEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLObjectElementEvents, 0x3050f3c4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLObjectElementEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLObjectElementEvents* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLObjectElementEvents* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLObjectElementEvents* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLObjectElementEvents* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLObjectElementEvents* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLObjectElementEvents* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLObjectElementEvents* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLObjectElementEventsVtbl;
interface HTMLObjectElementEvents {
    CONST_VTBL HTMLObjectElementEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLObjectElementEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLObjectElementEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLObjectElementEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLObjectElementEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLObjectElementEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLObjectElementEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLObjectElementEvents_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 HTMLObjectElementEvents_QueryInterface(HTMLObjectElementEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLObjectElementEvents_AddRef(HTMLObjectElementEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLObjectElementEvents_Release(HTMLObjectElementEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLObjectElementEvents_GetTypeInfoCount(HTMLObjectElementEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLObjectElementEvents_GetTypeInfo(HTMLObjectElementEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLObjectElementEvents_GetIDsOfNames(HTMLObjectElementEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLObjectElementEvents_Invoke(HTMLObjectElementEvents* 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  /* __HTMLObjectElementEvents_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLObjectElement interface
 */
#ifndef __IHTMLObjectElement_INTERFACE_DEFINED__
#define __IHTMLObjectElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLObjectElement, 0x3050f24f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f24f-98b5-11cf-bb82-00aa00bdce0b")
IHTMLObjectElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_object(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_classid(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_data(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_recordset(
        IDispatch *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_recordset(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_align(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_align(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_name(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_codeBase(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_codeBase(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_codeType(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_codeType(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_code(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_code(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_BaseHref(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_type(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_form(
        IHTMLFormElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_width(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_width(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_height(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_height(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_readyState(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onreadystatechange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onreadystatechange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onerror(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onerror(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_altHtml(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_altHtml(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_vspace(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_vspace(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_hspace(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_hspace(
        LONG *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLObjectElement, 0x3050f24f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLObjectElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLObjectElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLObjectElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLObjectElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLObjectElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLObjectElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLObjectElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLObjectElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLObjectElement methods ***/
    HRESULT (STDMETHODCALLTYPE *get_object)(
        IHTMLObjectElement* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_classid)(
        IHTMLObjectElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_data)(
        IHTMLObjectElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *putref_recordset)(
        IHTMLObjectElement* This,
        IDispatch *v);

    HRESULT (STDMETHODCALLTYPE *get_recordset)(
        IHTMLObjectElement* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *put_align)(
        IHTMLObjectElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_align)(
        IHTMLObjectElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_name)(
        IHTMLObjectElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_name)(
        IHTMLObjectElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_codeBase)(
        IHTMLObjectElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_codeBase)(
        IHTMLObjectElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_codeType)(
        IHTMLObjectElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_codeType)(
        IHTMLObjectElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_code)(
        IHTMLObjectElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_code)(
        IHTMLObjectElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_BaseHref)(
        IHTMLObjectElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_type)(
        IHTMLObjectElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLObjectElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_form)(
        IHTMLObjectElement* This,
        IHTMLFormElement **p);

    HRESULT (STDMETHODCALLTYPE *put_width)(
        IHTMLObjectElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_width)(
        IHTMLObjectElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_height)(
        IHTMLObjectElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_height)(
        IHTMLObjectElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_readyState)(
        IHTMLObjectElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_onreadystatechange)(
        IHTMLObjectElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onreadystatechange)(
        IHTMLObjectElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onerror)(
        IHTMLObjectElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onerror)(
        IHTMLObjectElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_altHtml)(
        IHTMLObjectElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_altHtml)(
        IHTMLObjectElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_vspace)(
        IHTMLObjectElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_vspace)(
        IHTMLObjectElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_hspace)(
        IHTMLObjectElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_hspace)(
        IHTMLObjectElement* This,
        LONG *p);

    END_INTERFACE
} IHTMLObjectElementVtbl;
interface IHTMLObjectElement {
    CONST_VTBL IHTMLObjectElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLObjectElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLObjectElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLObjectElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLObjectElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLObjectElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLObjectElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLObjectElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLObjectElement methods ***/
#define IHTMLObjectElement_get_object(This,p) (This)->lpVtbl->get_object(This,p)
#define IHTMLObjectElement_get_classid(This,p) (This)->lpVtbl->get_classid(This,p)
#define IHTMLObjectElement_get_data(This,p) (This)->lpVtbl->get_data(This,p)
#define IHTMLObjectElement_putref_recordset(This,v) (This)->lpVtbl->putref_recordset(This,v)
#define IHTMLObjectElement_get_recordset(This,p) (This)->lpVtbl->get_recordset(This,p)
#define IHTMLObjectElement_put_align(This,v) (This)->lpVtbl->put_align(This,v)
#define IHTMLObjectElement_get_align(This,p) (This)->lpVtbl->get_align(This,p)
#define IHTMLObjectElement_put_name(This,v) (This)->lpVtbl->put_name(This,v)
#define IHTMLObjectElement_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#define IHTMLObjectElement_put_codeBase(This,v) (This)->lpVtbl->put_codeBase(This,v)
#define IHTMLObjectElement_get_codeBase(This,p) (This)->lpVtbl->get_codeBase(This,p)
#define IHTMLObjectElement_put_codeType(This,v) (This)->lpVtbl->put_codeType(This,v)
#define IHTMLObjectElement_get_codeType(This,p) (This)->lpVtbl->get_codeType(This,p)
#define IHTMLObjectElement_put_code(This,v) (This)->lpVtbl->put_code(This,v)
#define IHTMLObjectElement_get_code(This,p) (This)->lpVtbl->get_code(This,p)
#define IHTMLObjectElement_get_BaseHref(This,p) (This)->lpVtbl->get_BaseHref(This,p)
#define IHTMLObjectElement_put_type(This,v) (This)->lpVtbl->put_type(This,v)
#define IHTMLObjectElement_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#define IHTMLObjectElement_get_form(This,p) (This)->lpVtbl->get_form(This,p)
#define IHTMLObjectElement_put_width(This,v) (This)->lpVtbl->put_width(This,v)
#define IHTMLObjectElement_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#define IHTMLObjectElement_put_height(This,v) (This)->lpVtbl->put_height(This,v)
#define IHTMLObjectElement_get_height(This,p) (This)->lpVtbl->get_height(This,p)
#define IHTMLObjectElement_get_readyState(This,p) (This)->lpVtbl->get_readyState(This,p)
#define IHTMLObjectElement_put_onreadystatechange(This,v) (This)->lpVtbl->put_onreadystatechange(This,v)
#define IHTMLObjectElement_get_onreadystatechange(This,p) (This)->lpVtbl->get_onreadystatechange(This,p)
#define IHTMLObjectElement_put_onerror(This,v) (This)->lpVtbl->put_onerror(This,v)
#define IHTMLObjectElement_get_onerror(This,p) (This)->lpVtbl->get_onerror(This,p)
#define IHTMLObjectElement_put_altHtml(This,v) (This)->lpVtbl->put_altHtml(This,v)
#define IHTMLObjectElement_get_altHtml(This,p) (This)->lpVtbl->get_altHtml(This,p)
#define IHTMLObjectElement_put_vspace(This,v) (This)->lpVtbl->put_vspace(This,v)
#define IHTMLObjectElement_get_vspace(This,p) (This)->lpVtbl->get_vspace(This,p)
#define IHTMLObjectElement_put_hspace(This,v) (This)->lpVtbl->put_hspace(This,v)
#define IHTMLObjectElement_get_hspace(This,p) (This)->lpVtbl->get_hspace(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLObjectElement_QueryInterface(IHTMLObjectElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLObjectElement_AddRef(IHTMLObjectElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLObjectElement_Release(IHTMLObjectElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLObjectElement_GetTypeInfoCount(IHTMLObjectElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLObjectElement_GetTypeInfo(IHTMLObjectElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLObjectElement_GetIDsOfNames(IHTMLObjectElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLObjectElement_Invoke(IHTMLObjectElement* 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);
}
/*** IHTMLObjectElement methods ***/
static FORCEINLINE HRESULT IHTMLObjectElement_get_object(IHTMLObjectElement* This,IDispatch **p) {
    return This->lpVtbl->get_object(This,p);
}
static FORCEINLINE HRESULT IHTMLObjectElement_get_classid(IHTMLObjectElement* This,BSTR *p) {
    return This->lpVtbl->get_classid(This,p);
}
static FORCEINLINE HRESULT IHTMLObjectElement_get_data(IHTMLObjectElement* This,BSTR *p) {
    return This->lpVtbl->get_data(This,p);
}
static FORCEINLINE HRESULT IHTMLObjectElement_putref_recordset(IHTMLObjectElement* This,IDispatch *v) {
    return This->lpVtbl->putref_recordset(This,v);
}
static FORCEINLINE HRESULT IHTMLObjectElement_get_recordset(IHTMLObjectElement* This,IDispatch **p) {
    return This->lpVtbl->get_recordset(This,p);
}
static FORCEINLINE HRESULT IHTMLObjectElement_put_align(IHTMLObjectElement* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static FORCEINLINE HRESULT IHTMLObjectElement_get_align(IHTMLObjectElement* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
static FORCEINLINE HRESULT IHTMLObjectElement_put_name(IHTMLObjectElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static FORCEINLINE HRESULT IHTMLObjectElement_get_name(IHTMLObjectElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static FORCEINLINE HRESULT IHTMLObjectElement_put_codeBase(IHTMLObjectElement* This,BSTR v) {
    return This->lpVtbl->put_codeBase(This,v);
}
static FORCEINLINE HRESULT IHTMLObjectElement_get_codeBase(IHTMLObjectElement* This,BSTR *p) {
    return This->lpVtbl->get_codeBase(This,p);
}
static FORCEINLINE HRESULT IHTMLObjectElement_put_codeType(IHTMLObjectElement* This,BSTR v) {
    return This->lpVtbl->put_codeType(This,v);
}
static FORCEINLINE HRESULT IHTMLObjectElement_get_codeType(IHTMLObjectElement* This,BSTR *p) {
    return This->lpVtbl->get_codeType(This,p);
}
static FORCEINLINE HRESULT IHTMLObjectElement_put_code(IHTMLObjectElement* This,BSTR v) {
    return This->lpVtbl->put_code(This,v);
}
static FORCEINLINE HRESULT IHTMLObjectElement_get_code(IHTMLObjectElement* This,BSTR *p) {
    return This->lpVtbl->get_code(This,p);
}
static FORCEINLINE HRESULT IHTMLObjectElement_get_BaseHref(IHTMLObjectElement* This,BSTR *p) {
    return This->lpVtbl->get_BaseHref(This,p);
}
static FORCEINLINE HRESULT IHTMLObjectElement_put_type(IHTMLObjectElement* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static FORCEINLINE HRESULT IHTMLObjectElement_get_type(IHTMLObjectElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static FORCEINLINE HRESULT IHTMLObjectElement_get_form(IHTMLObjectElement* This,IHTMLFormElement **p) {
    return This->lpVtbl->get_form(This,p);
}
static FORCEINLINE HRESULT IHTMLObjectElement_put_width(IHTMLObjectElement* This,VARIANT v) {
    return This->lpVtbl->put_width(This,v);
}
static FORCEINLINE HRESULT IHTMLObjectElement_get_width(IHTMLObjectElement* This,VARIANT *p) {
    return This->lpVtbl->get_width(This,p);
}
static FORCEINLINE HRESULT IHTMLObjectElement_put_height(IHTMLObjectElement* This,VARIANT v) {
    return This->lpVtbl->put_height(This,v);
}
static FORCEINLINE HRESULT IHTMLObjectElement_get_height(IHTMLObjectElement* This,VARIANT *p) {
    return This->lpVtbl->get_height(This,p);
}
static FORCEINLINE HRESULT IHTMLObjectElement_get_readyState(IHTMLObjectElement* This,LONG *p) {
    return This->lpVtbl->get_readyState(This,p);
}
static FORCEINLINE HRESULT IHTMLObjectElement_put_onreadystatechange(IHTMLObjectElement* This,VARIANT v) {
    return This->lpVtbl->put_onreadystatechange(This,v);
}
static FORCEINLINE HRESULT IHTMLObjectElement_get_onreadystatechange(IHTMLObjectElement* This,VARIANT *p) {
    return This->lpVtbl->get_onreadystatechange(This,p);
}
static FORCEINLINE HRESULT IHTMLObjectElement_put_onerror(IHTMLObjectElement* This,VARIANT v) {
    return This->lpVtbl->put_onerror(This,v);
}
static FORCEINLINE HRESULT IHTMLObjectElement_get_onerror(IHTMLObjectElement* This,VARIANT *p) {
    return This->lpVtbl->get_onerror(This,p);
}
static FORCEINLINE HRESULT IHTMLObjectElement_put_altHtml(IHTMLObjectElement* This,BSTR v) {
    return This->lpVtbl->put_altHtml(This,v);
}
static FORCEINLINE HRESULT IHTMLObjectElement_get_altHtml(IHTMLObjectElement* This,BSTR *p) {
    return This->lpVtbl->get_altHtml(This,p);
}
static FORCEINLINE HRESULT IHTMLObjectElement_put_vspace(IHTMLObjectElement* This,LONG v) {
    return This->lpVtbl->put_vspace(This,v);
}
static FORCEINLINE HRESULT IHTMLObjectElement_get_vspace(IHTMLObjectElement* This,LONG *p) {
    return This->lpVtbl->get_vspace(This,p);
}
static FORCEINLINE HRESULT IHTMLObjectElement_put_hspace(IHTMLObjectElement* This,LONG v) {
    return This->lpVtbl->put_hspace(This,v);
}
static FORCEINLINE HRESULT IHTMLObjectElement_get_hspace(IHTMLObjectElement* This,LONG *p) {
    return This->lpVtbl->get_hspace(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLObjectElement_get_object_Proxy(
    IHTMLObjectElement* This,
    IDispatch **p);
void __RPC_STUB IHTMLObjectElement_get_object_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_get_classid_Proxy(
    IHTMLObjectElement* This,
    BSTR *p);
void __RPC_STUB IHTMLObjectElement_get_classid_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_get_data_Proxy(
    IHTMLObjectElement* This,
    BSTR *p);
void __RPC_STUB IHTMLObjectElement_get_data_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_putref_recordset_Proxy(
    IHTMLObjectElement* This,
    IDispatch *v);
void __RPC_STUB IHTMLObjectElement_putref_recordset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_get_recordset_Proxy(
    IHTMLObjectElement* This,
    IDispatch **p);
void __RPC_STUB IHTMLObjectElement_get_recordset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_put_align_Proxy(
    IHTMLObjectElement* This,
    BSTR v);
void __RPC_STUB IHTMLObjectElement_put_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_get_align_Proxy(
    IHTMLObjectElement* This,
    BSTR *p);
void __RPC_STUB IHTMLObjectElement_get_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_put_name_Proxy(
    IHTMLObjectElement* This,
    BSTR v);
void __RPC_STUB IHTMLObjectElement_put_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_get_name_Proxy(
    IHTMLObjectElement* This,
    BSTR *p);
void __RPC_STUB IHTMLObjectElement_get_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_put_codeBase_Proxy(
    IHTMLObjectElement* This,
    BSTR v);
void __RPC_STUB IHTMLObjectElement_put_codeBase_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_get_codeBase_Proxy(
    IHTMLObjectElement* This,
    BSTR *p);
void __RPC_STUB IHTMLObjectElement_get_codeBase_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_put_codeType_Proxy(
    IHTMLObjectElement* This,
    BSTR v);
void __RPC_STUB IHTMLObjectElement_put_codeType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_get_codeType_Proxy(
    IHTMLObjectElement* This,
    BSTR *p);
void __RPC_STUB IHTMLObjectElement_get_codeType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_put_code_Proxy(
    IHTMLObjectElement* This,
    BSTR v);
void __RPC_STUB IHTMLObjectElement_put_code_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_get_code_Proxy(
    IHTMLObjectElement* This,
    BSTR *p);
void __RPC_STUB IHTMLObjectElement_get_code_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_get_BaseHref_Proxy(
    IHTMLObjectElement* This,
    BSTR *p);
void __RPC_STUB IHTMLObjectElement_get_BaseHref_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_put_type_Proxy(
    IHTMLObjectElement* This,
    BSTR v);
void __RPC_STUB IHTMLObjectElement_put_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_get_type_Proxy(
    IHTMLObjectElement* This,
    BSTR *p);
void __RPC_STUB IHTMLObjectElement_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_get_form_Proxy(
    IHTMLObjectElement* This,
    IHTMLFormElement **p);
void __RPC_STUB IHTMLObjectElement_get_form_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_put_width_Proxy(
    IHTMLObjectElement* This,
    VARIANT v);
void __RPC_STUB IHTMLObjectElement_put_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_get_width_Proxy(
    IHTMLObjectElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLObjectElement_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_put_height_Proxy(
    IHTMLObjectElement* This,
    VARIANT v);
void __RPC_STUB IHTMLObjectElement_put_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_get_height_Proxy(
    IHTMLObjectElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLObjectElement_get_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_get_readyState_Proxy(
    IHTMLObjectElement* This,
    LONG *p);
void __RPC_STUB IHTMLObjectElement_get_readyState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_put_onreadystatechange_Proxy(
    IHTMLObjectElement* This,
    VARIANT v);
void __RPC_STUB IHTMLObjectElement_put_onreadystatechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_get_onreadystatechange_Proxy(
    IHTMLObjectElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLObjectElement_get_onreadystatechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_put_onerror_Proxy(
    IHTMLObjectElement* This,
    VARIANT v);
void __RPC_STUB IHTMLObjectElement_put_onerror_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_get_onerror_Proxy(
    IHTMLObjectElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLObjectElement_get_onerror_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_put_altHtml_Proxy(
    IHTMLObjectElement* This,
    BSTR v);
void __RPC_STUB IHTMLObjectElement_put_altHtml_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_get_altHtml_Proxy(
    IHTMLObjectElement* This,
    BSTR *p);
void __RPC_STUB IHTMLObjectElement_get_altHtml_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_put_vspace_Proxy(
    IHTMLObjectElement* This,
    LONG v);
void __RPC_STUB IHTMLObjectElement_put_vspace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_get_vspace_Proxy(
    IHTMLObjectElement* This,
    LONG *p);
void __RPC_STUB IHTMLObjectElement_get_vspace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_put_hspace_Proxy(
    IHTMLObjectElement* This,
    LONG v);
void __RPC_STUB IHTMLObjectElement_put_hspace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement_get_hspace_Proxy(
    IHTMLObjectElement* This,
    LONG *p);
void __RPC_STUB IHTMLObjectElement_get_hspace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLObjectElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLObjectElement2 interface
 */
#ifndef __IHTMLObjectElement2_INTERFACE_DEFINED__
#define __IHTMLObjectElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLObjectElement2, 0x3050f4cd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f4cd-98b5-11cf-bb82-00aa00bdce0b")
IHTMLObjectElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE namedRecordset(
        BSTR dataMember,
        VARIANT *hierarchy,
        IDispatch **ppRecordset) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_classid(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_classid(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_data(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_data(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLObjectElement2, 0x3050f4cd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLObjectElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLObjectElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLObjectElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLObjectElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLObjectElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLObjectElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLObjectElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLObjectElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLObjectElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *namedRecordset)(
        IHTMLObjectElement2* This,
        BSTR dataMember,
        VARIANT *hierarchy,
        IDispatch **ppRecordset);

    HRESULT (STDMETHODCALLTYPE *put_classid)(
        IHTMLObjectElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_classid)(
        IHTMLObjectElement2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_data)(
        IHTMLObjectElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_data)(
        IHTMLObjectElement2* This,
        BSTR *p);

    END_INTERFACE
} IHTMLObjectElement2Vtbl;
interface IHTMLObjectElement2 {
    CONST_VTBL IHTMLObjectElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLObjectElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLObjectElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLObjectElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLObjectElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLObjectElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLObjectElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLObjectElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLObjectElement2 methods ***/
#define IHTMLObjectElement2_namedRecordset(This,dataMember,hierarchy,ppRecordset) (This)->lpVtbl->namedRecordset(This,dataMember,hierarchy,ppRecordset)
#define IHTMLObjectElement2_put_classid(This,v) (This)->lpVtbl->put_classid(This,v)
#define IHTMLObjectElement2_get_classid(This,p) (This)->lpVtbl->get_classid(This,p)
#define IHTMLObjectElement2_put_data(This,v) (This)->lpVtbl->put_data(This,v)
#define IHTMLObjectElement2_get_data(This,p) (This)->lpVtbl->get_data(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLObjectElement2_QueryInterface(IHTMLObjectElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLObjectElement2_AddRef(IHTMLObjectElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLObjectElement2_Release(IHTMLObjectElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLObjectElement2_GetTypeInfoCount(IHTMLObjectElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLObjectElement2_GetTypeInfo(IHTMLObjectElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLObjectElement2_GetIDsOfNames(IHTMLObjectElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLObjectElement2_Invoke(IHTMLObjectElement2* 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);
}
/*** IHTMLObjectElement2 methods ***/
static FORCEINLINE HRESULT IHTMLObjectElement2_namedRecordset(IHTMLObjectElement2* This,BSTR dataMember,VARIANT *hierarchy,IDispatch **ppRecordset) {
    return This->lpVtbl->namedRecordset(This,dataMember,hierarchy,ppRecordset);
}
static FORCEINLINE HRESULT IHTMLObjectElement2_put_classid(IHTMLObjectElement2* This,BSTR v) {
    return This->lpVtbl->put_classid(This,v);
}
static FORCEINLINE HRESULT IHTMLObjectElement2_get_classid(IHTMLObjectElement2* This,BSTR *p) {
    return This->lpVtbl->get_classid(This,p);
}
static FORCEINLINE HRESULT IHTMLObjectElement2_put_data(IHTMLObjectElement2* This,BSTR v) {
    return This->lpVtbl->put_data(This,v);
}
static FORCEINLINE HRESULT IHTMLObjectElement2_get_data(IHTMLObjectElement2* This,BSTR *p) {
    return This->lpVtbl->get_data(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLObjectElement2_namedRecordset_Proxy(
    IHTMLObjectElement2* This,
    BSTR dataMember,
    VARIANT *hierarchy,
    IDispatch **ppRecordset);
void __RPC_STUB IHTMLObjectElement2_namedRecordset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement2_put_classid_Proxy(
    IHTMLObjectElement2* This,
    BSTR v);
void __RPC_STUB IHTMLObjectElement2_put_classid_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement2_get_classid_Proxy(
    IHTMLObjectElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLObjectElement2_get_classid_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement2_put_data_Proxy(
    IHTMLObjectElement2* This,
    BSTR v);
void __RPC_STUB IHTMLObjectElement2_put_data_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement2_get_data_Proxy(
    IHTMLObjectElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLObjectElement2_get_data_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLObjectElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLObjectElement3 interface
 */
#ifndef __IHTMLObjectElement3_INTERFACE_DEFINED__
#define __IHTMLObjectElement3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLObjectElement3, 0x3050f827, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f827-98b5-11cf-bb82-00aa00bdce0b")
IHTMLObjectElement3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_archive(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_archive(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_alt(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_alt(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_declare(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_declare(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_standby(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_standby(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_border(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_border(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_useMap(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_useMap(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLObjectElement3, 0x3050f827, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLObjectElement3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLObjectElement3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLObjectElement3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLObjectElement3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLObjectElement3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLObjectElement3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLObjectElement3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLObjectElement3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLObjectElement3 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_archive)(
        IHTMLObjectElement3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_archive)(
        IHTMLObjectElement3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_alt)(
        IHTMLObjectElement3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_alt)(
        IHTMLObjectElement3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_declare)(
        IHTMLObjectElement3* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_declare)(
        IHTMLObjectElement3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_standby)(
        IHTMLObjectElement3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_standby)(
        IHTMLObjectElement3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_border)(
        IHTMLObjectElement3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_border)(
        IHTMLObjectElement3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_useMap)(
        IHTMLObjectElement3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_useMap)(
        IHTMLObjectElement3* This,
        BSTR *p);

    END_INTERFACE
} IHTMLObjectElement3Vtbl;
interface IHTMLObjectElement3 {
    CONST_VTBL IHTMLObjectElement3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLObjectElement3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLObjectElement3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLObjectElement3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLObjectElement3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLObjectElement3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLObjectElement3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLObjectElement3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLObjectElement3 methods ***/
#define IHTMLObjectElement3_put_archive(This,v) (This)->lpVtbl->put_archive(This,v)
#define IHTMLObjectElement3_get_archive(This,p) (This)->lpVtbl->get_archive(This,p)
#define IHTMLObjectElement3_put_alt(This,v) (This)->lpVtbl->put_alt(This,v)
#define IHTMLObjectElement3_get_alt(This,p) (This)->lpVtbl->get_alt(This,p)
#define IHTMLObjectElement3_put_declare(This,v) (This)->lpVtbl->put_declare(This,v)
#define IHTMLObjectElement3_get_declare(This,p) (This)->lpVtbl->get_declare(This,p)
#define IHTMLObjectElement3_put_standby(This,v) (This)->lpVtbl->put_standby(This,v)
#define IHTMLObjectElement3_get_standby(This,p) (This)->lpVtbl->get_standby(This,p)
#define IHTMLObjectElement3_put_border(This,v) (This)->lpVtbl->put_border(This,v)
#define IHTMLObjectElement3_get_border(This,p) (This)->lpVtbl->get_border(This,p)
#define IHTMLObjectElement3_put_useMap(This,v) (This)->lpVtbl->put_useMap(This,v)
#define IHTMLObjectElement3_get_useMap(This,p) (This)->lpVtbl->get_useMap(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLObjectElement3_QueryInterface(IHTMLObjectElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLObjectElement3_AddRef(IHTMLObjectElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLObjectElement3_Release(IHTMLObjectElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLObjectElement3_GetTypeInfoCount(IHTMLObjectElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLObjectElement3_GetTypeInfo(IHTMLObjectElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLObjectElement3_GetIDsOfNames(IHTMLObjectElement3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLObjectElement3_Invoke(IHTMLObjectElement3* 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);
}
/*** IHTMLObjectElement3 methods ***/
static FORCEINLINE HRESULT IHTMLObjectElement3_put_archive(IHTMLObjectElement3* This,BSTR v) {
    return This->lpVtbl->put_archive(This,v);
}
static FORCEINLINE HRESULT IHTMLObjectElement3_get_archive(IHTMLObjectElement3* This,BSTR *p) {
    return This->lpVtbl->get_archive(This,p);
}
static FORCEINLINE HRESULT IHTMLObjectElement3_put_alt(IHTMLObjectElement3* This,BSTR v) {
    return This->lpVtbl->put_alt(This,v);
}
static FORCEINLINE HRESULT IHTMLObjectElement3_get_alt(IHTMLObjectElement3* This,BSTR *p) {
    return This->lpVtbl->get_alt(This,p);
}
static FORCEINLINE HRESULT IHTMLObjectElement3_put_declare(IHTMLObjectElement3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_declare(This,v);
}
static FORCEINLINE HRESULT IHTMLObjectElement3_get_declare(IHTMLObjectElement3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_declare(This,p);
}
static FORCEINLINE HRESULT IHTMLObjectElement3_put_standby(IHTMLObjectElement3* This,BSTR v) {
    return This->lpVtbl->put_standby(This,v);
}
static FORCEINLINE HRESULT IHTMLObjectElement3_get_standby(IHTMLObjectElement3* This,BSTR *p) {
    return This->lpVtbl->get_standby(This,p);
}
static FORCEINLINE HRESULT IHTMLObjectElement3_put_border(IHTMLObjectElement3* This,VARIANT v) {
    return This->lpVtbl->put_border(This,v);
}
static FORCEINLINE HRESULT IHTMLObjectElement3_get_border(IHTMLObjectElement3* This,VARIANT *p) {
    return This->lpVtbl->get_border(This,p);
}
static FORCEINLINE HRESULT IHTMLObjectElement3_put_useMap(IHTMLObjectElement3* This,BSTR v) {
    return This->lpVtbl->put_useMap(This,v);
}
static FORCEINLINE HRESULT IHTMLObjectElement3_get_useMap(IHTMLObjectElement3* This,BSTR *p) {
    return This->lpVtbl->get_useMap(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLObjectElement3_put_archive_Proxy(
    IHTMLObjectElement3* This,
    BSTR v);
void __RPC_STUB IHTMLObjectElement3_put_archive_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement3_get_archive_Proxy(
    IHTMLObjectElement3* This,
    BSTR *p);
void __RPC_STUB IHTMLObjectElement3_get_archive_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement3_put_alt_Proxy(
    IHTMLObjectElement3* This,
    BSTR v);
void __RPC_STUB IHTMLObjectElement3_put_alt_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement3_get_alt_Proxy(
    IHTMLObjectElement3* This,
    BSTR *p);
void __RPC_STUB IHTMLObjectElement3_get_alt_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement3_put_declare_Proxy(
    IHTMLObjectElement3* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLObjectElement3_put_declare_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement3_get_declare_Proxy(
    IHTMLObjectElement3* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLObjectElement3_get_declare_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement3_put_standby_Proxy(
    IHTMLObjectElement3* This,
    BSTR v);
void __RPC_STUB IHTMLObjectElement3_put_standby_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement3_get_standby_Proxy(
    IHTMLObjectElement3* This,
    BSTR *p);
void __RPC_STUB IHTMLObjectElement3_get_standby_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement3_put_border_Proxy(
    IHTMLObjectElement3* This,
    VARIANT v);
void __RPC_STUB IHTMLObjectElement3_put_border_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement3_get_border_Proxy(
    IHTMLObjectElement3* This,
    VARIANT *p);
void __RPC_STUB IHTMLObjectElement3_get_border_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement3_put_useMap_Proxy(
    IHTMLObjectElement3* This,
    BSTR v);
void __RPC_STUB IHTMLObjectElement3_put_useMap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement3_get_useMap_Proxy(
    IHTMLObjectElement3* This,
    BSTR *p);
void __RPC_STUB IHTMLObjectElement3_get_useMap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLObjectElement3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLObjectElement4 interface
 */
#ifndef __IHTMLObjectElement4_INTERFACE_DEFINED__
#define __IHTMLObjectElement4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLObjectElement4, 0x3051043e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051043e-98b5-11cf-bb82-00aa00bdce0b")
IHTMLObjectElement4 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_contentDocument(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_codeBase(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_codeBase(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_data(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_data(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLObjectElement4, 0x3051043e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLObjectElement4Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLObjectElement4* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLObjectElement4* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLObjectElement4* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLObjectElement4* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLObjectElement4* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLObjectElement4* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLObjectElement4* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLObjectElement4 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_contentDocument)(
        IHTMLObjectElement4* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *put_codeBase)(
        IHTMLObjectElement4* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_codeBase)(
        IHTMLObjectElement4* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_data)(
        IHTMLObjectElement4* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_data)(
        IHTMLObjectElement4* This,
        BSTR *p);

    END_INTERFACE
} IHTMLObjectElement4Vtbl;
interface IHTMLObjectElement4 {
    CONST_VTBL IHTMLObjectElement4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLObjectElement4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLObjectElement4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLObjectElement4_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLObjectElement4_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLObjectElement4_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLObjectElement4_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLObjectElement4_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLObjectElement4 methods ***/
#define IHTMLObjectElement4_get_contentDocument(This,p) (This)->lpVtbl->get_contentDocument(This,p)
#define IHTMLObjectElement4_put_codeBase(This,v) (This)->lpVtbl->put_codeBase(This,v)
#define IHTMLObjectElement4_get_codeBase(This,p) (This)->lpVtbl->get_codeBase(This,p)
#define IHTMLObjectElement4_put_data(This,v) (This)->lpVtbl->put_data(This,v)
#define IHTMLObjectElement4_get_data(This,p) (This)->lpVtbl->get_data(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLObjectElement4_QueryInterface(IHTMLObjectElement4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLObjectElement4_AddRef(IHTMLObjectElement4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLObjectElement4_Release(IHTMLObjectElement4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLObjectElement4_GetTypeInfoCount(IHTMLObjectElement4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLObjectElement4_GetTypeInfo(IHTMLObjectElement4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLObjectElement4_GetIDsOfNames(IHTMLObjectElement4* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLObjectElement4_Invoke(IHTMLObjectElement4* 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);
}
/*** IHTMLObjectElement4 methods ***/
static FORCEINLINE HRESULT IHTMLObjectElement4_get_contentDocument(IHTMLObjectElement4* This,IDispatch **p) {
    return This->lpVtbl->get_contentDocument(This,p);
}
static FORCEINLINE HRESULT IHTMLObjectElement4_put_codeBase(IHTMLObjectElement4* This,BSTR v) {
    return This->lpVtbl->put_codeBase(This,v);
}
static FORCEINLINE HRESULT IHTMLObjectElement4_get_codeBase(IHTMLObjectElement4* This,BSTR *p) {
    return This->lpVtbl->get_codeBase(This,p);
}
static FORCEINLINE HRESULT IHTMLObjectElement4_put_data(IHTMLObjectElement4* This,BSTR v) {
    return This->lpVtbl->put_data(This,v);
}
static FORCEINLINE HRESULT IHTMLObjectElement4_get_data(IHTMLObjectElement4* This,BSTR *p) {
    return This->lpVtbl->get_data(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLObjectElement4_get_contentDocument_Proxy(
    IHTMLObjectElement4* This,
    IDispatch **p);
void __RPC_STUB IHTMLObjectElement4_get_contentDocument_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement4_put_codeBase_Proxy(
    IHTMLObjectElement4* This,
    BSTR v);
void __RPC_STUB IHTMLObjectElement4_put_codeBase_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement4_get_codeBase_Proxy(
    IHTMLObjectElement4* This,
    BSTR *p);
void __RPC_STUB IHTMLObjectElement4_get_codeBase_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement4_put_data_Proxy(
    IHTMLObjectElement4* This,
    BSTR v);
void __RPC_STUB IHTMLObjectElement4_put_data_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement4_get_data_Proxy(
    IHTMLObjectElement4* This,
    BSTR *p);
void __RPC_STUB IHTMLObjectElement4_get_data_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLObjectElement4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLObjectElement5 interface
 */
#ifndef __IHTMLObjectElement5_INTERFACE_DEFINED__
#define __IHTMLObjectElement5_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLObjectElement5, 0x305104b5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104b5-98b5-11cf-bb82-00aa00bdce0b")
IHTMLObjectElement5 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_object(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_object(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLObjectElement5, 0x305104b5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLObjectElement5Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLObjectElement5* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLObjectElement5* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLObjectElement5* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLObjectElement5* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLObjectElement5* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLObjectElement5* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLObjectElement5* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLObjectElement5 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_object)(
        IHTMLObjectElement5* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_object)(
        IHTMLObjectElement5* This,
        BSTR *p);

    END_INTERFACE
} IHTMLObjectElement5Vtbl;
interface IHTMLObjectElement5 {
    CONST_VTBL IHTMLObjectElement5Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLObjectElement5_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLObjectElement5_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLObjectElement5_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLObjectElement5_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLObjectElement5_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLObjectElement5_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLObjectElement5_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLObjectElement5 methods ***/
#define IHTMLObjectElement5_put_object(This,v) (This)->lpVtbl->put_object(This,v)
#define IHTMLObjectElement5_get_object(This,p) (This)->lpVtbl->get_object(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLObjectElement5_QueryInterface(IHTMLObjectElement5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLObjectElement5_AddRef(IHTMLObjectElement5* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLObjectElement5_Release(IHTMLObjectElement5* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLObjectElement5_GetTypeInfoCount(IHTMLObjectElement5* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLObjectElement5_GetTypeInfo(IHTMLObjectElement5* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLObjectElement5_GetIDsOfNames(IHTMLObjectElement5* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLObjectElement5_Invoke(IHTMLObjectElement5* 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);
}
/*** IHTMLObjectElement5 methods ***/
static FORCEINLINE HRESULT IHTMLObjectElement5_put_object(IHTMLObjectElement5* This,BSTR v) {
    return This->lpVtbl->put_object(This,v);
}
static FORCEINLINE HRESULT IHTMLObjectElement5_get_object(IHTMLObjectElement5* This,BSTR *p) {
    return This->lpVtbl->get_object(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLObjectElement5_put_object_Proxy(
    IHTMLObjectElement5* This,
    BSTR v);
void __RPC_STUB IHTMLObjectElement5_put_object_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLObjectElement5_get_object_Proxy(
    IHTMLObjectElement5* This,
    BSTR *p);
void __RPC_STUB IHTMLObjectElement5_get_object_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLObjectElement5_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLParamElement interface
 */
#ifndef __IHTMLParamElement_INTERFACE_DEFINED__
#define __IHTMLParamElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLParamElement, 0x3050f83d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f83d-98b5-11cf-bb82-00aa00bdce0b")
IHTMLParamElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_name(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_value(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_value(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_type(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_valueType(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_valueType(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLParamElement, 0x3050f83d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLParamElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLParamElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLParamElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLParamElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLParamElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLParamElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLParamElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLParamElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLParamElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_name)(
        IHTMLParamElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_name)(
        IHTMLParamElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_value)(
        IHTMLParamElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_value)(
        IHTMLParamElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_type)(
        IHTMLParamElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLParamElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_valueType)(
        IHTMLParamElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_valueType)(
        IHTMLParamElement* This,
        BSTR *p);

    END_INTERFACE
} IHTMLParamElementVtbl;
interface IHTMLParamElement {
    CONST_VTBL IHTMLParamElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLParamElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLParamElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLParamElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLParamElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLParamElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLParamElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLParamElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLParamElement methods ***/
#define IHTMLParamElement_put_name(This,v) (This)->lpVtbl->put_name(This,v)
#define IHTMLParamElement_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#define IHTMLParamElement_put_value(This,v) (This)->lpVtbl->put_value(This,v)
#define IHTMLParamElement_get_value(This,p) (This)->lpVtbl->get_value(This,p)
#define IHTMLParamElement_put_type(This,v) (This)->lpVtbl->put_type(This,v)
#define IHTMLParamElement_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#define IHTMLParamElement_put_valueType(This,v) (This)->lpVtbl->put_valueType(This,v)
#define IHTMLParamElement_get_valueType(This,p) (This)->lpVtbl->get_valueType(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLParamElement_QueryInterface(IHTMLParamElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLParamElement_AddRef(IHTMLParamElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLParamElement_Release(IHTMLParamElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLParamElement_GetTypeInfoCount(IHTMLParamElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLParamElement_GetTypeInfo(IHTMLParamElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLParamElement_GetIDsOfNames(IHTMLParamElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLParamElement_Invoke(IHTMLParamElement* 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);
}
/*** IHTMLParamElement methods ***/
static FORCEINLINE HRESULT IHTMLParamElement_put_name(IHTMLParamElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static FORCEINLINE HRESULT IHTMLParamElement_get_name(IHTMLParamElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static FORCEINLINE HRESULT IHTMLParamElement_put_value(IHTMLParamElement* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static FORCEINLINE HRESULT IHTMLParamElement_get_value(IHTMLParamElement* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
static FORCEINLINE HRESULT IHTMLParamElement_put_type(IHTMLParamElement* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static FORCEINLINE HRESULT IHTMLParamElement_get_type(IHTMLParamElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static FORCEINLINE HRESULT IHTMLParamElement_put_valueType(IHTMLParamElement* This,BSTR v) {
    return This->lpVtbl->put_valueType(This,v);
}
static FORCEINLINE HRESULT IHTMLParamElement_get_valueType(IHTMLParamElement* This,BSTR *p) {
    return This->lpVtbl->get_valueType(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLParamElement_put_name_Proxy(
    IHTMLParamElement* This,
    BSTR v);
void __RPC_STUB IHTMLParamElement_put_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLParamElement_get_name_Proxy(
    IHTMLParamElement* This,
    BSTR *p);
void __RPC_STUB IHTMLParamElement_get_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLParamElement_put_value_Proxy(
    IHTMLParamElement* This,
    BSTR v);
void __RPC_STUB IHTMLParamElement_put_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLParamElement_get_value_Proxy(
    IHTMLParamElement* This,
    BSTR *p);
void __RPC_STUB IHTMLParamElement_get_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLParamElement_put_type_Proxy(
    IHTMLParamElement* This,
    BSTR v);
void __RPC_STUB IHTMLParamElement_put_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLParamElement_get_type_Proxy(
    IHTMLParamElement* This,
    BSTR *p);
void __RPC_STUB IHTMLParamElement_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLParamElement_put_valueType_Proxy(
    IHTMLParamElement* This,
    BSTR v);
void __RPC_STUB IHTMLParamElement_put_valueType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLParamElement_get_valueType_Proxy(
    IHTMLParamElement* This,
    BSTR *p);
void __RPC_STUB IHTMLParamElement_get_valueType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLParamElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLParamElement2 interface
 */
#ifndef __IHTMLParamElement2_INTERFACE_DEFINED__
#define __IHTMLParamElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLParamElement2, 0x30510444, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510444-98b5-11cf-bb82-00aa00bdce0b")
IHTMLParamElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_name(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_type(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_value(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_value(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_valueType(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_valueType(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLParamElement2, 0x30510444, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLParamElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLParamElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLParamElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLParamElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLParamElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLParamElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLParamElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLParamElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLParamElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_name)(
        IHTMLParamElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_name)(
        IHTMLParamElement2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_type)(
        IHTMLParamElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLParamElement2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_value)(
        IHTMLParamElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_value)(
        IHTMLParamElement2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_valueType)(
        IHTMLParamElement2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_valueType)(
        IHTMLParamElement2* This,
        BSTR *p);

    END_INTERFACE
} IHTMLParamElement2Vtbl;
interface IHTMLParamElement2 {
    CONST_VTBL IHTMLParamElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLParamElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLParamElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLParamElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLParamElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLParamElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLParamElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLParamElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLParamElement2 methods ***/
#define IHTMLParamElement2_put_name(This,v) (This)->lpVtbl->put_name(This,v)
#define IHTMLParamElement2_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#define IHTMLParamElement2_put_type(This,v) (This)->lpVtbl->put_type(This,v)
#define IHTMLParamElement2_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#define IHTMLParamElement2_put_value(This,v) (This)->lpVtbl->put_value(This,v)
#define IHTMLParamElement2_get_value(This,p) (This)->lpVtbl->get_value(This,p)
#define IHTMLParamElement2_put_valueType(This,v) (This)->lpVtbl->put_valueType(This,v)
#define IHTMLParamElement2_get_valueType(This,p) (This)->lpVtbl->get_valueType(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLParamElement2_QueryInterface(IHTMLParamElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLParamElement2_AddRef(IHTMLParamElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLParamElement2_Release(IHTMLParamElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLParamElement2_GetTypeInfoCount(IHTMLParamElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLParamElement2_GetTypeInfo(IHTMLParamElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLParamElement2_GetIDsOfNames(IHTMLParamElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLParamElement2_Invoke(IHTMLParamElement2* 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);
}
/*** IHTMLParamElement2 methods ***/
static FORCEINLINE HRESULT IHTMLParamElement2_put_name(IHTMLParamElement2* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static FORCEINLINE HRESULT IHTMLParamElement2_get_name(IHTMLParamElement2* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static FORCEINLINE HRESULT IHTMLParamElement2_put_type(IHTMLParamElement2* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static FORCEINLINE HRESULT IHTMLParamElement2_get_type(IHTMLParamElement2* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static FORCEINLINE HRESULT IHTMLParamElement2_put_value(IHTMLParamElement2* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static FORCEINLINE HRESULT IHTMLParamElement2_get_value(IHTMLParamElement2* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
static FORCEINLINE HRESULT IHTMLParamElement2_put_valueType(IHTMLParamElement2* This,BSTR v) {
    return This->lpVtbl->put_valueType(This,v);
}
static FORCEINLINE HRESULT IHTMLParamElement2_get_valueType(IHTMLParamElement2* This,BSTR *p) {
    return This->lpVtbl->get_valueType(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLParamElement2_put_name_Proxy(
    IHTMLParamElement2* This,
    BSTR v);
void __RPC_STUB IHTMLParamElement2_put_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLParamElement2_get_name_Proxy(
    IHTMLParamElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLParamElement2_get_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLParamElement2_put_type_Proxy(
    IHTMLParamElement2* This,
    BSTR v);
void __RPC_STUB IHTMLParamElement2_put_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLParamElement2_get_type_Proxy(
    IHTMLParamElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLParamElement2_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLParamElement2_put_value_Proxy(
    IHTMLParamElement2* This,
    BSTR v);
void __RPC_STUB IHTMLParamElement2_put_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLParamElement2_get_value_Proxy(
    IHTMLParamElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLParamElement2_get_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLParamElement2_put_valueType_Proxy(
    IHTMLParamElement2* This,
    BSTR v);
void __RPC_STUB IHTMLParamElement2_put_valueType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLParamElement2_get_valueType_Proxy(
    IHTMLParamElement2* This,
    BSTR *p);
void __RPC_STUB IHTMLParamElement2_get_valueType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLParamElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLObjectElement dispinterface
 */
#ifndef __DispHTMLObjectElement_DISPINTERFACE_DEFINED__
#define __DispHTMLObjectElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLObjectElement, 0x3050f529, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f529-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLObjectElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLObjectElement, 0x3050f529, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLObjectElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLObjectElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLObjectElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLObjectElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLObjectElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLObjectElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLObjectElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLObjectElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLObjectElementVtbl;
interface DispHTMLObjectElement {
    CONST_VTBL DispHTMLObjectElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLObjectElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLObjectElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLObjectElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLObjectElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLObjectElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLObjectElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLObjectElement_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 DispHTMLObjectElement_QueryInterface(DispHTMLObjectElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLObjectElement_AddRef(DispHTMLObjectElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLObjectElement_Release(DispHTMLObjectElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLObjectElement_GetTypeInfoCount(DispHTMLObjectElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLObjectElement_GetTypeInfo(DispHTMLObjectElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLObjectElement_GetIDsOfNames(DispHTMLObjectElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLObjectElement_Invoke(DispHTMLObjectElement* 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  /* __DispHTMLObjectElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLObjectElement coclass
 */

DEFINE_GUID(CLSID_HTMLObjectElement, 0x3050f24e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f24e-98b5-11cf-bb82-00aa00bdce0b") HTMLObjectElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLObjectElement, 0x3050f24e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CObjectElement;
/*****************************************************************************
 * DispHTMLParamElement dispinterface
 */
#ifndef __DispHTMLParamElement_DISPINTERFACE_DEFINED__
#define __DispHTMLParamElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLParamElement, 0x3050f590, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f590-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLParamElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLParamElement, 0x3050f590, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLParamElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLParamElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLParamElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLParamElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLParamElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLParamElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLParamElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLParamElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLParamElementVtbl;
interface DispHTMLParamElement {
    CONST_VTBL DispHTMLParamElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLParamElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLParamElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLParamElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLParamElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLParamElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLParamElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLParamElement_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 DispHTMLParamElement_QueryInterface(DispHTMLParamElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLParamElement_AddRef(DispHTMLParamElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLParamElement_Release(DispHTMLParamElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLParamElement_GetTypeInfoCount(DispHTMLParamElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLParamElement_GetTypeInfo(DispHTMLParamElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLParamElement_GetIDsOfNames(DispHTMLParamElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLParamElement_Invoke(DispHTMLParamElement* 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  /* __DispHTMLParamElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLParamElement coclass
 */

DEFINE_GUID(CLSID_HTMLParamElement, 0x3050f83e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f83e-98b5-11cf-bb82-00aa00bdce0b") HTMLParamElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLParamElement, 0x3050f83e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CParamElement;
/*****************************************************************************
 * HTMLFrameSiteEvents2 dispinterface
 */
#ifndef __HTMLFrameSiteEvents2_DISPINTERFACE_DEFINED__
#define __HTMLFrameSiteEvents2_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLFrameSiteEvents2, 0x3050f7ff, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f7ff-98b5-11cf-bb82-00aa00bdce0b")
HTMLFrameSiteEvents2 : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLFrameSiteEvents2, 0x3050f7ff, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLFrameSiteEvents2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLFrameSiteEvents2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLFrameSiteEvents2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLFrameSiteEvents2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLFrameSiteEvents2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLFrameSiteEvents2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLFrameSiteEvents2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLFrameSiteEvents2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLFrameSiteEvents2Vtbl;
interface HTMLFrameSiteEvents2 {
    CONST_VTBL HTMLFrameSiteEvents2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLFrameSiteEvents2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLFrameSiteEvents2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLFrameSiteEvents2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLFrameSiteEvents2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLFrameSiteEvents2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLFrameSiteEvents2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLFrameSiteEvents2_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 HTMLFrameSiteEvents2_QueryInterface(HTMLFrameSiteEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLFrameSiteEvents2_AddRef(HTMLFrameSiteEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLFrameSiteEvents2_Release(HTMLFrameSiteEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLFrameSiteEvents2_GetTypeInfoCount(HTMLFrameSiteEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLFrameSiteEvents2_GetTypeInfo(HTMLFrameSiteEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLFrameSiteEvents2_GetIDsOfNames(HTMLFrameSiteEvents2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLFrameSiteEvents2_Invoke(HTMLFrameSiteEvents2* 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  /* __HTMLFrameSiteEvents2_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLFrameSiteEvents dispinterface
 */
#ifndef __HTMLFrameSiteEvents_DISPINTERFACE_DEFINED__
#define __HTMLFrameSiteEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLFrameSiteEvents, 0x3050f800, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f800-98b5-11cf-bb82-00aa00bdce0b")
HTMLFrameSiteEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLFrameSiteEvents, 0x3050f800, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLFrameSiteEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLFrameSiteEvents* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLFrameSiteEvents* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLFrameSiteEvents* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLFrameSiteEvents* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLFrameSiteEvents* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLFrameSiteEvents* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLFrameSiteEvents* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLFrameSiteEventsVtbl;
interface HTMLFrameSiteEvents {
    CONST_VTBL HTMLFrameSiteEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLFrameSiteEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLFrameSiteEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLFrameSiteEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLFrameSiteEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLFrameSiteEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLFrameSiteEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLFrameSiteEvents_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 HTMLFrameSiteEvents_QueryInterface(HTMLFrameSiteEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLFrameSiteEvents_AddRef(HTMLFrameSiteEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLFrameSiteEvents_Release(HTMLFrameSiteEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLFrameSiteEvents_GetTypeInfoCount(HTMLFrameSiteEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLFrameSiteEvents_GetTypeInfo(HTMLFrameSiteEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLFrameSiteEvents_GetIDsOfNames(HTMLFrameSiteEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLFrameSiteEvents_Invoke(HTMLFrameSiteEvents* 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  /* __HTMLFrameSiteEvents_DISPINTERFACE_DEFINED__ */

typedef enum _frameScrolling {
    frameScrollingyes = 1,
    frameScrollingno = 2,
    frameScrollingauto = 4,
    frameScrolling_Max = 0x7fffffff
} frameScrolling;
/*****************************************************************************
 * IHTMLFrameBase interface
 */
#ifndef __IHTMLFrameBase_INTERFACE_DEFINED__
#define __IHTMLFrameBase_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLFrameBase, 0x3050f311, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f311-98b5-11cf-bb82-00aa00bdce0b")
IHTMLFrameBase : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_src(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_src(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_name(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_border(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_border(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_frameBorder(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_frameBorder(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_frameSpacing(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_frameSpacing(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_marginWidth(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_marginWidth(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_marginHeight(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_marginHeight(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_noResize(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_noResize(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrolling(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrolling(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLFrameBase, 0x3050f311, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLFrameBaseVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLFrameBase* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLFrameBase* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLFrameBase* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLFrameBase* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLFrameBase* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLFrameBase* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLFrameBase* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLFrameBase methods ***/
    HRESULT (STDMETHODCALLTYPE *put_src)(
        IHTMLFrameBase* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_src)(
        IHTMLFrameBase* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_name)(
        IHTMLFrameBase* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_name)(
        IHTMLFrameBase* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_border)(
        IHTMLFrameBase* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_border)(
        IHTMLFrameBase* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_frameBorder)(
        IHTMLFrameBase* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_frameBorder)(
        IHTMLFrameBase* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_frameSpacing)(
        IHTMLFrameBase* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_frameSpacing)(
        IHTMLFrameBase* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_marginWidth)(
        IHTMLFrameBase* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_marginWidth)(
        IHTMLFrameBase* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_marginHeight)(
        IHTMLFrameBase* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_marginHeight)(
        IHTMLFrameBase* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_noResize)(
        IHTMLFrameBase* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_noResize)(
        IHTMLFrameBase* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_scrolling)(
        IHTMLFrameBase* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_scrolling)(
        IHTMLFrameBase* This,
        BSTR *p);

    END_INTERFACE
} IHTMLFrameBaseVtbl;
interface IHTMLFrameBase {
    CONST_VTBL IHTMLFrameBaseVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLFrameBase_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLFrameBase_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLFrameBase_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLFrameBase_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLFrameBase_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLFrameBase_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLFrameBase_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLFrameBase methods ***/
#define IHTMLFrameBase_put_src(This,v) (This)->lpVtbl->put_src(This,v)
#define IHTMLFrameBase_get_src(This,p) (This)->lpVtbl->get_src(This,p)
#define IHTMLFrameBase_put_name(This,v) (This)->lpVtbl->put_name(This,v)
#define IHTMLFrameBase_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#define IHTMLFrameBase_put_border(This,v) (This)->lpVtbl->put_border(This,v)
#define IHTMLFrameBase_get_border(This,p) (This)->lpVtbl->get_border(This,p)
#define IHTMLFrameBase_put_frameBorder(This,v) (This)->lpVtbl->put_frameBorder(This,v)
#define IHTMLFrameBase_get_frameBorder(This,p) (This)->lpVtbl->get_frameBorder(This,p)
#define IHTMLFrameBase_put_frameSpacing(This,v) (This)->lpVtbl->put_frameSpacing(This,v)
#define IHTMLFrameBase_get_frameSpacing(This,p) (This)->lpVtbl->get_frameSpacing(This,p)
#define IHTMLFrameBase_put_marginWidth(This,v) (This)->lpVtbl->put_marginWidth(This,v)
#define IHTMLFrameBase_get_marginWidth(This,p) (This)->lpVtbl->get_marginWidth(This,p)
#define IHTMLFrameBase_put_marginHeight(This,v) (This)->lpVtbl->put_marginHeight(This,v)
#define IHTMLFrameBase_get_marginHeight(This,p) (This)->lpVtbl->get_marginHeight(This,p)
#define IHTMLFrameBase_put_noResize(This,v) (This)->lpVtbl->put_noResize(This,v)
#define IHTMLFrameBase_get_noResize(This,p) (This)->lpVtbl->get_noResize(This,p)
#define IHTMLFrameBase_put_scrolling(This,v) (This)->lpVtbl->put_scrolling(This,v)
#define IHTMLFrameBase_get_scrolling(This,p) (This)->lpVtbl->get_scrolling(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLFrameBase_QueryInterface(IHTMLFrameBase* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLFrameBase_AddRef(IHTMLFrameBase* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLFrameBase_Release(IHTMLFrameBase* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLFrameBase_GetTypeInfoCount(IHTMLFrameBase* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLFrameBase_GetTypeInfo(IHTMLFrameBase* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLFrameBase_GetIDsOfNames(IHTMLFrameBase* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLFrameBase_Invoke(IHTMLFrameBase* 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);
}
/*** IHTMLFrameBase methods ***/
static FORCEINLINE HRESULT IHTMLFrameBase_put_src(IHTMLFrameBase* This,BSTR v) {
    return This->lpVtbl->put_src(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameBase_get_src(IHTMLFrameBase* This,BSTR *p) {
    return This->lpVtbl->get_src(This,p);
}
static FORCEINLINE HRESULT IHTMLFrameBase_put_name(IHTMLFrameBase* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameBase_get_name(IHTMLFrameBase* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static FORCEINLINE HRESULT IHTMLFrameBase_put_border(IHTMLFrameBase* This,VARIANT v) {
    return This->lpVtbl->put_border(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameBase_get_border(IHTMLFrameBase* This,VARIANT *p) {
    return This->lpVtbl->get_border(This,p);
}
static FORCEINLINE HRESULT IHTMLFrameBase_put_frameBorder(IHTMLFrameBase* This,BSTR v) {
    return This->lpVtbl->put_frameBorder(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameBase_get_frameBorder(IHTMLFrameBase* This,BSTR *p) {
    return This->lpVtbl->get_frameBorder(This,p);
}
static FORCEINLINE HRESULT IHTMLFrameBase_put_frameSpacing(IHTMLFrameBase* This,VARIANT v) {
    return This->lpVtbl->put_frameSpacing(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameBase_get_frameSpacing(IHTMLFrameBase* This,VARIANT *p) {
    return This->lpVtbl->get_frameSpacing(This,p);
}
static FORCEINLINE HRESULT IHTMLFrameBase_put_marginWidth(IHTMLFrameBase* This,VARIANT v) {
    return This->lpVtbl->put_marginWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameBase_get_marginWidth(IHTMLFrameBase* This,VARIANT *p) {
    return This->lpVtbl->get_marginWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLFrameBase_put_marginHeight(IHTMLFrameBase* This,VARIANT v) {
    return This->lpVtbl->put_marginHeight(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameBase_get_marginHeight(IHTMLFrameBase* This,VARIANT *p) {
    return This->lpVtbl->get_marginHeight(This,p);
}
static FORCEINLINE HRESULT IHTMLFrameBase_put_noResize(IHTMLFrameBase* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_noResize(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameBase_get_noResize(IHTMLFrameBase* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_noResize(This,p);
}
static FORCEINLINE HRESULT IHTMLFrameBase_put_scrolling(IHTMLFrameBase* This,BSTR v) {
    return This->lpVtbl->put_scrolling(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameBase_get_scrolling(IHTMLFrameBase* This,BSTR *p) {
    return This->lpVtbl->get_scrolling(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLFrameBase_put_src_Proxy(
    IHTMLFrameBase* This,
    BSTR v);
void __RPC_STUB IHTMLFrameBase_put_src_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameBase_get_src_Proxy(
    IHTMLFrameBase* This,
    BSTR *p);
void __RPC_STUB IHTMLFrameBase_get_src_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameBase_put_name_Proxy(
    IHTMLFrameBase* This,
    BSTR v);
void __RPC_STUB IHTMLFrameBase_put_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameBase_get_name_Proxy(
    IHTMLFrameBase* This,
    BSTR *p);
void __RPC_STUB IHTMLFrameBase_get_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameBase_put_border_Proxy(
    IHTMLFrameBase* This,
    VARIANT v);
void __RPC_STUB IHTMLFrameBase_put_border_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameBase_get_border_Proxy(
    IHTMLFrameBase* This,
    VARIANT *p);
void __RPC_STUB IHTMLFrameBase_get_border_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameBase_put_frameBorder_Proxy(
    IHTMLFrameBase* This,
    BSTR v);
void __RPC_STUB IHTMLFrameBase_put_frameBorder_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameBase_get_frameBorder_Proxy(
    IHTMLFrameBase* This,
    BSTR *p);
void __RPC_STUB IHTMLFrameBase_get_frameBorder_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameBase_put_frameSpacing_Proxy(
    IHTMLFrameBase* This,
    VARIANT v);
void __RPC_STUB IHTMLFrameBase_put_frameSpacing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameBase_get_frameSpacing_Proxy(
    IHTMLFrameBase* This,
    VARIANT *p);
void __RPC_STUB IHTMLFrameBase_get_frameSpacing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameBase_put_marginWidth_Proxy(
    IHTMLFrameBase* This,
    VARIANT v);
void __RPC_STUB IHTMLFrameBase_put_marginWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameBase_get_marginWidth_Proxy(
    IHTMLFrameBase* This,
    VARIANT *p);
void __RPC_STUB IHTMLFrameBase_get_marginWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameBase_put_marginHeight_Proxy(
    IHTMLFrameBase* This,
    VARIANT v);
void __RPC_STUB IHTMLFrameBase_put_marginHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameBase_get_marginHeight_Proxy(
    IHTMLFrameBase* This,
    VARIANT *p);
void __RPC_STUB IHTMLFrameBase_get_marginHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameBase_put_noResize_Proxy(
    IHTMLFrameBase* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLFrameBase_put_noResize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameBase_get_noResize_Proxy(
    IHTMLFrameBase* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLFrameBase_get_noResize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameBase_put_scrolling_Proxy(
    IHTMLFrameBase* This,
    BSTR v);
void __RPC_STUB IHTMLFrameBase_put_scrolling_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameBase_get_scrolling_Proxy(
    IHTMLFrameBase* This,
    BSTR *p);
void __RPC_STUB IHTMLFrameBase_get_scrolling_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLFrameBase_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLFrameBase2 interface
 */
#ifndef __IHTMLFrameBase2_INTERFACE_DEFINED__
#define __IHTMLFrameBase2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLFrameBase2, 0x3050f6db, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f6db-98b5-11cf-bb82-00aa00bdce0b")
IHTMLFrameBase2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_contentWindow(
        IHTMLWindow2 **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onload(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onload(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onreadystatechange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onreadystatechange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_readyState(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_allowTransparency(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_allowTransparency(
        VARIANT_BOOL *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLFrameBase2, 0x3050f6db, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLFrameBase2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLFrameBase2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLFrameBase2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLFrameBase2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLFrameBase2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLFrameBase2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLFrameBase2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLFrameBase2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLFrameBase2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_contentWindow)(
        IHTMLFrameBase2* This,
        IHTMLWindow2 **p);

    HRESULT (STDMETHODCALLTYPE *put_onload)(
        IHTMLFrameBase2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onload)(
        IHTMLFrameBase2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onreadystatechange)(
        IHTMLFrameBase2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onreadystatechange)(
        IHTMLFrameBase2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_readyState)(
        IHTMLFrameBase2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_allowTransparency)(
        IHTMLFrameBase2* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_allowTransparency)(
        IHTMLFrameBase2* This,
        VARIANT_BOOL *p);

    END_INTERFACE
} IHTMLFrameBase2Vtbl;
interface IHTMLFrameBase2 {
    CONST_VTBL IHTMLFrameBase2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLFrameBase2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLFrameBase2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLFrameBase2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLFrameBase2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLFrameBase2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLFrameBase2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLFrameBase2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLFrameBase2 methods ***/
#define IHTMLFrameBase2_get_contentWindow(This,p) (This)->lpVtbl->get_contentWindow(This,p)
#define IHTMLFrameBase2_put_onload(This,v) (This)->lpVtbl->put_onload(This,v)
#define IHTMLFrameBase2_get_onload(This,p) (This)->lpVtbl->get_onload(This,p)
#define IHTMLFrameBase2_put_onreadystatechange(This,v) (This)->lpVtbl->put_onreadystatechange(This,v)
#define IHTMLFrameBase2_get_onreadystatechange(This,p) (This)->lpVtbl->get_onreadystatechange(This,p)
#define IHTMLFrameBase2_get_readyState(This,p) (This)->lpVtbl->get_readyState(This,p)
#define IHTMLFrameBase2_put_allowTransparency(This,v) (This)->lpVtbl->put_allowTransparency(This,v)
#define IHTMLFrameBase2_get_allowTransparency(This,p) (This)->lpVtbl->get_allowTransparency(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLFrameBase2_QueryInterface(IHTMLFrameBase2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLFrameBase2_AddRef(IHTMLFrameBase2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLFrameBase2_Release(IHTMLFrameBase2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLFrameBase2_GetTypeInfoCount(IHTMLFrameBase2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLFrameBase2_GetTypeInfo(IHTMLFrameBase2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLFrameBase2_GetIDsOfNames(IHTMLFrameBase2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLFrameBase2_Invoke(IHTMLFrameBase2* 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);
}
/*** IHTMLFrameBase2 methods ***/
static FORCEINLINE HRESULT IHTMLFrameBase2_get_contentWindow(IHTMLFrameBase2* This,IHTMLWindow2 **p) {
    return This->lpVtbl->get_contentWindow(This,p);
}
static FORCEINLINE HRESULT IHTMLFrameBase2_put_onload(IHTMLFrameBase2* This,VARIANT v) {
    return This->lpVtbl->put_onload(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameBase2_get_onload(IHTMLFrameBase2* This,VARIANT *p) {
    return This->lpVtbl->get_onload(This,p);
}
static FORCEINLINE HRESULT IHTMLFrameBase2_put_onreadystatechange(IHTMLFrameBase2* This,VARIANT v) {
    return This->lpVtbl->put_onreadystatechange(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameBase2_get_onreadystatechange(IHTMLFrameBase2* This,VARIANT *p) {
    return This->lpVtbl->get_onreadystatechange(This,p);
}
static FORCEINLINE HRESULT IHTMLFrameBase2_get_readyState(IHTMLFrameBase2* This,BSTR *p) {
    return This->lpVtbl->get_readyState(This,p);
}
static FORCEINLINE HRESULT IHTMLFrameBase2_put_allowTransparency(IHTMLFrameBase2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_allowTransparency(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameBase2_get_allowTransparency(IHTMLFrameBase2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_allowTransparency(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLFrameBase2_get_contentWindow_Proxy(
    IHTMLFrameBase2* This,
    IHTMLWindow2 **p);
void __RPC_STUB IHTMLFrameBase2_get_contentWindow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameBase2_put_onload_Proxy(
    IHTMLFrameBase2* This,
    VARIANT v);
void __RPC_STUB IHTMLFrameBase2_put_onload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameBase2_get_onload_Proxy(
    IHTMLFrameBase2* This,
    VARIANT *p);
void __RPC_STUB IHTMLFrameBase2_get_onload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameBase2_put_onreadystatechange_Proxy(
    IHTMLFrameBase2* This,
    VARIANT v);
void __RPC_STUB IHTMLFrameBase2_put_onreadystatechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameBase2_get_onreadystatechange_Proxy(
    IHTMLFrameBase2* This,
    VARIANT *p);
void __RPC_STUB IHTMLFrameBase2_get_onreadystatechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameBase2_get_readyState_Proxy(
    IHTMLFrameBase2* This,
    BSTR *p);
void __RPC_STUB IHTMLFrameBase2_get_readyState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameBase2_put_allowTransparency_Proxy(
    IHTMLFrameBase2* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLFrameBase2_put_allowTransparency_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameBase2_get_allowTransparency_Proxy(
    IHTMLFrameBase2* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLFrameBase2_get_allowTransparency_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLFrameBase2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLFrameBase3 interface
 */
#ifndef __IHTMLFrameBase3_INTERFACE_DEFINED__
#define __IHTMLFrameBase3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLFrameBase3, 0x3050f82e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f82e-98b5-11cf-bb82-00aa00bdce0b")
IHTMLFrameBase3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_longDesc(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_longDesc(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLFrameBase3, 0x3050f82e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLFrameBase3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLFrameBase3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLFrameBase3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLFrameBase3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLFrameBase3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLFrameBase3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLFrameBase3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLFrameBase3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLFrameBase3 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_longDesc)(
        IHTMLFrameBase3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_longDesc)(
        IHTMLFrameBase3* This,
        BSTR *p);

    END_INTERFACE
} IHTMLFrameBase3Vtbl;
interface IHTMLFrameBase3 {
    CONST_VTBL IHTMLFrameBase3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLFrameBase3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLFrameBase3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLFrameBase3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLFrameBase3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLFrameBase3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLFrameBase3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLFrameBase3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLFrameBase3 methods ***/
#define IHTMLFrameBase3_put_longDesc(This,v) (This)->lpVtbl->put_longDesc(This,v)
#define IHTMLFrameBase3_get_longDesc(This,p) (This)->lpVtbl->get_longDesc(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLFrameBase3_QueryInterface(IHTMLFrameBase3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLFrameBase3_AddRef(IHTMLFrameBase3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLFrameBase3_Release(IHTMLFrameBase3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLFrameBase3_GetTypeInfoCount(IHTMLFrameBase3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLFrameBase3_GetTypeInfo(IHTMLFrameBase3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLFrameBase3_GetIDsOfNames(IHTMLFrameBase3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLFrameBase3_Invoke(IHTMLFrameBase3* 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);
}
/*** IHTMLFrameBase3 methods ***/
static FORCEINLINE HRESULT IHTMLFrameBase3_put_longDesc(IHTMLFrameBase3* This,BSTR v) {
    return This->lpVtbl->put_longDesc(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameBase3_get_longDesc(IHTMLFrameBase3* This,BSTR *p) {
    return This->lpVtbl->get_longDesc(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLFrameBase3_put_longDesc_Proxy(
    IHTMLFrameBase3* This,
    BSTR v);
void __RPC_STUB IHTMLFrameBase3_put_longDesc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameBase3_get_longDesc_Proxy(
    IHTMLFrameBase3* This,
    BSTR *p);
void __RPC_STUB IHTMLFrameBase3_get_longDesc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLFrameBase3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLFrameBase dispinterface
 */
#ifndef __DispHTMLFrameBase_DISPINTERFACE_DEFINED__
#define __DispHTMLFrameBase_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLFrameBase, 0x3050f541, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f541-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLFrameBase : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLFrameBase, 0x3050f541, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLFrameBaseVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLFrameBase* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLFrameBase* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLFrameBase* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLFrameBase* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLFrameBase* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLFrameBase* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLFrameBase* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLFrameBaseVtbl;
interface DispHTMLFrameBase {
    CONST_VTBL DispHTMLFrameBaseVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLFrameBase_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLFrameBase_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLFrameBase_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLFrameBase_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLFrameBase_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLFrameBase_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLFrameBase_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 DispHTMLFrameBase_QueryInterface(DispHTMLFrameBase* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLFrameBase_AddRef(DispHTMLFrameBase* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLFrameBase_Release(DispHTMLFrameBase* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLFrameBase_GetTypeInfoCount(DispHTMLFrameBase* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLFrameBase_GetTypeInfo(DispHTMLFrameBase* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLFrameBase_GetIDsOfNames(DispHTMLFrameBase* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLFrameBase_Invoke(DispHTMLFrameBase* 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  /* __DispHTMLFrameBase_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLFrameBase coclass
 */

DEFINE_GUID(CLSID_HTMLFrameBase, 0x3050f312, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f312-98b5-11cf-bb82-00aa00bdce0b") HTMLFrameBase;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLFrameBase, 0x3050f312, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CFrameSite;
/*****************************************************************************
 * IHTMLFrameElement interface
 */
#ifndef __IHTMLFrameElement_INTERFACE_DEFINED__
#define __IHTMLFrameElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLFrameElement, 0x3050f313, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f313-98b5-11cf-bb82-00aa00bdce0b")
IHTMLFrameElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_borderColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderColor(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLFrameElement, 0x3050f313, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLFrameElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLFrameElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLFrameElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLFrameElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLFrameElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLFrameElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLFrameElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLFrameElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLFrameElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_borderColor)(
        IHTMLFrameElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderColor)(
        IHTMLFrameElement* This,
        VARIANT *p);

    END_INTERFACE
} IHTMLFrameElementVtbl;
interface IHTMLFrameElement {
    CONST_VTBL IHTMLFrameElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLFrameElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLFrameElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLFrameElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLFrameElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLFrameElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLFrameElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLFrameElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLFrameElement methods ***/
#define IHTMLFrameElement_put_borderColor(This,v) (This)->lpVtbl->put_borderColor(This,v)
#define IHTMLFrameElement_get_borderColor(This,p) (This)->lpVtbl->get_borderColor(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLFrameElement_QueryInterface(IHTMLFrameElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLFrameElement_AddRef(IHTMLFrameElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLFrameElement_Release(IHTMLFrameElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLFrameElement_GetTypeInfoCount(IHTMLFrameElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLFrameElement_GetTypeInfo(IHTMLFrameElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLFrameElement_GetIDsOfNames(IHTMLFrameElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLFrameElement_Invoke(IHTMLFrameElement* 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);
}
/*** IHTMLFrameElement methods ***/
static FORCEINLINE HRESULT IHTMLFrameElement_put_borderColor(IHTMLFrameElement* This,VARIANT v) {
    return This->lpVtbl->put_borderColor(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameElement_get_borderColor(IHTMLFrameElement* This,VARIANT *p) {
    return This->lpVtbl->get_borderColor(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLFrameElement_put_borderColor_Proxy(
    IHTMLFrameElement* This,
    VARIANT v);
void __RPC_STUB IHTMLFrameElement_put_borderColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameElement_get_borderColor_Proxy(
    IHTMLFrameElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLFrameElement_get_borderColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLFrameElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLFrameElement2 interface
 */
#ifndef __IHTMLFrameElement2_INTERFACE_DEFINED__
#define __IHTMLFrameElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLFrameElement2, 0x3050f7f5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f7f5-98b5-11cf-bb82-00aa00bdce0b")
IHTMLFrameElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_height(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_height(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_width(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_width(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLFrameElement2, 0x3050f7f5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLFrameElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLFrameElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLFrameElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLFrameElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLFrameElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLFrameElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLFrameElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLFrameElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLFrameElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_height)(
        IHTMLFrameElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_height)(
        IHTMLFrameElement2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_width)(
        IHTMLFrameElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_width)(
        IHTMLFrameElement2* This,
        VARIANT *p);

    END_INTERFACE
} IHTMLFrameElement2Vtbl;
interface IHTMLFrameElement2 {
    CONST_VTBL IHTMLFrameElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLFrameElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLFrameElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLFrameElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLFrameElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLFrameElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLFrameElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLFrameElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLFrameElement2 methods ***/
#define IHTMLFrameElement2_put_height(This,v) (This)->lpVtbl->put_height(This,v)
#define IHTMLFrameElement2_get_height(This,p) (This)->lpVtbl->get_height(This,p)
#define IHTMLFrameElement2_put_width(This,v) (This)->lpVtbl->put_width(This,v)
#define IHTMLFrameElement2_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLFrameElement2_QueryInterface(IHTMLFrameElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLFrameElement2_AddRef(IHTMLFrameElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLFrameElement2_Release(IHTMLFrameElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLFrameElement2_GetTypeInfoCount(IHTMLFrameElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLFrameElement2_GetTypeInfo(IHTMLFrameElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLFrameElement2_GetIDsOfNames(IHTMLFrameElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLFrameElement2_Invoke(IHTMLFrameElement2* 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);
}
/*** IHTMLFrameElement2 methods ***/
static FORCEINLINE HRESULT IHTMLFrameElement2_put_height(IHTMLFrameElement2* This,VARIANT v) {
    return This->lpVtbl->put_height(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameElement2_get_height(IHTMLFrameElement2* This,VARIANT *p) {
    return This->lpVtbl->get_height(This,p);
}
static FORCEINLINE HRESULT IHTMLFrameElement2_put_width(IHTMLFrameElement2* This,VARIANT v) {
    return This->lpVtbl->put_width(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameElement2_get_width(IHTMLFrameElement2* This,VARIANT *p) {
    return This->lpVtbl->get_width(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLFrameElement2_put_height_Proxy(
    IHTMLFrameElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLFrameElement2_put_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameElement2_get_height_Proxy(
    IHTMLFrameElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLFrameElement2_get_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameElement2_put_width_Proxy(
    IHTMLFrameElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLFrameElement2_put_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameElement2_get_width_Proxy(
    IHTMLFrameElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLFrameElement2_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLFrameElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLFrameElement3 interface
 */
#ifndef __IHTMLFrameElement3_INTERFACE_DEFINED__
#define __IHTMLFrameElement3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLFrameElement3, 0x3051042d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051042d-98b5-11cf-bb82-00aa00bdce0b")
IHTMLFrameElement3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_contentDocument(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_src(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_src(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_longDesc(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_longDesc(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_frameBorder(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_frameBorder(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLFrameElement3, 0x3051042d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLFrameElement3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLFrameElement3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLFrameElement3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLFrameElement3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLFrameElement3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLFrameElement3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLFrameElement3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLFrameElement3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLFrameElement3 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_contentDocument)(
        IHTMLFrameElement3* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *put_src)(
        IHTMLFrameElement3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_src)(
        IHTMLFrameElement3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_longDesc)(
        IHTMLFrameElement3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_longDesc)(
        IHTMLFrameElement3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_frameBorder)(
        IHTMLFrameElement3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_frameBorder)(
        IHTMLFrameElement3* This,
        BSTR *p);

    END_INTERFACE
} IHTMLFrameElement3Vtbl;
interface IHTMLFrameElement3 {
    CONST_VTBL IHTMLFrameElement3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLFrameElement3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLFrameElement3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLFrameElement3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLFrameElement3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLFrameElement3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLFrameElement3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLFrameElement3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLFrameElement3 methods ***/
#define IHTMLFrameElement3_get_contentDocument(This,p) (This)->lpVtbl->get_contentDocument(This,p)
#define IHTMLFrameElement3_put_src(This,v) (This)->lpVtbl->put_src(This,v)
#define IHTMLFrameElement3_get_src(This,p) (This)->lpVtbl->get_src(This,p)
#define IHTMLFrameElement3_put_longDesc(This,v) (This)->lpVtbl->put_longDesc(This,v)
#define IHTMLFrameElement3_get_longDesc(This,p) (This)->lpVtbl->get_longDesc(This,p)
#define IHTMLFrameElement3_put_frameBorder(This,v) (This)->lpVtbl->put_frameBorder(This,v)
#define IHTMLFrameElement3_get_frameBorder(This,p) (This)->lpVtbl->get_frameBorder(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLFrameElement3_QueryInterface(IHTMLFrameElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLFrameElement3_AddRef(IHTMLFrameElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLFrameElement3_Release(IHTMLFrameElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLFrameElement3_GetTypeInfoCount(IHTMLFrameElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLFrameElement3_GetTypeInfo(IHTMLFrameElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLFrameElement3_GetIDsOfNames(IHTMLFrameElement3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLFrameElement3_Invoke(IHTMLFrameElement3* 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);
}
/*** IHTMLFrameElement3 methods ***/
static FORCEINLINE HRESULT IHTMLFrameElement3_get_contentDocument(IHTMLFrameElement3* This,IDispatch **p) {
    return This->lpVtbl->get_contentDocument(This,p);
}
static FORCEINLINE HRESULT IHTMLFrameElement3_put_src(IHTMLFrameElement3* This,BSTR v) {
    return This->lpVtbl->put_src(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameElement3_get_src(IHTMLFrameElement3* This,BSTR *p) {
    return This->lpVtbl->get_src(This,p);
}
static FORCEINLINE HRESULT IHTMLFrameElement3_put_longDesc(IHTMLFrameElement3* This,BSTR v) {
    return This->lpVtbl->put_longDesc(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameElement3_get_longDesc(IHTMLFrameElement3* This,BSTR *p) {
    return This->lpVtbl->get_longDesc(This,p);
}
static FORCEINLINE HRESULT IHTMLFrameElement3_put_frameBorder(IHTMLFrameElement3* This,BSTR v) {
    return This->lpVtbl->put_frameBorder(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameElement3_get_frameBorder(IHTMLFrameElement3* This,BSTR *p) {
    return This->lpVtbl->get_frameBorder(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLFrameElement3_get_contentDocument_Proxy(
    IHTMLFrameElement3* This,
    IDispatch **p);
void __RPC_STUB IHTMLFrameElement3_get_contentDocument_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameElement3_put_src_Proxy(
    IHTMLFrameElement3* This,
    BSTR v);
void __RPC_STUB IHTMLFrameElement3_put_src_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameElement3_get_src_Proxy(
    IHTMLFrameElement3* This,
    BSTR *p);
void __RPC_STUB IHTMLFrameElement3_get_src_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameElement3_put_longDesc_Proxy(
    IHTMLFrameElement3* This,
    BSTR v);
void __RPC_STUB IHTMLFrameElement3_put_longDesc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameElement3_get_longDesc_Proxy(
    IHTMLFrameElement3* This,
    BSTR *p);
void __RPC_STUB IHTMLFrameElement3_get_longDesc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameElement3_put_frameBorder_Proxy(
    IHTMLFrameElement3* This,
    BSTR v);
void __RPC_STUB IHTMLFrameElement3_put_frameBorder_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameElement3_get_frameBorder_Proxy(
    IHTMLFrameElement3* This,
    BSTR *p);
void __RPC_STUB IHTMLFrameElement3_get_frameBorder_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLFrameElement3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLFrameElement dispinterface
 */
#ifndef __DispHTMLFrameElement_DISPINTERFACE_DEFINED__
#define __DispHTMLFrameElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLFrameElement, 0x3050f513, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f513-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLFrameElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLFrameElement, 0x3050f513, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLFrameElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLFrameElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLFrameElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLFrameElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLFrameElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLFrameElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLFrameElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLFrameElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLFrameElementVtbl;
interface DispHTMLFrameElement {
    CONST_VTBL DispHTMLFrameElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLFrameElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLFrameElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLFrameElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLFrameElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLFrameElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLFrameElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLFrameElement_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 DispHTMLFrameElement_QueryInterface(DispHTMLFrameElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLFrameElement_AddRef(DispHTMLFrameElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLFrameElement_Release(DispHTMLFrameElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLFrameElement_GetTypeInfoCount(DispHTMLFrameElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLFrameElement_GetTypeInfo(DispHTMLFrameElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLFrameElement_GetIDsOfNames(DispHTMLFrameElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLFrameElement_Invoke(DispHTMLFrameElement* 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  /* __DispHTMLFrameElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLFrameElement coclass
 */

DEFINE_GUID(CLSID_HTMLFrameElement, 0x3050f314, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f314-98b5-11cf-bb82-00aa00bdce0b") HTMLFrameElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLFrameElement, 0x3050f314, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CFrameElement;
typedef enum _sandboxAllow {
    sandboxAllowScripts = 0,
    sandboxAllowSameOrigin = 1,
    sandboxAllowTopNavigation = 2,
    sandboxAllowForms = 3,
    sandboxAllowPopups = 4,
    sandboxAllow_Max = 0x7fffffff
} sandboxAllow;
/*****************************************************************************
 * IHTMLIFrameElement interface
 */
#ifndef __IHTMLIFrameElement_INTERFACE_DEFINED__
#define __IHTMLIFrameElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLIFrameElement, 0x3050f315, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f315-98b5-11cf-bb82-00aa00bdce0b")
IHTMLIFrameElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_vspace(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_vspace(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_hspace(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_hspace(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_align(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_align(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLIFrameElement, 0x3050f315, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLIFrameElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLIFrameElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLIFrameElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLIFrameElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLIFrameElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLIFrameElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLIFrameElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLIFrameElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLIFrameElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_vspace)(
        IHTMLIFrameElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_vspace)(
        IHTMLIFrameElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_hspace)(
        IHTMLIFrameElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_hspace)(
        IHTMLIFrameElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_align)(
        IHTMLIFrameElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_align)(
        IHTMLIFrameElement* This,
        BSTR *p);

    END_INTERFACE
} IHTMLIFrameElementVtbl;
interface IHTMLIFrameElement {
    CONST_VTBL IHTMLIFrameElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLIFrameElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLIFrameElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLIFrameElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLIFrameElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLIFrameElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLIFrameElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLIFrameElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLIFrameElement methods ***/
#define IHTMLIFrameElement_put_vspace(This,v) (This)->lpVtbl->put_vspace(This,v)
#define IHTMLIFrameElement_get_vspace(This,p) (This)->lpVtbl->get_vspace(This,p)
#define IHTMLIFrameElement_put_hspace(This,v) (This)->lpVtbl->put_hspace(This,v)
#define IHTMLIFrameElement_get_hspace(This,p) (This)->lpVtbl->get_hspace(This,p)
#define IHTMLIFrameElement_put_align(This,v) (This)->lpVtbl->put_align(This,v)
#define IHTMLIFrameElement_get_align(This,p) (This)->lpVtbl->get_align(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLIFrameElement_QueryInterface(IHTMLIFrameElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLIFrameElement_AddRef(IHTMLIFrameElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLIFrameElement_Release(IHTMLIFrameElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLIFrameElement_GetTypeInfoCount(IHTMLIFrameElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLIFrameElement_GetTypeInfo(IHTMLIFrameElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLIFrameElement_GetIDsOfNames(IHTMLIFrameElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLIFrameElement_Invoke(IHTMLIFrameElement* 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);
}
/*** IHTMLIFrameElement methods ***/
static FORCEINLINE HRESULT IHTMLIFrameElement_put_vspace(IHTMLIFrameElement* This,LONG v) {
    return This->lpVtbl->put_vspace(This,v);
}
static FORCEINLINE HRESULT IHTMLIFrameElement_get_vspace(IHTMLIFrameElement* This,LONG *p) {
    return This->lpVtbl->get_vspace(This,p);
}
static FORCEINLINE HRESULT IHTMLIFrameElement_put_hspace(IHTMLIFrameElement* This,LONG v) {
    return This->lpVtbl->put_hspace(This,v);
}
static FORCEINLINE HRESULT IHTMLIFrameElement_get_hspace(IHTMLIFrameElement* This,LONG *p) {
    return This->lpVtbl->get_hspace(This,p);
}
static FORCEINLINE HRESULT IHTMLIFrameElement_put_align(IHTMLIFrameElement* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static FORCEINLINE HRESULT IHTMLIFrameElement_get_align(IHTMLIFrameElement* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLIFrameElement_put_vspace_Proxy(
    IHTMLIFrameElement* This,
    LONG v);
void __RPC_STUB IHTMLIFrameElement_put_vspace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLIFrameElement_get_vspace_Proxy(
    IHTMLIFrameElement* This,
    LONG *p);
void __RPC_STUB IHTMLIFrameElement_get_vspace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLIFrameElement_put_hspace_Proxy(
    IHTMLIFrameElement* This,
    LONG v);
void __RPC_STUB IHTMLIFrameElement_put_hspace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLIFrameElement_get_hspace_Proxy(
    IHTMLIFrameElement* This,
    LONG *p);
void __RPC_STUB IHTMLIFrameElement_get_hspace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLIFrameElement_put_align_Proxy(
    IHTMLIFrameElement* This,
    BSTR v);
void __RPC_STUB IHTMLIFrameElement_put_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLIFrameElement_get_align_Proxy(
    IHTMLIFrameElement* This,
    BSTR *p);
void __RPC_STUB IHTMLIFrameElement_get_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLIFrameElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLIFrameElement2 interface
 */
#ifndef __IHTMLIFrameElement2_INTERFACE_DEFINED__
#define __IHTMLIFrameElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLIFrameElement2, 0x3050f4e6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f4e6-98b5-11cf-bb82-00aa00bdce0b")
IHTMLIFrameElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_height(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_height(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_width(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_width(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLIFrameElement2, 0x3050f4e6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLIFrameElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLIFrameElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLIFrameElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLIFrameElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLIFrameElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLIFrameElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLIFrameElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLIFrameElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLIFrameElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_height)(
        IHTMLIFrameElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_height)(
        IHTMLIFrameElement2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_width)(
        IHTMLIFrameElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_width)(
        IHTMLIFrameElement2* This,
        VARIANT *p);

    END_INTERFACE
} IHTMLIFrameElement2Vtbl;
interface IHTMLIFrameElement2 {
    CONST_VTBL IHTMLIFrameElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLIFrameElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLIFrameElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLIFrameElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLIFrameElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLIFrameElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLIFrameElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLIFrameElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLIFrameElement2 methods ***/
#define IHTMLIFrameElement2_put_height(This,v) (This)->lpVtbl->put_height(This,v)
#define IHTMLIFrameElement2_get_height(This,p) (This)->lpVtbl->get_height(This,p)
#define IHTMLIFrameElement2_put_width(This,v) (This)->lpVtbl->put_width(This,v)
#define IHTMLIFrameElement2_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLIFrameElement2_QueryInterface(IHTMLIFrameElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLIFrameElement2_AddRef(IHTMLIFrameElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLIFrameElement2_Release(IHTMLIFrameElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLIFrameElement2_GetTypeInfoCount(IHTMLIFrameElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLIFrameElement2_GetTypeInfo(IHTMLIFrameElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLIFrameElement2_GetIDsOfNames(IHTMLIFrameElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLIFrameElement2_Invoke(IHTMLIFrameElement2* 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);
}
/*** IHTMLIFrameElement2 methods ***/
static FORCEINLINE HRESULT IHTMLIFrameElement2_put_height(IHTMLIFrameElement2* This,VARIANT v) {
    return This->lpVtbl->put_height(This,v);
}
static FORCEINLINE HRESULT IHTMLIFrameElement2_get_height(IHTMLIFrameElement2* This,VARIANT *p) {
    return This->lpVtbl->get_height(This,p);
}
static FORCEINLINE HRESULT IHTMLIFrameElement2_put_width(IHTMLIFrameElement2* This,VARIANT v) {
    return This->lpVtbl->put_width(This,v);
}
static FORCEINLINE HRESULT IHTMLIFrameElement2_get_width(IHTMLIFrameElement2* This,VARIANT *p) {
    return This->lpVtbl->get_width(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLIFrameElement2_put_height_Proxy(
    IHTMLIFrameElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLIFrameElement2_put_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLIFrameElement2_get_height_Proxy(
    IHTMLIFrameElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLIFrameElement2_get_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLIFrameElement2_put_width_Proxy(
    IHTMLIFrameElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLIFrameElement2_put_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLIFrameElement2_get_width_Proxy(
    IHTMLIFrameElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLIFrameElement2_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLIFrameElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLIFrameElement3 interface
 */
#ifndef __IHTMLIFrameElement3_INTERFACE_DEFINED__
#define __IHTMLIFrameElement3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLIFrameElement3, 0x30510433, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510433-98b5-11cf-bb82-00aa00bdce0b")
IHTMLIFrameElement3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_contentDocument(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_src(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_src(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_longDesc(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_longDesc(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_frameBorder(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_frameBorder(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLIFrameElement3, 0x30510433, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLIFrameElement3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLIFrameElement3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLIFrameElement3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLIFrameElement3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLIFrameElement3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLIFrameElement3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLIFrameElement3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLIFrameElement3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLIFrameElement3 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_contentDocument)(
        IHTMLIFrameElement3* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *put_src)(
        IHTMLIFrameElement3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_src)(
        IHTMLIFrameElement3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_longDesc)(
        IHTMLIFrameElement3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_longDesc)(
        IHTMLIFrameElement3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_frameBorder)(
        IHTMLIFrameElement3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_frameBorder)(
        IHTMLIFrameElement3* This,
        BSTR *p);

    END_INTERFACE
} IHTMLIFrameElement3Vtbl;
interface IHTMLIFrameElement3 {
    CONST_VTBL IHTMLIFrameElement3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLIFrameElement3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLIFrameElement3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLIFrameElement3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLIFrameElement3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLIFrameElement3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLIFrameElement3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLIFrameElement3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLIFrameElement3 methods ***/
#define IHTMLIFrameElement3_get_contentDocument(This,p) (This)->lpVtbl->get_contentDocument(This,p)
#define IHTMLIFrameElement3_put_src(This,v) (This)->lpVtbl->put_src(This,v)
#define IHTMLIFrameElement3_get_src(This,p) (This)->lpVtbl->get_src(This,p)
#define IHTMLIFrameElement3_put_longDesc(This,v) (This)->lpVtbl->put_longDesc(This,v)
#define IHTMLIFrameElement3_get_longDesc(This,p) (This)->lpVtbl->get_longDesc(This,p)
#define IHTMLIFrameElement3_put_frameBorder(This,v) (This)->lpVtbl->put_frameBorder(This,v)
#define IHTMLIFrameElement3_get_frameBorder(This,p) (This)->lpVtbl->get_frameBorder(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLIFrameElement3_QueryInterface(IHTMLIFrameElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLIFrameElement3_AddRef(IHTMLIFrameElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLIFrameElement3_Release(IHTMLIFrameElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLIFrameElement3_GetTypeInfoCount(IHTMLIFrameElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLIFrameElement3_GetTypeInfo(IHTMLIFrameElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLIFrameElement3_GetIDsOfNames(IHTMLIFrameElement3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLIFrameElement3_Invoke(IHTMLIFrameElement3* 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);
}
/*** IHTMLIFrameElement3 methods ***/
static FORCEINLINE HRESULT IHTMLIFrameElement3_get_contentDocument(IHTMLIFrameElement3* This,IDispatch **p) {
    return This->lpVtbl->get_contentDocument(This,p);
}
static FORCEINLINE HRESULT IHTMLIFrameElement3_put_src(IHTMLIFrameElement3* This,BSTR v) {
    return This->lpVtbl->put_src(This,v);
}
static FORCEINLINE HRESULT IHTMLIFrameElement3_get_src(IHTMLIFrameElement3* This,BSTR *p) {
    return This->lpVtbl->get_src(This,p);
}
static FORCEINLINE HRESULT IHTMLIFrameElement3_put_longDesc(IHTMLIFrameElement3* This,BSTR v) {
    return This->lpVtbl->put_longDesc(This,v);
}
static FORCEINLINE HRESULT IHTMLIFrameElement3_get_longDesc(IHTMLIFrameElement3* This,BSTR *p) {
    return This->lpVtbl->get_longDesc(This,p);
}
static FORCEINLINE HRESULT IHTMLIFrameElement3_put_frameBorder(IHTMLIFrameElement3* This,BSTR v) {
    return This->lpVtbl->put_frameBorder(This,v);
}
static FORCEINLINE HRESULT IHTMLIFrameElement3_get_frameBorder(IHTMLIFrameElement3* This,BSTR *p) {
    return This->lpVtbl->get_frameBorder(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLIFrameElement3_get_contentDocument_Proxy(
    IHTMLIFrameElement3* This,
    IDispatch **p);
void __RPC_STUB IHTMLIFrameElement3_get_contentDocument_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLIFrameElement3_put_src_Proxy(
    IHTMLIFrameElement3* This,
    BSTR v);
void __RPC_STUB IHTMLIFrameElement3_put_src_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLIFrameElement3_get_src_Proxy(
    IHTMLIFrameElement3* This,
    BSTR *p);
void __RPC_STUB IHTMLIFrameElement3_get_src_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLIFrameElement3_put_longDesc_Proxy(
    IHTMLIFrameElement3* This,
    BSTR v);
void __RPC_STUB IHTMLIFrameElement3_put_longDesc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLIFrameElement3_get_longDesc_Proxy(
    IHTMLIFrameElement3* This,
    BSTR *p);
void __RPC_STUB IHTMLIFrameElement3_get_longDesc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLIFrameElement3_put_frameBorder_Proxy(
    IHTMLIFrameElement3* This,
    BSTR v);
void __RPC_STUB IHTMLIFrameElement3_put_frameBorder_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLIFrameElement3_get_frameBorder_Proxy(
    IHTMLIFrameElement3* This,
    BSTR *p);
void __RPC_STUB IHTMLIFrameElement3_get_frameBorder_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLIFrameElement3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLIFrame dispinterface
 */
#ifndef __DispHTMLIFrame_DISPINTERFACE_DEFINED__
#define __DispHTMLIFrame_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLIFrame, 0x3050f51b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f51b-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLIFrame : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLIFrame, 0x3050f51b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLIFrameVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLIFrame* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLIFrame* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLIFrame* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLIFrame* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLIFrame* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLIFrame* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLIFrame* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLIFrameVtbl;
interface DispHTMLIFrame {
    CONST_VTBL DispHTMLIFrameVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLIFrame_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLIFrame_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLIFrame_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLIFrame_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLIFrame_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLIFrame_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLIFrame_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 DispHTMLIFrame_QueryInterface(DispHTMLIFrame* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLIFrame_AddRef(DispHTMLIFrame* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLIFrame_Release(DispHTMLIFrame* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLIFrame_GetTypeInfoCount(DispHTMLIFrame* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLIFrame_GetTypeInfo(DispHTMLIFrame* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLIFrame_GetIDsOfNames(DispHTMLIFrame* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLIFrame_Invoke(DispHTMLIFrame* 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  /* __DispHTMLIFrame_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLIFrame coclass
 */

DEFINE_GUID(CLSID_HTMLIFrame, 0x3050f316, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f316-98b5-11cf-bb82-00aa00bdce0b") HTMLIFrame;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLIFrame, 0x3050f316, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CIFrameElement;
/*****************************************************************************
 * IHTMLDivPosition interface
 */
#ifndef __IHTMLDivPosition_INTERFACE_DEFINED__
#define __IHTMLDivPosition_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDivPosition, 0x3050f212, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f212-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDivPosition : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_align(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_align(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDivPosition, 0x3050f212, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDivPositionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLDivPosition* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLDivPosition* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLDivPosition* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLDivPosition* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLDivPosition* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLDivPosition* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLDivPosition* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLDivPosition methods ***/
    HRESULT (STDMETHODCALLTYPE *put_align)(
        IHTMLDivPosition* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_align)(
        IHTMLDivPosition* This,
        BSTR *p);

    END_INTERFACE
} IHTMLDivPositionVtbl;
interface IHTMLDivPosition {
    CONST_VTBL IHTMLDivPositionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDivPosition_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDivPosition_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDivPosition_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDivPosition_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDivPosition_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDivPosition_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDivPosition_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDivPosition methods ***/
#define IHTMLDivPosition_put_align(This,v) (This)->lpVtbl->put_align(This,v)
#define IHTMLDivPosition_get_align(This,p) (This)->lpVtbl->get_align(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDivPosition_QueryInterface(IHTMLDivPosition* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDivPosition_AddRef(IHTMLDivPosition* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDivPosition_Release(IHTMLDivPosition* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDivPosition_GetTypeInfoCount(IHTMLDivPosition* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDivPosition_GetTypeInfo(IHTMLDivPosition* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDivPosition_GetIDsOfNames(IHTMLDivPosition* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDivPosition_Invoke(IHTMLDivPosition* 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);
}
/*** IHTMLDivPosition methods ***/
static FORCEINLINE HRESULT IHTMLDivPosition_put_align(IHTMLDivPosition* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static FORCEINLINE HRESULT IHTMLDivPosition_get_align(IHTMLDivPosition* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDivPosition_put_align_Proxy(
    IHTMLDivPosition* This,
    BSTR v);
void __RPC_STUB IHTMLDivPosition_put_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDivPosition_get_align_Proxy(
    IHTMLDivPosition* This,
    BSTR *p);
void __RPC_STUB IHTMLDivPosition_get_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDivPosition_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLFieldSetElement interface
 */
#ifndef __IHTMLFieldSetElement_INTERFACE_DEFINED__
#define __IHTMLFieldSetElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLFieldSetElement, 0x3050f3e7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f3e7-98b5-11cf-bb82-00aa00bdce0b")
IHTMLFieldSetElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_align(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_align(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLFieldSetElement, 0x3050f3e7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLFieldSetElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLFieldSetElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLFieldSetElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLFieldSetElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLFieldSetElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLFieldSetElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLFieldSetElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLFieldSetElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLFieldSetElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_align)(
        IHTMLFieldSetElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_align)(
        IHTMLFieldSetElement* This,
        BSTR *p);

    END_INTERFACE
} IHTMLFieldSetElementVtbl;
interface IHTMLFieldSetElement {
    CONST_VTBL IHTMLFieldSetElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLFieldSetElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLFieldSetElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLFieldSetElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLFieldSetElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLFieldSetElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLFieldSetElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLFieldSetElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLFieldSetElement methods ***/
#define IHTMLFieldSetElement_put_align(This,v) (This)->lpVtbl->put_align(This,v)
#define IHTMLFieldSetElement_get_align(This,p) (This)->lpVtbl->get_align(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLFieldSetElement_QueryInterface(IHTMLFieldSetElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLFieldSetElement_AddRef(IHTMLFieldSetElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLFieldSetElement_Release(IHTMLFieldSetElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLFieldSetElement_GetTypeInfoCount(IHTMLFieldSetElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLFieldSetElement_GetTypeInfo(IHTMLFieldSetElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLFieldSetElement_GetIDsOfNames(IHTMLFieldSetElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLFieldSetElement_Invoke(IHTMLFieldSetElement* 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);
}
/*** IHTMLFieldSetElement methods ***/
static FORCEINLINE HRESULT IHTMLFieldSetElement_put_align(IHTMLFieldSetElement* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static FORCEINLINE HRESULT IHTMLFieldSetElement_get_align(IHTMLFieldSetElement* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLFieldSetElement_put_align_Proxy(
    IHTMLFieldSetElement* This,
    BSTR v);
void __RPC_STUB IHTMLFieldSetElement_put_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFieldSetElement_get_align_Proxy(
    IHTMLFieldSetElement* This,
    BSTR *p);
void __RPC_STUB IHTMLFieldSetElement_get_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLFieldSetElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLFieldSetElement2 interface
 */
#ifndef __IHTMLFieldSetElement2_INTERFACE_DEFINED__
#define __IHTMLFieldSetElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLFieldSetElement2, 0x3050f833, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f833-98b5-11cf-bb82-00aa00bdce0b")
IHTMLFieldSetElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_form(
        IHTMLFormElement **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLFieldSetElement2, 0x3050f833, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLFieldSetElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLFieldSetElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLFieldSetElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLFieldSetElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLFieldSetElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLFieldSetElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLFieldSetElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLFieldSetElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLFieldSetElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_form)(
        IHTMLFieldSetElement2* This,
        IHTMLFormElement **p);

    END_INTERFACE
} IHTMLFieldSetElement2Vtbl;
interface IHTMLFieldSetElement2 {
    CONST_VTBL IHTMLFieldSetElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLFieldSetElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLFieldSetElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLFieldSetElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLFieldSetElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLFieldSetElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLFieldSetElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLFieldSetElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLFieldSetElement2 methods ***/
#define IHTMLFieldSetElement2_get_form(This,p) (This)->lpVtbl->get_form(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLFieldSetElement2_QueryInterface(IHTMLFieldSetElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLFieldSetElement2_AddRef(IHTMLFieldSetElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLFieldSetElement2_Release(IHTMLFieldSetElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLFieldSetElement2_GetTypeInfoCount(IHTMLFieldSetElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLFieldSetElement2_GetTypeInfo(IHTMLFieldSetElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLFieldSetElement2_GetIDsOfNames(IHTMLFieldSetElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLFieldSetElement2_Invoke(IHTMLFieldSetElement2* 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);
}
/*** IHTMLFieldSetElement2 methods ***/
static FORCEINLINE HRESULT IHTMLFieldSetElement2_get_form(IHTMLFieldSetElement2* This,IHTMLFormElement **p) {
    return This->lpVtbl->get_form(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLFieldSetElement2_get_form_Proxy(
    IHTMLFieldSetElement2* This,
    IHTMLFormElement **p);
void __RPC_STUB IHTMLFieldSetElement2_get_form_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLFieldSetElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLLegendElement interface
 */
#ifndef __IHTMLLegendElement_INTERFACE_DEFINED__
#define __IHTMLLegendElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLLegendElement, 0x3050f3ea, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f3ea-98b5-11cf-bb82-00aa00bdce0b")
IHTMLLegendElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_align(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_align(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLLegendElement, 0x3050f3ea, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLLegendElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLLegendElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLLegendElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLLegendElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLLegendElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLLegendElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLLegendElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLLegendElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLLegendElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_align)(
        IHTMLLegendElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_align)(
        IHTMLLegendElement* This,
        BSTR *p);

    END_INTERFACE
} IHTMLLegendElementVtbl;
interface IHTMLLegendElement {
    CONST_VTBL IHTMLLegendElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLLegendElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLLegendElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLLegendElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLLegendElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLLegendElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLLegendElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLLegendElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLLegendElement methods ***/
#define IHTMLLegendElement_put_align(This,v) (This)->lpVtbl->put_align(This,v)
#define IHTMLLegendElement_get_align(This,p) (This)->lpVtbl->get_align(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLLegendElement_QueryInterface(IHTMLLegendElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLLegendElement_AddRef(IHTMLLegendElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLLegendElement_Release(IHTMLLegendElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLLegendElement_GetTypeInfoCount(IHTMLLegendElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLLegendElement_GetTypeInfo(IHTMLLegendElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLLegendElement_GetIDsOfNames(IHTMLLegendElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLLegendElement_Invoke(IHTMLLegendElement* 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);
}
/*** IHTMLLegendElement methods ***/
static FORCEINLINE HRESULT IHTMLLegendElement_put_align(IHTMLLegendElement* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static FORCEINLINE HRESULT IHTMLLegendElement_get_align(IHTMLLegendElement* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLLegendElement_put_align_Proxy(
    IHTMLLegendElement* This,
    BSTR v);
void __RPC_STUB IHTMLLegendElement_put_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLLegendElement_get_align_Proxy(
    IHTMLLegendElement* This,
    BSTR *p);
void __RPC_STUB IHTMLLegendElement_get_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLLegendElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLLegendElement2 interface
 */
#ifndef __IHTMLLegendElement2_INTERFACE_DEFINED__
#define __IHTMLLegendElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLLegendElement2, 0x3050f834, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f834-98b5-11cf-bb82-00aa00bdce0b")
IHTMLLegendElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_form(
        IHTMLFormElement **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLLegendElement2, 0x3050f834, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLLegendElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLLegendElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLLegendElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLLegendElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLLegendElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLLegendElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLLegendElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLLegendElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLLegendElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_form)(
        IHTMLLegendElement2* This,
        IHTMLFormElement **p);

    END_INTERFACE
} IHTMLLegendElement2Vtbl;
interface IHTMLLegendElement2 {
    CONST_VTBL IHTMLLegendElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLLegendElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLLegendElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLLegendElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLLegendElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLLegendElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLLegendElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLLegendElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLLegendElement2 methods ***/
#define IHTMLLegendElement2_get_form(This,p) (This)->lpVtbl->get_form(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLLegendElement2_QueryInterface(IHTMLLegendElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLLegendElement2_AddRef(IHTMLLegendElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLLegendElement2_Release(IHTMLLegendElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLLegendElement2_GetTypeInfoCount(IHTMLLegendElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLLegendElement2_GetTypeInfo(IHTMLLegendElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLLegendElement2_GetIDsOfNames(IHTMLLegendElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLLegendElement2_Invoke(IHTMLLegendElement2* 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);
}
/*** IHTMLLegendElement2 methods ***/
static FORCEINLINE HRESULT IHTMLLegendElement2_get_form(IHTMLLegendElement2* This,IHTMLFormElement **p) {
    return This->lpVtbl->get_form(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLLegendElement2_get_form_Proxy(
    IHTMLLegendElement2* This,
    IHTMLFormElement **p);
void __RPC_STUB IHTMLLegendElement2_get_form_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLLegendElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLDivPosition dispinterface
 */
#ifndef __DispHTMLDivPosition_DISPINTERFACE_DEFINED__
#define __DispHTMLDivPosition_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLDivPosition, 0x3050f50f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f50f-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLDivPosition : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLDivPosition, 0x3050f50f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLDivPositionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLDivPosition* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLDivPosition* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLDivPosition* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLDivPosition* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLDivPosition* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLDivPosition* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLDivPosition* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLDivPositionVtbl;
interface DispHTMLDivPosition {
    CONST_VTBL DispHTMLDivPositionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLDivPosition_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLDivPosition_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLDivPosition_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLDivPosition_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLDivPosition_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLDivPosition_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLDivPosition_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 DispHTMLDivPosition_QueryInterface(DispHTMLDivPosition* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLDivPosition_AddRef(DispHTMLDivPosition* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLDivPosition_Release(DispHTMLDivPosition* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLDivPosition_GetTypeInfoCount(DispHTMLDivPosition* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLDivPosition_GetTypeInfo(DispHTMLDivPosition* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLDivPosition_GetIDsOfNames(DispHTMLDivPosition* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLDivPosition_Invoke(DispHTMLDivPosition* 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  /* __DispHTMLDivPosition_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLDivPosition coclass
 */

DEFINE_GUID(CLSID_HTMLDivPosition, 0x3050f249, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f249-98b5-11cf-bb82-00aa00bdce0b") HTMLDivPosition;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLDivPosition, 0x3050f249, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_C1DElement;
/*****************************************************************************
 * DispHTMLFieldSetElement dispinterface
 */
#ifndef __DispHTMLFieldSetElement_DISPINTERFACE_DEFINED__
#define __DispHTMLFieldSetElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLFieldSetElement, 0x3050f545, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f545-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLFieldSetElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLFieldSetElement, 0x3050f545, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLFieldSetElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLFieldSetElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLFieldSetElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLFieldSetElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLFieldSetElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLFieldSetElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLFieldSetElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLFieldSetElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLFieldSetElementVtbl;
interface DispHTMLFieldSetElement {
    CONST_VTBL DispHTMLFieldSetElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLFieldSetElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLFieldSetElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLFieldSetElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLFieldSetElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLFieldSetElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLFieldSetElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLFieldSetElement_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 DispHTMLFieldSetElement_QueryInterface(DispHTMLFieldSetElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLFieldSetElement_AddRef(DispHTMLFieldSetElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLFieldSetElement_Release(DispHTMLFieldSetElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLFieldSetElement_GetTypeInfoCount(DispHTMLFieldSetElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLFieldSetElement_GetTypeInfo(DispHTMLFieldSetElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLFieldSetElement_GetIDsOfNames(DispHTMLFieldSetElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLFieldSetElement_Invoke(DispHTMLFieldSetElement* 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  /* __DispHTMLFieldSetElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLFieldSetElement coclass
 */

DEFINE_GUID(CLSID_HTMLFieldSetElement, 0x3050f3e8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f3e8-98b5-11cf-bb82-00aa00bdce0b") HTMLFieldSetElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLFieldSetElement, 0x3050f3e8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CFieldSetElement;
/*****************************************************************************
 * DispHTMLLegendElement dispinterface
 */
#ifndef __DispHTMLLegendElement_DISPINTERFACE_DEFINED__
#define __DispHTMLLegendElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLLegendElement, 0x3050f546, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f546-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLLegendElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLLegendElement, 0x3050f546, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLLegendElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLLegendElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLLegendElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLLegendElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLLegendElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLLegendElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLLegendElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLLegendElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLLegendElementVtbl;
interface DispHTMLLegendElement {
    CONST_VTBL DispHTMLLegendElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLLegendElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLLegendElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLLegendElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLLegendElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLLegendElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLLegendElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLLegendElement_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 DispHTMLLegendElement_QueryInterface(DispHTMLLegendElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLLegendElement_AddRef(DispHTMLLegendElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLLegendElement_Release(DispHTMLLegendElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLLegendElement_GetTypeInfoCount(DispHTMLLegendElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLLegendElement_GetTypeInfo(DispHTMLLegendElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLLegendElement_GetIDsOfNames(DispHTMLLegendElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLLegendElement_Invoke(DispHTMLLegendElement* 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  /* __DispHTMLLegendElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLLegendElement coclass
 */

DEFINE_GUID(CLSID_HTMLLegendElement, 0x3050f3e9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f3e9-98b5-11cf-bb82-00aa00bdce0b") HTMLLegendElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLLegendElement, 0x3050f3e9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CLegendElement;
/*****************************************************************************
 * IHTMLSpanFlow interface
 */
#ifndef __IHTMLSpanFlow_INTERFACE_DEFINED__
#define __IHTMLSpanFlow_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLSpanFlow, 0x3050f3e5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f3e5-98b5-11cf-bb82-00aa00bdce0b")
IHTMLSpanFlow : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_align(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_align(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLSpanFlow, 0x3050f3e5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLSpanFlowVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLSpanFlow* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLSpanFlow* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLSpanFlow* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLSpanFlow* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLSpanFlow* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLSpanFlow* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLSpanFlow* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLSpanFlow methods ***/
    HRESULT (STDMETHODCALLTYPE *put_align)(
        IHTMLSpanFlow* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_align)(
        IHTMLSpanFlow* This,
        BSTR *p);

    END_INTERFACE
} IHTMLSpanFlowVtbl;
interface IHTMLSpanFlow {
    CONST_VTBL IHTMLSpanFlowVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLSpanFlow_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLSpanFlow_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLSpanFlow_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLSpanFlow_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLSpanFlow_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLSpanFlow_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLSpanFlow_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLSpanFlow methods ***/
#define IHTMLSpanFlow_put_align(This,v) (This)->lpVtbl->put_align(This,v)
#define IHTMLSpanFlow_get_align(This,p) (This)->lpVtbl->get_align(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLSpanFlow_QueryInterface(IHTMLSpanFlow* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLSpanFlow_AddRef(IHTMLSpanFlow* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLSpanFlow_Release(IHTMLSpanFlow* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLSpanFlow_GetTypeInfoCount(IHTMLSpanFlow* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLSpanFlow_GetTypeInfo(IHTMLSpanFlow* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLSpanFlow_GetIDsOfNames(IHTMLSpanFlow* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLSpanFlow_Invoke(IHTMLSpanFlow* 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);
}
/*** IHTMLSpanFlow methods ***/
static FORCEINLINE HRESULT IHTMLSpanFlow_put_align(IHTMLSpanFlow* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static FORCEINLINE HRESULT IHTMLSpanFlow_get_align(IHTMLSpanFlow* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLSpanFlow_put_align_Proxy(
    IHTMLSpanFlow* This,
    BSTR v);
void __RPC_STUB IHTMLSpanFlow_put_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSpanFlow_get_align_Proxy(
    IHTMLSpanFlow* This,
    BSTR *p);
void __RPC_STUB IHTMLSpanFlow_get_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLSpanFlow_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLSpanFlow dispinterface
 */
#ifndef __DispHTMLSpanFlow_DISPINTERFACE_DEFINED__
#define __DispHTMLSpanFlow_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLSpanFlow, 0x3050f544, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f544-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLSpanFlow : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLSpanFlow, 0x3050f544, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLSpanFlowVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLSpanFlow* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLSpanFlow* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLSpanFlow* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLSpanFlow* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLSpanFlow* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLSpanFlow* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLSpanFlow* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLSpanFlowVtbl;
interface DispHTMLSpanFlow {
    CONST_VTBL DispHTMLSpanFlowVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLSpanFlow_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLSpanFlow_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLSpanFlow_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLSpanFlow_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLSpanFlow_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLSpanFlow_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLSpanFlow_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 DispHTMLSpanFlow_QueryInterface(DispHTMLSpanFlow* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLSpanFlow_AddRef(DispHTMLSpanFlow* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLSpanFlow_Release(DispHTMLSpanFlow* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLSpanFlow_GetTypeInfoCount(DispHTMLSpanFlow* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLSpanFlow_GetTypeInfo(DispHTMLSpanFlow* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLSpanFlow_GetIDsOfNames(DispHTMLSpanFlow* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLSpanFlow_Invoke(DispHTMLSpanFlow* 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  /* __DispHTMLSpanFlow_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLSpanFlow coclass
 */

DEFINE_GUID(CLSID_HTMLSpanFlow, 0x3050f3e6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f3e6-98b5-11cf-bb82-00aa00bdce0b") HTMLSpanFlow;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLSpanFlow, 0x3050f3e6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSpanSite;
/*****************************************************************************
 * IHTMLFrameSetElement interface
 */
#ifndef __IHTMLFrameSetElement_INTERFACE_DEFINED__
#define __IHTMLFrameSetElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLFrameSetElement, 0x3050f319, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f319-98b5-11cf-bb82-00aa00bdce0b")
IHTMLFrameSetElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_rows(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_rows(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_cols(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cols(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_border(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_border(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderColor(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderColor(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_frameBorder(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_frameBorder(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_frameSpacing(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_frameSpacing(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_name(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onload(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onload(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onunload(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onunload(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onbeforeunload(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onbeforeunload(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLFrameSetElement, 0x3050f319, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLFrameSetElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLFrameSetElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLFrameSetElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLFrameSetElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLFrameSetElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLFrameSetElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLFrameSetElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLFrameSetElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLFrameSetElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_rows)(
        IHTMLFrameSetElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_rows)(
        IHTMLFrameSetElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_cols)(
        IHTMLFrameSetElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_cols)(
        IHTMLFrameSetElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_border)(
        IHTMLFrameSetElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_border)(
        IHTMLFrameSetElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_borderColor)(
        IHTMLFrameSetElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_borderColor)(
        IHTMLFrameSetElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_frameBorder)(
        IHTMLFrameSetElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_frameBorder)(
        IHTMLFrameSetElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_frameSpacing)(
        IHTMLFrameSetElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_frameSpacing)(
        IHTMLFrameSetElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_name)(
        IHTMLFrameSetElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_name)(
        IHTMLFrameSetElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_onload)(
        IHTMLFrameSetElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onload)(
        IHTMLFrameSetElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onunload)(
        IHTMLFrameSetElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onunload)(
        IHTMLFrameSetElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onbeforeunload)(
        IHTMLFrameSetElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onbeforeunload)(
        IHTMLFrameSetElement* This,
        VARIANT *p);

    END_INTERFACE
} IHTMLFrameSetElementVtbl;
interface IHTMLFrameSetElement {
    CONST_VTBL IHTMLFrameSetElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLFrameSetElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLFrameSetElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLFrameSetElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLFrameSetElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLFrameSetElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLFrameSetElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLFrameSetElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLFrameSetElement methods ***/
#define IHTMLFrameSetElement_put_rows(This,v) (This)->lpVtbl->put_rows(This,v)
#define IHTMLFrameSetElement_get_rows(This,p) (This)->lpVtbl->get_rows(This,p)
#define IHTMLFrameSetElement_put_cols(This,v) (This)->lpVtbl->put_cols(This,v)
#define IHTMLFrameSetElement_get_cols(This,p) (This)->lpVtbl->get_cols(This,p)
#define IHTMLFrameSetElement_put_border(This,v) (This)->lpVtbl->put_border(This,v)
#define IHTMLFrameSetElement_get_border(This,p) (This)->lpVtbl->get_border(This,p)
#define IHTMLFrameSetElement_put_borderColor(This,v) (This)->lpVtbl->put_borderColor(This,v)
#define IHTMLFrameSetElement_get_borderColor(This,p) (This)->lpVtbl->get_borderColor(This,p)
#define IHTMLFrameSetElement_put_frameBorder(This,v) (This)->lpVtbl->put_frameBorder(This,v)
#define IHTMLFrameSetElement_get_frameBorder(This,p) (This)->lpVtbl->get_frameBorder(This,p)
#define IHTMLFrameSetElement_put_frameSpacing(This,v) (This)->lpVtbl->put_frameSpacing(This,v)
#define IHTMLFrameSetElement_get_frameSpacing(This,p) (This)->lpVtbl->get_frameSpacing(This,p)
#define IHTMLFrameSetElement_put_name(This,v) (This)->lpVtbl->put_name(This,v)
#define IHTMLFrameSetElement_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#define IHTMLFrameSetElement_put_onload(This,v) (This)->lpVtbl->put_onload(This,v)
#define IHTMLFrameSetElement_get_onload(This,p) (This)->lpVtbl->get_onload(This,p)
#define IHTMLFrameSetElement_put_onunload(This,v) (This)->lpVtbl->put_onunload(This,v)
#define IHTMLFrameSetElement_get_onunload(This,p) (This)->lpVtbl->get_onunload(This,p)
#define IHTMLFrameSetElement_put_onbeforeunload(This,v) (This)->lpVtbl->put_onbeforeunload(This,v)
#define IHTMLFrameSetElement_get_onbeforeunload(This,p) (This)->lpVtbl->get_onbeforeunload(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLFrameSetElement_QueryInterface(IHTMLFrameSetElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLFrameSetElement_AddRef(IHTMLFrameSetElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLFrameSetElement_Release(IHTMLFrameSetElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLFrameSetElement_GetTypeInfoCount(IHTMLFrameSetElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement_GetTypeInfo(IHTMLFrameSetElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement_GetIDsOfNames(IHTMLFrameSetElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement_Invoke(IHTMLFrameSetElement* 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);
}
/*** IHTMLFrameSetElement methods ***/
static FORCEINLINE HRESULT IHTMLFrameSetElement_put_rows(IHTMLFrameSetElement* This,BSTR v) {
    return This->lpVtbl->put_rows(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement_get_rows(IHTMLFrameSetElement* This,BSTR *p) {
    return This->lpVtbl->get_rows(This,p);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement_put_cols(IHTMLFrameSetElement* This,BSTR v) {
    return This->lpVtbl->put_cols(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement_get_cols(IHTMLFrameSetElement* This,BSTR *p) {
    return This->lpVtbl->get_cols(This,p);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement_put_border(IHTMLFrameSetElement* This,VARIANT v) {
    return This->lpVtbl->put_border(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement_get_border(IHTMLFrameSetElement* This,VARIANT *p) {
    return This->lpVtbl->get_border(This,p);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement_put_borderColor(IHTMLFrameSetElement* This,VARIANT v) {
    return This->lpVtbl->put_borderColor(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement_get_borderColor(IHTMLFrameSetElement* This,VARIANT *p) {
    return This->lpVtbl->get_borderColor(This,p);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement_put_frameBorder(IHTMLFrameSetElement* This,BSTR v) {
    return This->lpVtbl->put_frameBorder(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement_get_frameBorder(IHTMLFrameSetElement* This,BSTR *p) {
    return This->lpVtbl->get_frameBorder(This,p);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement_put_frameSpacing(IHTMLFrameSetElement* This,VARIANT v) {
    return This->lpVtbl->put_frameSpacing(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement_get_frameSpacing(IHTMLFrameSetElement* This,VARIANT *p) {
    return This->lpVtbl->get_frameSpacing(This,p);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement_put_name(IHTMLFrameSetElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement_get_name(IHTMLFrameSetElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement_put_onload(IHTMLFrameSetElement* This,VARIANT v) {
    return This->lpVtbl->put_onload(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement_get_onload(IHTMLFrameSetElement* This,VARIANT *p) {
    return This->lpVtbl->get_onload(This,p);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement_put_onunload(IHTMLFrameSetElement* This,VARIANT v) {
    return This->lpVtbl->put_onunload(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement_get_onunload(IHTMLFrameSetElement* This,VARIANT *p) {
    return This->lpVtbl->get_onunload(This,p);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement_put_onbeforeunload(IHTMLFrameSetElement* This,VARIANT v) {
    return This->lpVtbl->put_onbeforeunload(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement_get_onbeforeunload(IHTMLFrameSetElement* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforeunload(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement_put_rows_Proxy(
    IHTMLFrameSetElement* This,
    BSTR v);
void __RPC_STUB IHTMLFrameSetElement_put_rows_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement_get_rows_Proxy(
    IHTMLFrameSetElement* This,
    BSTR *p);
void __RPC_STUB IHTMLFrameSetElement_get_rows_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement_put_cols_Proxy(
    IHTMLFrameSetElement* This,
    BSTR v);
void __RPC_STUB IHTMLFrameSetElement_put_cols_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement_get_cols_Proxy(
    IHTMLFrameSetElement* This,
    BSTR *p);
void __RPC_STUB IHTMLFrameSetElement_get_cols_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement_put_border_Proxy(
    IHTMLFrameSetElement* This,
    VARIANT v);
void __RPC_STUB IHTMLFrameSetElement_put_border_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement_get_border_Proxy(
    IHTMLFrameSetElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLFrameSetElement_get_border_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement_put_borderColor_Proxy(
    IHTMLFrameSetElement* This,
    VARIANT v);
void __RPC_STUB IHTMLFrameSetElement_put_borderColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement_get_borderColor_Proxy(
    IHTMLFrameSetElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLFrameSetElement_get_borderColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement_put_frameBorder_Proxy(
    IHTMLFrameSetElement* This,
    BSTR v);
void __RPC_STUB IHTMLFrameSetElement_put_frameBorder_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement_get_frameBorder_Proxy(
    IHTMLFrameSetElement* This,
    BSTR *p);
void __RPC_STUB IHTMLFrameSetElement_get_frameBorder_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement_put_frameSpacing_Proxy(
    IHTMLFrameSetElement* This,
    VARIANT v);
void __RPC_STUB IHTMLFrameSetElement_put_frameSpacing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement_get_frameSpacing_Proxy(
    IHTMLFrameSetElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLFrameSetElement_get_frameSpacing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement_put_name_Proxy(
    IHTMLFrameSetElement* This,
    BSTR v);
void __RPC_STUB IHTMLFrameSetElement_put_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement_get_name_Proxy(
    IHTMLFrameSetElement* This,
    BSTR *p);
void __RPC_STUB IHTMLFrameSetElement_get_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement_put_onload_Proxy(
    IHTMLFrameSetElement* This,
    VARIANT v);
void __RPC_STUB IHTMLFrameSetElement_put_onload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement_get_onload_Proxy(
    IHTMLFrameSetElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLFrameSetElement_get_onload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement_put_onunload_Proxy(
    IHTMLFrameSetElement* This,
    VARIANT v);
void __RPC_STUB IHTMLFrameSetElement_put_onunload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement_get_onunload_Proxy(
    IHTMLFrameSetElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLFrameSetElement_get_onunload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement_put_onbeforeunload_Proxy(
    IHTMLFrameSetElement* This,
    VARIANT v);
void __RPC_STUB IHTMLFrameSetElement_put_onbeforeunload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement_get_onbeforeunload_Proxy(
    IHTMLFrameSetElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLFrameSetElement_get_onbeforeunload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLFrameSetElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLFrameSetElement2 interface
 */
#ifndef __IHTMLFrameSetElement2_INTERFACE_DEFINED__
#define __IHTMLFrameSetElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLFrameSetElement2, 0x3050f5c6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f5c6-98b5-11cf-bb82-00aa00bdce0b")
IHTMLFrameSetElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_onbeforeprint(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onbeforeprint(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onafterprint(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onafterprint(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLFrameSetElement2, 0x3050f5c6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLFrameSetElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLFrameSetElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLFrameSetElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLFrameSetElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLFrameSetElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLFrameSetElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLFrameSetElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLFrameSetElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLFrameSetElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_onbeforeprint)(
        IHTMLFrameSetElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onbeforeprint)(
        IHTMLFrameSetElement2* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onafterprint)(
        IHTMLFrameSetElement2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onafterprint)(
        IHTMLFrameSetElement2* This,
        VARIANT *p);

    END_INTERFACE
} IHTMLFrameSetElement2Vtbl;
interface IHTMLFrameSetElement2 {
    CONST_VTBL IHTMLFrameSetElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLFrameSetElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLFrameSetElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLFrameSetElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLFrameSetElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLFrameSetElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLFrameSetElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLFrameSetElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLFrameSetElement2 methods ***/
#define IHTMLFrameSetElement2_put_onbeforeprint(This,v) (This)->lpVtbl->put_onbeforeprint(This,v)
#define IHTMLFrameSetElement2_get_onbeforeprint(This,p) (This)->lpVtbl->get_onbeforeprint(This,p)
#define IHTMLFrameSetElement2_put_onafterprint(This,v) (This)->lpVtbl->put_onafterprint(This,v)
#define IHTMLFrameSetElement2_get_onafterprint(This,p) (This)->lpVtbl->get_onafterprint(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLFrameSetElement2_QueryInterface(IHTMLFrameSetElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLFrameSetElement2_AddRef(IHTMLFrameSetElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLFrameSetElement2_Release(IHTMLFrameSetElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLFrameSetElement2_GetTypeInfoCount(IHTMLFrameSetElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement2_GetTypeInfo(IHTMLFrameSetElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement2_GetIDsOfNames(IHTMLFrameSetElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement2_Invoke(IHTMLFrameSetElement2* 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);
}
/*** IHTMLFrameSetElement2 methods ***/
static FORCEINLINE HRESULT IHTMLFrameSetElement2_put_onbeforeprint(IHTMLFrameSetElement2* This,VARIANT v) {
    return This->lpVtbl->put_onbeforeprint(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement2_get_onbeforeprint(IHTMLFrameSetElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforeprint(This,p);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement2_put_onafterprint(IHTMLFrameSetElement2* This,VARIANT v) {
    return This->lpVtbl->put_onafterprint(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement2_get_onafterprint(IHTMLFrameSetElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onafterprint(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement2_put_onbeforeprint_Proxy(
    IHTMLFrameSetElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLFrameSetElement2_put_onbeforeprint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement2_get_onbeforeprint_Proxy(
    IHTMLFrameSetElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLFrameSetElement2_get_onbeforeprint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement2_put_onafterprint_Proxy(
    IHTMLFrameSetElement2* This,
    VARIANT v);
void __RPC_STUB IHTMLFrameSetElement2_put_onafterprint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement2_get_onafterprint_Proxy(
    IHTMLFrameSetElement2* This,
    VARIANT *p);
void __RPC_STUB IHTMLFrameSetElement2_get_onafterprint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLFrameSetElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLFrameSetElement3 interface
 */
#ifndef __IHTMLFrameSetElement3_INTERFACE_DEFINED__
#define __IHTMLFrameSetElement3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLFrameSetElement3, 0x30510796, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510796-98b5-11cf-bb82-00aa00bdce0b")
IHTMLFrameSetElement3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_onhashchange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onhashchange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onmessage(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onmessage(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onoffline(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onoffline(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ononline(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ononline(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onstorage(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onstorage(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLFrameSetElement3, 0x30510796, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLFrameSetElement3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLFrameSetElement3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLFrameSetElement3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLFrameSetElement3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLFrameSetElement3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLFrameSetElement3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLFrameSetElement3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLFrameSetElement3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLFrameSetElement3 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_onhashchange)(
        IHTMLFrameSetElement3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onhashchange)(
        IHTMLFrameSetElement3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onmessage)(
        IHTMLFrameSetElement3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onmessage)(
        IHTMLFrameSetElement3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onoffline)(
        IHTMLFrameSetElement3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onoffline)(
        IHTMLFrameSetElement3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ononline)(
        IHTMLFrameSetElement3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ononline)(
        IHTMLFrameSetElement3* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onstorage)(
        IHTMLFrameSetElement3* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onstorage)(
        IHTMLFrameSetElement3* This,
        VARIANT *p);

    END_INTERFACE
} IHTMLFrameSetElement3Vtbl;
interface IHTMLFrameSetElement3 {
    CONST_VTBL IHTMLFrameSetElement3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLFrameSetElement3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLFrameSetElement3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLFrameSetElement3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLFrameSetElement3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLFrameSetElement3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLFrameSetElement3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLFrameSetElement3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLFrameSetElement3 methods ***/
#define IHTMLFrameSetElement3_put_onhashchange(This,v) (This)->lpVtbl->put_onhashchange(This,v)
#define IHTMLFrameSetElement3_get_onhashchange(This,p) (This)->lpVtbl->get_onhashchange(This,p)
#define IHTMLFrameSetElement3_put_onmessage(This,v) (This)->lpVtbl->put_onmessage(This,v)
#define IHTMLFrameSetElement3_get_onmessage(This,p) (This)->lpVtbl->get_onmessage(This,p)
#define IHTMLFrameSetElement3_put_onoffline(This,v) (This)->lpVtbl->put_onoffline(This,v)
#define IHTMLFrameSetElement3_get_onoffline(This,p) (This)->lpVtbl->get_onoffline(This,p)
#define IHTMLFrameSetElement3_put_ononline(This,v) (This)->lpVtbl->put_ononline(This,v)
#define IHTMLFrameSetElement3_get_ononline(This,p) (This)->lpVtbl->get_ononline(This,p)
#define IHTMLFrameSetElement3_put_onstorage(This,v) (This)->lpVtbl->put_onstorage(This,v)
#define IHTMLFrameSetElement3_get_onstorage(This,p) (This)->lpVtbl->get_onstorage(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLFrameSetElement3_QueryInterface(IHTMLFrameSetElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLFrameSetElement3_AddRef(IHTMLFrameSetElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLFrameSetElement3_Release(IHTMLFrameSetElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLFrameSetElement3_GetTypeInfoCount(IHTMLFrameSetElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement3_GetTypeInfo(IHTMLFrameSetElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement3_GetIDsOfNames(IHTMLFrameSetElement3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement3_Invoke(IHTMLFrameSetElement3* 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);
}
/*** IHTMLFrameSetElement3 methods ***/
static FORCEINLINE HRESULT IHTMLFrameSetElement3_put_onhashchange(IHTMLFrameSetElement3* This,VARIANT v) {
    return This->lpVtbl->put_onhashchange(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement3_get_onhashchange(IHTMLFrameSetElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onhashchange(This,p);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement3_put_onmessage(IHTMLFrameSetElement3* This,VARIANT v) {
    return This->lpVtbl->put_onmessage(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement3_get_onmessage(IHTMLFrameSetElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onmessage(This,p);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement3_put_onoffline(IHTMLFrameSetElement3* This,VARIANT v) {
    return This->lpVtbl->put_onoffline(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement3_get_onoffline(IHTMLFrameSetElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onoffline(This,p);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement3_put_ononline(IHTMLFrameSetElement3* This,VARIANT v) {
    return This->lpVtbl->put_ononline(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement3_get_ononline(IHTMLFrameSetElement3* This,VARIANT *p) {
    return This->lpVtbl->get_ononline(This,p);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement3_put_onstorage(IHTMLFrameSetElement3* This,VARIANT v) {
    return This->lpVtbl->put_onstorage(This,v);
}
static FORCEINLINE HRESULT IHTMLFrameSetElement3_get_onstorage(IHTMLFrameSetElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onstorage(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement3_put_onhashchange_Proxy(
    IHTMLFrameSetElement3* This,
    VARIANT v);
void __RPC_STUB IHTMLFrameSetElement3_put_onhashchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement3_get_onhashchange_Proxy(
    IHTMLFrameSetElement3* This,
    VARIANT *p);
void __RPC_STUB IHTMLFrameSetElement3_get_onhashchange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement3_put_onmessage_Proxy(
    IHTMLFrameSetElement3* This,
    VARIANT v);
void __RPC_STUB IHTMLFrameSetElement3_put_onmessage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement3_get_onmessage_Proxy(
    IHTMLFrameSetElement3* This,
    VARIANT *p);
void __RPC_STUB IHTMLFrameSetElement3_get_onmessage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement3_put_onoffline_Proxy(
    IHTMLFrameSetElement3* This,
    VARIANT v);
void __RPC_STUB IHTMLFrameSetElement3_put_onoffline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement3_get_onoffline_Proxy(
    IHTMLFrameSetElement3* This,
    VARIANT *p);
void __RPC_STUB IHTMLFrameSetElement3_get_onoffline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement3_put_ononline_Proxy(
    IHTMLFrameSetElement3* This,
    VARIANT v);
void __RPC_STUB IHTMLFrameSetElement3_put_ononline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement3_get_ononline_Proxy(
    IHTMLFrameSetElement3* This,
    VARIANT *p);
void __RPC_STUB IHTMLFrameSetElement3_get_ononline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement3_put_onstorage_Proxy(
    IHTMLFrameSetElement3* This,
    VARIANT v);
void __RPC_STUB IHTMLFrameSetElement3_put_onstorage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFrameSetElement3_get_onstorage_Proxy(
    IHTMLFrameSetElement3* This,
    VARIANT *p);
void __RPC_STUB IHTMLFrameSetElement3_get_onstorage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLFrameSetElement3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLFrameSetSite dispinterface
 */
#ifndef __DispHTMLFrameSetSite_DISPINTERFACE_DEFINED__
#define __DispHTMLFrameSetSite_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLFrameSetSite, 0x3050f514, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f514-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLFrameSetSite : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLFrameSetSite, 0x3050f514, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLFrameSetSiteVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLFrameSetSite* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLFrameSetSite* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLFrameSetSite* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLFrameSetSite* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLFrameSetSite* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLFrameSetSite* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLFrameSetSite* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLFrameSetSiteVtbl;
interface DispHTMLFrameSetSite {
    CONST_VTBL DispHTMLFrameSetSiteVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLFrameSetSite_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLFrameSetSite_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLFrameSetSite_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLFrameSetSite_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLFrameSetSite_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLFrameSetSite_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLFrameSetSite_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 DispHTMLFrameSetSite_QueryInterface(DispHTMLFrameSetSite* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLFrameSetSite_AddRef(DispHTMLFrameSetSite* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLFrameSetSite_Release(DispHTMLFrameSetSite* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLFrameSetSite_GetTypeInfoCount(DispHTMLFrameSetSite* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLFrameSetSite_GetTypeInfo(DispHTMLFrameSetSite* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLFrameSetSite_GetIDsOfNames(DispHTMLFrameSetSite* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLFrameSetSite_Invoke(DispHTMLFrameSetSite* 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  /* __DispHTMLFrameSetSite_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLFrameSetSite coclass
 */

DEFINE_GUID(CLSID_HTMLFrameSetSite, 0x3050f31a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f31a-98b5-11cf-bb82-00aa00bdce0b") HTMLFrameSetSite;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLFrameSetSite, 0x3050f31a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CFrameSetSite;
/*****************************************************************************
 * IHTMLBGsound interface
 */
#ifndef __IHTMLBGsound_INTERFACE_DEFINED__
#define __IHTMLBGsound_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLBGsound, 0x3050f369, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f369-98b5-11cf-bb82-00aa00bdce0b")
IHTMLBGsound : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_src(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_src(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_loop(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_loop(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_volume(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_volume(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_balance(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_balance(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLBGsound, 0x3050f369, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLBGsoundVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLBGsound* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLBGsound* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLBGsound* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLBGsound* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLBGsound* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLBGsound* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLBGsound* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLBGsound methods ***/
    HRESULT (STDMETHODCALLTYPE *put_src)(
        IHTMLBGsound* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_src)(
        IHTMLBGsound* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_loop)(
        IHTMLBGsound* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_loop)(
        IHTMLBGsound* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_volume)(
        IHTMLBGsound* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_volume)(
        IHTMLBGsound* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_balance)(
        IHTMLBGsound* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_balance)(
        IHTMLBGsound* This,
        VARIANT *p);

    END_INTERFACE
} IHTMLBGsoundVtbl;
interface IHTMLBGsound {
    CONST_VTBL IHTMLBGsoundVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLBGsound_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLBGsound_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLBGsound_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLBGsound_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLBGsound_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLBGsound_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLBGsound_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLBGsound methods ***/
#define IHTMLBGsound_put_src(This,v) (This)->lpVtbl->put_src(This,v)
#define IHTMLBGsound_get_src(This,p) (This)->lpVtbl->get_src(This,p)
#define IHTMLBGsound_put_loop(This,v) (This)->lpVtbl->put_loop(This,v)
#define IHTMLBGsound_get_loop(This,p) (This)->lpVtbl->get_loop(This,p)
#define IHTMLBGsound_put_volume(This,v) (This)->lpVtbl->put_volume(This,v)
#define IHTMLBGsound_get_volume(This,p) (This)->lpVtbl->get_volume(This,p)
#define IHTMLBGsound_put_balance(This,v) (This)->lpVtbl->put_balance(This,v)
#define IHTMLBGsound_get_balance(This,p) (This)->lpVtbl->get_balance(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLBGsound_QueryInterface(IHTMLBGsound* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLBGsound_AddRef(IHTMLBGsound* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLBGsound_Release(IHTMLBGsound* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLBGsound_GetTypeInfoCount(IHTMLBGsound* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLBGsound_GetTypeInfo(IHTMLBGsound* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLBGsound_GetIDsOfNames(IHTMLBGsound* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLBGsound_Invoke(IHTMLBGsound* 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);
}
/*** IHTMLBGsound methods ***/
static FORCEINLINE HRESULT IHTMLBGsound_put_src(IHTMLBGsound* This,BSTR v) {
    return This->lpVtbl->put_src(This,v);
}
static FORCEINLINE HRESULT IHTMLBGsound_get_src(IHTMLBGsound* This,BSTR *p) {
    return This->lpVtbl->get_src(This,p);
}
static FORCEINLINE HRESULT IHTMLBGsound_put_loop(IHTMLBGsound* This,VARIANT v) {
    return This->lpVtbl->put_loop(This,v);
}
static FORCEINLINE HRESULT IHTMLBGsound_get_loop(IHTMLBGsound* This,VARIANT *p) {
    return This->lpVtbl->get_loop(This,p);
}
static FORCEINLINE HRESULT IHTMLBGsound_put_volume(IHTMLBGsound* This,VARIANT v) {
    return This->lpVtbl->put_volume(This,v);
}
static FORCEINLINE HRESULT IHTMLBGsound_get_volume(IHTMLBGsound* This,VARIANT *p) {
    return This->lpVtbl->get_volume(This,p);
}
static FORCEINLINE HRESULT IHTMLBGsound_put_balance(IHTMLBGsound* This,VARIANT v) {
    return This->lpVtbl->put_balance(This,v);
}
static FORCEINLINE HRESULT IHTMLBGsound_get_balance(IHTMLBGsound* This,VARIANT *p) {
    return This->lpVtbl->get_balance(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLBGsound_put_src_Proxy(
    IHTMLBGsound* This,
    BSTR v);
void __RPC_STUB IHTMLBGsound_put_src_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBGsound_get_src_Proxy(
    IHTMLBGsound* This,
    BSTR *p);
void __RPC_STUB IHTMLBGsound_get_src_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBGsound_put_loop_Proxy(
    IHTMLBGsound* This,
    VARIANT v);
void __RPC_STUB IHTMLBGsound_put_loop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBGsound_get_loop_Proxy(
    IHTMLBGsound* This,
    VARIANT *p);
void __RPC_STUB IHTMLBGsound_get_loop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBGsound_put_volume_Proxy(
    IHTMLBGsound* This,
    VARIANT v);
void __RPC_STUB IHTMLBGsound_put_volume_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBGsound_get_volume_Proxy(
    IHTMLBGsound* This,
    VARIANT *p);
void __RPC_STUB IHTMLBGsound_get_volume_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBGsound_put_balance_Proxy(
    IHTMLBGsound* This,
    VARIANT v);
void __RPC_STUB IHTMLBGsound_put_balance_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLBGsound_get_balance_Proxy(
    IHTMLBGsound* This,
    VARIANT *p);
void __RPC_STUB IHTMLBGsound_get_balance_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLBGsound_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLBGsound dispinterface
 */
#ifndef __DispHTMLBGsound_DISPINTERFACE_DEFINED__
#define __DispHTMLBGsound_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLBGsound, 0x3050f53c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f53c-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLBGsound : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLBGsound, 0x3050f53c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLBGsoundVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLBGsound* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLBGsound* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLBGsound* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLBGsound* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLBGsound* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLBGsound* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLBGsound* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLBGsoundVtbl;
interface DispHTMLBGsound {
    CONST_VTBL DispHTMLBGsoundVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLBGsound_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLBGsound_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLBGsound_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLBGsound_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLBGsound_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLBGsound_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLBGsound_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 DispHTMLBGsound_QueryInterface(DispHTMLBGsound* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLBGsound_AddRef(DispHTMLBGsound* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLBGsound_Release(DispHTMLBGsound* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLBGsound_GetTypeInfoCount(DispHTMLBGsound* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLBGsound_GetTypeInfo(DispHTMLBGsound* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLBGsound_GetIDsOfNames(DispHTMLBGsound* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLBGsound_Invoke(DispHTMLBGsound* 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  /* __DispHTMLBGsound_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLBGsound coclass
 */

DEFINE_GUID(CLSID_HTMLBGsound, 0x3050f370, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f370-98b5-11cf-bb82-00aa00bdce0b") HTMLBGsound;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLBGsound, 0x3050f370, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CBGsound;
/*****************************************************************************
 * IHTMLFontNamesCollection interface
 */
#ifndef __IHTMLFontNamesCollection_INTERFACE_DEFINED__
#define __IHTMLFontNamesCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLFontNamesCollection, 0x3050f376, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f376-98b5-11cf-bb82-00aa00bdce0b")
IHTMLFontNamesCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__newEnum(
        IUnknown **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE item(
        LONG index,
        BSTR *pBstr) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLFontNamesCollection, 0x3050f376, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLFontNamesCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLFontNamesCollection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLFontNamesCollection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLFontNamesCollection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLFontNamesCollection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLFontNamesCollection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLFontNamesCollection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLFontNamesCollection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLFontNamesCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLFontNamesCollection* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get__newEnum)(
        IHTMLFontNamesCollection* This,
        IUnknown **p);

    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLFontNamesCollection* This,
        LONG index,
        BSTR *pBstr);

    END_INTERFACE
} IHTMLFontNamesCollectionVtbl;
interface IHTMLFontNamesCollection {
    CONST_VTBL IHTMLFontNamesCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLFontNamesCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLFontNamesCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLFontNamesCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLFontNamesCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLFontNamesCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLFontNamesCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLFontNamesCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLFontNamesCollection methods ***/
#define IHTMLFontNamesCollection_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLFontNamesCollection_get__newEnum(This,p) (This)->lpVtbl->get__newEnum(This,p)
#define IHTMLFontNamesCollection_item(This,index,pBstr) (This)->lpVtbl->item(This,index,pBstr)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLFontNamesCollection_QueryInterface(IHTMLFontNamesCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLFontNamesCollection_AddRef(IHTMLFontNamesCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLFontNamesCollection_Release(IHTMLFontNamesCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLFontNamesCollection_GetTypeInfoCount(IHTMLFontNamesCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLFontNamesCollection_GetTypeInfo(IHTMLFontNamesCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLFontNamesCollection_GetIDsOfNames(IHTMLFontNamesCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLFontNamesCollection_Invoke(IHTMLFontNamesCollection* 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);
}
/*** IHTMLFontNamesCollection methods ***/
static FORCEINLINE HRESULT IHTMLFontNamesCollection_get_length(IHTMLFontNamesCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IHTMLFontNamesCollection_get__newEnum(IHTMLFontNamesCollection* This,IUnknown **p) {
    return This->lpVtbl->get__newEnum(This,p);
}
static FORCEINLINE HRESULT IHTMLFontNamesCollection_item(IHTMLFontNamesCollection* This,LONG index,BSTR *pBstr) {
    return This->lpVtbl->item(This,index,pBstr);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLFontNamesCollection_get_length_Proxy(
    IHTMLFontNamesCollection* This,
    LONG *p);
void __RPC_STUB IHTMLFontNamesCollection_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFontNamesCollection_get__newEnum_Proxy(
    IHTMLFontNamesCollection* This,
    IUnknown **p);
void __RPC_STUB IHTMLFontNamesCollection_get__newEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFontNamesCollection_item_Proxy(
    IHTMLFontNamesCollection* This,
    LONG index,
    BSTR *pBstr);
void __RPC_STUB IHTMLFontNamesCollection_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLFontNamesCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLFontSizesCollection interface
 */
#ifndef __IHTMLFontSizesCollection_INTERFACE_DEFINED__
#define __IHTMLFontSizesCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLFontSizesCollection, 0x3050f377, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f377-98b5-11cf-bb82-00aa00bdce0b")
IHTMLFontSizesCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__newEnum(
        IUnknown **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_forFont(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE item(
        LONG index,
        LONG *plSize) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLFontSizesCollection, 0x3050f377, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLFontSizesCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLFontSizesCollection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLFontSizesCollection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLFontSizesCollection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLFontSizesCollection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLFontSizesCollection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLFontSizesCollection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLFontSizesCollection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLFontSizesCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLFontSizesCollection* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get__newEnum)(
        IHTMLFontSizesCollection* This,
        IUnknown **p);

    HRESULT (STDMETHODCALLTYPE *get_forFont)(
        IHTMLFontSizesCollection* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLFontSizesCollection* This,
        LONG index,
        LONG *plSize);

    END_INTERFACE
} IHTMLFontSizesCollectionVtbl;
interface IHTMLFontSizesCollection {
    CONST_VTBL IHTMLFontSizesCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLFontSizesCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLFontSizesCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLFontSizesCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLFontSizesCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLFontSizesCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLFontSizesCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLFontSizesCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLFontSizesCollection methods ***/
#define IHTMLFontSizesCollection_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLFontSizesCollection_get__newEnum(This,p) (This)->lpVtbl->get__newEnum(This,p)
#define IHTMLFontSizesCollection_get_forFont(This,p) (This)->lpVtbl->get_forFont(This,p)
#define IHTMLFontSizesCollection_item(This,index,plSize) (This)->lpVtbl->item(This,index,plSize)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLFontSizesCollection_QueryInterface(IHTMLFontSizesCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLFontSizesCollection_AddRef(IHTMLFontSizesCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLFontSizesCollection_Release(IHTMLFontSizesCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLFontSizesCollection_GetTypeInfoCount(IHTMLFontSizesCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLFontSizesCollection_GetTypeInfo(IHTMLFontSizesCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLFontSizesCollection_GetIDsOfNames(IHTMLFontSizesCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLFontSizesCollection_Invoke(IHTMLFontSizesCollection* 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);
}
/*** IHTMLFontSizesCollection methods ***/
static FORCEINLINE HRESULT IHTMLFontSizesCollection_get_length(IHTMLFontSizesCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IHTMLFontSizesCollection_get__newEnum(IHTMLFontSizesCollection* This,IUnknown **p) {
    return This->lpVtbl->get__newEnum(This,p);
}
static FORCEINLINE HRESULT IHTMLFontSizesCollection_get_forFont(IHTMLFontSizesCollection* This,BSTR *p) {
    return This->lpVtbl->get_forFont(This,p);
}
static FORCEINLINE HRESULT IHTMLFontSizesCollection_item(IHTMLFontSizesCollection* This,LONG index,LONG *plSize) {
    return This->lpVtbl->item(This,index,plSize);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLFontSizesCollection_get_length_Proxy(
    IHTMLFontSizesCollection* This,
    LONG *p);
void __RPC_STUB IHTMLFontSizesCollection_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFontSizesCollection_get__newEnum_Proxy(
    IHTMLFontSizesCollection* This,
    IUnknown **p);
void __RPC_STUB IHTMLFontSizesCollection_get__newEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFontSizesCollection_get_forFont_Proxy(
    IHTMLFontSizesCollection* This,
    BSTR *p);
void __RPC_STUB IHTMLFontSizesCollection_get_forFont_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLFontSizesCollection_item_Proxy(
    IHTMLFontSizesCollection* This,
    LONG index,
    LONG *plSize);
void __RPC_STUB IHTMLFontSizesCollection_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLFontSizesCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLOptionsHolder interface
 */
#ifndef __IHTMLOptionsHolder_INTERFACE_DEFINED__
#define __IHTMLOptionsHolder_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLOptionsHolder, 0x3050f378, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f378-98b5-11cf-bb82-00aa00bdce0b")
IHTMLOptionsHolder : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_document(
        IHTMLDocument2 **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fonts(
        IHTMLFontNamesCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_execArg(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_execArg(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_errorLine(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_errorLine(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_errorCharacter(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_errorCharacter(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_errorCode(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_errorCode(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_errorMessage(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_errorMessage(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_errorDebug(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_errorDebug(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_unsecuredWindowOfDocument(
        IHTMLWindow2 **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_findText(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_findText(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_anythingAfterFrameset(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_anythingAfterFrameset(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE sizes(
        BSTR fontName,
        IHTMLFontSizesCollection **pSizesCollection) = 0;

    virtual HRESULT STDMETHODCALLTYPE openfiledlg(
        VARIANT initFile,
        VARIANT initDir,
        VARIANT filter,
        VARIANT title,
        BSTR *pathName) = 0;

    virtual HRESULT STDMETHODCALLTYPE savefiledlg(
        VARIANT initFile,
        VARIANT initDir,
        VARIANT filter,
        VARIANT title,
        BSTR *pathName) = 0;

    virtual HRESULT STDMETHODCALLTYPE choosecolordlg(
        VARIANT initColor,
        LONG *rgbColor) = 0;

    virtual HRESULT STDMETHODCALLTYPE showSecurityInfo(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE isApartmentModel(
        IHTMLObjectElement *object,
        VARIANT_BOOL *fApartment) = 0;

    virtual HRESULT STDMETHODCALLTYPE getCharset(
        BSTR fontName,
        LONG *charset) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_secureConnectionInfo(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLOptionsHolder, 0x3050f378, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLOptionsHolderVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLOptionsHolder* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLOptionsHolder* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLOptionsHolder* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLOptionsHolder* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLOptionsHolder* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLOptionsHolder* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLOptionsHolder* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLOptionsHolder methods ***/
    HRESULT (STDMETHODCALLTYPE *get_document)(
        IHTMLOptionsHolder* This,
        IHTMLDocument2 **p);

    HRESULT (STDMETHODCALLTYPE *get_fonts)(
        IHTMLOptionsHolder* This,
        IHTMLFontNamesCollection **p);

    HRESULT (STDMETHODCALLTYPE *put_execArg)(
        IHTMLOptionsHolder* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_execArg)(
        IHTMLOptionsHolder* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_errorLine)(
        IHTMLOptionsHolder* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_errorLine)(
        IHTMLOptionsHolder* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_errorCharacter)(
        IHTMLOptionsHolder* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_errorCharacter)(
        IHTMLOptionsHolder* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_errorCode)(
        IHTMLOptionsHolder* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_errorCode)(
        IHTMLOptionsHolder* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_errorMessage)(
        IHTMLOptionsHolder* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_errorMessage)(
        IHTMLOptionsHolder* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_errorDebug)(
        IHTMLOptionsHolder* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_errorDebug)(
        IHTMLOptionsHolder* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_unsecuredWindowOfDocument)(
        IHTMLOptionsHolder* This,
        IHTMLWindow2 **p);

    HRESULT (STDMETHODCALLTYPE *put_findText)(
        IHTMLOptionsHolder* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_findText)(
        IHTMLOptionsHolder* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_anythingAfterFrameset)(
        IHTMLOptionsHolder* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_anythingAfterFrameset)(
        IHTMLOptionsHolder* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *sizes)(
        IHTMLOptionsHolder* This,
        BSTR fontName,
        IHTMLFontSizesCollection **pSizesCollection);

    HRESULT (STDMETHODCALLTYPE *openfiledlg)(
        IHTMLOptionsHolder* This,
        VARIANT initFile,
        VARIANT initDir,
        VARIANT filter,
        VARIANT title,
        BSTR *pathName);

    HRESULT (STDMETHODCALLTYPE *savefiledlg)(
        IHTMLOptionsHolder* This,
        VARIANT initFile,
        VARIANT initDir,
        VARIANT filter,
        VARIANT title,
        BSTR *pathName);

    HRESULT (STDMETHODCALLTYPE *choosecolordlg)(
        IHTMLOptionsHolder* This,
        VARIANT initColor,
        LONG *rgbColor);

    HRESULT (STDMETHODCALLTYPE *showSecurityInfo)(
        IHTMLOptionsHolder* This);

    HRESULT (STDMETHODCALLTYPE *isApartmentModel)(
        IHTMLOptionsHolder* This,
        IHTMLObjectElement *object,
        VARIANT_BOOL *fApartment);

    HRESULT (STDMETHODCALLTYPE *getCharset)(
        IHTMLOptionsHolder* This,
        BSTR fontName,
        LONG *charset);

    HRESULT (STDMETHODCALLTYPE *get_secureConnectionInfo)(
        IHTMLOptionsHolder* This,
        BSTR *p);

    END_INTERFACE
} IHTMLOptionsHolderVtbl;
interface IHTMLOptionsHolder {
    CONST_VTBL IHTMLOptionsHolderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLOptionsHolder_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLOptionsHolder_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLOptionsHolder_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLOptionsHolder_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLOptionsHolder_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLOptionsHolder_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLOptionsHolder_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLOptionsHolder methods ***/
#define IHTMLOptionsHolder_get_document(This,p) (This)->lpVtbl->get_document(This,p)
#define IHTMLOptionsHolder_get_fonts(This,p) (This)->lpVtbl->get_fonts(This,p)
#define IHTMLOptionsHolder_put_execArg(This,v) (This)->lpVtbl->put_execArg(This,v)
#define IHTMLOptionsHolder_get_execArg(This,p) (This)->lpVtbl->get_execArg(This,p)
#define IHTMLOptionsHolder_put_errorLine(This,v) (This)->lpVtbl->put_errorLine(This,v)
#define IHTMLOptionsHolder_get_errorLine(This,p) (This)->lpVtbl->get_errorLine(This,p)
#define IHTMLOptionsHolder_put_errorCharacter(This,v) (This)->lpVtbl->put_errorCharacter(This,v)
#define IHTMLOptionsHolder_get_errorCharacter(This,p) (This)->lpVtbl->get_errorCharacter(This,p)
#define IHTMLOptionsHolder_put_errorCode(This,v) (This)->lpVtbl->put_errorCode(This,v)
#define IHTMLOptionsHolder_get_errorCode(This,p) (This)->lpVtbl->get_errorCode(This,p)
#define IHTMLOptionsHolder_put_errorMessage(This,v) (This)->lpVtbl->put_errorMessage(This,v)
#define IHTMLOptionsHolder_get_errorMessage(This,p) (This)->lpVtbl->get_errorMessage(This,p)
#define IHTMLOptionsHolder_put_errorDebug(This,v) (This)->lpVtbl->put_errorDebug(This,v)
#define IHTMLOptionsHolder_get_errorDebug(This,p) (This)->lpVtbl->get_errorDebug(This,p)
#define IHTMLOptionsHolder_get_unsecuredWindowOfDocument(This,p) (This)->lpVtbl->get_unsecuredWindowOfDocument(This,p)
#define IHTMLOptionsHolder_put_findText(This,v) (This)->lpVtbl->put_findText(This,v)
#define IHTMLOptionsHolder_get_findText(This,p) (This)->lpVtbl->get_findText(This,p)
#define IHTMLOptionsHolder_put_anythingAfterFrameset(This,v) (This)->lpVtbl->put_anythingAfterFrameset(This,v)
#define IHTMLOptionsHolder_get_anythingAfterFrameset(This,p) (This)->lpVtbl->get_anythingAfterFrameset(This,p)
#define IHTMLOptionsHolder_sizes(This,fontName,pSizesCollection) (This)->lpVtbl->sizes(This,fontName,pSizesCollection)
#define IHTMLOptionsHolder_openfiledlg(This,initFile,initDir,filter,title,pathName) (This)->lpVtbl->openfiledlg(This,initFile,initDir,filter,title,pathName)
#define IHTMLOptionsHolder_savefiledlg(This,initFile,initDir,filter,title,pathName) (This)->lpVtbl->savefiledlg(This,initFile,initDir,filter,title,pathName)
#define IHTMLOptionsHolder_choosecolordlg(This,initColor,rgbColor) (This)->lpVtbl->choosecolordlg(This,initColor,rgbColor)
#define IHTMLOptionsHolder_showSecurityInfo(This) (This)->lpVtbl->showSecurityInfo(This)
#define IHTMLOptionsHolder_isApartmentModel(This,object,fApartment) (This)->lpVtbl->isApartmentModel(This,object,fApartment)
#define IHTMLOptionsHolder_getCharset(This,fontName,charset) (This)->lpVtbl->getCharset(This,fontName,charset)
#define IHTMLOptionsHolder_get_secureConnectionInfo(This,p) (This)->lpVtbl->get_secureConnectionInfo(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLOptionsHolder_QueryInterface(IHTMLOptionsHolder* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLOptionsHolder_AddRef(IHTMLOptionsHolder* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLOptionsHolder_Release(IHTMLOptionsHolder* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLOptionsHolder_GetTypeInfoCount(IHTMLOptionsHolder* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLOptionsHolder_GetTypeInfo(IHTMLOptionsHolder* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLOptionsHolder_GetIDsOfNames(IHTMLOptionsHolder* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLOptionsHolder_Invoke(IHTMLOptionsHolder* 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);
}
/*** IHTMLOptionsHolder methods ***/
static FORCEINLINE HRESULT IHTMLOptionsHolder_get_document(IHTMLOptionsHolder* This,IHTMLDocument2 **p) {
    return This->lpVtbl->get_document(This,p);
}
static FORCEINLINE HRESULT IHTMLOptionsHolder_get_fonts(IHTMLOptionsHolder* This,IHTMLFontNamesCollection **p) {
    return This->lpVtbl->get_fonts(This,p);
}
static FORCEINLINE HRESULT IHTMLOptionsHolder_put_execArg(IHTMLOptionsHolder* This,VARIANT v) {
    return This->lpVtbl->put_execArg(This,v);
}
static FORCEINLINE HRESULT IHTMLOptionsHolder_get_execArg(IHTMLOptionsHolder* This,VARIANT *p) {
    return This->lpVtbl->get_execArg(This,p);
}
static FORCEINLINE HRESULT IHTMLOptionsHolder_put_errorLine(IHTMLOptionsHolder* This,LONG v) {
    return This->lpVtbl->put_errorLine(This,v);
}
static FORCEINLINE HRESULT IHTMLOptionsHolder_get_errorLine(IHTMLOptionsHolder* This,LONG *p) {
    return This->lpVtbl->get_errorLine(This,p);
}
static FORCEINLINE HRESULT IHTMLOptionsHolder_put_errorCharacter(IHTMLOptionsHolder* This,LONG v) {
    return This->lpVtbl->put_errorCharacter(This,v);
}
static FORCEINLINE HRESULT IHTMLOptionsHolder_get_errorCharacter(IHTMLOptionsHolder* This,LONG *p) {
    return This->lpVtbl->get_errorCharacter(This,p);
}
static FORCEINLINE HRESULT IHTMLOptionsHolder_put_errorCode(IHTMLOptionsHolder* This,LONG v) {
    return This->lpVtbl->put_errorCode(This,v);
}
static FORCEINLINE HRESULT IHTMLOptionsHolder_get_errorCode(IHTMLOptionsHolder* This,LONG *p) {
    return This->lpVtbl->get_errorCode(This,p);
}
static FORCEINLINE HRESULT IHTMLOptionsHolder_put_errorMessage(IHTMLOptionsHolder* This,BSTR v) {
    return This->lpVtbl->put_errorMessage(This,v);
}
static FORCEINLINE HRESULT IHTMLOptionsHolder_get_errorMessage(IHTMLOptionsHolder* This,BSTR *p) {
    return This->lpVtbl->get_errorMessage(This,p);
}
static FORCEINLINE HRESULT IHTMLOptionsHolder_put_errorDebug(IHTMLOptionsHolder* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_errorDebug(This,v);
}
static FORCEINLINE HRESULT IHTMLOptionsHolder_get_errorDebug(IHTMLOptionsHolder* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_errorDebug(This,p);
}
static FORCEINLINE HRESULT IHTMLOptionsHolder_get_unsecuredWindowOfDocument(IHTMLOptionsHolder* This,IHTMLWindow2 **p) {
    return This->lpVtbl->get_unsecuredWindowOfDocument(This,p);
}
static FORCEINLINE HRESULT IHTMLOptionsHolder_put_findText(IHTMLOptionsHolder* This,BSTR v) {
    return This->lpVtbl->put_findText(This,v);
}
static FORCEINLINE HRESULT IHTMLOptionsHolder_get_findText(IHTMLOptionsHolder* This,BSTR *p) {
    return This->lpVtbl->get_findText(This,p);
}
static FORCEINLINE HRESULT IHTMLOptionsHolder_put_anythingAfterFrameset(IHTMLOptionsHolder* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_anythingAfterFrameset(This,v);
}
static FORCEINLINE HRESULT IHTMLOptionsHolder_get_anythingAfterFrameset(IHTMLOptionsHolder* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_anythingAfterFrameset(This,p);
}
static FORCEINLINE HRESULT IHTMLOptionsHolder_sizes(IHTMLOptionsHolder* This,BSTR fontName,IHTMLFontSizesCollection **pSizesCollection) {
    return This->lpVtbl->sizes(This,fontName,pSizesCollection);
}
static FORCEINLINE HRESULT IHTMLOptionsHolder_openfiledlg(IHTMLOptionsHolder* This,VARIANT initFile,VARIANT initDir,VARIANT filter,VARIANT title,BSTR *pathName) {
    return This->lpVtbl->openfiledlg(This,initFile,initDir,filter,title,pathName);
}
static FORCEINLINE HRESULT IHTMLOptionsHolder_savefiledlg(IHTMLOptionsHolder* This,VARIANT initFile,VARIANT initDir,VARIANT filter,VARIANT title,BSTR *pathName) {
    return This->lpVtbl->savefiledlg(This,initFile,initDir,filter,title,pathName);
}
static FORCEINLINE HRESULT IHTMLOptionsHolder_choosecolordlg(IHTMLOptionsHolder* This,VARIANT initColor,LONG *rgbColor) {
    return This->lpVtbl->choosecolordlg(This,initColor,rgbColor);
}
static FORCEINLINE HRESULT IHTMLOptionsHolder_showSecurityInfo(IHTMLOptionsHolder* This) {
    return This->lpVtbl->showSecurityInfo(This);
}
static FORCEINLINE HRESULT IHTMLOptionsHolder_isApartmentModel(IHTMLOptionsHolder* This,IHTMLObjectElement *object,VARIANT_BOOL *fApartment) {
    return This->lpVtbl->isApartmentModel(This,object,fApartment);
}
static FORCEINLINE HRESULT IHTMLOptionsHolder_getCharset(IHTMLOptionsHolder* This,BSTR fontName,LONG *charset) {
    return This->lpVtbl->getCharset(This,fontName,charset);
}
static FORCEINLINE HRESULT IHTMLOptionsHolder_get_secureConnectionInfo(IHTMLOptionsHolder* This,BSTR *p) {
    return This->lpVtbl->get_secureConnectionInfo(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLOptionsHolder_get_document_Proxy(
    IHTMLOptionsHolder* This,
    IHTMLDocument2 **p);
void __RPC_STUB IHTMLOptionsHolder_get_document_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionsHolder_get_fonts_Proxy(
    IHTMLOptionsHolder* This,
    IHTMLFontNamesCollection **p);
void __RPC_STUB IHTMLOptionsHolder_get_fonts_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionsHolder_put_execArg_Proxy(
    IHTMLOptionsHolder* This,
    VARIANT v);
void __RPC_STUB IHTMLOptionsHolder_put_execArg_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionsHolder_get_execArg_Proxy(
    IHTMLOptionsHolder* This,
    VARIANT *p);
void __RPC_STUB IHTMLOptionsHolder_get_execArg_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionsHolder_put_errorLine_Proxy(
    IHTMLOptionsHolder* This,
    LONG v);
void __RPC_STUB IHTMLOptionsHolder_put_errorLine_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionsHolder_get_errorLine_Proxy(
    IHTMLOptionsHolder* This,
    LONG *p);
void __RPC_STUB IHTMLOptionsHolder_get_errorLine_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionsHolder_put_errorCharacter_Proxy(
    IHTMLOptionsHolder* This,
    LONG v);
void __RPC_STUB IHTMLOptionsHolder_put_errorCharacter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionsHolder_get_errorCharacter_Proxy(
    IHTMLOptionsHolder* This,
    LONG *p);
void __RPC_STUB IHTMLOptionsHolder_get_errorCharacter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionsHolder_put_errorCode_Proxy(
    IHTMLOptionsHolder* This,
    LONG v);
void __RPC_STUB IHTMLOptionsHolder_put_errorCode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionsHolder_get_errorCode_Proxy(
    IHTMLOptionsHolder* This,
    LONG *p);
void __RPC_STUB IHTMLOptionsHolder_get_errorCode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionsHolder_put_errorMessage_Proxy(
    IHTMLOptionsHolder* This,
    BSTR v);
void __RPC_STUB IHTMLOptionsHolder_put_errorMessage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionsHolder_get_errorMessage_Proxy(
    IHTMLOptionsHolder* This,
    BSTR *p);
void __RPC_STUB IHTMLOptionsHolder_get_errorMessage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionsHolder_put_errorDebug_Proxy(
    IHTMLOptionsHolder* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLOptionsHolder_put_errorDebug_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionsHolder_get_errorDebug_Proxy(
    IHTMLOptionsHolder* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLOptionsHolder_get_errorDebug_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionsHolder_get_unsecuredWindowOfDocument_Proxy(
    IHTMLOptionsHolder* This,
    IHTMLWindow2 **p);
void __RPC_STUB IHTMLOptionsHolder_get_unsecuredWindowOfDocument_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionsHolder_put_findText_Proxy(
    IHTMLOptionsHolder* This,
    BSTR v);
void __RPC_STUB IHTMLOptionsHolder_put_findText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionsHolder_get_findText_Proxy(
    IHTMLOptionsHolder* This,
    BSTR *p);
void __RPC_STUB IHTMLOptionsHolder_get_findText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionsHolder_put_anythingAfterFrameset_Proxy(
    IHTMLOptionsHolder* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLOptionsHolder_put_anythingAfterFrameset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionsHolder_get_anythingAfterFrameset_Proxy(
    IHTMLOptionsHolder* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLOptionsHolder_get_anythingAfterFrameset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionsHolder_sizes_Proxy(
    IHTMLOptionsHolder* This,
    BSTR fontName,
    IHTMLFontSizesCollection **pSizesCollection);
void __RPC_STUB IHTMLOptionsHolder_sizes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionsHolder_openfiledlg_Proxy(
    IHTMLOptionsHolder* This,
    VARIANT initFile,
    VARIANT initDir,
    VARIANT filter,
    VARIANT title,
    BSTR *pathName);
void __RPC_STUB IHTMLOptionsHolder_openfiledlg_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionsHolder_savefiledlg_Proxy(
    IHTMLOptionsHolder* This,
    VARIANT initFile,
    VARIANT initDir,
    VARIANT filter,
    VARIANT title,
    BSTR *pathName);
void __RPC_STUB IHTMLOptionsHolder_savefiledlg_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionsHolder_choosecolordlg_Proxy(
    IHTMLOptionsHolder* This,
    VARIANT initColor,
    LONG *rgbColor);
void __RPC_STUB IHTMLOptionsHolder_choosecolordlg_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionsHolder_showSecurityInfo_Proxy(
    IHTMLOptionsHolder* This);
void __RPC_STUB IHTMLOptionsHolder_showSecurityInfo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionsHolder_isApartmentModel_Proxy(
    IHTMLOptionsHolder* This,
    IHTMLObjectElement *object,
    VARIANT_BOOL *fApartment);
void __RPC_STUB IHTMLOptionsHolder_isApartmentModel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionsHolder_getCharset_Proxy(
    IHTMLOptionsHolder* This,
    BSTR fontName,
    LONG *charset);
void __RPC_STUB IHTMLOptionsHolder_getCharset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLOptionsHolder_get_secureConnectionInfo_Proxy(
    IHTMLOptionsHolder* This,
    BSTR *p);
void __RPC_STUB IHTMLOptionsHolder_get_secureConnectionInfo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLOptionsHolder_INTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLStyleElementEvents2 dispinterface
 */
#ifndef __HTMLStyleElementEvents2_DISPINTERFACE_DEFINED__
#define __HTMLStyleElementEvents2_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLStyleElementEvents2, 0x3050f615, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f615-98b5-11cf-bb82-00aa00bdce0b")
HTMLStyleElementEvents2 : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLStyleElementEvents2, 0x3050f615, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLStyleElementEvents2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLStyleElementEvents2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLStyleElementEvents2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLStyleElementEvents2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLStyleElementEvents2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLStyleElementEvents2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLStyleElementEvents2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLStyleElementEvents2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLStyleElementEvents2Vtbl;
interface HTMLStyleElementEvents2 {
    CONST_VTBL HTMLStyleElementEvents2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLStyleElementEvents2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLStyleElementEvents2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLStyleElementEvents2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLStyleElementEvents2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLStyleElementEvents2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLStyleElementEvents2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLStyleElementEvents2_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 HTMLStyleElementEvents2_QueryInterface(HTMLStyleElementEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLStyleElementEvents2_AddRef(HTMLStyleElementEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLStyleElementEvents2_Release(HTMLStyleElementEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLStyleElementEvents2_GetTypeInfoCount(HTMLStyleElementEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLStyleElementEvents2_GetTypeInfo(HTMLStyleElementEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLStyleElementEvents2_GetIDsOfNames(HTMLStyleElementEvents2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLStyleElementEvents2_Invoke(HTMLStyleElementEvents2* 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  /* __HTMLStyleElementEvents2_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLStyleElementEvents dispinterface
 */
#ifndef __HTMLStyleElementEvents_DISPINTERFACE_DEFINED__
#define __HTMLStyleElementEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLStyleElementEvents, 0x3050f3cb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f3cb-98b5-11cf-bb82-00aa00bdce0b")
HTMLStyleElementEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLStyleElementEvents, 0x3050f3cb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLStyleElementEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLStyleElementEvents* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLStyleElementEvents* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLStyleElementEvents* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLStyleElementEvents* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLStyleElementEvents* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLStyleElementEvents* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLStyleElementEvents* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLStyleElementEventsVtbl;
interface HTMLStyleElementEvents {
    CONST_VTBL HTMLStyleElementEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLStyleElementEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLStyleElementEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLStyleElementEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLStyleElementEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLStyleElementEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLStyleElementEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLStyleElementEvents_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 HTMLStyleElementEvents_QueryInterface(HTMLStyleElementEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLStyleElementEvents_AddRef(HTMLStyleElementEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLStyleElementEvents_Release(HTMLStyleElementEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLStyleElementEvents_GetTypeInfoCount(HTMLStyleElementEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLStyleElementEvents_GetTypeInfo(HTMLStyleElementEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLStyleElementEvents_GetIDsOfNames(HTMLStyleElementEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLStyleElementEvents_Invoke(HTMLStyleElementEvents* 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  /* __HTMLStyleElementEvents_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLStyleElement interface
 */
#ifndef __IHTMLStyleElement_INTERFACE_DEFINED__
#define __IHTMLStyleElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLStyleElement, 0x3050f375, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f375-98b5-11cf-bb82-00aa00bdce0b")
IHTMLStyleElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_type(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_readyState(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onreadystatechange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onreadystatechange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onload(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onload(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onerror(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onerror(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_styleSheet(
        IHTMLStyleSheet **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_disabled(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_disabled(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_media(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_media(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLStyleElement, 0x3050f375, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLStyleElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLStyleElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLStyleElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLStyleElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLStyleElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLStyleElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLStyleElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLStyleElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLStyleElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_type)(
        IHTMLStyleElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLStyleElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_readyState)(
        IHTMLStyleElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_onreadystatechange)(
        IHTMLStyleElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onreadystatechange)(
        IHTMLStyleElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onload)(
        IHTMLStyleElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onload)(
        IHTMLStyleElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onerror)(
        IHTMLStyleElement* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onerror)(
        IHTMLStyleElement* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_styleSheet)(
        IHTMLStyleElement* This,
        IHTMLStyleSheet **p);

    HRESULT (STDMETHODCALLTYPE *put_disabled)(
        IHTMLStyleElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_disabled)(
        IHTMLStyleElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_media)(
        IHTMLStyleElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_media)(
        IHTMLStyleElement* This,
        BSTR *p);

    END_INTERFACE
} IHTMLStyleElementVtbl;
interface IHTMLStyleElement {
    CONST_VTBL IHTMLStyleElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLStyleElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLStyleElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLStyleElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLStyleElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLStyleElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLStyleElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLStyleElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLStyleElement methods ***/
#define IHTMLStyleElement_put_type(This,v) (This)->lpVtbl->put_type(This,v)
#define IHTMLStyleElement_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#define IHTMLStyleElement_get_readyState(This,p) (This)->lpVtbl->get_readyState(This,p)
#define IHTMLStyleElement_put_onreadystatechange(This,v) (This)->lpVtbl->put_onreadystatechange(This,v)
#define IHTMLStyleElement_get_onreadystatechange(This,p) (This)->lpVtbl->get_onreadystatechange(This,p)
#define IHTMLStyleElement_put_onload(This,v) (This)->lpVtbl->put_onload(This,v)
#define IHTMLStyleElement_get_onload(This,p) (This)->lpVtbl->get_onload(This,p)
#define IHTMLStyleElement_put_onerror(This,v) (This)->lpVtbl->put_onerror(This,v)
#define IHTMLStyleElement_get_onerror(This,p) (This)->lpVtbl->get_onerror(This,p)
#define IHTMLStyleElement_get_styleSheet(This,p) (This)->lpVtbl->get_styleSheet(This,p)
#define IHTMLStyleElement_put_disabled(This,v) (This)->lpVtbl->put_disabled(This,v)
#define IHTMLStyleElement_get_disabled(This,p) (This)->lpVtbl->get_disabled(This,p)
#define IHTMLStyleElement_put_media(This,v) (This)->lpVtbl->put_media(This,v)
#define IHTMLStyleElement_get_media(This,p) (This)->lpVtbl->get_media(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLStyleElement_QueryInterface(IHTMLStyleElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLStyleElement_AddRef(IHTMLStyleElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLStyleElement_Release(IHTMLStyleElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLStyleElement_GetTypeInfoCount(IHTMLStyleElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLStyleElement_GetTypeInfo(IHTMLStyleElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLStyleElement_GetIDsOfNames(IHTMLStyleElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLStyleElement_Invoke(IHTMLStyleElement* 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);
}
/*** IHTMLStyleElement methods ***/
static FORCEINLINE HRESULT IHTMLStyleElement_put_type(IHTMLStyleElement* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static FORCEINLINE HRESULT IHTMLStyleElement_get_type(IHTMLStyleElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleElement_get_readyState(IHTMLStyleElement* This,BSTR *p) {
    return This->lpVtbl->get_readyState(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleElement_put_onreadystatechange(IHTMLStyleElement* This,VARIANT v) {
    return This->lpVtbl->put_onreadystatechange(This,v);
}
static FORCEINLINE HRESULT IHTMLStyleElement_get_onreadystatechange(IHTMLStyleElement* This,VARIANT *p) {
    return This->lpVtbl->get_onreadystatechange(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleElement_put_onload(IHTMLStyleElement* This,VARIANT v) {
    return This->lpVtbl->put_onload(This,v);
}
static FORCEINLINE HRESULT IHTMLStyleElement_get_onload(IHTMLStyleElement* This,VARIANT *p) {
    return This->lpVtbl->get_onload(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleElement_put_onerror(IHTMLStyleElement* This,VARIANT v) {
    return This->lpVtbl->put_onerror(This,v);
}
static FORCEINLINE HRESULT IHTMLStyleElement_get_onerror(IHTMLStyleElement* This,VARIANT *p) {
    return This->lpVtbl->get_onerror(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleElement_get_styleSheet(IHTMLStyleElement* This,IHTMLStyleSheet **p) {
    return This->lpVtbl->get_styleSheet(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleElement_put_disabled(IHTMLStyleElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_disabled(This,v);
}
static FORCEINLINE HRESULT IHTMLStyleElement_get_disabled(IHTMLStyleElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_disabled(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleElement_put_media(IHTMLStyleElement* This,BSTR v) {
    return This->lpVtbl->put_media(This,v);
}
static FORCEINLINE HRESULT IHTMLStyleElement_get_media(IHTMLStyleElement* This,BSTR *p) {
    return This->lpVtbl->get_media(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLStyleElement_put_type_Proxy(
    IHTMLStyleElement* This,
    BSTR v);
void __RPC_STUB IHTMLStyleElement_put_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleElement_get_type_Proxy(
    IHTMLStyleElement* This,
    BSTR *p);
void __RPC_STUB IHTMLStyleElement_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleElement_get_readyState_Proxy(
    IHTMLStyleElement* This,
    BSTR *p);
void __RPC_STUB IHTMLStyleElement_get_readyState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleElement_put_onreadystatechange_Proxy(
    IHTMLStyleElement* This,
    VARIANT v);
void __RPC_STUB IHTMLStyleElement_put_onreadystatechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleElement_get_onreadystatechange_Proxy(
    IHTMLStyleElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyleElement_get_onreadystatechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleElement_put_onload_Proxy(
    IHTMLStyleElement* This,
    VARIANT v);
void __RPC_STUB IHTMLStyleElement_put_onload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleElement_get_onload_Proxy(
    IHTMLStyleElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyleElement_get_onload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleElement_put_onerror_Proxy(
    IHTMLStyleElement* This,
    VARIANT v);
void __RPC_STUB IHTMLStyleElement_put_onerror_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleElement_get_onerror_Proxy(
    IHTMLStyleElement* This,
    VARIANT *p);
void __RPC_STUB IHTMLStyleElement_get_onerror_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleElement_get_styleSheet_Proxy(
    IHTMLStyleElement* This,
    IHTMLStyleSheet **p);
void __RPC_STUB IHTMLStyleElement_get_styleSheet_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleElement_put_disabled_Proxy(
    IHTMLStyleElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLStyleElement_put_disabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleElement_get_disabled_Proxy(
    IHTMLStyleElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLStyleElement_get_disabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleElement_put_media_Proxy(
    IHTMLStyleElement* This,
    BSTR v);
void __RPC_STUB IHTMLStyleElement_put_media_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleElement_get_media_Proxy(
    IHTMLStyleElement* This,
    BSTR *p);
void __RPC_STUB IHTMLStyleElement_get_media_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLStyleElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLStyleElement2 interface
 */
#ifndef __IHTMLStyleElement2_INTERFACE_DEFINED__
#define __IHTMLStyleElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLStyleElement2, 0x3051072a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051072a-98b5-11cf-bb82-00aa00bdce0b")
IHTMLStyleElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_sheet(
        IHTMLStyleSheet **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLStyleElement2, 0x3051072a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLStyleElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLStyleElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLStyleElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLStyleElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLStyleElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLStyleElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLStyleElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLStyleElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLStyleElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_sheet)(
        IHTMLStyleElement2* This,
        IHTMLStyleSheet **p);

    END_INTERFACE
} IHTMLStyleElement2Vtbl;
interface IHTMLStyleElement2 {
    CONST_VTBL IHTMLStyleElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLStyleElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLStyleElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLStyleElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLStyleElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLStyleElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLStyleElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLStyleElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLStyleElement2 methods ***/
#define IHTMLStyleElement2_get_sheet(This,p) (This)->lpVtbl->get_sheet(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLStyleElement2_QueryInterface(IHTMLStyleElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLStyleElement2_AddRef(IHTMLStyleElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLStyleElement2_Release(IHTMLStyleElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLStyleElement2_GetTypeInfoCount(IHTMLStyleElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLStyleElement2_GetTypeInfo(IHTMLStyleElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLStyleElement2_GetIDsOfNames(IHTMLStyleElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLStyleElement2_Invoke(IHTMLStyleElement2* 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);
}
/*** IHTMLStyleElement2 methods ***/
static FORCEINLINE HRESULT IHTMLStyleElement2_get_sheet(IHTMLStyleElement2* This,IHTMLStyleSheet **p) {
    return This->lpVtbl->get_sheet(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLStyleElement2_get_sheet_Proxy(
    IHTMLStyleElement2* This,
    IHTMLStyleSheet **p);
void __RPC_STUB IHTMLStyleElement2_get_sheet_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLStyleElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLStyleElement dispinterface
 */
#ifndef __DispHTMLStyleElement_DISPINTERFACE_DEFINED__
#define __DispHTMLStyleElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLStyleElement, 0x3050f511, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f511-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLStyleElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLStyleElement, 0x3050f511, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLStyleElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLStyleElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLStyleElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLStyleElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLStyleElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLStyleElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLStyleElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLStyleElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLStyleElementVtbl;
interface DispHTMLStyleElement {
    CONST_VTBL DispHTMLStyleElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLStyleElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLStyleElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLStyleElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLStyleElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLStyleElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLStyleElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLStyleElement_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 DispHTMLStyleElement_QueryInterface(DispHTMLStyleElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLStyleElement_AddRef(DispHTMLStyleElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLStyleElement_Release(DispHTMLStyleElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLStyleElement_GetTypeInfoCount(DispHTMLStyleElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLStyleElement_GetTypeInfo(DispHTMLStyleElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLStyleElement_GetIDsOfNames(DispHTMLStyleElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLStyleElement_Invoke(DispHTMLStyleElement* 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  /* __DispHTMLStyleElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLStyleElement coclass
 */

DEFINE_GUID(CLSID_HTMLStyleElement, 0x3050f37d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f37d-98b5-11cf-bb82-00aa00bdce0b") HTMLStyleElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLStyleElement, 0x3050f37d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CStyleElement;
/*****************************************************************************
 * IHTMLStyleFontFace interface
 */
#ifndef __IHTMLStyleFontFace_INTERFACE_DEFINED__
#define __IHTMLStyleFontFace_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLStyleFontFace, 0x3050f3d5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f3d5-98b5-11cf-bb82-00aa00bdce0b")
IHTMLStyleFontFace : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_fontsrc(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fontsrc(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLStyleFontFace, 0x3050f3d5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLStyleFontFaceVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLStyleFontFace* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLStyleFontFace* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLStyleFontFace* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLStyleFontFace* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLStyleFontFace* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLStyleFontFace* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLStyleFontFace* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLStyleFontFace methods ***/
    HRESULT (STDMETHODCALLTYPE *put_fontsrc)(
        IHTMLStyleFontFace* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_fontsrc)(
        IHTMLStyleFontFace* This,
        BSTR *p);

    END_INTERFACE
} IHTMLStyleFontFaceVtbl;
interface IHTMLStyleFontFace {
    CONST_VTBL IHTMLStyleFontFaceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLStyleFontFace_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLStyleFontFace_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLStyleFontFace_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLStyleFontFace_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLStyleFontFace_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLStyleFontFace_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLStyleFontFace_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLStyleFontFace methods ***/
#define IHTMLStyleFontFace_put_fontsrc(This,v) (This)->lpVtbl->put_fontsrc(This,v)
#define IHTMLStyleFontFace_get_fontsrc(This,p) (This)->lpVtbl->get_fontsrc(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLStyleFontFace_QueryInterface(IHTMLStyleFontFace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLStyleFontFace_AddRef(IHTMLStyleFontFace* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLStyleFontFace_Release(IHTMLStyleFontFace* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLStyleFontFace_GetTypeInfoCount(IHTMLStyleFontFace* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLStyleFontFace_GetTypeInfo(IHTMLStyleFontFace* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLStyleFontFace_GetIDsOfNames(IHTMLStyleFontFace* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLStyleFontFace_Invoke(IHTMLStyleFontFace* 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);
}
/*** IHTMLStyleFontFace methods ***/
static FORCEINLINE HRESULT IHTMLStyleFontFace_put_fontsrc(IHTMLStyleFontFace* This,BSTR v) {
    return This->lpVtbl->put_fontsrc(This,v);
}
static FORCEINLINE HRESULT IHTMLStyleFontFace_get_fontsrc(IHTMLStyleFontFace* This,BSTR *p) {
    return This->lpVtbl->get_fontsrc(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLStyleFontFace_put_fontsrc_Proxy(
    IHTMLStyleFontFace* This,
    BSTR v);
void __RPC_STUB IHTMLStyleFontFace_put_fontsrc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleFontFace_get_fontsrc_Proxy(
    IHTMLStyleFontFace* This,
    BSTR *p);
void __RPC_STUB IHTMLStyleFontFace_get_fontsrc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLStyleFontFace_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLStyleFontFace2 interface
 */
#ifndef __IHTMLStyleFontFace2_INTERFACE_DEFINED__
#define __IHTMLStyleFontFace2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLStyleFontFace2, 0x305106ec, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106ec-98b5-11cf-bb82-00aa00bdce0b")
IHTMLStyleFontFace2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_style(
        IHTMLRuleStyle **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLStyleFontFace2, 0x305106ec, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLStyleFontFace2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLStyleFontFace2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLStyleFontFace2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLStyleFontFace2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLStyleFontFace2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLStyleFontFace2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLStyleFontFace2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLStyleFontFace2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLStyleFontFace2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_style)(
        IHTMLStyleFontFace2* This,
        IHTMLRuleStyle **p);

    END_INTERFACE
} IHTMLStyleFontFace2Vtbl;
interface IHTMLStyleFontFace2 {
    CONST_VTBL IHTMLStyleFontFace2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLStyleFontFace2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLStyleFontFace2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLStyleFontFace2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLStyleFontFace2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLStyleFontFace2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLStyleFontFace2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLStyleFontFace2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLStyleFontFace2 methods ***/
#define IHTMLStyleFontFace2_get_style(This,p) (This)->lpVtbl->get_style(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLStyleFontFace2_QueryInterface(IHTMLStyleFontFace2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLStyleFontFace2_AddRef(IHTMLStyleFontFace2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLStyleFontFace2_Release(IHTMLStyleFontFace2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLStyleFontFace2_GetTypeInfoCount(IHTMLStyleFontFace2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLStyleFontFace2_GetTypeInfo(IHTMLStyleFontFace2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLStyleFontFace2_GetIDsOfNames(IHTMLStyleFontFace2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLStyleFontFace2_Invoke(IHTMLStyleFontFace2* 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);
}
/*** IHTMLStyleFontFace2 methods ***/
static FORCEINLINE HRESULT IHTMLStyleFontFace2_get_style(IHTMLStyleFontFace2* This,IHTMLRuleStyle **p) {
    return This->lpVtbl->get_style(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLStyleFontFace2_get_style_Proxy(
    IHTMLStyleFontFace2* This,
    IHTMLRuleStyle **p);
void __RPC_STUB IHTMLStyleFontFace2_get_style_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLStyleFontFace2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLStyleFontFace dispinterface
 */
#ifndef __DispHTMLStyleFontFace_DISPINTERFACE_DEFINED__
#define __DispHTMLStyleFontFace_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLStyleFontFace, 0x30590081, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590081-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLStyleFontFace : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLStyleFontFace, 0x30590081, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLStyleFontFaceVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLStyleFontFace* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLStyleFontFace* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLStyleFontFace* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLStyleFontFace* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLStyleFontFace* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLStyleFontFace* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLStyleFontFace* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLStyleFontFaceVtbl;
interface DispHTMLStyleFontFace {
    CONST_VTBL DispHTMLStyleFontFaceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLStyleFontFace_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLStyleFontFace_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLStyleFontFace_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLStyleFontFace_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLStyleFontFace_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLStyleFontFace_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLStyleFontFace_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 DispHTMLStyleFontFace_QueryInterface(DispHTMLStyleFontFace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLStyleFontFace_AddRef(DispHTMLStyleFontFace* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLStyleFontFace_Release(DispHTMLStyleFontFace* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLStyleFontFace_GetTypeInfoCount(DispHTMLStyleFontFace* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLStyleFontFace_GetTypeInfo(DispHTMLStyleFontFace* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLStyleFontFace_GetIDsOfNames(DispHTMLStyleFontFace* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLStyleFontFace_Invoke(DispHTMLStyleFontFace* 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  /* __DispHTMLStyleFontFace_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLStyleFontFace coclass
 */

DEFINE_GUID(CLSID_HTMLStyleFontFace, 0x3050f3d4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f3d4-98b5-11cf-bb82-00aa00bdce0b") HTMLStyleFontFace;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLStyleFontFace, 0x3050f3d4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CFontFace;
/*****************************************************************************
 * IHTMLXDomainRequest interface
 */
#ifndef __IHTMLXDomainRequest_INTERFACE_DEFINED__
#define __IHTMLXDomainRequest_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLXDomainRequest, 0x30510454, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510454-98b5-11cf-bb82-00aa00bdce0b")
IHTMLXDomainRequest : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_responseText(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_timeout(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_timeout(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_contentType(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onprogress(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onprogress(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onerror(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onerror(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ontimeout(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ontimeout(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onload(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onload(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE abort(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE open(
        BSTR bstrMethod,
        BSTR bstrUrl) = 0;

    virtual HRESULT STDMETHODCALLTYPE send(
        VARIANT varBody) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLXDomainRequest, 0x30510454, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLXDomainRequestVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLXDomainRequest* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLXDomainRequest* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLXDomainRequest* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLXDomainRequest* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLXDomainRequest* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLXDomainRequest* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLXDomainRequest* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLXDomainRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *get_responseText)(
        IHTMLXDomainRequest* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_timeout)(
        IHTMLXDomainRequest* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_timeout)(
        IHTMLXDomainRequest* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_contentType)(
        IHTMLXDomainRequest* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_onprogress)(
        IHTMLXDomainRequest* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onprogress)(
        IHTMLXDomainRequest* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onerror)(
        IHTMLXDomainRequest* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onerror)(
        IHTMLXDomainRequest* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ontimeout)(
        IHTMLXDomainRequest* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ontimeout)(
        IHTMLXDomainRequest* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onload)(
        IHTMLXDomainRequest* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onload)(
        IHTMLXDomainRequest* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *abort)(
        IHTMLXDomainRequest* This);

    HRESULT (STDMETHODCALLTYPE *open)(
        IHTMLXDomainRequest* This,
        BSTR bstrMethod,
        BSTR bstrUrl);

    HRESULT (STDMETHODCALLTYPE *send)(
        IHTMLXDomainRequest* This,
        VARIANT varBody);

    END_INTERFACE
} IHTMLXDomainRequestVtbl;
interface IHTMLXDomainRequest {
    CONST_VTBL IHTMLXDomainRequestVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLXDomainRequest_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLXDomainRequest_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLXDomainRequest_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLXDomainRequest_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLXDomainRequest_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLXDomainRequest_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLXDomainRequest_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLXDomainRequest methods ***/
#define IHTMLXDomainRequest_get_responseText(This,p) (This)->lpVtbl->get_responseText(This,p)
#define IHTMLXDomainRequest_put_timeout(This,v) (This)->lpVtbl->put_timeout(This,v)
#define IHTMLXDomainRequest_get_timeout(This,p) (This)->lpVtbl->get_timeout(This,p)
#define IHTMLXDomainRequest_get_contentType(This,p) (This)->lpVtbl->get_contentType(This,p)
#define IHTMLXDomainRequest_put_onprogress(This,v) (This)->lpVtbl->put_onprogress(This,v)
#define IHTMLXDomainRequest_get_onprogress(This,p) (This)->lpVtbl->get_onprogress(This,p)
#define IHTMLXDomainRequest_put_onerror(This,v) (This)->lpVtbl->put_onerror(This,v)
#define IHTMLXDomainRequest_get_onerror(This,p) (This)->lpVtbl->get_onerror(This,p)
#define IHTMLXDomainRequest_put_ontimeout(This,v) (This)->lpVtbl->put_ontimeout(This,v)
#define IHTMLXDomainRequest_get_ontimeout(This,p) (This)->lpVtbl->get_ontimeout(This,p)
#define IHTMLXDomainRequest_put_onload(This,v) (This)->lpVtbl->put_onload(This,v)
#define IHTMLXDomainRequest_get_onload(This,p) (This)->lpVtbl->get_onload(This,p)
#define IHTMLXDomainRequest_abort(This) (This)->lpVtbl->abort(This)
#define IHTMLXDomainRequest_open(This,bstrMethod,bstrUrl) (This)->lpVtbl->open(This,bstrMethod,bstrUrl)
#define IHTMLXDomainRequest_send(This,varBody) (This)->lpVtbl->send(This,varBody)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLXDomainRequest_QueryInterface(IHTMLXDomainRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLXDomainRequest_AddRef(IHTMLXDomainRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLXDomainRequest_Release(IHTMLXDomainRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLXDomainRequest_GetTypeInfoCount(IHTMLXDomainRequest* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLXDomainRequest_GetTypeInfo(IHTMLXDomainRequest* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLXDomainRequest_GetIDsOfNames(IHTMLXDomainRequest* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLXDomainRequest_Invoke(IHTMLXDomainRequest* 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);
}
/*** IHTMLXDomainRequest methods ***/
static FORCEINLINE HRESULT IHTMLXDomainRequest_get_responseText(IHTMLXDomainRequest* This,BSTR *p) {
    return This->lpVtbl->get_responseText(This,p);
}
static FORCEINLINE HRESULT IHTMLXDomainRequest_put_timeout(IHTMLXDomainRequest* This,LONG v) {
    return This->lpVtbl->put_timeout(This,v);
}
static FORCEINLINE HRESULT IHTMLXDomainRequest_get_timeout(IHTMLXDomainRequest* This,LONG *p) {
    return This->lpVtbl->get_timeout(This,p);
}
static FORCEINLINE HRESULT IHTMLXDomainRequest_get_contentType(IHTMLXDomainRequest* This,BSTR *p) {
    return This->lpVtbl->get_contentType(This,p);
}
static FORCEINLINE HRESULT IHTMLXDomainRequest_put_onprogress(IHTMLXDomainRequest* This,VARIANT v) {
    return This->lpVtbl->put_onprogress(This,v);
}
static FORCEINLINE HRESULT IHTMLXDomainRequest_get_onprogress(IHTMLXDomainRequest* This,VARIANT *p) {
    return This->lpVtbl->get_onprogress(This,p);
}
static FORCEINLINE HRESULT IHTMLXDomainRequest_put_onerror(IHTMLXDomainRequest* This,VARIANT v) {
    return This->lpVtbl->put_onerror(This,v);
}
static FORCEINLINE HRESULT IHTMLXDomainRequest_get_onerror(IHTMLXDomainRequest* This,VARIANT *p) {
    return This->lpVtbl->get_onerror(This,p);
}
static FORCEINLINE HRESULT IHTMLXDomainRequest_put_ontimeout(IHTMLXDomainRequest* This,VARIANT v) {
    return This->lpVtbl->put_ontimeout(This,v);
}
static FORCEINLINE HRESULT IHTMLXDomainRequest_get_ontimeout(IHTMLXDomainRequest* This,VARIANT *p) {
    return This->lpVtbl->get_ontimeout(This,p);
}
static FORCEINLINE HRESULT IHTMLXDomainRequest_put_onload(IHTMLXDomainRequest* This,VARIANT v) {
    return This->lpVtbl->put_onload(This,v);
}
static FORCEINLINE HRESULT IHTMLXDomainRequest_get_onload(IHTMLXDomainRequest* This,VARIANT *p) {
    return This->lpVtbl->get_onload(This,p);
}
static FORCEINLINE HRESULT IHTMLXDomainRequest_abort(IHTMLXDomainRequest* This) {
    return This->lpVtbl->abort(This);
}
static FORCEINLINE HRESULT IHTMLXDomainRequest_open(IHTMLXDomainRequest* This,BSTR bstrMethod,BSTR bstrUrl) {
    return This->lpVtbl->open(This,bstrMethod,bstrUrl);
}
static FORCEINLINE HRESULT IHTMLXDomainRequest_send(IHTMLXDomainRequest* This,VARIANT varBody) {
    return This->lpVtbl->send(This,varBody);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLXDomainRequest_get_responseText_Proxy(
    IHTMLXDomainRequest* This,
    BSTR *p);
void __RPC_STUB IHTMLXDomainRequest_get_responseText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLXDomainRequest_put_timeout_Proxy(
    IHTMLXDomainRequest* This,
    LONG v);
void __RPC_STUB IHTMLXDomainRequest_put_timeout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLXDomainRequest_get_timeout_Proxy(
    IHTMLXDomainRequest* This,
    LONG *p);
void __RPC_STUB IHTMLXDomainRequest_get_timeout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLXDomainRequest_get_contentType_Proxy(
    IHTMLXDomainRequest* This,
    BSTR *p);
void __RPC_STUB IHTMLXDomainRequest_get_contentType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLXDomainRequest_put_onprogress_Proxy(
    IHTMLXDomainRequest* This,
    VARIANT v);
void __RPC_STUB IHTMLXDomainRequest_put_onprogress_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLXDomainRequest_get_onprogress_Proxy(
    IHTMLXDomainRequest* This,
    VARIANT *p);
void __RPC_STUB IHTMLXDomainRequest_get_onprogress_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLXDomainRequest_put_onerror_Proxy(
    IHTMLXDomainRequest* This,
    VARIANT v);
void __RPC_STUB IHTMLXDomainRequest_put_onerror_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLXDomainRequest_get_onerror_Proxy(
    IHTMLXDomainRequest* This,
    VARIANT *p);
void __RPC_STUB IHTMLXDomainRequest_get_onerror_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLXDomainRequest_put_ontimeout_Proxy(
    IHTMLXDomainRequest* This,
    VARIANT v);
void __RPC_STUB IHTMLXDomainRequest_put_ontimeout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLXDomainRequest_get_ontimeout_Proxy(
    IHTMLXDomainRequest* This,
    VARIANT *p);
void __RPC_STUB IHTMLXDomainRequest_get_ontimeout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLXDomainRequest_put_onload_Proxy(
    IHTMLXDomainRequest* This,
    VARIANT v);
void __RPC_STUB IHTMLXDomainRequest_put_onload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLXDomainRequest_get_onload_Proxy(
    IHTMLXDomainRequest* This,
    VARIANT *p);
void __RPC_STUB IHTMLXDomainRequest_get_onload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLXDomainRequest_abort_Proxy(
    IHTMLXDomainRequest* This);
void __RPC_STUB IHTMLXDomainRequest_abort_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLXDomainRequest_open_Proxy(
    IHTMLXDomainRequest* This,
    BSTR bstrMethod,
    BSTR bstrUrl);
void __RPC_STUB IHTMLXDomainRequest_open_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLXDomainRequest_send_Proxy(
    IHTMLXDomainRequest* This,
    VARIANT varBody);
void __RPC_STUB IHTMLXDomainRequest_send_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLXDomainRequest_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLXDomainRequestFactory interface
 */
#ifndef __IHTMLXDomainRequestFactory_INTERFACE_DEFINED__
#define __IHTMLXDomainRequestFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLXDomainRequestFactory, 0x30510456, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510456-98b5-11cf-bb82-00aa00bdce0b")
IHTMLXDomainRequestFactory : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE create(
        IHTMLXDomainRequest **a) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLXDomainRequestFactory, 0x30510456, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLXDomainRequestFactoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLXDomainRequestFactory* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLXDomainRequestFactory* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLXDomainRequestFactory* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLXDomainRequestFactory* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLXDomainRequestFactory* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLXDomainRequestFactory* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLXDomainRequestFactory* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLXDomainRequestFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *create)(
        IHTMLXDomainRequestFactory* This,
        IHTMLXDomainRequest **a);

    END_INTERFACE
} IHTMLXDomainRequestFactoryVtbl;
interface IHTMLXDomainRequestFactory {
    CONST_VTBL IHTMLXDomainRequestFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLXDomainRequestFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLXDomainRequestFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLXDomainRequestFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLXDomainRequestFactory_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLXDomainRequestFactory_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLXDomainRequestFactory_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLXDomainRequestFactory_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLXDomainRequestFactory methods ***/
#define IHTMLXDomainRequestFactory_create(This,a) (This)->lpVtbl->create(This,a)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLXDomainRequestFactory_QueryInterface(IHTMLXDomainRequestFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLXDomainRequestFactory_AddRef(IHTMLXDomainRequestFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLXDomainRequestFactory_Release(IHTMLXDomainRequestFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLXDomainRequestFactory_GetTypeInfoCount(IHTMLXDomainRequestFactory* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLXDomainRequestFactory_GetTypeInfo(IHTMLXDomainRequestFactory* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLXDomainRequestFactory_GetIDsOfNames(IHTMLXDomainRequestFactory* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLXDomainRequestFactory_Invoke(IHTMLXDomainRequestFactory* 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);
}
/*** IHTMLXDomainRequestFactory methods ***/
static FORCEINLINE HRESULT IHTMLXDomainRequestFactory_create(IHTMLXDomainRequestFactory* This,IHTMLXDomainRequest **a) {
    return This->lpVtbl->create(This,a);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLXDomainRequestFactory_create_Proxy(
    IHTMLXDomainRequestFactory* This,
    IHTMLXDomainRequest **a);
void __RPC_STUB IHTMLXDomainRequestFactory_create_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLXDomainRequestFactory_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispXDomainRequest dispinterface
 */
#ifndef __DispXDomainRequest_DISPINTERFACE_DEFINED__
#define __DispXDomainRequest_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispXDomainRequest, 0x3050f599, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f599-98b5-11cf-bb82-00aa00bdce0b")
DispXDomainRequest : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispXDomainRequest, 0x3050f599, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispXDomainRequestVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispXDomainRequest* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispXDomainRequest* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispXDomainRequest* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispXDomainRequest* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispXDomainRequest* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispXDomainRequest* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispXDomainRequest* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispXDomainRequestVtbl;
interface DispXDomainRequest {
    CONST_VTBL DispXDomainRequestVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispXDomainRequest_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispXDomainRequest_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispXDomainRequest_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispXDomainRequest_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispXDomainRequest_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispXDomainRequest_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispXDomainRequest_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 DispXDomainRequest_QueryInterface(DispXDomainRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispXDomainRequest_AddRef(DispXDomainRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispXDomainRequest_Release(DispXDomainRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispXDomainRequest_GetTypeInfoCount(DispXDomainRequest* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispXDomainRequest_GetTypeInfo(DispXDomainRequest* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispXDomainRequest_GetIDsOfNames(DispXDomainRequest* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispXDomainRequest_Invoke(DispXDomainRequest* 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  /* __DispXDomainRequest_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * XDomainRequest coclass
 */

DEFINE_GUID(CLSID_XDomainRequest, 0x30510455, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510455-98b5-11cf-bb82-00aa00bdce0b") XDomainRequest;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XDomainRequest, 0x30510455, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CXDomainRequest;
/*****************************************************************************
 * XDomainRequestFactory coclass
 */

DEFINE_GUID(CLSID_XDomainRequestFactory, 0x30510457, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510457-98b5-11cf-bb82-00aa00bdce0b") XDomainRequestFactory;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XDomainRequestFactory, 0x30510457, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CXDomainRequestFactory;
/*****************************************************************************
 * IHTMLStorage interface
 */
#ifndef __IHTMLStorage_INTERFACE_DEFINED__
#define __IHTMLStorage_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLStorage, 0x30510474, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510474-98b5-11cf-bb82-00aa00bdce0b")
IHTMLStorage : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_remainingSpace(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE key(
        LONG lIndex,
        BSTR *a) = 0;

    virtual HRESULT STDMETHODCALLTYPE getItem(
        BSTR bstrKey,
        VARIANT *a) = 0;

    virtual HRESULT STDMETHODCALLTYPE setItem(
        BSTR bstrKey,
        BSTR bstrValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeItem(
        BSTR bstrKey) = 0;

    virtual HRESULT STDMETHODCALLTYPE clear(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLStorage, 0x30510474, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLStorageVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLStorage* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLStorage* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLStorage* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLStorage* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLStorage* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLStorage* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLStorage* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLStorage methods ***/
    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLStorage* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_remainingSpace)(
        IHTMLStorage* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *key)(
        IHTMLStorage* This,
        LONG lIndex,
        BSTR *a);

    HRESULT (STDMETHODCALLTYPE *getItem)(
        IHTMLStorage* This,
        BSTR bstrKey,
        VARIANT *a);

    HRESULT (STDMETHODCALLTYPE *setItem)(
        IHTMLStorage* This,
        BSTR bstrKey,
        BSTR bstrValue);

    HRESULT (STDMETHODCALLTYPE *removeItem)(
        IHTMLStorage* This,
        BSTR bstrKey);

    HRESULT (STDMETHODCALLTYPE *clear)(
        IHTMLStorage* This);

    END_INTERFACE
} IHTMLStorageVtbl;
interface IHTMLStorage {
    CONST_VTBL IHTMLStorageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLStorage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLStorage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLStorage_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLStorage_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLStorage_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLStorage_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLStorage_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLStorage methods ***/
#define IHTMLStorage_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLStorage_get_remainingSpace(This,p) (This)->lpVtbl->get_remainingSpace(This,p)
#define IHTMLStorage_key(This,lIndex,a) (This)->lpVtbl->key(This,lIndex,a)
#define IHTMLStorage_getItem(This,bstrKey,a) (This)->lpVtbl->getItem(This,bstrKey,a)
#define IHTMLStorage_setItem(This,bstrKey,bstrValue) (This)->lpVtbl->setItem(This,bstrKey,bstrValue)
#define IHTMLStorage_removeItem(This,bstrKey) (This)->lpVtbl->removeItem(This,bstrKey)
#define IHTMLStorage_clear(This) (This)->lpVtbl->clear(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLStorage_QueryInterface(IHTMLStorage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLStorage_AddRef(IHTMLStorage* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLStorage_Release(IHTMLStorage* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLStorage_GetTypeInfoCount(IHTMLStorage* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLStorage_GetTypeInfo(IHTMLStorage* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLStorage_GetIDsOfNames(IHTMLStorage* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLStorage_Invoke(IHTMLStorage* 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);
}
/*** IHTMLStorage methods ***/
static FORCEINLINE HRESULT IHTMLStorage_get_length(IHTMLStorage* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IHTMLStorage_get_remainingSpace(IHTMLStorage* This,LONG *p) {
    return This->lpVtbl->get_remainingSpace(This,p);
}
static FORCEINLINE HRESULT IHTMLStorage_key(IHTMLStorage* This,LONG lIndex,BSTR *a) {
    return This->lpVtbl->key(This,lIndex,a);
}
static FORCEINLINE HRESULT IHTMLStorage_getItem(IHTMLStorage* This,BSTR bstrKey,VARIANT *a) {
    return This->lpVtbl->getItem(This,bstrKey,a);
}
static FORCEINLINE HRESULT IHTMLStorage_setItem(IHTMLStorage* This,BSTR bstrKey,BSTR bstrValue) {
    return This->lpVtbl->setItem(This,bstrKey,bstrValue);
}
static FORCEINLINE HRESULT IHTMLStorage_removeItem(IHTMLStorage* This,BSTR bstrKey) {
    return This->lpVtbl->removeItem(This,bstrKey);
}
static FORCEINLINE HRESULT IHTMLStorage_clear(IHTMLStorage* This) {
    return This->lpVtbl->clear(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLStorage_get_length_Proxy(
    IHTMLStorage* This,
    LONG *p);
void __RPC_STUB IHTMLStorage_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStorage_get_remainingSpace_Proxy(
    IHTMLStorage* This,
    LONG *p);
void __RPC_STUB IHTMLStorage_get_remainingSpace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStorage_key_Proxy(
    IHTMLStorage* This,
    LONG lIndex,
    BSTR *a);
void __RPC_STUB IHTMLStorage_key_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStorage_getItem_Proxy(
    IHTMLStorage* This,
    BSTR bstrKey,
    VARIANT *a);
void __RPC_STUB IHTMLStorage_getItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStorage_setItem_Proxy(
    IHTMLStorage* This,
    BSTR bstrKey,
    BSTR bstrValue);
void __RPC_STUB IHTMLStorage_setItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStorage_removeItem_Proxy(
    IHTMLStorage* This,
    BSTR bstrKey);
void __RPC_STUB IHTMLStorage_removeItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStorage_clear_Proxy(
    IHTMLStorage* This);
void __RPC_STUB IHTMLStorage_clear_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLStorage_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLStorage2 interface
 */
#ifndef __IHTMLStorage2_INTERFACE_DEFINED__
#define __IHTMLStorage2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLStorage2, 0x30510799, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510799-98b5-11cf-bb82-00aa00bdce0b")
IHTMLStorage2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE setItem(
        BSTR bstrKey,
        BSTR bstrValue) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLStorage2, 0x30510799, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLStorage2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLStorage2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLStorage2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLStorage2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLStorage2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLStorage2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLStorage2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLStorage2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLStorage2 methods ***/
    HRESULT (STDMETHODCALLTYPE *setItem)(
        IHTMLStorage2* This,
        BSTR bstrKey,
        BSTR bstrValue);

    END_INTERFACE
} IHTMLStorage2Vtbl;
interface IHTMLStorage2 {
    CONST_VTBL IHTMLStorage2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLStorage2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLStorage2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLStorage2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLStorage2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLStorage2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLStorage2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLStorage2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLStorage2 methods ***/
#define IHTMLStorage2_setItem(This,bstrKey,bstrValue) (This)->lpVtbl->setItem(This,bstrKey,bstrValue)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLStorage2_QueryInterface(IHTMLStorage2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLStorage2_AddRef(IHTMLStorage2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLStorage2_Release(IHTMLStorage2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLStorage2_GetTypeInfoCount(IHTMLStorage2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLStorage2_GetTypeInfo(IHTMLStorage2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLStorage2_GetIDsOfNames(IHTMLStorage2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLStorage2_Invoke(IHTMLStorage2* 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);
}
/*** IHTMLStorage2 methods ***/
static FORCEINLINE HRESULT IHTMLStorage2_setItem(IHTMLStorage2* This,BSTR bstrKey,BSTR bstrValue) {
    return This->lpVtbl->setItem(This,bstrKey,bstrValue);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLStorage2_setItem_Proxy(
    IHTMLStorage2* This,
    BSTR bstrKey,
    BSTR bstrValue);
void __RPC_STUB IHTMLStorage2_setItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLStorage2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLStorage dispinterface
 */
#ifndef __DispHTMLStorage_DISPINTERFACE_DEFINED__
#define __DispHTMLStorage_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLStorage, 0x3050f59d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f59d-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLStorage : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLStorage, 0x3050f59d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLStorageVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLStorage* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLStorage* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLStorage* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLStorage* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLStorage* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLStorage* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLStorage* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLStorageVtbl;
interface DispHTMLStorage {
    CONST_VTBL DispHTMLStorageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLStorage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLStorage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLStorage_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLStorage_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLStorage_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLStorage_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLStorage_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 DispHTMLStorage_QueryInterface(DispHTMLStorage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLStorage_AddRef(DispHTMLStorage* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLStorage_Release(DispHTMLStorage* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLStorage_GetTypeInfoCount(DispHTMLStorage* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLStorage_GetTypeInfo(DispHTMLStorage* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLStorage_GetIDsOfNames(DispHTMLStorage* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLStorage_Invoke(DispHTMLStorage* 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  /* __DispHTMLStorage_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLStorage coclass
 */

DEFINE_GUID(CLSID_HTMLStorage, 0x30510475, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510475-98b5-11cf-bb82-00aa00bdce0b") HTMLStorage;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLStorage, 0x30510475, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CStorage;
/*****************************************************************************
 * IEventTarget interface
 */
#ifndef __IEventTarget_INTERFACE_DEFINED__
#define __IEventTarget_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEventTarget, 0x305104b9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104b9-98b5-11cf-bb82-00aa00bdce0b")
IEventTarget : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE addEventListener(
        BSTR type,
        IDispatch *listener,
        VARIANT_BOOL useCapture) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeEventListener(
        BSTR type,
        IDispatch *listener,
        VARIANT_BOOL useCapture) = 0;

    virtual HRESULT STDMETHODCALLTYPE dispatchEvent(
        IDOMEvent *evt,
        VARIANT_BOOL *pfResult) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEventTarget, 0x305104b9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IEventTargetVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IEventTarget* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IEventTarget* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IEventTarget* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IEventTarget* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IEventTarget* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IEventTarget* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IEventTarget* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IEventTarget methods ***/
    HRESULT (STDMETHODCALLTYPE *addEventListener)(
        IEventTarget* This,
        BSTR type,
        IDispatch *listener,
        VARIANT_BOOL useCapture);

    HRESULT (STDMETHODCALLTYPE *removeEventListener)(
        IEventTarget* This,
        BSTR type,
        IDispatch *listener,
        VARIANT_BOOL useCapture);

    HRESULT (STDMETHODCALLTYPE *dispatchEvent)(
        IEventTarget* This,
        IDOMEvent *evt,
        VARIANT_BOOL *pfResult);

    END_INTERFACE
} IEventTargetVtbl;
interface IEventTarget {
    CONST_VTBL IEventTargetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEventTarget_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEventTarget_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEventTarget_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IEventTarget_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IEventTarget_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IEventTarget_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IEventTarget_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IEventTarget methods ***/
#define IEventTarget_addEventListener(This,type,listener,useCapture) (This)->lpVtbl->addEventListener(This,type,listener,useCapture)
#define IEventTarget_removeEventListener(This,type,listener,useCapture) (This)->lpVtbl->removeEventListener(This,type,listener,useCapture)
#define IEventTarget_dispatchEvent(This,evt,pfResult) (This)->lpVtbl->dispatchEvent(This,evt,pfResult)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEventTarget_QueryInterface(IEventTarget* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEventTarget_AddRef(IEventTarget* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEventTarget_Release(IEventTarget* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IEventTarget_GetTypeInfoCount(IEventTarget* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IEventTarget_GetTypeInfo(IEventTarget* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IEventTarget_GetIDsOfNames(IEventTarget* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IEventTarget_Invoke(IEventTarget* 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);
}
/*** IEventTarget methods ***/
static FORCEINLINE HRESULT IEventTarget_addEventListener(IEventTarget* This,BSTR type,IDispatch *listener,VARIANT_BOOL useCapture) {
    return This->lpVtbl->addEventListener(This,type,listener,useCapture);
}
static FORCEINLINE HRESULT IEventTarget_removeEventListener(IEventTarget* This,BSTR type,IDispatch *listener,VARIANT_BOOL useCapture) {
    return This->lpVtbl->removeEventListener(This,type,listener,useCapture);
}
static FORCEINLINE HRESULT IEventTarget_dispatchEvent(IEventTarget* This,IDOMEvent *evt,VARIANT_BOOL *pfResult) {
    return This->lpVtbl->dispatchEvent(This,evt,pfResult);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IEventTarget_addEventListener_Proxy(
    IEventTarget* This,
    BSTR type,
    IDispatch *listener,
    VARIANT_BOOL useCapture);
void __RPC_STUB IEventTarget_addEventListener_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IEventTarget_removeEventListener_Proxy(
    IEventTarget* This,
    BSTR type,
    IDispatch *listener,
    VARIANT_BOOL useCapture);
void __RPC_STUB IEventTarget_removeEventListener_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IEventTarget_dispatchEvent_Proxy(
    IEventTarget* This,
    IDOMEvent *evt,
    VARIANT_BOOL *pfResult);
void __RPC_STUB IEventTarget_dispatchEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IEventTarget_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDOMEvent interface
 */
#ifndef __IDOMEvent_INTERFACE_DEFINED__
#define __IDOMEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMEvent, 0x305104ba, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104ba-98b5-11cf-bb82-00aa00bdce0b")
IDOMEvent : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_bubbles(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cancelable(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_currentTarget(
        IEventTarget **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_defaultPrevented(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_eventPhase(
        USHORT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_target(
        IEventTarget **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_timeStamp(
        ULONGLONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE initEvent(
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable) = 0;

    virtual HRESULT STDMETHODCALLTYPE preventDefault(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE stopPropagation(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE stopImmediatePropagation(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_isTrusted(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_cancelBubble(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cancelBubble(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_srcElement(
        IHTMLElement **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMEvent, 0x305104ba, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDOMEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDOMEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDOMEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDOMEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDOMEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *get_bubbles)(
        IDOMEvent* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_cancelable)(
        IDOMEvent* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_currentTarget)(
        IDOMEvent* This,
        IEventTarget **p);

    HRESULT (STDMETHODCALLTYPE *get_defaultPrevented)(
        IDOMEvent* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_eventPhase)(
        IDOMEvent* This,
        USHORT *p);

    HRESULT (STDMETHODCALLTYPE *get_target)(
        IDOMEvent* This,
        IEventTarget **p);

    HRESULT (STDMETHODCALLTYPE *get_timeStamp)(
        IDOMEvent* This,
        ULONGLONG *p);

    HRESULT (STDMETHODCALLTYPE *get_type)(
        IDOMEvent* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *initEvent)(
        IDOMEvent* This,
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable);

    HRESULT (STDMETHODCALLTYPE *preventDefault)(
        IDOMEvent* This);

    HRESULT (STDMETHODCALLTYPE *stopPropagation)(
        IDOMEvent* This);

    HRESULT (STDMETHODCALLTYPE *stopImmediatePropagation)(
        IDOMEvent* This);

    HRESULT (STDMETHODCALLTYPE *get_isTrusted)(
        IDOMEvent* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_cancelBubble)(
        IDOMEvent* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_cancelBubble)(
        IDOMEvent* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_srcElement)(
        IDOMEvent* This,
        IHTMLElement **p);

    END_INTERFACE
} IDOMEventVtbl;
interface IDOMEvent {
    CONST_VTBL IDOMEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDOMEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDOMEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDOMEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDOMEvent_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDOMEvent methods ***/
#define IDOMEvent_get_bubbles(This,p) (This)->lpVtbl->get_bubbles(This,p)
#define IDOMEvent_get_cancelable(This,p) (This)->lpVtbl->get_cancelable(This,p)
#define IDOMEvent_get_currentTarget(This,p) (This)->lpVtbl->get_currentTarget(This,p)
#define IDOMEvent_get_defaultPrevented(This,p) (This)->lpVtbl->get_defaultPrevented(This,p)
#define IDOMEvent_get_eventPhase(This,p) (This)->lpVtbl->get_eventPhase(This,p)
#define IDOMEvent_get_target(This,p) (This)->lpVtbl->get_target(This,p)
#define IDOMEvent_get_timeStamp(This,p) (This)->lpVtbl->get_timeStamp(This,p)
#define IDOMEvent_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#define IDOMEvent_initEvent(This,eventType,canBubble,cancelable) (This)->lpVtbl->initEvent(This,eventType,canBubble,cancelable)
#define IDOMEvent_preventDefault(This) (This)->lpVtbl->preventDefault(This)
#define IDOMEvent_stopPropagation(This) (This)->lpVtbl->stopPropagation(This)
#define IDOMEvent_stopImmediatePropagation(This) (This)->lpVtbl->stopImmediatePropagation(This)
#define IDOMEvent_get_isTrusted(This,p) (This)->lpVtbl->get_isTrusted(This,p)
#define IDOMEvent_put_cancelBubble(This,v) (This)->lpVtbl->put_cancelBubble(This,v)
#define IDOMEvent_get_cancelBubble(This,p) (This)->lpVtbl->get_cancelBubble(This,p)
#define IDOMEvent_get_srcElement(This,p) (This)->lpVtbl->get_srcElement(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMEvent_QueryInterface(IDOMEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMEvent_AddRef(IDOMEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMEvent_Release(IDOMEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDOMEvent_GetTypeInfoCount(IDOMEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDOMEvent_GetTypeInfo(IDOMEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDOMEvent_GetIDsOfNames(IDOMEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDOMEvent_Invoke(IDOMEvent* 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);
}
/*** IDOMEvent methods ***/
static FORCEINLINE HRESULT IDOMEvent_get_bubbles(IDOMEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_bubbles(This,p);
}
static FORCEINLINE HRESULT IDOMEvent_get_cancelable(IDOMEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_cancelable(This,p);
}
static FORCEINLINE HRESULT IDOMEvent_get_currentTarget(IDOMEvent* This,IEventTarget **p) {
    return This->lpVtbl->get_currentTarget(This,p);
}
static FORCEINLINE HRESULT IDOMEvent_get_defaultPrevented(IDOMEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_defaultPrevented(This,p);
}
static FORCEINLINE HRESULT IDOMEvent_get_eventPhase(IDOMEvent* This,USHORT *p) {
    return This->lpVtbl->get_eventPhase(This,p);
}
static FORCEINLINE HRESULT IDOMEvent_get_target(IDOMEvent* This,IEventTarget **p) {
    return This->lpVtbl->get_target(This,p);
}
static FORCEINLINE HRESULT IDOMEvent_get_timeStamp(IDOMEvent* This,ULONGLONG *p) {
    return This->lpVtbl->get_timeStamp(This,p);
}
static FORCEINLINE HRESULT IDOMEvent_get_type(IDOMEvent* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static FORCEINLINE HRESULT IDOMEvent_initEvent(IDOMEvent* This,BSTR eventType,VARIANT_BOOL canBubble,VARIANT_BOOL cancelable) {
    return This->lpVtbl->initEvent(This,eventType,canBubble,cancelable);
}
static FORCEINLINE HRESULT IDOMEvent_preventDefault(IDOMEvent* This) {
    return This->lpVtbl->preventDefault(This);
}
static FORCEINLINE HRESULT IDOMEvent_stopPropagation(IDOMEvent* This) {
    return This->lpVtbl->stopPropagation(This);
}
static FORCEINLINE HRESULT IDOMEvent_stopImmediatePropagation(IDOMEvent* This) {
    return This->lpVtbl->stopImmediatePropagation(This);
}
static FORCEINLINE HRESULT IDOMEvent_get_isTrusted(IDOMEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_isTrusted(This,p);
}
static FORCEINLINE HRESULT IDOMEvent_put_cancelBubble(IDOMEvent* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_cancelBubble(This,v);
}
static FORCEINLINE HRESULT IDOMEvent_get_cancelBubble(IDOMEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_cancelBubble(This,p);
}
static FORCEINLINE HRESULT IDOMEvent_get_srcElement(IDOMEvent* This,IHTMLElement **p) {
    return This->lpVtbl->get_srcElement(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMEvent_get_bubbles_Proxy(
    IDOMEvent* This,
    VARIANT_BOOL *p);
void __RPC_STUB IDOMEvent_get_bubbles_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMEvent_get_cancelable_Proxy(
    IDOMEvent* This,
    VARIANT_BOOL *p);
void __RPC_STUB IDOMEvent_get_cancelable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMEvent_get_currentTarget_Proxy(
    IDOMEvent* This,
    IEventTarget **p);
void __RPC_STUB IDOMEvent_get_currentTarget_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMEvent_get_defaultPrevented_Proxy(
    IDOMEvent* This,
    VARIANT_BOOL *p);
void __RPC_STUB IDOMEvent_get_defaultPrevented_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMEvent_get_eventPhase_Proxy(
    IDOMEvent* This,
    USHORT *p);
void __RPC_STUB IDOMEvent_get_eventPhase_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMEvent_get_target_Proxy(
    IDOMEvent* This,
    IEventTarget **p);
void __RPC_STUB IDOMEvent_get_target_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMEvent_get_timeStamp_Proxy(
    IDOMEvent* This,
    ULONGLONG *p);
void __RPC_STUB IDOMEvent_get_timeStamp_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMEvent_get_type_Proxy(
    IDOMEvent* This,
    BSTR *p);
void __RPC_STUB IDOMEvent_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMEvent_initEvent_Proxy(
    IDOMEvent* This,
    BSTR eventType,
    VARIANT_BOOL canBubble,
    VARIANT_BOOL cancelable);
void __RPC_STUB IDOMEvent_initEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMEvent_preventDefault_Proxy(
    IDOMEvent* This);
void __RPC_STUB IDOMEvent_preventDefault_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMEvent_stopPropagation_Proxy(
    IDOMEvent* This);
void __RPC_STUB IDOMEvent_stopPropagation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMEvent_stopImmediatePropagation_Proxy(
    IDOMEvent* This);
void __RPC_STUB IDOMEvent_stopImmediatePropagation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMEvent_get_isTrusted_Proxy(
    IDOMEvent* This,
    VARIANT_BOOL *p);
void __RPC_STUB IDOMEvent_get_isTrusted_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMEvent_put_cancelBubble_Proxy(
    IDOMEvent* This,
    VARIANT_BOOL v);
void __RPC_STUB IDOMEvent_put_cancelBubble_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMEvent_get_cancelBubble_Proxy(
    IDOMEvent* This,
    VARIANT_BOOL *p);
void __RPC_STUB IDOMEvent_get_cancelBubble_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMEvent_get_srcElement_Proxy(
    IDOMEvent* This,
    IHTMLElement **p);
void __RPC_STUB IDOMEvent_get_srcElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispDOMEvent dispinterface
 */
#ifndef __DispDOMEvent_DISPINTERFACE_DEFINED__
#define __DispDOMEvent_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispDOMEvent, 0x3050f5a2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f5a2-98b5-11cf-bb82-00aa00bdce0b")
DispDOMEvent : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispDOMEvent, 0x3050f5a2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispDOMEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispDOMEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispDOMEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispDOMEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispDOMEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispDOMEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispDOMEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispDOMEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispDOMEventVtbl;
interface DispDOMEvent {
    CONST_VTBL DispDOMEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispDOMEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispDOMEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispDOMEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispDOMEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispDOMEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispDOMEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispDOMEvent_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 DispDOMEvent_QueryInterface(DispDOMEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispDOMEvent_AddRef(DispDOMEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispDOMEvent_Release(DispDOMEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispDOMEvent_GetTypeInfoCount(DispDOMEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispDOMEvent_GetTypeInfo(DispDOMEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispDOMEvent_GetIDsOfNames(DispDOMEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispDOMEvent_Invoke(DispDOMEvent* 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  /* __DispDOMEvent_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * DOMEvent coclass
 */

DEFINE_GUID(CLSID_DOMEvent, 0x305104bb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305104bb-98b5-11cf-bb82-00aa00bdce0b") DOMEvent;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMEvent, 0x305104bb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDOMEvent;
/*****************************************************************************
 * IDOMUIEvent interface
 */
#ifndef __IDOMUIEvent_INTERFACE_DEFINED__
#define __IDOMUIEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMUIEvent, 0x305106ca, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106ca-98b5-11cf-bb82-00aa00bdce0b")
IDOMUIEvent : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_view(
        IHTMLWindow2 **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_detail(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE initUIEvent(
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        IHTMLWindow2 *view,
        LONG detail) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMUIEvent, 0x305106ca, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMUIEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMUIEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMUIEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMUIEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDOMUIEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDOMUIEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDOMUIEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDOMUIEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDOMUIEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *get_view)(
        IDOMUIEvent* This,
        IHTMLWindow2 **p);

    HRESULT (STDMETHODCALLTYPE *get_detail)(
        IDOMUIEvent* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *initUIEvent)(
        IDOMUIEvent* This,
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        IHTMLWindow2 *view,
        LONG detail);

    END_INTERFACE
} IDOMUIEventVtbl;
interface IDOMUIEvent {
    CONST_VTBL IDOMUIEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMUIEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMUIEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMUIEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDOMUIEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDOMUIEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDOMUIEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDOMUIEvent_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDOMUIEvent methods ***/
#define IDOMUIEvent_get_view(This,p) (This)->lpVtbl->get_view(This,p)
#define IDOMUIEvent_get_detail(This,p) (This)->lpVtbl->get_detail(This,p)
#define IDOMUIEvent_initUIEvent(This,eventType,canBubble,cancelable,view,detail) (This)->lpVtbl->initUIEvent(This,eventType,canBubble,cancelable,view,detail)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMUIEvent_QueryInterface(IDOMUIEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMUIEvent_AddRef(IDOMUIEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMUIEvent_Release(IDOMUIEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDOMUIEvent_GetTypeInfoCount(IDOMUIEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDOMUIEvent_GetTypeInfo(IDOMUIEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDOMUIEvent_GetIDsOfNames(IDOMUIEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDOMUIEvent_Invoke(IDOMUIEvent* 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);
}
/*** IDOMUIEvent methods ***/
static FORCEINLINE HRESULT IDOMUIEvent_get_view(IDOMUIEvent* This,IHTMLWindow2 **p) {
    return This->lpVtbl->get_view(This,p);
}
static FORCEINLINE HRESULT IDOMUIEvent_get_detail(IDOMUIEvent* This,LONG *p) {
    return This->lpVtbl->get_detail(This,p);
}
static FORCEINLINE HRESULT IDOMUIEvent_initUIEvent(IDOMUIEvent* This,BSTR eventType,VARIANT_BOOL canBubble,VARIANT_BOOL cancelable,IHTMLWindow2 *view,LONG detail) {
    return This->lpVtbl->initUIEvent(This,eventType,canBubble,cancelable,view,detail);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMUIEvent_get_view_Proxy(
    IDOMUIEvent* This,
    IHTMLWindow2 **p);
void __RPC_STUB IDOMUIEvent_get_view_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMUIEvent_get_detail_Proxy(
    IDOMUIEvent* This,
    LONG *p);
void __RPC_STUB IDOMUIEvent_get_detail_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMUIEvent_initUIEvent_Proxy(
    IDOMUIEvent* This,
    BSTR eventType,
    VARIANT_BOOL canBubble,
    VARIANT_BOOL cancelable,
    IHTMLWindow2 *view,
    LONG detail);
void __RPC_STUB IDOMUIEvent_initUIEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMUIEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispDOMUIEvent dispinterface
 */
#ifndef __DispDOMUIEvent_DISPINTERFACE_DEFINED__
#define __DispDOMUIEvent_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispDOMUIEvent, 0x30590072, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590072-98b5-11cf-bb82-00aa00bdce0b")
DispDOMUIEvent : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispDOMUIEvent, 0x30590072, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispDOMUIEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispDOMUIEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispDOMUIEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispDOMUIEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispDOMUIEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispDOMUIEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispDOMUIEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispDOMUIEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispDOMUIEventVtbl;
interface DispDOMUIEvent {
    CONST_VTBL DispDOMUIEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispDOMUIEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispDOMUIEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispDOMUIEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispDOMUIEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispDOMUIEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispDOMUIEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispDOMUIEvent_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 DispDOMUIEvent_QueryInterface(DispDOMUIEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispDOMUIEvent_AddRef(DispDOMUIEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispDOMUIEvent_Release(DispDOMUIEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispDOMUIEvent_GetTypeInfoCount(DispDOMUIEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispDOMUIEvent_GetTypeInfo(DispDOMUIEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispDOMUIEvent_GetIDsOfNames(DispDOMUIEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispDOMUIEvent_Invoke(DispDOMUIEvent* 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  /* __DispDOMUIEvent_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * DOMUIEvent coclass
 */

DEFINE_GUID(CLSID_DOMUIEvent, 0x305106cb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305106cb-98b5-11cf-bb82-00aa00bdce0b") DOMUIEvent;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMUIEvent, 0x305106cb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDOMUIEvent;
/*****************************************************************************
 * IDOMMouseEvent interface
 */
#ifndef __IDOMMouseEvent_INTERFACE_DEFINED__
#define __IDOMMouseEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMMouseEvent, 0x305106ce, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106ce-98b5-11cf-bb82-00aa00bdce0b")
IDOMMouseEvent : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_screenX(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_screenY(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clientX(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clientY(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ctrlKey(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_shiftKey(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_altKey(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_metaKey(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_button(
        USHORT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_relatedTarget(
        IEventTarget **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE initMouseEvent(
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        IHTMLWindow2 *viewArg,
        LONG detailArg,
        LONG screenXArg,
        LONG screenYArg,
        LONG clientXArg,
        LONG clientYArg,
        VARIANT_BOOL ctrlKeyArg,
        VARIANT_BOOL altKeyArg,
        VARIANT_BOOL shiftKeyArg,
        VARIANT_BOOL metaKeyArg,
        USHORT buttonArg,
        IEventTarget *relatedTargetArg) = 0;

    virtual HRESULT STDMETHODCALLTYPE getModifierState(
        BSTR keyArg,
        VARIANT_BOOL *activated) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_buttons(
        USHORT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fromElement(
        IHTMLElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_toElement(
        IHTMLElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_offsetX(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_offsetY(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pageX(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pageY(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_layerX(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_layerY(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_which(
        USHORT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMMouseEvent, 0x305106ce, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMMouseEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMMouseEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMMouseEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMMouseEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDOMMouseEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDOMMouseEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDOMMouseEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDOMMouseEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDOMMouseEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *get_screenX)(
        IDOMMouseEvent* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_screenY)(
        IDOMMouseEvent* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_clientX)(
        IDOMMouseEvent* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_clientY)(
        IDOMMouseEvent* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_ctrlKey)(
        IDOMMouseEvent* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_shiftKey)(
        IDOMMouseEvent* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_altKey)(
        IDOMMouseEvent* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_metaKey)(
        IDOMMouseEvent* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_button)(
        IDOMMouseEvent* This,
        USHORT *p);

    HRESULT (STDMETHODCALLTYPE *get_relatedTarget)(
        IDOMMouseEvent* This,
        IEventTarget **p);

    HRESULT (STDMETHODCALLTYPE *initMouseEvent)(
        IDOMMouseEvent* This,
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        IHTMLWindow2 *viewArg,
        LONG detailArg,
        LONG screenXArg,
        LONG screenYArg,
        LONG clientXArg,
        LONG clientYArg,
        VARIANT_BOOL ctrlKeyArg,
        VARIANT_BOOL altKeyArg,
        VARIANT_BOOL shiftKeyArg,
        VARIANT_BOOL metaKeyArg,
        USHORT buttonArg,
        IEventTarget *relatedTargetArg);

    HRESULT (STDMETHODCALLTYPE *getModifierState)(
        IDOMMouseEvent* This,
        BSTR keyArg,
        VARIANT_BOOL *activated);

    HRESULT (STDMETHODCALLTYPE *get_buttons)(
        IDOMMouseEvent* This,
        USHORT *p);

    HRESULT (STDMETHODCALLTYPE *get_fromElement)(
        IDOMMouseEvent* This,
        IHTMLElement **p);

    HRESULT (STDMETHODCALLTYPE *get_toElement)(
        IDOMMouseEvent* This,
        IHTMLElement **p);

    HRESULT (STDMETHODCALLTYPE *get_x)(
        IDOMMouseEvent* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_y)(
        IDOMMouseEvent* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_offsetX)(
        IDOMMouseEvent* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_offsetY)(
        IDOMMouseEvent* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_pageX)(
        IDOMMouseEvent* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_pageY)(
        IDOMMouseEvent* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_layerX)(
        IDOMMouseEvent* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_layerY)(
        IDOMMouseEvent* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_which)(
        IDOMMouseEvent* This,
        USHORT *p);

    END_INTERFACE
} IDOMMouseEventVtbl;
interface IDOMMouseEvent {
    CONST_VTBL IDOMMouseEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMMouseEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMMouseEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMMouseEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDOMMouseEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDOMMouseEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDOMMouseEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDOMMouseEvent_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDOMMouseEvent methods ***/
#define IDOMMouseEvent_get_screenX(This,p) (This)->lpVtbl->get_screenX(This,p)
#define IDOMMouseEvent_get_screenY(This,p) (This)->lpVtbl->get_screenY(This,p)
#define IDOMMouseEvent_get_clientX(This,p) (This)->lpVtbl->get_clientX(This,p)
#define IDOMMouseEvent_get_clientY(This,p) (This)->lpVtbl->get_clientY(This,p)
#define IDOMMouseEvent_get_ctrlKey(This,p) (This)->lpVtbl->get_ctrlKey(This,p)
#define IDOMMouseEvent_get_shiftKey(This,p) (This)->lpVtbl->get_shiftKey(This,p)
#define IDOMMouseEvent_get_altKey(This,p) (This)->lpVtbl->get_altKey(This,p)
#define IDOMMouseEvent_get_metaKey(This,p) (This)->lpVtbl->get_metaKey(This,p)
#define IDOMMouseEvent_get_button(This,p) (This)->lpVtbl->get_button(This,p)
#define IDOMMouseEvent_get_relatedTarget(This,p) (This)->lpVtbl->get_relatedTarget(This,p)
#define IDOMMouseEvent_initMouseEvent(This,eventType,canBubble,cancelable,viewArg,detailArg,screenXArg,screenYArg,clientXArg,clientYArg,ctrlKeyArg,altKeyArg,shiftKeyArg,metaKeyArg,buttonArg,relatedTargetArg) (This)->lpVtbl->initMouseEvent(This,eventType,canBubble,cancelable,viewArg,detailArg,screenXArg,screenYArg,clientXArg,clientYArg,ctrlKeyArg,altKeyArg,shiftKeyArg,metaKeyArg,buttonArg,relatedTargetArg)
#define IDOMMouseEvent_getModifierState(This,keyArg,activated) (This)->lpVtbl->getModifierState(This,keyArg,activated)
#define IDOMMouseEvent_get_buttons(This,p) (This)->lpVtbl->get_buttons(This,p)
#define IDOMMouseEvent_get_fromElement(This,p) (This)->lpVtbl->get_fromElement(This,p)
#define IDOMMouseEvent_get_toElement(This,p) (This)->lpVtbl->get_toElement(This,p)
#define IDOMMouseEvent_get_x(This,p) (This)->lpVtbl->get_x(This,p)
#define IDOMMouseEvent_get_y(This,p) (This)->lpVtbl->get_y(This,p)
#define IDOMMouseEvent_get_offsetX(This,p) (This)->lpVtbl->get_offsetX(This,p)
#define IDOMMouseEvent_get_offsetY(This,p) (This)->lpVtbl->get_offsetY(This,p)
#define IDOMMouseEvent_get_pageX(This,p) (This)->lpVtbl->get_pageX(This,p)
#define IDOMMouseEvent_get_pageY(This,p) (This)->lpVtbl->get_pageY(This,p)
#define IDOMMouseEvent_get_layerX(This,p) (This)->lpVtbl->get_layerX(This,p)
#define IDOMMouseEvent_get_layerY(This,p) (This)->lpVtbl->get_layerY(This,p)
#define IDOMMouseEvent_get_which(This,p) (This)->lpVtbl->get_which(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMMouseEvent_QueryInterface(IDOMMouseEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMMouseEvent_AddRef(IDOMMouseEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMMouseEvent_Release(IDOMMouseEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDOMMouseEvent_GetTypeInfoCount(IDOMMouseEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDOMMouseEvent_GetTypeInfo(IDOMMouseEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDOMMouseEvent_GetIDsOfNames(IDOMMouseEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDOMMouseEvent_Invoke(IDOMMouseEvent* 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);
}
/*** IDOMMouseEvent methods ***/
static FORCEINLINE HRESULT IDOMMouseEvent_get_screenX(IDOMMouseEvent* This,LONG *p) {
    return This->lpVtbl->get_screenX(This,p);
}
static FORCEINLINE HRESULT IDOMMouseEvent_get_screenY(IDOMMouseEvent* This,LONG *p) {
    return This->lpVtbl->get_screenY(This,p);
}
static FORCEINLINE HRESULT IDOMMouseEvent_get_clientX(IDOMMouseEvent* This,LONG *p) {
    return This->lpVtbl->get_clientX(This,p);
}
static FORCEINLINE HRESULT IDOMMouseEvent_get_clientY(IDOMMouseEvent* This,LONG *p) {
    return This->lpVtbl->get_clientY(This,p);
}
static FORCEINLINE HRESULT IDOMMouseEvent_get_ctrlKey(IDOMMouseEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_ctrlKey(This,p);
}
static FORCEINLINE HRESULT IDOMMouseEvent_get_shiftKey(IDOMMouseEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_shiftKey(This,p);
}
static FORCEINLINE HRESULT IDOMMouseEvent_get_altKey(IDOMMouseEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_altKey(This,p);
}
static FORCEINLINE HRESULT IDOMMouseEvent_get_metaKey(IDOMMouseEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_metaKey(This,p);
}
static FORCEINLINE HRESULT IDOMMouseEvent_get_button(IDOMMouseEvent* This,USHORT *p) {
    return This->lpVtbl->get_button(This,p);
}
static FORCEINLINE HRESULT IDOMMouseEvent_get_relatedTarget(IDOMMouseEvent* This,IEventTarget **p) {
    return This->lpVtbl->get_relatedTarget(This,p);
}
static FORCEINLINE HRESULT IDOMMouseEvent_initMouseEvent(IDOMMouseEvent* This,BSTR eventType,VARIANT_BOOL canBubble,VARIANT_BOOL cancelable,IHTMLWindow2 *viewArg,LONG detailArg,LONG screenXArg,LONG screenYArg,LONG clientXArg,LONG clientYArg,VARIANT_BOOL ctrlKeyArg,VARIANT_BOOL altKeyArg,VARIANT_BOOL shiftKeyArg,VARIANT_BOOL metaKeyArg,USHORT buttonArg,IEventTarget *relatedTargetArg) {
    return This->lpVtbl->initMouseEvent(This,eventType,canBubble,cancelable,viewArg,detailArg,screenXArg,screenYArg,clientXArg,clientYArg,ctrlKeyArg,altKeyArg,shiftKeyArg,metaKeyArg,buttonArg,relatedTargetArg);
}
static FORCEINLINE HRESULT IDOMMouseEvent_getModifierState(IDOMMouseEvent* This,BSTR keyArg,VARIANT_BOOL *activated) {
    return This->lpVtbl->getModifierState(This,keyArg,activated);
}
static FORCEINLINE HRESULT IDOMMouseEvent_get_buttons(IDOMMouseEvent* This,USHORT *p) {
    return This->lpVtbl->get_buttons(This,p);
}
static FORCEINLINE HRESULT IDOMMouseEvent_get_fromElement(IDOMMouseEvent* This,IHTMLElement **p) {
    return This->lpVtbl->get_fromElement(This,p);
}
static FORCEINLINE HRESULT IDOMMouseEvent_get_toElement(IDOMMouseEvent* This,IHTMLElement **p) {
    return This->lpVtbl->get_toElement(This,p);
}
static FORCEINLINE HRESULT IDOMMouseEvent_get_x(IDOMMouseEvent* This,LONG *p) {
    return This->lpVtbl->get_x(This,p);
}
static FORCEINLINE HRESULT IDOMMouseEvent_get_y(IDOMMouseEvent* This,LONG *p) {
    return This->lpVtbl->get_y(This,p);
}
static FORCEINLINE HRESULT IDOMMouseEvent_get_offsetX(IDOMMouseEvent* This,LONG *p) {
    return This->lpVtbl->get_offsetX(This,p);
}
static FORCEINLINE HRESULT IDOMMouseEvent_get_offsetY(IDOMMouseEvent* This,LONG *p) {
    return This->lpVtbl->get_offsetY(This,p);
}
static FORCEINLINE HRESULT IDOMMouseEvent_get_pageX(IDOMMouseEvent* This,LONG *p) {
    return This->lpVtbl->get_pageX(This,p);
}
static FORCEINLINE HRESULT IDOMMouseEvent_get_pageY(IDOMMouseEvent* This,LONG *p) {
    return This->lpVtbl->get_pageY(This,p);
}
static FORCEINLINE HRESULT IDOMMouseEvent_get_layerX(IDOMMouseEvent* This,LONG *p) {
    return This->lpVtbl->get_layerX(This,p);
}
static FORCEINLINE HRESULT IDOMMouseEvent_get_layerY(IDOMMouseEvent* This,LONG *p) {
    return This->lpVtbl->get_layerY(This,p);
}
static FORCEINLINE HRESULT IDOMMouseEvent_get_which(IDOMMouseEvent* This,USHORT *p) {
    return This->lpVtbl->get_which(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMMouseEvent_get_screenX_Proxy(
    IDOMMouseEvent* This,
    LONG *p);
void __RPC_STUB IDOMMouseEvent_get_screenX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMouseEvent_get_screenY_Proxy(
    IDOMMouseEvent* This,
    LONG *p);
void __RPC_STUB IDOMMouseEvent_get_screenY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMouseEvent_get_clientX_Proxy(
    IDOMMouseEvent* This,
    LONG *p);
void __RPC_STUB IDOMMouseEvent_get_clientX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMouseEvent_get_clientY_Proxy(
    IDOMMouseEvent* This,
    LONG *p);
void __RPC_STUB IDOMMouseEvent_get_clientY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMouseEvent_get_ctrlKey_Proxy(
    IDOMMouseEvent* This,
    VARIANT_BOOL *p);
void __RPC_STUB IDOMMouseEvent_get_ctrlKey_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMouseEvent_get_shiftKey_Proxy(
    IDOMMouseEvent* This,
    VARIANT_BOOL *p);
void __RPC_STUB IDOMMouseEvent_get_shiftKey_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMouseEvent_get_altKey_Proxy(
    IDOMMouseEvent* This,
    VARIANT_BOOL *p);
void __RPC_STUB IDOMMouseEvent_get_altKey_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMouseEvent_get_metaKey_Proxy(
    IDOMMouseEvent* This,
    VARIANT_BOOL *p);
void __RPC_STUB IDOMMouseEvent_get_metaKey_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMouseEvent_get_button_Proxy(
    IDOMMouseEvent* This,
    USHORT *p);
void __RPC_STUB IDOMMouseEvent_get_button_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMouseEvent_get_relatedTarget_Proxy(
    IDOMMouseEvent* This,
    IEventTarget **p);
void __RPC_STUB IDOMMouseEvent_get_relatedTarget_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMouseEvent_initMouseEvent_Proxy(
    IDOMMouseEvent* This,
    BSTR eventType,
    VARIANT_BOOL canBubble,
    VARIANT_BOOL cancelable,
    IHTMLWindow2 *viewArg,
    LONG detailArg,
    LONG screenXArg,
    LONG screenYArg,
    LONG clientXArg,
    LONG clientYArg,
    VARIANT_BOOL ctrlKeyArg,
    VARIANT_BOOL altKeyArg,
    VARIANT_BOOL shiftKeyArg,
    VARIANT_BOOL metaKeyArg,
    USHORT buttonArg,
    IEventTarget *relatedTargetArg);
void __RPC_STUB IDOMMouseEvent_initMouseEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMouseEvent_getModifierState_Proxy(
    IDOMMouseEvent* This,
    BSTR keyArg,
    VARIANT_BOOL *activated);
void __RPC_STUB IDOMMouseEvent_getModifierState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMouseEvent_get_buttons_Proxy(
    IDOMMouseEvent* This,
    USHORT *p);
void __RPC_STUB IDOMMouseEvent_get_buttons_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMouseEvent_get_fromElement_Proxy(
    IDOMMouseEvent* This,
    IHTMLElement **p);
void __RPC_STUB IDOMMouseEvent_get_fromElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMouseEvent_get_toElement_Proxy(
    IDOMMouseEvent* This,
    IHTMLElement **p);
void __RPC_STUB IDOMMouseEvent_get_toElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMouseEvent_get_x_Proxy(
    IDOMMouseEvent* This,
    LONG *p);
void __RPC_STUB IDOMMouseEvent_get_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMouseEvent_get_y_Proxy(
    IDOMMouseEvent* This,
    LONG *p);
void __RPC_STUB IDOMMouseEvent_get_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMouseEvent_get_offsetX_Proxy(
    IDOMMouseEvent* This,
    LONG *p);
void __RPC_STUB IDOMMouseEvent_get_offsetX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMouseEvent_get_offsetY_Proxy(
    IDOMMouseEvent* This,
    LONG *p);
void __RPC_STUB IDOMMouseEvent_get_offsetY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMouseEvent_get_pageX_Proxy(
    IDOMMouseEvent* This,
    LONG *p);
void __RPC_STUB IDOMMouseEvent_get_pageX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMouseEvent_get_pageY_Proxy(
    IDOMMouseEvent* This,
    LONG *p);
void __RPC_STUB IDOMMouseEvent_get_pageY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMouseEvent_get_layerX_Proxy(
    IDOMMouseEvent* This,
    LONG *p);
void __RPC_STUB IDOMMouseEvent_get_layerX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMouseEvent_get_layerY_Proxy(
    IDOMMouseEvent* This,
    LONG *p);
void __RPC_STUB IDOMMouseEvent_get_layerY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMouseEvent_get_which_Proxy(
    IDOMMouseEvent* This,
    USHORT *p);
void __RPC_STUB IDOMMouseEvent_get_which_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMMouseEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispDOMMouseEvent dispinterface
 */
#ifndef __DispDOMMouseEvent_DISPINTERFACE_DEFINED__
#define __DispDOMMouseEvent_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispDOMMouseEvent, 0x30590073, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590073-98b5-11cf-bb82-00aa00bdce0b")
DispDOMMouseEvent : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispDOMMouseEvent, 0x30590073, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispDOMMouseEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispDOMMouseEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispDOMMouseEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispDOMMouseEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispDOMMouseEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispDOMMouseEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispDOMMouseEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispDOMMouseEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispDOMMouseEventVtbl;
interface DispDOMMouseEvent {
    CONST_VTBL DispDOMMouseEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispDOMMouseEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispDOMMouseEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispDOMMouseEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispDOMMouseEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispDOMMouseEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispDOMMouseEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispDOMMouseEvent_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 DispDOMMouseEvent_QueryInterface(DispDOMMouseEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispDOMMouseEvent_AddRef(DispDOMMouseEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispDOMMouseEvent_Release(DispDOMMouseEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispDOMMouseEvent_GetTypeInfoCount(DispDOMMouseEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispDOMMouseEvent_GetTypeInfo(DispDOMMouseEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispDOMMouseEvent_GetIDsOfNames(DispDOMMouseEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispDOMMouseEvent_Invoke(DispDOMMouseEvent* 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  /* __DispDOMMouseEvent_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * DOMMouseEvent coclass
 */

DEFINE_GUID(CLSID_DOMMouseEvent, 0x305106cf, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305106cf-98b5-11cf-bb82-00aa00bdce0b") DOMMouseEvent;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMMouseEvent, 0x305106cf, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDOMMouseEvent;
/*****************************************************************************
 * IDOMDragEvent interface
 */
#ifndef __IDOMDragEvent_INTERFACE_DEFINED__
#define __IDOMDragEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMDragEvent, 0x30510761, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510761-98b5-11cf-bb82-00aa00bdce0b")
IDOMDragEvent : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_dataTransfer(
        IHTMLDataTransfer **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE initDragEvent(
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        IHTMLWindow2 *viewArg,
        LONG detailArg,
        LONG screenXArg,
        LONG screenYArg,
        LONG clientXArg,
        LONG clientYArg,
        VARIANT_BOOL ctrlKeyArg,
        VARIANT_BOOL altKeyArg,
        VARIANT_BOOL shiftKeyArg,
        VARIANT_BOOL metaKeyArg,
        USHORT buttonArg,
        IEventTarget *relatedTargetArg,
        IHTMLDataTransfer *dataTransferArg) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMDragEvent, 0x30510761, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMDragEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMDragEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMDragEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMDragEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDOMDragEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDOMDragEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDOMDragEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDOMDragEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDOMDragEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *get_dataTransfer)(
        IDOMDragEvent* This,
        IHTMLDataTransfer **p);

    HRESULT (STDMETHODCALLTYPE *initDragEvent)(
        IDOMDragEvent* This,
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        IHTMLWindow2 *viewArg,
        LONG detailArg,
        LONG screenXArg,
        LONG screenYArg,
        LONG clientXArg,
        LONG clientYArg,
        VARIANT_BOOL ctrlKeyArg,
        VARIANT_BOOL altKeyArg,
        VARIANT_BOOL shiftKeyArg,
        VARIANT_BOOL metaKeyArg,
        USHORT buttonArg,
        IEventTarget *relatedTargetArg,
        IHTMLDataTransfer *dataTransferArg);

    END_INTERFACE
} IDOMDragEventVtbl;
interface IDOMDragEvent {
    CONST_VTBL IDOMDragEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMDragEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMDragEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMDragEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDOMDragEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDOMDragEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDOMDragEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDOMDragEvent_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDOMDragEvent methods ***/
#define IDOMDragEvent_get_dataTransfer(This,p) (This)->lpVtbl->get_dataTransfer(This,p)
#define IDOMDragEvent_initDragEvent(This,eventType,canBubble,cancelable,viewArg,detailArg,screenXArg,screenYArg,clientXArg,clientYArg,ctrlKeyArg,altKeyArg,shiftKeyArg,metaKeyArg,buttonArg,relatedTargetArg,dataTransferArg) (This)->lpVtbl->initDragEvent(This,eventType,canBubble,cancelable,viewArg,detailArg,screenXArg,screenYArg,clientXArg,clientYArg,ctrlKeyArg,altKeyArg,shiftKeyArg,metaKeyArg,buttonArg,relatedTargetArg,dataTransferArg)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMDragEvent_QueryInterface(IDOMDragEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMDragEvent_AddRef(IDOMDragEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMDragEvent_Release(IDOMDragEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDOMDragEvent_GetTypeInfoCount(IDOMDragEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDOMDragEvent_GetTypeInfo(IDOMDragEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDOMDragEvent_GetIDsOfNames(IDOMDragEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDOMDragEvent_Invoke(IDOMDragEvent* 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);
}
/*** IDOMDragEvent methods ***/
static FORCEINLINE HRESULT IDOMDragEvent_get_dataTransfer(IDOMDragEvent* This,IHTMLDataTransfer **p) {
    return This->lpVtbl->get_dataTransfer(This,p);
}
static FORCEINLINE HRESULT IDOMDragEvent_initDragEvent(IDOMDragEvent* This,BSTR eventType,VARIANT_BOOL canBubble,VARIANT_BOOL cancelable,IHTMLWindow2 *viewArg,LONG detailArg,LONG screenXArg,LONG screenYArg,LONG clientXArg,LONG clientYArg,VARIANT_BOOL ctrlKeyArg,VARIANT_BOOL altKeyArg,VARIANT_BOOL shiftKeyArg,VARIANT_BOOL metaKeyArg,USHORT buttonArg,IEventTarget *relatedTargetArg,IHTMLDataTransfer *dataTransferArg) {
    return This->lpVtbl->initDragEvent(This,eventType,canBubble,cancelable,viewArg,detailArg,screenXArg,screenYArg,clientXArg,clientYArg,ctrlKeyArg,altKeyArg,shiftKeyArg,metaKeyArg,buttonArg,relatedTargetArg,dataTransferArg);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMDragEvent_get_dataTransfer_Proxy(
    IDOMDragEvent* This,
    IHTMLDataTransfer **p);
void __RPC_STUB IDOMDragEvent_get_dataTransfer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMDragEvent_initDragEvent_Proxy(
    IDOMDragEvent* This,
    BSTR eventType,
    VARIANT_BOOL canBubble,
    VARIANT_BOOL cancelable,
    IHTMLWindow2 *viewArg,
    LONG detailArg,
    LONG screenXArg,
    LONG screenYArg,
    LONG clientXArg,
    LONG clientYArg,
    VARIANT_BOOL ctrlKeyArg,
    VARIANT_BOOL altKeyArg,
    VARIANT_BOOL shiftKeyArg,
    VARIANT_BOOL metaKeyArg,
    USHORT buttonArg,
    IEventTarget *relatedTargetArg,
    IHTMLDataTransfer *dataTransferArg);
void __RPC_STUB IDOMDragEvent_initDragEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMDragEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispDOMDragEvent dispinterface
 */
#ifndef __DispDOMDragEvent_DISPINTERFACE_DEFINED__
#define __DispDOMDragEvent_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispDOMDragEvent, 0x305900a7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305900a7-98b5-11cf-bb82-00aa00bdce0b")
DispDOMDragEvent : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispDOMDragEvent, 0x305900a7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispDOMDragEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispDOMDragEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispDOMDragEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispDOMDragEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispDOMDragEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispDOMDragEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispDOMDragEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispDOMDragEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispDOMDragEventVtbl;
interface DispDOMDragEvent {
    CONST_VTBL DispDOMDragEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispDOMDragEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispDOMDragEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispDOMDragEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispDOMDragEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispDOMDragEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispDOMDragEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispDOMDragEvent_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 DispDOMDragEvent_QueryInterface(DispDOMDragEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispDOMDragEvent_AddRef(DispDOMDragEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispDOMDragEvent_Release(DispDOMDragEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispDOMDragEvent_GetTypeInfoCount(DispDOMDragEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispDOMDragEvent_GetTypeInfo(DispDOMDragEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispDOMDragEvent_GetIDsOfNames(DispDOMDragEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispDOMDragEvent_Invoke(DispDOMDragEvent* 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  /* __DispDOMDragEvent_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * DOMDragEvent coclass
 */

DEFINE_GUID(CLSID_DOMDragEvent, 0x30510762, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510762-98b5-11cf-bb82-00aa00bdce0b") DOMDragEvent;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMDragEvent, 0x30510762, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDOMDragEvent;
/*****************************************************************************
 * IDOMMouseWheelEvent interface
 */
#ifndef __IDOMMouseWheelEvent_INTERFACE_DEFINED__
#define __IDOMMouseWheelEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMMouseWheelEvent, 0x305106d0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106d0-98b5-11cf-bb82-00aa00bdce0b")
IDOMMouseWheelEvent : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_wheelDelta(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE initMouseWheelEvent(
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        IHTMLWindow2 *viewArg,
        LONG detailArg,
        LONG screenXArg,
        LONG screenYArg,
        LONG clientXArg,
        LONG clientYArg,
        USHORT buttonArg,
        IEventTarget *relatedTargetArg,
        BSTR modifiersListArg,
        LONG wheelDeltaArg) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMMouseWheelEvent, 0x305106d0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMMouseWheelEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMMouseWheelEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMMouseWheelEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMMouseWheelEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDOMMouseWheelEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDOMMouseWheelEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDOMMouseWheelEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDOMMouseWheelEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDOMMouseWheelEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *get_wheelDelta)(
        IDOMMouseWheelEvent* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *initMouseWheelEvent)(
        IDOMMouseWheelEvent* This,
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        IHTMLWindow2 *viewArg,
        LONG detailArg,
        LONG screenXArg,
        LONG screenYArg,
        LONG clientXArg,
        LONG clientYArg,
        USHORT buttonArg,
        IEventTarget *relatedTargetArg,
        BSTR modifiersListArg,
        LONG wheelDeltaArg);

    END_INTERFACE
} IDOMMouseWheelEventVtbl;
interface IDOMMouseWheelEvent {
    CONST_VTBL IDOMMouseWheelEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMMouseWheelEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMMouseWheelEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMMouseWheelEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDOMMouseWheelEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDOMMouseWheelEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDOMMouseWheelEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDOMMouseWheelEvent_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDOMMouseWheelEvent methods ***/
#define IDOMMouseWheelEvent_get_wheelDelta(This,p) (This)->lpVtbl->get_wheelDelta(This,p)
#define IDOMMouseWheelEvent_initMouseWheelEvent(This,eventType,canBubble,cancelable,viewArg,detailArg,screenXArg,screenYArg,clientXArg,clientYArg,buttonArg,relatedTargetArg,modifiersListArg,wheelDeltaArg) (This)->lpVtbl->initMouseWheelEvent(This,eventType,canBubble,cancelable,viewArg,detailArg,screenXArg,screenYArg,clientXArg,clientYArg,buttonArg,relatedTargetArg,modifiersListArg,wheelDeltaArg)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMMouseWheelEvent_QueryInterface(IDOMMouseWheelEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMMouseWheelEvent_AddRef(IDOMMouseWheelEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMMouseWheelEvent_Release(IDOMMouseWheelEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDOMMouseWheelEvent_GetTypeInfoCount(IDOMMouseWheelEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDOMMouseWheelEvent_GetTypeInfo(IDOMMouseWheelEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDOMMouseWheelEvent_GetIDsOfNames(IDOMMouseWheelEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDOMMouseWheelEvent_Invoke(IDOMMouseWheelEvent* 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);
}
/*** IDOMMouseWheelEvent methods ***/
static FORCEINLINE HRESULT IDOMMouseWheelEvent_get_wheelDelta(IDOMMouseWheelEvent* This,LONG *p) {
    return This->lpVtbl->get_wheelDelta(This,p);
}
static FORCEINLINE HRESULT IDOMMouseWheelEvent_initMouseWheelEvent(IDOMMouseWheelEvent* This,BSTR eventType,VARIANT_BOOL canBubble,VARIANT_BOOL cancelable,IHTMLWindow2 *viewArg,LONG detailArg,LONG screenXArg,LONG screenYArg,LONG clientXArg,LONG clientYArg,USHORT buttonArg,IEventTarget *relatedTargetArg,BSTR modifiersListArg,LONG wheelDeltaArg) {
    return This->lpVtbl->initMouseWheelEvent(This,eventType,canBubble,cancelable,viewArg,detailArg,screenXArg,screenYArg,clientXArg,clientYArg,buttonArg,relatedTargetArg,modifiersListArg,wheelDeltaArg);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMMouseWheelEvent_get_wheelDelta_Proxy(
    IDOMMouseWheelEvent* This,
    LONG *p);
void __RPC_STUB IDOMMouseWheelEvent_get_wheelDelta_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMouseWheelEvent_initMouseWheelEvent_Proxy(
    IDOMMouseWheelEvent* This,
    BSTR eventType,
    VARIANT_BOOL canBubble,
    VARIANT_BOOL cancelable,
    IHTMLWindow2 *viewArg,
    LONG detailArg,
    LONG screenXArg,
    LONG screenYArg,
    LONG clientXArg,
    LONG clientYArg,
    USHORT buttonArg,
    IEventTarget *relatedTargetArg,
    BSTR modifiersListArg,
    LONG wheelDeltaArg);
void __RPC_STUB IDOMMouseWheelEvent_initMouseWheelEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMMouseWheelEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispDOMMouseWheelEvent dispinterface
 */
#ifndef __DispDOMMouseWheelEvent_DISPINTERFACE_DEFINED__
#define __DispDOMMouseWheelEvent_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispDOMMouseWheelEvent, 0x30590074, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590074-98b5-11cf-bb82-00aa00bdce0b")
DispDOMMouseWheelEvent : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispDOMMouseWheelEvent, 0x30590074, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispDOMMouseWheelEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispDOMMouseWheelEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispDOMMouseWheelEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispDOMMouseWheelEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispDOMMouseWheelEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispDOMMouseWheelEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispDOMMouseWheelEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispDOMMouseWheelEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispDOMMouseWheelEventVtbl;
interface DispDOMMouseWheelEvent {
    CONST_VTBL DispDOMMouseWheelEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispDOMMouseWheelEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispDOMMouseWheelEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispDOMMouseWheelEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispDOMMouseWheelEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispDOMMouseWheelEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispDOMMouseWheelEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispDOMMouseWheelEvent_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 DispDOMMouseWheelEvent_QueryInterface(DispDOMMouseWheelEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispDOMMouseWheelEvent_AddRef(DispDOMMouseWheelEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispDOMMouseWheelEvent_Release(DispDOMMouseWheelEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispDOMMouseWheelEvent_GetTypeInfoCount(DispDOMMouseWheelEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispDOMMouseWheelEvent_GetTypeInfo(DispDOMMouseWheelEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispDOMMouseWheelEvent_GetIDsOfNames(DispDOMMouseWheelEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispDOMMouseWheelEvent_Invoke(DispDOMMouseWheelEvent* 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  /* __DispDOMMouseWheelEvent_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * DOMMouseWheelEvent coclass
 */

DEFINE_GUID(CLSID_DOMMouseWheelEvent, 0x305106d1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305106d1-98b5-11cf-bb82-00aa00bdce0b") DOMMouseWheelEvent;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMMouseWheelEvent, 0x305106d1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDOMMouseWheelEvent;
/*****************************************************************************
 * IDOMWheelEvent interface
 */
#ifndef __IDOMWheelEvent_INTERFACE_DEFINED__
#define __IDOMWheelEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMWheelEvent, 0x305106d2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106d2-98b5-11cf-bb82-00aa00bdce0b")
IDOMWheelEvent : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_deltaX(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_deltaY(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_deltaZ(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_deltaMode(
        ULONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE initWheelEvent(
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        IHTMLWindow2 *viewArg,
        LONG detailArg,
        LONG screenXArg,
        LONG screenYArg,
        LONG clientXArg,
        LONG clientYArg,
        USHORT buttonArg,
        IEventTarget *relatedTargetArg,
        BSTR modifiersListArg,
        LONG deltaX,
        LONG deltaY,
        LONG deltaZ,
        ULONG deltaMode) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMWheelEvent, 0x305106d2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMWheelEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMWheelEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMWheelEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMWheelEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDOMWheelEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDOMWheelEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDOMWheelEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDOMWheelEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDOMWheelEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *get_deltaX)(
        IDOMWheelEvent* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_deltaY)(
        IDOMWheelEvent* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_deltaZ)(
        IDOMWheelEvent* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_deltaMode)(
        IDOMWheelEvent* This,
        ULONG *p);

    HRESULT (STDMETHODCALLTYPE *initWheelEvent)(
        IDOMWheelEvent* This,
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        IHTMLWindow2 *viewArg,
        LONG detailArg,
        LONG screenXArg,
        LONG screenYArg,
        LONG clientXArg,
        LONG clientYArg,
        USHORT buttonArg,
        IEventTarget *relatedTargetArg,
        BSTR modifiersListArg,
        LONG deltaX,
        LONG deltaY,
        LONG deltaZ,
        ULONG deltaMode);

    END_INTERFACE
} IDOMWheelEventVtbl;
interface IDOMWheelEvent {
    CONST_VTBL IDOMWheelEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMWheelEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMWheelEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMWheelEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDOMWheelEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDOMWheelEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDOMWheelEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDOMWheelEvent_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDOMWheelEvent methods ***/
#define IDOMWheelEvent_get_deltaX(This,p) (This)->lpVtbl->get_deltaX(This,p)
#define IDOMWheelEvent_get_deltaY(This,p) (This)->lpVtbl->get_deltaY(This,p)
#define IDOMWheelEvent_get_deltaZ(This,p) (This)->lpVtbl->get_deltaZ(This,p)
#define IDOMWheelEvent_get_deltaMode(This,p) (This)->lpVtbl->get_deltaMode(This,p)
#define IDOMWheelEvent_initWheelEvent(This,eventType,canBubble,cancelable,viewArg,detailArg,screenXArg,screenYArg,clientXArg,clientYArg,buttonArg,relatedTargetArg,modifiersListArg,deltaX,deltaY,deltaZ,deltaMode) (This)->lpVtbl->initWheelEvent(This,eventType,canBubble,cancelable,viewArg,detailArg,screenXArg,screenYArg,clientXArg,clientYArg,buttonArg,relatedTargetArg,modifiersListArg,deltaX,deltaY,deltaZ,deltaMode)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMWheelEvent_QueryInterface(IDOMWheelEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMWheelEvent_AddRef(IDOMWheelEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMWheelEvent_Release(IDOMWheelEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDOMWheelEvent_GetTypeInfoCount(IDOMWheelEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDOMWheelEvent_GetTypeInfo(IDOMWheelEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDOMWheelEvent_GetIDsOfNames(IDOMWheelEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDOMWheelEvent_Invoke(IDOMWheelEvent* 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);
}
/*** IDOMWheelEvent methods ***/
static FORCEINLINE HRESULT IDOMWheelEvent_get_deltaX(IDOMWheelEvent* This,LONG *p) {
    return This->lpVtbl->get_deltaX(This,p);
}
static FORCEINLINE HRESULT IDOMWheelEvent_get_deltaY(IDOMWheelEvent* This,LONG *p) {
    return This->lpVtbl->get_deltaY(This,p);
}
static FORCEINLINE HRESULT IDOMWheelEvent_get_deltaZ(IDOMWheelEvent* This,LONG *p) {
    return This->lpVtbl->get_deltaZ(This,p);
}
static FORCEINLINE HRESULT IDOMWheelEvent_get_deltaMode(IDOMWheelEvent* This,ULONG *p) {
    return This->lpVtbl->get_deltaMode(This,p);
}
static FORCEINLINE HRESULT IDOMWheelEvent_initWheelEvent(IDOMWheelEvent* This,BSTR eventType,VARIANT_BOOL canBubble,VARIANT_BOOL cancelable,IHTMLWindow2 *viewArg,LONG detailArg,LONG screenXArg,LONG screenYArg,LONG clientXArg,LONG clientYArg,USHORT buttonArg,IEventTarget *relatedTargetArg,BSTR modifiersListArg,LONG deltaX,LONG deltaY,LONG deltaZ,ULONG deltaMode) {
    return This->lpVtbl->initWheelEvent(This,eventType,canBubble,cancelable,viewArg,detailArg,screenXArg,screenYArg,clientXArg,clientYArg,buttonArg,relatedTargetArg,modifiersListArg,deltaX,deltaY,deltaZ,deltaMode);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMWheelEvent_get_deltaX_Proxy(
    IDOMWheelEvent* This,
    LONG *p);
void __RPC_STUB IDOMWheelEvent_get_deltaX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMWheelEvent_get_deltaY_Proxy(
    IDOMWheelEvent* This,
    LONG *p);
void __RPC_STUB IDOMWheelEvent_get_deltaY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMWheelEvent_get_deltaZ_Proxy(
    IDOMWheelEvent* This,
    LONG *p);
void __RPC_STUB IDOMWheelEvent_get_deltaZ_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMWheelEvent_get_deltaMode_Proxy(
    IDOMWheelEvent* This,
    ULONG *p);
void __RPC_STUB IDOMWheelEvent_get_deltaMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMWheelEvent_initWheelEvent_Proxy(
    IDOMWheelEvent* This,
    BSTR eventType,
    VARIANT_BOOL canBubble,
    VARIANT_BOOL cancelable,
    IHTMLWindow2 *viewArg,
    LONG detailArg,
    LONG screenXArg,
    LONG screenYArg,
    LONG clientXArg,
    LONG clientYArg,
    USHORT buttonArg,
    IEventTarget *relatedTargetArg,
    BSTR modifiersListArg,
    LONG deltaX,
    LONG deltaY,
    LONG deltaZ,
    ULONG deltaMode);
void __RPC_STUB IDOMWheelEvent_initWheelEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMWheelEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispDOMWheelEvent dispinterface
 */
#ifndef __DispDOMWheelEvent_DISPINTERFACE_DEFINED__
#define __DispDOMWheelEvent_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispDOMWheelEvent, 0x30590075, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590075-98b5-11cf-bb82-00aa00bdce0b")
DispDOMWheelEvent : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispDOMWheelEvent, 0x30590075, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispDOMWheelEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispDOMWheelEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispDOMWheelEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispDOMWheelEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispDOMWheelEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispDOMWheelEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispDOMWheelEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispDOMWheelEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispDOMWheelEventVtbl;
interface DispDOMWheelEvent {
    CONST_VTBL DispDOMWheelEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispDOMWheelEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispDOMWheelEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispDOMWheelEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispDOMWheelEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispDOMWheelEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispDOMWheelEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispDOMWheelEvent_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 DispDOMWheelEvent_QueryInterface(DispDOMWheelEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispDOMWheelEvent_AddRef(DispDOMWheelEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispDOMWheelEvent_Release(DispDOMWheelEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispDOMWheelEvent_GetTypeInfoCount(DispDOMWheelEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispDOMWheelEvent_GetTypeInfo(DispDOMWheelEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispDOMWheelEvent_GetIDsOfNames(DispDOMWheelEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispDOMWheelEvent_Invoke(DispDOMWheelEvent* 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  /* __DispDOMWheelEvent_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * DOMWheelEvent coclass
 */

DEFINE_GUID(CLSID_DOMWheelEvent, 0x305106d3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305106d3-98b5-11cf-bb82-00aa00bdce0b") DOMWheelEvent;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMWheelEvent, 0x305106d3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDOMWheelEvent;
/*****************************************************************************
 * IDOMTextEvent interface
 */
#ifndef __IDOMTextEvent_INTERFACE_DEFINED__
#define __IDOMTextEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMTextEvent, 0x305106d4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106d4-98b5-11cf-bb82-00aa00bdce0b")
IDOMTextEvent : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_data(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_inputMethod(
        ULONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE initTextEvent(
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        IHTMLWindow2 *viewArg,
        BSTR dataArg,
        ULONG inputMethod,
        BSTR locale) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_locale(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMTextEvent, 0x305106d4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMTextEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMTextEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMTextEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMTextEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDOMTextEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDOMTextEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDOMTextEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDOMTextEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDOMTextEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *get_data)(
        IDOMTextEvent* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_inputMethod)(
        IDOMTextEvent* This,
        ULONG *p);

    HRESULT (STDMETHODCALLTYPE *initTextEvent)(
        IDOMTextEvent* This,
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        IHTMLWindow2 *viewArg,
        BSTR dataArg,
        ULONG inputMethod,
        BSTR locale);

    HRESULT (STDMETHODCALLTYPE *get_locale)(
        IDOMTextEvent* This,
        BSTR *p);

    END_INTERFACE
} IDOMTextEventVtbl;
interface IDOMTextEvent {
    CONST_VTBL IDOMTextEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMTextEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMTextEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMTextEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDOMTextEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDOMTextEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDOMTextEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDOMTextEvent_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDOMTextEvent methods ***/
#define IDOMTextEvent_get_data(This,p) (This)->lpVtbl->get_data(This,p)
#define IDOMTextEvent_get_inputMethod(This,p) (This)->lpVtbl->get_inputMethod(This,p)
#define IDOMTextEvent_initTextEvent(This,eventType,canBubble,cancelable,viewArg,dataArg,inputMethod,locale) (This)->lpVtbl->initTextEvent(This,eventType,canBubble,cancelable,viewArg,dataArg,inputMethod,locale)
#define IDOMTextEvent_get_locale(This,p) (This)->lpVtbl->get_locale(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMTextEvent_QueryInterface(IDOMTextEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMTextEvent_AddRef(IDOMTextEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMTextEvent_Release(IDOMTextEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDOMTextEvent_GetTypeInfoCount(IDOMTextEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDOMTextEvent_GetTypeInfo(IDOMTextEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDOMTextEvent_GetIDsOfNames(IDOMTextEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDOMTextEvent_Invoke(IDOMTextEvent* 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);
}
/*** IDOMTextEvent methods ***/
static FORCEINLINE HRESULT IDOMTextEvent_get_data(IDOMTextEvent* This,BSTR *p) {
    return This->lpVtbl->get_data(This,p);
}
static FORCEINLINE HRESULT IDOMTextEvent_get_inputMethod(IDOMTextEvent* This,ULONG *p) {
    return This->lpVtbl->get_inputMethod(This,p);
}
static FORCEINLINE HRESULT IDOMTextEvent_initTextEvent(IDOMTextEvent* This,BSTR eventType,VARIANT_BOOL canBubble,VARIANT_BOOL cancelable,IHTMLWindow2 *viewArg,BSTR dataArg,ULONG inputMethod,BSTR locale) {
    return This->lpVtbl->initTextEvent(This,eventType,canBubble,cancelable,viewArg,dataArg,inputMethod,locale);
}
static FORCEINLINE HRESULT IDOMTextEvent_get_locale(IDOMTextEvent* This,BSTR *p) {
    return This->lpVtbl->get_locale(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMTextEvent_get_data_Proxy(
    IDOMTextEvent* This,
    BSTR *p);
void __RPC_STUB IDOMTextEvent_get_data_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMTextEvent_get_inputMethod_Proxy(
    IDOMTextEvent* This,
    ULONG *p);
void __RPC_STUB IDOMTextEvent_get_inputMethod_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMTextEvent_initTextEvent_Proxy(
    IDOMTextEvent* This,
    BSTR eventType,
    VARIANT_BOOL canBubble,
    VARIANT_BOOL cancelable,
    IHTMLWindow2 *viewArg,
    BSTR dataArg,
    ULONG inputMethod,
    BSTR locale);
void __RPC_STUB IDOMTextEvent_initTextEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMTextEvent_get_locale_Proxy(
    IDOMTextEvent* This,
    BSTR *p);
void __RPC_STUB IDOMTextEvent_get_locale_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMTextEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispDOMTextEvent dispinterface
 */
#ifndef __DispDOMTextEvent_DISPINTERFACE_DEFINED__
#define __DispDOMTextEvent_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispDOMTextEvent, 0x30590076, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590076-98b5-11cf-bb82-00aa00bdce0b")
DispDOMTextEvent : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispDOMTextEvent, 0x30590076, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispDOMTextEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispDOMTextEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispDOMTextEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispDOMTextEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispDOMTextEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispDOMTextEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispDOMTextEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispDOMTextEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispDOMTextEventVtbl;
interface DispDOMTextEvent {
    CONST_VTBL DispDOMTextEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispDOMTextEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispDOMTextEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispDOMTextEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispDOMTextEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispDOMTextEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispDOMTextEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispDOMTextEvent_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 DispDOMTextEvent_QueryInterface(DispDOMTextEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispDOMTextEvent_AddRef(DispDOMTextEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispDOMTextEvent_Release(DispDOMTextEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispDOMTextEvent_GetTypeInfoCount(DispDOMTextEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispDOMTextEvent_GetTypeInfo(DispDOMTextEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispDOMTextEvent_GetIDsOfNames(DispDOMTextEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispDOMTextEvent_Invoke(DispDOMTextEvent* 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  /* __DispDOMTextEvent_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * DOMTextEvent coclass
 */

DEFINE_GUID(CLSID_DOMTextEvent, 0x305106d5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305106d5-98b5-11cf-bb82-00aa00bdce0b") DOMTextEvent;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMTextEvent, 0x305106d5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDOMTextEvent;
/*****************************************************************************
 * IDOMKeyboardEvent interface
 */
#ifndef __IDOMKeyboardEvent_INTERFACE_DEFINED__
#define __IDOMKeyboardEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMKeyboardEvent, 0x305106d6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106d6-98b5-11cf-bb82-00aa00bdce0b")
IDOMKeyboardEvent : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_key(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_location(
        ULONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ctrlKey(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_shiftKey(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_altKey(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_metaKey(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_repeat(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE getModifierState(
        BSTR keyArg,
        VARIANT_BOOL *state) = 0;

    virtual HRESULT STDMETHODCALLTYPE initKeyboardEvent(
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        IHTMLWindow2 *viewArg,
        BSTR keyArg,
        ULONG locationArg,
        BSTR modifiersListArg,
        VARIANT_BOOL repeat,
        BSTR locale) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_keyCode(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_charCode(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_which(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ie9_char(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_locale(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMKeyboardEvent, 0x305106d6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMKeyboardEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMKeyboardEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMKeyboardEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMKeyboardEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDOMKeyboardEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDOMKeyboardEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDOMKeyboardEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDOMKeyboardEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDOMKeyboardEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *get_key)(
        IDOMKeyboardEvent* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_location)(
        IDOMKeyboardEvent* This,
        ULONG *p);

    HRESULT (STDMETHODCALLTYPE *get_ctrlKey)(
        IDOMKeyboardEvent* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_shiftKey)(
        IDOMKeyboardEvent* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_altKey)(
        IDOMKeyboardEvent* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_metaKey)(
        IDOMKeyboardEvent* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_repeat)(
        IDOMKeyboardEvent* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *getModifierState)(
        IDOMKeyboardEvent* This,
        BSTR keyArg,
        VARIANT_BOOL *state);

    HRESULT (STDMETHODCALLTYPE *initKeyboardEvent)(
        IDOMKeyboardEvent* This,
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        IHTMLWindow2 *viewArg,
        BSTR keyArg,
        ULONG locationArg,
        BSTR modifiersListArg,
        VARIANT_BOOL repeat,
        BSTR locale);

    HRESULT (STDMETHODCALLTYPE *get_keyCode)(
        IDOMKeyboardEvent* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_charCode)(
        IDOMKeyboardEvent* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_which)(
        IDOMKeyboardEvent* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_ie9_char)(
        IDOMKeyboardEvent* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_locale)(
        IDOMKeyboardEvent* This,
        BSTR *p);

    END_INTERFACE
} IDOMKeyboardEventVtbl;
interface IDOMKeyboardEvent {
    CONST_VTBL IDOMKeyboardEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMKeyboardEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMKeyboardEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMKeyboardEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDOMKeyboardEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDOMKeyboardEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDOMKeyboardEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDOMKeyboardEvent_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDOMKeyboardEvent methods ***/
#define IDOMKeyboardEvent_get_key(This,p) (This)->lpVtbl->get_key(This,p)
#define IDOMKeyboardEvent_get_location(This,p) (This)->lpVtbl->get_location(This,p)
#define IDOMKeyboardEvent_get_ctrlKey(This,p) (This)->lpVtbl->get_ctrlKey(This,p)
#define IDOMKeyboardEvent_get_shiftKey(This,p) (This)->lpVtbl->get_shiftKey(This,p)
#define IDOMKeyboardEvent_get_altKey(This,p) (This)->lpVtbl->get_altKey(This,p)
#define IDOMKeyboardEvent_get_metaKey(This,p) (This)->lpVtbl->get_metaKey(This,p)
#define IDOMKeyboardEvent_get_repeat(This,p) (This)->lpVtbl->get_repeat(This,p)
#define IDOMKeyboardEvent_getModifierState(This,keyArg,state) (This)->lpVtbl->getModifierState(This,keyArg,state)
#define IDOMKeyboardEvent_initKeyboardEvent(This,eventType,canBubble,cancelable,viewArg,keyArg,locationArg,modifiersListArg,repeat,locale) (This)->lpVtbl->initKeyboardEvent(This,eventType,canBubble,cancelable,viewArg,keyArg,locationArg,modifiersListArg,repeat,locale)
#define IDOMKeyboardEvent_get_keyCode(This,p) (This)->lpVtbl->get_keyCode(This,p)
#define IDOMKeyboardEvent_get_charCode(This,p) (This)->lpVtbl->get_charCode(This,p)
#define IDOMKeyboardEvent_get_which(This,p) (This)->lpVtbl->get_which(This,p)
#define IDOMKeyboardEvent_get_ie9_char(This,p) (This)->lpVtbl->get_ie9_char(This,p)
#define IDOMKeyboardEvent_get_locale(This,p) (This)->lpVtbl->get_locale(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMKeyboardEvent_QueryInterface(IDOMKeyboardEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMKeyboardEvent_AddRef(IDOMKeyboardEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMKeyboardEvent_Release(IDOMKeyboardEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDOMKeyboardEvent_GetTypeInfoCount(IDOMKeyboardEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDOMKeyboardEvent_GetTypeInfo(IDOMKeyboardEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDOMKeyboardEvent_GetIDsOfNames(IDOMKeyboardEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDOMKeyboardEvent_Invoke(IDOMKeyboardEvent* 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);
}
/*** IDOMKeyboardEvent methods ***/
static FORCEINLINE HRESULT IDOMKeyboardEvent_get_key(IDOMKeyboardEvent* This,BSTR *p) {
    return This->lpVtbl->get_key(This,p);
}
static FORCEINLINE HRESULT IDOMKeyboardEvent_get_location(IDOMKeyboardEvent* This,ULONG *p) {
    return This->lpVtbl->get_location(This,p);
}
static FORCEINLINE HRESULT IDOMKeyboardEvent_get_ctrlKey(IDOMKeyboardEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_ctrlKey(This,p);
}
static FORCEINLINE HRESULT IDOMKeyboardEvent_get_shiftKey(IDOMKeyboardEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_shiftKey(This,p);
}
static FORCEINLINE HRESULT IDOMKeyboardEvent_get_altKey(IDOMKeyboardEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_altKey(This,p);
}
static FORCEINLINE HRESULT IDOMKeyboardEvent_get_metaKey(IDOMKeyboardEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_metaKey(This,p);
}
static FORCEINLINE HRESULT IDOMKeyboardEvent_get_repeat(IDOMKeyboardEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_repeat(This,p);
}
static FORCEINLINE HRESULT IDOMKeyboardEvent_getModifierState(IDOMKeyboardEvent* This,BSTR keyArg,VARIANT_BOOL *state) {
    return This->lpVtbl->getModifierState(This,keyArg,state);
}
static FORCEINLINE HRESULT IDOMKeyboardEvent_initKeyboardEvent(IDOMKeyboardEvent* This,BSTR eventType,VARIANT_BOOL canBubble,VARIANT_BOOL cancelable,IHTMLWindow2 *viewArg,BSTR keyArg,ULONG locationArg,BSTR modifiersListArg,VARIANT_BOOL repeat,BSTR locale) {
    return This->lpVtbl->initKeyboardEvent(This,eventType,canBubble,cancelable,viewArg,keyArg,locationArg,modifiersListArg,repeat,locale);
}
static FORCEINLINE HRESULT IDOMKeyboardEvent_get_keyCode(IDOMKeyboardEvent* This,LONG *p) {
    return This->lpVtbl->get_keyCode(This,p);
}
static FORCEINLINE HRESULT IDOMKeyboardEvent_get_charCode(IDOMKeyboardEvent* This,LONG *p) {
    return This->lpVtbl->get_charCode(This,p);
}
static FORCEINLINE HRESULT IDOMKeyboardEvent_get_which(IDOMKeyboardEvent* This,LONG *p) {
    return This->lpVtbl->get_which(This,p);
}
static FORCEINLINE HRESULT IDOMKeyboardEvent_get_ie9_char(IDOMKeyboardEvent* This,VARIANT *p) {
    return This->lpVtbl->get_ie9_char(This,p);
}
static FORCEINLINE HRESULT IDOMKeyboardEvent_get_locale(IDOMKeyboardEvent* This,BSTR *p) {
    return This->lpVtbl->get_locale(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMKeyboardEvent_get_key_Proxy(
    IDOMKeyboardEvent* This,
    BSTR *p);
void __RPC_STUB IDOMKeyboardEvent_get_key_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMKeyboardEvent_get_location_Proxy(
    IDOMKeyboardEvent* This,
    ULONG *p);
void __RPC_STUB IDOMKeyboardEvent_get_location_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMKeyboardEvent_get_ctrlKey_Proxy(
    IDOMKeyboardEvent* This,
    VARIANT_BOOL *p);
void __RPC_STUB IDOMKeyboardEvent_get_ctrlKey_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMKeyboardEvent_get_shiftKey_Proxy(
    IDOMKeyboardEvent* This,
    VARIANT_BOOL *p);
void __RPC_STUB IDOMKeyboardEvent_get_shiftKey_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMKeyboardEvent_get_altKey_Proxy(
    IDOMKeyboardEvent* This,
    VARIANT_BOOL *p);
void __RPC_STUB IDOMKeyboardEvent_get_altKey_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMKeyboardEvent_get_metaKey_Proxy(
    IDOMKeyboardEvent* This,
    VARIANT_BOOL *p);
void __RPC_STUB IDOMKeyboardEvent_get_metaKey_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMKeyboardEvent_get_repeat_Proxy(
    IDOMKeyboardEvent* This,
    VARIANT_BOOL *p);
void __RPC_STUB IDOMKeyboardEvent_get_repeat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMKeyboardEvent_getModifierState_Proxy(
    IDOMKeyboardEvent* This,
    BSTR keyArg,
    VARIANT_BOOL *state);
void __RPC_STUB IDOMKeyboardEvent_getModifierState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMKeyboardEvent_initKeyboardEvent_Proxy(
    IDOMKeyboardEvent* This,
    BSTR eventType,
    VARIANT_BOOL canBubble,
    VARIANT_BOOL cancelable,
    IHTMLWindow2 *viewArg,
    BSTR keyArg,
    ULONG locationArg,
    BSTR modifiersListArg,
    VARIANT_BOOL repeat,
    BSTR locale);
void __RPC_STUB IDOMKeyboardEvent_initKeyboardEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMKeyboardEvent_get_keyCode_Proxy(
    IDOMKeyboardEvent* This,
    LONG *p);
void __RPC_STUB IDOMKeyboardEvent_get_keyCode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMKeyboardEvent_get_charCode_Proxy(
    IDOMKeyboardEvent* This,
    LONG *p);
void __RPC_STUB IDOMKeyboardEvent_get_charCode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMKeyboardEvent_get_which_Proxy(
    IDOMKeyboardEvent* This,
    LONG *p);
void __RPC_STUB IDOMKeyboardEvent_get_which_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMKeyboardEvent_get_ie9_char_Proxy(
    IDOMKeyboardEvent* This,
    VARIANT *p);
void __RPC_STUB IDOMKeyboardEvent_get_ie9_char_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMKeyboardEvent_get_locale_Proxy(
    IDOMKeyboardEvent* This,
    BSTR *p);
void __RPC_STUB IDOMKeyboardEvent_get_locale_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMKeyboardEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispDOMKeyboardEvent dispinterface
 */
#ifndef __DispDOMKeyboardEvent_DISPINTERFACE_DEFINED__
#define __DispDOMKeyboardEvent_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispDOMKeyboardEvent, 0x30590077, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590077-98b5-11cf-bb82-00aa00bdce0b")
DispDOMKeyboardEvent : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispDOMKeyboardEvent, 0x30590077, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispDOMKeyboardEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispDOMKeyboardEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispDOMKeyboardEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispDOMKeyboardEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispDOMKeyboardEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispDOMKeyboardEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispDOMKeyboardEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispDOMKeyboardEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispDOMKeyboardEventVtbl;
interface DispDOMKeyboardEvent {
    CONST_VTBL DispDOMKeyboardEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispDOMKeyboardEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispDOMKeyboardEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispDOMKeyboardEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispDOMKeyboardEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispDOMKeyboardEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispDOMKeyboardEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispDOMKeyboardEvent_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 DispDOMKeyboardEvent_QueryInterface(DispDOMKeyboardEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispDOMKeyboardEvent_AddRef(DispDOMKeyboardEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispDOMKeyboardEvent_Release(DispDOMKeyboardEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispDOMKeyboardEvent_GetTypeInfoCount(DispDOMKeyboardEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispDOMKeyboardEvent_GetTypeInfo(DispDOMKeyboardEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispDOMKeyboardEvent_GetIDsOfNames(DispDOMKeyboardEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispDOMKeyboardEvent_Invoke(DispDOMKeyboardEvent* 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  /* __DispDOMKeyboardEvent_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * DOMKeyboardEvent coclass
 */

DEFINE_GUID(CLSID_DOMKeyboardEvent, 0x305106d7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305106d7-98b5-11cf-bb82-00aa00bdce0b") DOMKeyboardEvent;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMKeyboardEvent, 0x305106d7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDOMKeyboardEvent;
/*****************************************************************************
 * IDOMCompositionEvent interface
 */
#ifndef __IDOMCompositionEvent_INTERFACE_DEFINED__
#define __IDOMCompositionEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMCompositionEvent, 0x305106d8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106d8-98b5-11cf-bb82-00aa00bdce0b")
IDOMCompositionEvent : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_data(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE initCompositionEvent(
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        IHTMLWindow2 *viewArg,
        BSTR data,
        BSTR locale) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_locale(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMCompositionEvent, 0x305106d8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMCompositionEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMCompositionEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMCompositionEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMCompositionEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDOMCompositionEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDOMCompositionEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDOMCompositionEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDOMCompositionEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDOMCompositionEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *get_data)(
        IDOMCompositionEvent* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *initCompositionEvent)(
        IDOMCompositionEvent* This,
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        IHTMLWindow2 *viewArg,
        BSTR data,
        BSTR locale);

    HRESULT (STDMETHODCALLTYPE *get_locale)(
        IDOMCompositionEvent* This,
        BSTR *p);

    END_INTERFACE
} IDOMCompositionEventVtbl;
interface IDOMCompositionEvent {
    CONST_VTBL IDOMCompositionEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMCompositionEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMCompositionEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMCompositionEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDOMCompositionEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDOMCompositionEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDOMCompositionEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDOMCompositionEvent_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDOMCompositionEvent methods ***/
#define IDOMCompositionEvent_get_data(This,p) (This)->lpVtbl->get_data(This,p)
#define IDOMCompositionEvent_initCompositionEvent(This,eventType,canBubble,cancelable,viewArg,data,locale) (This)->lpVtbl->initCompositionEvent(This,eventType,canBubble,cancelable,viewArg,data,locale)
#define IDOMCompositionEvent_get_locale(This,p) (This)->lpVtbl->get_locale(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMCompositionEvent_QueryInterface(IDOMCompositionEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMCompositionEvent_AddRef(IDOMCompositionEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMCompositionEvent_Release(IDOMCompositionEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDOMCompositionEvent_GetTypeInfoCount(IDOMCompositionEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDOMCompositionEvent_GetTypeInfo(IDOMCompositionEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDOMCompositionEvent_GetIDsOfNames(IDOMCompositionEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDOMCompositionEvent_Invoke(IDOMCompositionEvent* 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);
}
/*** IDOMCompositionEvent methods ***/
static FORCEINLINE HRESULT IDOMCompositionEvent_get_data(IDOMCompositionEvent* This,BSTR *p) {
    return This->lpVtbl->get_data(This,p);
}
static FORCEINLINE HRESULT IDOMCompositionEvent_initCompositionEvent(IDOMCompositionEvent* This,BSTR eventType,VARIANT_BOOL canBubble,VARIANT_BOOL cancelable,IHTMLWindow2 *viewArg,BSTR data,BSTR locale) {
    return This->lpVtbl->initCompositionEvent(This,eventType,canBubble,cancelable,viewArg,data,locale);
}
static FORCEINLINE HRESULT IDOMCompositionEvent_get_locale(IDOMCompositionEvent* This,BSTR *p) {
    return This->lpVtbl->get_locale(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMCompositionEvent_get_data_Proxy(
    IDOMCompositionEvent* This,
    BSTR *p);
void __RPC_STUB IDOMCompositionEvent_get_data_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMCompositionEvent_initCompositionEvent_Proxy(
    IDOMCompositionEvent* This,
    BSTR eventType,
    VARIANT_BOOL canBubble,
    VARIANT_BOOL cancelable,
    IHTMLWindow2 *viewArg,
    BSTR data,
    BSTR locale);
void __RPC_STUB IDOMCompositionEvent_initCompositionEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMCompositionEvent_get_locale_Proxy(
    IDOMCompositionEvent* This,
    BSTR *p);
void __RPC_STUB IDOMCompositionEvent_get_locale_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMCompositionEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispDOMCompositionEvent dispinterface
 */
#ifndef __DispDOMCompositionEvent_DISPINTERFACE_DEFINED__
#define __DispDOMCompositionEvent_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispDOMCompositionEvent, 0x30590078, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590078-98b5-11cf-bb82-00aa00bdce0b")
DispDOMCompositionEvent : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispDOMCompositionEvent, 0x30590078, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispDOMCompositionEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispDOMCompositionEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispDOMCompositionEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispDOMCompositionEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispDOMCompositionEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispDOMCompositionEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispDOMCompositionEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispDOMCompositionEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispDOMCompositionEventVtbl;
interface DispDOMCompositionEvent {
    CONST_VTBL DispDOMCompositionEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispDOMCompositionEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispDOMCompositionEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispDOMCompositionEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispDOMCompositionEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispDOMCompositionEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispDOMCompositionEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispDOMCompositionEvent_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 DispDOMCompositionEvent_QueryInterface(DispDOMCompositionEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispDOMCompositionEvent_AddRef(DispDOMCompositionEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispDOMCompositionEvent_Release(DispDOMCompositionEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispDOMCompositionEvent_GetTypeInfoCount(DispDOMCompositionEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispDOMCompositionEvent_GetTypeInfo(DispDOMCompositionEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispDOMCompositionEvent_GetIDsOfNames(DispDOMCompositionEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispDOMCompositionEvent_Invoke(DispDOMCompositionEvent* 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  /* __DispDOMCompositionEvent_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * DOMCompositionEvent coclass
 */

DEFINE_GUID(CLSID_DOMCompositionEvent, 0x305106d9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305106d9-98b5-11cf-bb82-00aa00bdce0b") DOMCompositionEvent;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMCompositionEvent, 0x305106d9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDOMCompositionEvent;
/*****************************************************************************
 * IDOMMutationEvent interface
 */
#ifndef __IDOMMutationEvent_INTERFACE_DEFINED__
#define __IDOMMutationEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMMutationEvent, 0x305106da, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106da-98b5-11cf-bb82-00aa00bdce0b")
IDOMMutationEvent : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_relatedNode(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_prevValue(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_newValue(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_attrName(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_attrChange(
        USHORT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE initMutationEvent(
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        IDispatch *relatedNodeArg,
        BSTR prevValueArg,
        BSTR newValueArg,
        BSTR attrNameArg,
        USHORT attrChangeArg) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMMutationEvent, 0x305106da, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMMutationEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMMutationEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMMutationEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMMutationEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDOMMutationEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDOMMutationEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDOMMutationEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDOMMutationEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDOMMutationEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *get_relatedNode)(
        IDOMMutationEvent* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_prevValue)(
        IDOMMutationEvent* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_newValue)(
        IDOMMutationEvent* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_attrName)(
        IDOMMutationEvent* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_attrChange)(
        IDOMMutationEvent* This,
        USHORT *p);

    HRESULT (STDMETHODCALLTYPE *initMutationEvent)(
        IDOMMutationEvent* This,
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        IDispatch *relatedNodeArg,
        BSTR prevValueArg,
        BSTR newValueArg,
        BSTR attrNameArg,
        USHORT attrChangeArg);

    END_INTERFACE
} IDOMMutationEventVtbl;
interface IDOMMutationEvent {
    CONST_VTBL IDOMMutationEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMMutationEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMMutationEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMMutationEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDOMMutationEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDOMMutationEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDOMMutationEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDOMMutationEvent_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDOMMutationEvent methods ***/
#define IDOMMutationEvent_get_relatedNode(This,p) (This)->lpVtbl->get_relatedNode(This,p)
#define IDOMMutationEvent_get_prevValue(This,p) (This)->lpVtbl->get_prevValue(This,p)
#define IDOMMutationEvent_get_newValue(This,p) (This)->lpVtbl->get_newValue(This,p)
#define IDOMMutationEvent_get_attrName(This,p) (This)->lpVtbl->get_attrName(This,p)
#define IDOMMutationEvent_get_attrChange(This,p) (This)->lpVtbl->get_attrChange(This,p)
#define IDOMMutationEvent_initMutationEvent(This,eventType,canBubble,cancelable,relatedNodeArg,prevValueArg,newValueArg,attrNameArg,attrChangeArg) (This)->lpVtbl->initMutationEvent(This,eventType,canBubble,cancelable,relatedNodeArg,prevValueArg,newValueArg,attrNameArg,attrChangeArg)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMMutationEvent_QueryInterface(IDOMMutationEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMMutationEvent_AddRef(IDOMMutationEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMMutationEvent_Release(IDOMMutationEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDOMMutationEvent_GetTypeInfoCount(IDOMMutationEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDOMMutationEvent_GetTypeInfo(IDOMMutationEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDOMMutationEvent_GetIDsOfNames(IDOMMutationEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDOMMutationEvent_Invoke(IDOMMutationEvent* 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);
}
/*** IDOMMutationEvent methods ***/
static FORCEINLINE HRESULT IDOMMutationEvent_get_relatedNode(IDOMMutationEvent* This,IDispatch **p) {
    return This->lpVtbl->get_relatedNode(This,p);
}
static FORCEINLINE HRESULT IDOMMutationEvent_get_prevValue(IDOMMutationEvent* This,BSTR *p) {
    return This->lpVtbl->get_prevValue(This,p);
}
static FORCEINLINE HRESULT IDOMMutationEvent_get_newValue(IDOMMutationEvent* This,BSTR *p) {
    return This->lpVtbl->get_newValue(This,p);
}
static FORCEINLINE HRESULT IDOMMutationEvent_get_attrName(IDOMMutationEvent* This,BSTR *p) {
    return This->lpVtbl->get_attrName(This,p);
}
static FORCEINLINE HRESULT IDOMMutationEvent_get_attrChange(IDOMMutationEvent* This,USHORT *p) {
    return This->lpVtbl->get_attrChange(This,p);
}
static FORCEINLINE HRESULT IDOMMutationEvent_initMutationEvent(IDOMMutationEvent* This,BSTR eventType,VARIANT_BOOL canBubble,VARIANT_BOOL cancelable,IDispatch *relatedNodeArg,BSTR prevValueArg,BSTR newValueArg,BSTR attrNameArg,USHORT attrChangeArg) {
    return This->lpVtbl->initMutationEvent(This,eventType,canBubble,cancelable,relatedNodeArg,prevValueArg,newValueArg,attrNameArg,attrChangeArg);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMMutationEvent_get_relatedNode_Proxy(
    IDOMMutationEvent* This,
    IDispatch **p);
void __RPC_STUB IDOMMutationEvent_get_relatedNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMutationEvent_get_prevValue_Proxy(
    IDOMMutationEvent* This,
    BSTR *p);
void __RPC_STUB IDOMMutationEvent_get_prevValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMutationEvent_get_newValue_Proxy(
    IDOMMutationEvent* This,
    BSTR *p);
void __RPC_STUB IDOMMutationEvent_get_newValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMutationEvent_get_attrName_Proxy(
    IDOMMutationEvent* This,
    BSTR *p);
void __RPC_STUB IDOMMutationEvent_get_attrName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMutationEvent_get_attrChange_Proxy(
    IDOMMutationEvent* This,
    USHORT *p);
void __RPC_STUB IDOMMutationEvent_get_attrChange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMutationEvent_initMutationEvent_Proxy(
    IDOMMutationEvent* This,
    BSTR eventType,
    VARIANT_BOOL canBubble,
    VARIANT_BOOL cancelable,
    IDispatch *relatedNodeArg,
    BSTR prevValueArg,
    BSTR newValueArg,
    BSTR attrNameArg,
    USHORT attrChangeArg);
void __RPC_STUB IDOMMutationEvent_initMutationEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMMutationEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispDOMMutationEvent dispinterface
 */
#ifndef __DispDOMMutationEvent_DISPINTERFACE_DEFINED__
#define __DispDOMMutationEvent_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispDOMMutationEvent, 0x30590079, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590079-98b5-11cf-bb82-00aa00bdce0b")
DispDOMMutationEvent : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispDOMMutationEvent, 0x30590079, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispDOMMutationEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispDOMMutationEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispDOMMutationEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispDOMMutationEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispDOMMutationEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispDOMMutationEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispDOMMutationEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispDOMMutationEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispDOMMutationEventVtbl;
interface DispDOMMutationEvent {
    CONST_VTBL DispDOMMutationEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispDOMMutationEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispDOMMutationEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispDOMMutationEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispDOMMutationEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispDOMMutationEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispDOMMutationEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispDOMMutationEvent_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 DispDOMMutationEvent_QueryInterface(DispDOMMutationEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispDOMMutationEvent_AddRef(DispDOMMutationEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispDOMMutationEvent_Release(DispDOMMutationEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispDOMMutationEvent_GetTypeInfoCount(DispDOMMutationEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispDOMMutationEvent_GetTypeInfo(DispDOMMutationEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispDOMMutationEvent_GetIDsOfNames(DispDOMMutationEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispDOMMutationEvent_Invoke(DispDOMMutationEvent* 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  /* __DispDOMMutationEvent_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * DOMMutationEvent coclass
 */

DEFINE_GUID(CLSID_DOMMutationEvent, 0x305106db, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305106db-98b5-11cf-bb82-00aa00bdce0b") DOMMutationEvent;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMMutationEvent, 0x305106db, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDOMMutationEvent;
/*****************************************************************************
 * IDOMBeforeUnloadEvent interface
 */
#ifndef __IDOMBeforeUnloadEvent_INTERFACE_DEFINED__
#define __IDOMBeforeUnloadEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMBeforeUnloadEvent, 0x30510763, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510763-98b5-11cf-bb82-00aa00bdce0b")
IDOMBeforeUnloadEvent : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_returnValue(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_returnValue(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMBeforeUnloadEvent, 0x30510763, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMBeforeUnloadEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMBeforeUnloadEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMBeforeUnloadEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMBeforeUnloadEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDOMBeforeUnloadEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDOMBeforeUnloadEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDOMBeforeUnloadEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDOMBeforeUnloadEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDOMBeforeUnloadEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *put_returnValue)(
        IDOMBeforeUnloadEvent* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_returnValue)(
        IDOMBeforeUnloadEvent* This,
        VARIANT *p);

    END_INTERFACE
} IDOMBeforeUnloadEventVtbl;
interface IDOMBeforeUnloadEvent {
    CONST_VTBL IDOMBeforeUnloadEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMBeforeUnloadEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMBeforeUnloadEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMBeforeUnloadEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDOMBeforeUnloadEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDOMBeforeUnloadEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDOMBeforeUnloadEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDOMBeforeUnloadEvent_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDOMBeforeUnloadEvent methods ***/
#define IDOMBeforeUnloadEvent_put_returnValue(This,v) (This)->lpVtbl->put_returnValue(This,v)
#define IDOMBeforeUnloadEvent_get_returnValue(This,p) (This)->lpVtbl->get_returnValue(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMBeforeUnloadEvent_QueryInterface(IDOMBeforeUnloadEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMBeforeUnloadEvent_AddRef(IDOMBeforeUnloadEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMBeforeUnloadEvent_Release(IDOMBeforeUnloadEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDOMBeforeUnloadEvent_GetTypeInfoCount(IDOMBeforeUnloadEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDOMBeforeUnloadEvent_GetTypeInfo(IDOMBeforeUnloadEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDOMBeforeUnloadEvent_GetIDsOfNames(IDOMBeforeUnloadEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDOMBeforeUnloadEvent_Invoke(IDOMBeforeUnloadEvent* 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);
}
/*** IDOMBeforeUnloadEvent methods ***/
static FORCEINLINE HRESULT IDOMBeforeUnloadEvent_put_returnValue(IDOMBeforeUnloadEvent* This,VARIANT v) {
    return This->lpVtbl->put_returnValue(This,v);
}
static FORCEINLINE HRESULT IDOMBeforeUnloadEvent_get_returnValue(IDOMBeforeUnloadEvent* This,VARIANT *p) {
    return This->lpVtbl->get_returnValue(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMBeforeUnloadEvent_put_returnValue_Proxy(
    IDOMBeforeUnloadEvent* This,
    VARIANT v);
void __RPC_STUB IDOMBeforeUnloadEvent_put_returnValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMBeforeUnloadEvent_get_returnValue_Proxy(
    IDOMBeforeUnloadEvent* This,
    VARIANT *p);
void __RPC_STUB IDOMBeforeUnloadEvent_get_returnValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMBeforeUnloadEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispDOMBeforeUnloadEvent dispinterface
 */
#ifndef __DispDOMBeforeUnloadEvent_DISPINTERFACE_DEFINED__
#define __DispDOMBeforeUnloadEvent_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispDOMBeforeUnloadEvent, 0x305900a8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305900a8-98b5-11cf-bb82-00aa00bdce0b")
DispDOMBeforeUnloadEvent : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispDOMBeforeUnloadEvent, 0x305900a8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispDOMBeforeUnloadEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispDOMBeforeUnloadEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispDOMBeforeUnloadEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispDOMBeforeUnloadEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispDOMBeforeUnloadEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispDOMBeforeUnloadEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispDOMBeforeUnloadEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispDOMBeforeUnloadEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispDOMBeforeUnloadEventVtbl;
interface DispDOMBeforeUnloadEvent {
    CONST_VTBL DispDOMBeforeUnloadEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispDOMBeforeUnloadEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispDOMBeforeUnloadEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispDOMBeforeUnloadEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispDOMBeforeUnloadEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispDOMBeforeUnloadEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispDOMBeforeUnloadEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispDOMBeforeUnloadEvent_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 DispDOMBeforeUnloadEvent_QueryInterface(DispDOMBeforeUnloadEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispDOMBeforeUnloadEvent_AddRef(DispDOMBeforeUnloadEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispDOMBeforeUnloadEvent_Release(DispDOMBeforeUnloadEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispDOMBeforeUnloadEvent_GetTypeInfoCount(DispDOMBeforeUnloadEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispDOMBeforeUnloadEvent_GetTypeInfo(DispDOMBeforeUnloadEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispDOMBeforeUnloadEvent_GetIDsOfNames(DispDOMBeforeUnloadEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispDOMBeforeUnloadEvent_Invoke(DispDOMBeforeUnloadEvent* 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  /* __DispDOMBeforeUnloadEvent_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * DOMBeforeUnloadEvent coclass
 */

DEFINE_GUID(CLSID_DOMBeforeUnloadEvent, 0x30510764, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510764-98b5-11cf-bb82-00aa00bdce0b") DOMBeforeUnloadEvent;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMBeforeUnloadEvent, 0x30510764, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDOMBeforeUnloadEvent;
/*****************************************************************************
 * IDOMFocusEvent interface
 */
#ifndef __IDOMFocusEvent_INTERFACE_DEFINED__
#define __IDOMFocusEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMFocusEvent, 0x305106cc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106cc-98b5-11cf-bb82-00aa00bdce0b")
IDOMFocusEvent : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_relatedTarget(
        IEventTarget **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE initFocusEvent(
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        IHTMLWindow2 *view,
        LONG detail,
        IEventTarget *relatedTargetArg) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMFocusEvent, 0x305106cc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMFocusEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMFocusEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMFocusEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMFocusEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDOMFocusEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDOMFocusEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDOMFocusEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDOMFocusEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDOMFocusEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *get_relatedTarget)(
        IDOMFocusEvent* This,
        IEventTarget **p);

    HRESULT (STDMETHODCALLTYPE *initFocusEvent)(
        IDOMFocusEvent* This,
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        IHTMLWindow2 *view,
        LONG detail,
        IEventTarget *relatedTargetArg);

    END_INTERFACE
} IDOMFocusEventVtbl;
interface IDOMFocusEvent {
    CONST_VTBL IDOMFocusEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMFocusEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMFocusEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMFocusEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDOMFocusEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDOMFocusEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDOMFocusEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDOMFocusEvent_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDOMFocusEvent methods ***/
#define IDOMFocusEvent_get_relatedTarget(This,p) (This)->lpVtbl->get_relatedTarget(This,p)
#define IDOMFocusEvent_initFocusEvent(This,eventType,canBubble,cancelable,view,detail,relatedTargetArg) (This)->lpVtbl->initFocusEvent(This,eventType,canBubble,cancelable,view,detail,relatedTargetArg)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMFocusEvent_QueryInterface(IDOMFocusEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMFocusEvent_AddRef(IDOMFocusEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMFocusEvent_Release(IDOMFocusEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDOMFocusEvent_GetTypeInfoCount(IDOMFocusEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDOMFocusEvent_GetTypeInfo(IDOMFocusEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDOMFocusEvent_GetIDsOfNames(IDOMFocusEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDOMFocusEvent_Invoke(IDOMFocusEvent* 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);
}
/*** IDOMFocusEvent methods ***/
static FORCEINLINE HRESULT IDOMFocusEvent_get_relatedTarget(IDOMFocusEvent* This,IEventTarget **p) {
    return This->lpVtbl->get_relatedTarget(This,p);
}
static FORCEINLINE HRESULT IDOMFocusEvent_initFocusEvent(IDOMFocusEvent* This,BSTR eventType,VARIANT_BOOL canBubble,VARIANT_BOOL cancelable,IHTMLWindow2 *view,LONG detail,IEventTarget *relatedTargetArg) {
    return This->lpVtbl->initFocusEvent(This,eventType,canBubble,cancelable,view,detail,relatedTargetArg);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMFocusEvent_get_relatedTarget_Proxy(
    IDOMFocusEvent* This,
    IEventTarget **p);
void __RPC_STUB IDOMFocusEvent_get_relatedTarget_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMFocusEvent_initFocusEvent_Proxy(
    IDOMFocusEvent* This,
    BSTR eventType,
    VARIANT_BOOL canBubble,
    VARIANT_BOOL cancelable,
    IHTMLWindow2 *view,
    LONG detail,
    IEventTarget *relatedTargetArg);
void __RPC_STUB IDOMFocusEvent_initFocusEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMFocusEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispDOMFocusEvent dispinterface
 */
#ifndef __DispDOMFocusEvent_DISPINTERFACE_DEFINED__
#define __DispDOMFocusEvent_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispDOMFocusEvent, 0x30590071, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590071-98b5-11cf-bb82-00aa00bdce0b")
DispDOMFocusEvent : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispDOMFocusEvent, 0x30590071, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispDOMFocusEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispDOMFocusEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispDOMFocusEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispDOMFocusEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispDOMFocusEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispDOMFocusEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispDOMFocusEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispDOMFocusEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispDOMFocusEventVtbl;
interface DispDOMFocusEvent {
    CONST_VTBL DispDOMFocusEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispDOMFocusEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispDOMFocusEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispDOMFocusEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispDOMFocusEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispDOMFocusEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispDOMFocusEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispDOMFocusEvent_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 DispDOMFocusEvent_QueryInterface(DispDOMFocusEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispDOMFocusEvent_AddRef(DispDOMFocusEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispDOMFocusEvent_Release(DispDOMFocusEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispDOMFocusEvent_GetTypeInfoCount(DispDOMFocusEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispDOMFocusEvent_GetTypeInfo(DispDOMFocusEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispDOMFocusEvent_GetIDsOfNames(DispDOMFocusEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispDOMFocusEvent_Invoke(DispDOMFocusEvent* 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  /* __DispDOMFocusEvent_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * DOMFocusEvent coclass
 */

DEFINE_GUID(CLSID_DOMFocusEvent, 0x305106cd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305106cd-98b5-11cf-bb82-00aa00bdce0b") DOMFocusEvent;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMFocusEvent, 0x305106cd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDOMFocusEvent;
/*****************************************************************************
 * IDOMCustomEvent interface
 */
#ifndef __IDOMCustomEvent_INTERFACE_DEFINED__
#define __IDOMCustomEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMCustomEvent, 0x305106de, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106de-98b5-11cf-bb82-00aa00bdce0b")
IDOMCustomEvent : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_detail(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE initCustomEvent(
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        VARIANT *detail) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMCustomEvent, 0x305106de, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMCustomEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMCustomEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMCustomEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMCustomEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDOMCustomEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDOMCustomEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDOMCustomEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDOMCustomEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDOMCustomEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *get_detail)(
        IDOMCustomEvent* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *initCustomEvent)(
        IDOMCustomEvent* This,
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        VARIANT *detail);

    END_INTERFACE
} IDOMCustomEventVtbl;
interface IDOMCustomEvent {
    CONST_VTBL IDOMCustomEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMCustomEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMCustomEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMCustomEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDOMCustomEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDOMCustomEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDOMCustomEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDOMCustomEvent_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDOMCustomEvent methods ***/
#define IDOMCustomEvent_get_detail(This,p) (This)->lpVtbl->get_detail(This,p)
#define IDOMCustomEvent_initCustomEvent(This,eventType,canBubble,cancelable,detail) (This)->lpVtbl->initCustomEvent(This,eventType,canBubble,cancelable,detail)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMCustomEvent_QueryInterface(IDOMCustomEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMCustomEvent_AddRef(IDOMCustomEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMCustomEvent_Release(IDOMCustomEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDOMCustomEvent_GetTypeInfoCount(IDOMCustomEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDOMCustomEvent_GetTypeInfo(IDOMCustomEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDOMCustomEvent_GetIDsOfNames(IDOMCustomEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDOMCustomEvent_Invoke(IDOMCustomEvent* 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);
}
/*** IDOMCustomEvent methods ***/
static FORCEINLINE HRESULT IDOMCustomEvent_get_detail(IDOMCustomEvent* This,VARIANT *p) {
    return This->lpVtbl->get_detail(This,p);
}
static FORCEINLINE HRESULT IDOMCustomEvent_initCustomEvent(IDOMCustomEvent* This,BSTR eventType,VARIANT_BOOL canBubble,VARIANT_BOOL cancelable,VARIANT *detail) {
    return This->lpVtbl->initCustomEvent(This,eventType,canBubble,cancelable,detail);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMCustomEvent_get_detail_Proxy(
    IDOMCustomEvent* This,
    VARIANT *p);
void __RPC_STUB IDOMCustomEvent_get_detail_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMCustomEvent_initCustomEvent_Proxy(
    IDOMCustomEvent* This,
    BSTR eventType,
    VARIANT_BOOL canBubble,
    VARIANT_BOOL cancelable,
    VARIANT *detail);
void __RPC_STUB IDOMCustomEvent_initCustomEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMCustomEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispDOMCustomEvent dispinterface
 */
#ifndef __DispDOMCustomEvent_DISPINTERFACE_DEFINED__
#define __DispDOMCustomEvent_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispDOMCustomEvent, 0x3059007c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059007c-98b5-11cf-bb82-00aa00bdce0b")
DispDOMCustomEvent : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispDOMCustomEvent, 0x3059007c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispDOMCustomEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispDOMCustomEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispDOMCustomEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispDOMCustomEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispDOMCustomEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispDOMCustomEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispDOMCustomEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispDOMCustomEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispDOMCustomEventVtbl;
interface DispDOMCustomEvent {
    CONST_VTBL DispDOMCustomEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispDOMCustomEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispDOMCustomEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispDOMCustomEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispDOMCustomEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispDOMCustomEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispDOMCustomEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispDOMCustomEvent_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 DispDOMCustomEvent_QueryInterface(DispDOMCustomEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispDOMCustomEvent_AddRef(DispDOMCustomEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispDOMCustomEvent_Release(DispDOMCustomEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispDOMCustomEvent_GetTypeInfoCount(DispDOMCustomEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispDOMCustomEvent_GetTypeInfo(DispDOMCustomEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispDOMCustomEvent_GetIDsOfNames(DispDOMCustomEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispDOMCustomEvent_Invoke(DispDOMCustomEvent* 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  /* __DispDOMCustomEvent_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * DOMCustomEvent coclass
 */

DEFINE_GUID(CLSID_DOMCustomEvent, 0x305106df, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305106df-98b5-11cf-bb82-00aa00bdce0b") DOMCustomEvent;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMCustomEvent, 0x305106df, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDOMCustomEvent;
/*****************************************************************************
 * ICanvasGradient interface
 */
#ifndef __ICanvasGradient_INTERFACE_DEFINED__
#define __ICanvasGradient_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICanvasGradient, 0x30510714, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510714-98b5-11cf-bb82-00aa00bdce0b")
ICanvasGradient : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE addColorStop(
        float offset,
        BSTR color) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICanvasGradient, 0x30510714, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ICanvasGradientVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICanvasGradient* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICanvasGradient* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICanvasGradient* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ICanvasGradient* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ICanvasGradient* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ICanvasGradient* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ICanvasGradient* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ICanvasGradient methods ***/
    HRESULT (STDMETHODCALLTYPE *addColorStop)(
        ICanvasGradient* This,
        float offset,
        BSTR color);

    END_INTERFACE
} ICanvasGradientVtbl;
interface ICanvasGradient {
    CONST_VTBL ICanvasGradientVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICanvasGradient_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICanvasGradient_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICanvasGradient_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ICanvasGradient_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ICanvasGradient_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ICanvasGradient_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ICanvasGradient_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ICanvasGradient methods ***/
#define ICanvasGradient_addColorStop(This,offset,color) (This)->lpVtbl->addColorStop(This,offset,color)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ICanvasGradient_QueryInterface(ICanvasGradient* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ICanvasGradient_AddRef(ICanvasGradient* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ICanvasGradient_Release(ICanvasGradient* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ICanvasGradient_GetTypeInfoCount(ICanvasGradient* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ICanvasGradient_GetTypeInfo(ICanvasGradient* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ICanvasGradient_GetIDsOfNames(ICanvasGradient* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ICanvasGradient_Invoke(ICanvasGradient* 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);
}
/*** ICanvasGradient methods ***/
static FORCEINLINE HRESULT ICanvasGradient_addColorStop(ICanvasGradient* This,float offset,BSTR color) {
    return This->lpVtbl->addColorStop(This,offset,color);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ICanvasGradient_addColorStop_Proxy(
    ICanvasGradient* This,
    float offset,
    BSTR color);
void __RPC_STUB ICanvasGradient_addColorStop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ICanvasGradient_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ICanvasPattern interface
 */
#ifndef __ICanvasPattern_INTERFACE_DEFINED__
#define __ICanvasPattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICanvasPattern, 0x30510716, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510716-98b5-11cf-bb82-00aa00bdce0b")
ICanvasPattern : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICanvasPattern, 0x30510716, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ICanvasPatternVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICanvasPattern* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICanvasPattern* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICanvasPattern* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ICanvasPattern* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ICanvasPattern* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ICanvasPattern* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ICanvasPattern* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} ICanvasPatternVtbl;
interface ICanvasPattern {
    CONST_VTBL ICanvasPatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICanvasPattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICanvasPattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICanvasPattern_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ICanvasPattern_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ICanvasPattern_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ICanvasPattern_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ICanvasPattern_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 ICanvasPattern_QueryInterface(ICanvasPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ICanvasPattern_AddRef(ICanvasPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ICanvasPattern_Release(ICanvasPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ICanvasPattern_GetTypeInfoCount(ICanvasPattern* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ICanvasPattern_GetTypeInfo(ICanvasPattern* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ICanvasPattern_GetIDsOfNames(ICanvasPattern* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ICanvasPattern_Invoke(ICanvasPattern* 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  /* __ICanvasPattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ICanvasTextMetrics interface
 */
#ifndef __ICanvasTextMetrics_INTERFACE_DEFINED__
#define __ICanvasTextMetrics_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICanvasTextMetrics, 0x30510718, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510718-98b5-11cf-bb82-00aa00bdce0b")
ICanvasTextMetrics : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_width(
        float *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICanvasTextMetrics, 0x30510718, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ICanvasTextMetricsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICanvasTextMetrics* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICanvasTextMetrics* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICanvasTextMetrics* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ICanvasTextMetrics* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ICanvasTextMetrics* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ICanvasTextMetrics* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ICanvasTextMetrics* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ICanvasTextMetrics methods ***/
    HRESULT (STDMETHODCALLTYPE *get_width)(
        ICanvasTextMetrics* This,
        float *p);

    END_INTERFACE
} ICanvasTextMetricsVtbl;
interface ICanvasTextMetrics {
    CONST_VTBL ICanvasTextMetricsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICanvasTextMetrics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICanvasTextMetrics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICanvasTextMetrics_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ICanvasTextMetrics_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ICanvasTextMetrics_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ICanvasTextMetrics_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ICanvasTextMetrics_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ICanvasTextMetrics methods ***/
#define ICanvasTextMetrics_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ICanvasTextMetrics_QueryInterface(ICanvasTextMetrics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ICanvasTextMetrics_AddRef(ICanvasTextMetrics* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ICanvasTextMetrics_Release(ICanvasTextMetrics* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ICanvasTextMetrics_GetTypeInfoCount(ICanvasTextMetrics* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ICanvasTextMetrics_GetTypeInfo(ICanvasTextMetrics* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ICanvasTextMetrics_GetIDsOfNames(ICanvasTextMetrics* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ICanvasTextMetrics_Invoke(ICanvasTextMetrics* 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);
}
/*** ICanvasTextMetrics methods ***/
static FORCEINLINE HRESULT ICanvasTextMetrics_get_width(ICanvasTextMetrics* This,float *p) {
    return This->lpVtbl->get_width(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ICanvasTextMetrics_get_width_Proxy(
    ICanvasTextMetrics* This,
    float *p);
void __RPC_STUB ICanvasTextMetrics_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ICanvasTextMetrics_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ICanvasImageData interface
 */
#ifndef __ICanvasImageData_INTERFACE_DEFINED__
#define __ICanvasImageData_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICanvasImageData, 0x3051071a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051071a-98b5-11cf-bb82-00aa00bdce0b")
ICanvasImageData : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_width(
        ULONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_height(
        ULONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_data(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICanvasImageData, 0x3051071a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ICanvasImageDataVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICanvasImageData* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICanvasImageData* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICanvasImageData* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ICanvasImageData* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ICanvasImageData* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ICanvasImageData* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ICanvasImageData* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ICanvasImageData methods ***/
    HRESULT (STDMETHODCALLTYPE *get_width)(
        ICanvasImageData* This,
        ULONG *p);

    HRESULT (STDMETHODCALLTYPE *get_height)(
        ICanvasImageData* This,
        ULONG *p);

    HRESULT (STDMETHODCALLTYPE *get_data)(
        ICanvasImageData* This,
        VARIANT *p);

    END_INTERFACE
} ICanvasImageDataVtbl;
interface ICanvasImageData {
    CONST_VTBL ICanvasImageDataVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICanvasImageData_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICanvasImageData_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICanvasImageData_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ICanvasImageData_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ICanvasImageData_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ICanvasImageData_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ICanvasImageData_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ICanvasImageData methods ***/
#define ICanvasImageData_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#define ICanvasImageData_get_height(This,p) (This)->lpVtbl->get_height(This,p)
#define ICanvasImageData_get_data(This,p) (This)->lpVtbl->get_data(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ICanvasImageData_QueryInterface(ICanvasImageData* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ICanvasImageData_AddRef(ICanvasImageData* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ICanvasImageData_Release(ICanvasImageData* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ICanvasImageData_GetTypeInfoCount(ICanvasImageData* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ICanvasImageData_GetTypeInfo(ICanvasImageData* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ICanvasImageData_GetIDsOfNames(ICanvasImageData* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ICanvasImageData_Invoke(ICanvasImageData* 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);
}
/*** ICanvasImageData methods ***/
static FORCEINLINE HRESULT ICanvasImageData_get_width(ICanvasImageData* This,ULONG *p) {
    return This->lpVtbl->get_width(This,p);
}
static FORCEINLINE HRESULT ICanvasImageData_get_height(ICanvasImageData* This,ULONG *p) {
    return This->lpVtbl->get_height(This,p);
}
static FORCEINLINE HRESULT ICanvasImageData_get_data(ICanvasImageData* This,VARIANT *p) {
    return This->lpVtbl->get_data(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ICanvasImageData_get_width_Proxy(
    ICanvasImageData* This,
    ULONG *p);
void __RPC_STUB ICanvasImageData_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasImageData_get_height_Proxy(
    ICanvasImageData* This,
    ULONG *p);
void __RPC_STUB ICanvasImageData_get_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasImageData_get_data_Proxy(
    ICanvasImageData* This,
    VARIANT *p);
void __RPC_STUB ICanvasImageData_get_data_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ICanvasImageData_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ICanvasPixelArray interface
 */
#ifndef __ICanvasPixelArray_INTERFACE_DEFINED__
#define __ICanvasPixelArray_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICanvasPixelArray, 0x3051071c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051071c-98b5-11cf-bb82-00aa00bdce0b")
ICanvasPixelArray : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_length(
        ULONG *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICanvasPixelArray, 0x3051071c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ICanvasPixelArrayVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICanvasPixelArray* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICanvasPixelArray* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICanvasPixelArray* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ICanvasPixelArray* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ICanvasPixelArray* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ICanvasPixelArray* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ICanvasPixelArray* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ICanvasPixelArray methods ***/
    HRESULT (STDMETHODCALLTYPE *get_length)(
        ICanvasPixelArray* This,
        ULONG *p);

    END_INTERFACE
} ICanvasPixelArrayVtbl;
interface ICanvasPixelArray {
    CONST_VTBL ICanvasPixelArrayVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICanvasPixelArray_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICanvasPixelArray_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICanvasPixelArray_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ICanvasPixelArray_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ICanvasPixelArray_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ICanvasPixelArray_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ICanvasPixelArray_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ICanvasPixelArray methods ***/
#define ICanvasPixelArray_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ICanvasPixelArray_QueryInterface(ICanvasPixelArray* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ICanvasPixelArray_AddRef(ICanvasPixelArray* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ICanvasPixelArray_Release(ICanvasPixelArray* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ICanvasPixelArray_GetTypeInfoCount(ICanvasPixelArray* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ICanvasPixelArray_GetTypeInfo(ICanvasPixelArray* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ICanvasPixelArray_GetIDsOfNames(ICanvasPixelArray* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ICanvasPixelArray_Invoke(ICanvasPixelArray* 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);
}
/*** ICanvasPixelArray methods ***/
static FORCEINLINE HRESULT ICanvasPixelArray_get_length(ICanvasPixelArray* This,ULONG *p) {
    return This->lpVtbl->get_length(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ICanvasPixelArray_get_length_Proxy(
    ICanvasPixelArray* This,
    ULONG *p);
void __RPC_STUB ICanvasPixelArray_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ICanvasPixelArray_INTERFACE_DEFINED__ */

#ifndef __IHTMLCanvasElement_FWD_DEFINED__
#define __IHTMLCanvasElement_FWD_DEFINED__
typedef interface IHTMLCanvasElement IHTMLCanvasElement;
#endif

/*****************************************************************************
 * ICanvasRenderingContext2D interface
 */
#ifndef __ICanvasRenderingContext2D_INTERFACE_DEFINED__
#define __ICanvasRenderingContext2D_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICanvasRenderingContext2D, 0x305106ff, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106ff-98b5-11cf-bb82-00aa00bdce0b")
ICanvasRenderingContext2D : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_canvas(
        IHTMLCanvasElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE restore(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE save(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE rotate(
        float angle) = 0;

    virtual HRESULT STDMETHODCALLTYPE scale(
        float x,
        float y) = 0;

    virtual HRESULT STDMETHODCALLTYPE setTransform(
        float m11,
        float m12,
        float m21,
        float m22,
        float dx,
        float dy) = 0;

    virtual HRESULT STDMETHODCALLTYPE transform(
        float m11,
        float m12,
        float m21,
        float m22,
        float dx,
        float dy) = 0;

    virtual HRESULT STDMETHODCALLTYPE translate(
        float x,
        float y) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_globalAlpha(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_globalAlpha(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_globalCompositeOperation(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_globalCompositeOperation(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_fillStyle(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fillStyle(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_strokeStyle(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_strokeStyle(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE createLinearGradient(
        float x0,
        float y0,
        float x1,
        float y1,
        ICanvasGradient **ppCanvasGradient) = 0;

    virtual HRESULT STDMETHODCALLTYPE createRadialGradient(
        float x0,
        float y0,
        float r0,
        float x1,
        float y1,
        float r1,
        ICanvasGradient **ppCanvasGradient) = 0;

    virtual HRESULT STDMETHODCALLTYPE createPattern(
        IDispatch *image,
        VARIANT repetition,
        ICanvasPattern **ppCanvasPattern) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_lineCap(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_lineCap(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_lineJoin(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_lineJoin(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_lineWidth(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_lineWidth(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_miterLimit(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_miterLimit(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_shadowBlur(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_shadowBlur(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_shadowColor(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_shadowColor(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_shadowOffsetX(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_shadowOffsetX(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_shadowOffsetY(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_shadowOffsetY(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE clearRect(
        float x,
        float y,
        float w,
        float h) = 0;

    virtual HRESULT STDMETHODCALLTYPE fillRect(
        float x,
        float y,
        float w,
        float h) = 0;

    virtual HRESULT STDMETHODCALLTYPE strokeRect(
        float x,
        float y,
        float w,
        float h) = 0;

    virtual HRESULT STDMETHODCALLTYPE arc(
        float x,
        float y,
        float radius,
        float startAngle,
        float endAngle,
        WINBOOL anticlockwise) = 0;

    virtual HRESULT STDMETHODCALLTYPE arcTo(
        float x1,
        float y1,
        float x2,
        float y2,
        float radius) = 0;

    virtual HRESULT STDMETHODCALLTYPE beginPath(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE bezierCurveTo(
        float cp1x,
        float cp1y,
        float cp2x,
        float cp2y,
        float x,
        float y) = 0;

    virtual HRESULT STDMETHODCALLTYPE clip(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE closePath(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE fill(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE lineTo(
        float x,
        float y) = 0;

    virtual HRESULT STDMETHODCALLTYPE moveTo(
        float x,
        float y) = 0;

    virtual HRESULT STDMETHODCALLTYPE quadraticCurveTo(
        float cpx,
        float cpy,
        float x,
        float y) = 0;

    virtual HRESULT STDMETHODCALLTYPE rect(
        float x,
        float y,
        float w,
        float h) = 0;

    virtual HRESULT STDMETHODCALLTYPE stroke(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE isPointInPath(
        float x,
        float y,
        VARIANT_BOOL *pResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_font(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_font(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textAlign(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textAlign(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_textBaseline(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textBaseline(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE fillText(
        BSTR text,
        float x,
        float y,
        VARIANT maxWidth) = 0;

    virtual HRESULT STDMETHODCALLTYPE measureText(
        BSTR text,
        ICanvasTextMetrics **ppCanvasTextMetrics) = 0;

    virtual HRESULT STDMETHODCALLTYPE strokeText(
        BSTR text,
        float x,
        float y,
        VARIANT maxWidth) = 0;

    virtual HRESULT STDMETHODCALLTYPE drawImage(
        IDispatch *pSrc,
        VARIANT a1,
        VARIANT a2,
        VARIANT a3,
        VARIANT a4,
        VARIANT a5,
        VARIANT a6,
        VARIANT a7,
        VARIANT a8) = 0;

    virtual HRESULT STDMETHODCALLTYPE createImageData(
        VARIANT a1,
        VARIANT a2,
        ICanvasImageData **ppCanvasImageData) = 0;

    virtual HRESULT STDMETHODCALLTYPE getImageData(
        float sx,
        float sy,
        float sw,
        float sh,
        ICanvasImageData **ppCanvasImageData) = 0;

    virtual HRESULT STDMETHODCALLTYPE putImageData(
        ICanvasImageData *imagedata,
        float dx,
        float dy,
        VARIANT dirtyX,
        VARIANT dirtyY,
        VARIANT dirtyWidth,
        VARIANT dirtyHeight) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICanvasRenderingContext2D, 0x305106ff, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ICanvasRenderingContext2DVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICanvasRenderingContext2D* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICanvasRenderingContext2D* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICanvasRenderingContext2D* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ICanvasRenderingContext2D* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ICanvasRenderingContext2D* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ICanvasRenderingContext2D* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ICanvasRenderingContext2D* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ICanvasRenderingContext2D methods ***/
    HRESULT (STDMETHODCALLTYPE *get_canvas)(
        ICanvasRenderingContext2D* This,
        IHTMLCanvasElement **p);

    HRESULT (STDMETHODCALLTYPE *restore)(
        ICanvasRenderingContext2D* This);

    HRESULT (STDMETHODCALLTYPE *save)(
        ICanvasRenderingContext2D* This);

    HRESULT (STDMETHODCALLTYPE *rotate)(
        ICanvasRenderingContext2D* This,
        float angle);

    HRESULT (STDMETHODCALLTYPE *scale)(
        ICanvasRenderingContext2D* This,
        float x,
        float y);

    HRESULT (STDMETHODCALLTYPE *setTransform)(
        ICanvasRenderingContext2D* This,
        float m11,
        float m12,
        float m21,
        float m22,
        float dx,
        float dy);

    HRESULT (STDMETHODCALLTYPE *transform)(
        ICanvasRenderingContext2D* This,
        float m11,
        float m12,
        float m21,
        float m22,
        float dx,
        float dy);

    HRESULT (STDMETHODCALLTYPE *translate)(
        ICanvasRenderingContext2D* This,
        float x,
        float y);

    HRESULT (STDMETHODCALLTYPE *put_globalAlpha)(
        ICanvasRenderingContext2D* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_globalAlpha)(
        ICanvasRenderingContext2D* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_globalCompositeOperation)(
        ICanvasRenderingContext2D* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_globalCompositeOperation)(
        ICanvasRenderingContext2D* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_fillStyle)(
        ICanvasRenderingContext2D* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_fillStyle)(
        ICanvasRenderingContext2D* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_strokeStyle)(
        ICanvasRenderingContext2D* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_strokeStyle)(
        ICanvasRenderingContext2D* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *createLinearGradient)(
        ICanvasRenderingContext2D* This,
        float x0,
        float y0,
        float x1,
        float y1,
        ICanvasGradient **ppCanvasGradient);

    HRESULT (STDMETHODCALLTYPE *createRadialGradient)(
        ICanvasRenderingContext2D* This,
        float x0,
        float y0,
        float r0,
        float x1,
        float y1,
        float r1,
        ICanvasGradient **ppCanvasGradient);

    HRESULT (STDMETHODCALLTYPE *createPattern)(
        ICanvasRenderingContext2D* This,
        IDispatch *image,
        VARIANT repetition,
        ICanvasPattern **ppCanvasPattern);

    HRESULT (STDMETHODCALLTYPE *put_lineCap)(
        ICanvasRenderingContext2D* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_lineCap)(
        ICanvasRenderingContext2D* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_lineJoin)(
        ICanvasRenderingContext2D* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_lineJoin)(
        ICanvasRenderingContext2D* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_lineWidth)(
        ICanvasRenderingContext2D* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_lineWidth)(
        ICanvasRenderingContext2D* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_miterLimit)(
        ICanvasRenderingContext2D* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_miterLimit)(
        ICanvasRenderingContext2D* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_shadowBlur)(
        ICanvasRenderingContext2D* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_shadowBlur)(
        ICanvasRenderingContext2D* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_shadowColor)(
        ICanvasRenderingContext2D* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_shadowColor)(
        ICanvasRenderingContext2D* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_shadowOffsetX)(
        ICanvasRenderingContext2D* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_shadowOffsetX)(
        ICanvasRenderingContext2D* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_shadowOffsetY)(
        ICanvasRenderingContext2D* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_shadowOffsetY)(
        ICanvasRenderingContext2D* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *clearRect)(
        ICanvasRenderingContext2D* This,
        float x,
        float y,
        float w,
        float h);

    HRESULT (STDMETHODCALLTYPE *fillRect)(
        ICanvasRenderingContext2D* This,
        float x,
        float y,
        float w,
        float h);

    HRESULT (STDMETHODCALLTYPE *strokeRect)(
        ICanvasRenderingContext2D* This,
        float x,
        float y,
        float w,
        float h);

    HRESULT (STDMETHODCALLTYPE *arc)(
        ICanvasRenderingContext2D* This,
        float x,
        float y,
        float radius,
        float startAngle,
        float endAngle,
        WINBOOL anticlockwise);

    HRESULT (STDMETHODCALLTYPE *arcTo)(
        ICanvasRenderingContext2D* This,
        float x1,
        float y1,
        float x2,
        float y2,
        float radius);

    HRESULT (STDMETHODCALLTYPE *beginPath)(
        ICanvasRenderingContext2D* This);

    HRESULT (STDMETHODCALLTYPE *bezierCurveTo)(
        ICanvasRenderingContext2D* This,
        float cp1x,
        float cp1y,
        float cp2x,
        float cp2y,
        float x,
        float y);

    HRESULT (STDMETHODCALLTYPE *clip)(
        ICanvasRenderingContext2D* This);

    HRESULT (STDMETHODCALLTYPE *closePath)(
        ICanvasRenderingContext2D* This);

    HRESULT (STDMETHODCALLTYPE *fill)(
        ICanvasRenderingContext2D* This);

    HRESULT (STDMETHODCALLTYPE *lineTo)(
        ICanvasRenderingContext2D* This,
        float x,
        float y);

    HRESULT (STDMETHODCALLTYPE *moveTo)(
        ICanvasRenderingContext2D* This,
        float x,
        float y);

    HRESULT (STDMETHODCALLTYPE *quadraticCurveTo)(
        ICanvasRenderingContext2D* This,
        float cpx,
        float cpy,
        float x,
        float y);

    HRESULT (STDMETHODCALLTYPE *rect)(
        ICanvasRenderingContext2D* This,
        float x,
        float y,
        float w,
        float h);

    HRESULT (STDMETHODCALLTYPE *stroke)(
        ICanvasRenderingContext2D* This);

    HRESULT (STDMETHODCALLTYPE *isPointInPath)(
        ICanvasRenderingContext2D* This,
        float x,
        float y,
        VARIANT_BOOL *pResult);

    HRESULT (STDMETHODCALLTYPE *put_font)(
        ICanvasRenderingContext2D* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_font)(
        ICanvasRenderingContext2D* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textAlign)(
        ICanvasRenderingContext2D* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textAlign)(
        ICanvasRenderingContext2D* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_textBaseline)(
        ICanvasRenderingContext2D* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_textBaseline)(
        ICanvasRenderingContext2D* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *fillText)(
        ICanvasRenderingContext2D* This,
        BSTR text,
        float x,
        float y,
        VARIANT maxWidth);

    HRESULT (STDMETHODCALLTYPE *measureText)(
        ICanvasRenderingContext2D* This,
        BSTR text,
        ICanvasTextMetrics **ppCanvasTextMetrics);

    HRESULT (STDMETHODCALLTYPE *strokeText)(
        ICanvasRenderingContext2D* This,
        BSTR text,
        float x,
        float y,
        VARIANT maxWidth);

    HRESULT (STDMETHODCALLTYPE *drawImage)(
        ICanvasRenderingContext2D* This,
        IDispatch *pSrc,
        VARIANT a1,
        VARIANT a2,
        VARIANT a3,
        VARIANT a4,
        VARIANT a5,
        VARIANT a6,
        VARIANT a7,
        VARIANT a8);

    HRESULT (STDMETHODCALLTYPE *createImageData)(
        ICanvasRenderingContext2D* This,
        VARIANT a1,
        VARIANT a2,
        ICanvasImageData **ppCanvasImageData);

    HRESULT (STDMETHODCALLTYPE *getImageData)(
        ICanvasRenderingContext2D* This,
        float sx,
        float sy,
        float sw,
        float sh,
        ICanvasImageData **ppCanvasImageData);

    HRESULT (STDMETHODCALLTYPE *putImageData)(
        ICanvasRenderingContext2D* This,
        ICanvasImageData *imagedata,
        float dx,
        float dy,
        VARIANT dirtyX,
        VARIANT dirtyY,
        VARIANT dirtyWidth,
        VARIANT dirtyHeight);

    END_INTERFACE
} ICanvasRenderingContext2DVtbl;
interface ICanvasRenderingContext2D {
    CONST_VTBL ICanvasRenderingContext2DVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICanvasRenderingContext2D_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICanvasRenderingContext2D_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICanvasRenderingContext2D_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ICanvasRenderingContext2D_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ICanvasRenderingContext2D_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ICanvasRenderingContext2D_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ICanvasRenderingContext2D_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ICanvasRenderingContext2D methods ***/
#define ICanvasRenderingContext2D_get_canvas(This,p) (This)->lpVtbl->get_canvas(This,p)
#define ICanvasRenderingContext2D_restore(This) (This)->lpVtbl->restore(This)
#define ICanvasRenderingContext2D_save(This) (This)->lpVtbl->save(This)
#define ICanvasRenderingContext2D_rotate(This,angle) (This)->lpVtbl->rotate(This,angle)
#define ICanvasRenderingContext2D_scale(This,x,y) (This)->lpVtbl->scale(This,x,y)
#define ICanvasRenderingContext2D_setTransform(This,m11,m12,m21,m22,dx,dy) (This)->lpVtbl->setTransform(This,m11,m12,m21,m22,dx,dy)
#define ICanvasRenderingContext2D_transform(This,m11,m12,m21,m22,dx,dy) (This)->lpVtbl->transform(This,m11,m12,m21,m22,dx,dy)
#define ICanvasRenderingContext2D_translate(This,x,y) (This)->lpVtbl->translate(This,x,y)
#define ICanvasRenderingContext2D_put_globalAlpha(This,v) (This)->lpVtbl->put_globalAlpha(This,v)
#define ICanvasRenderingContext2D_get_globalAlpha(This,p) (This)->lpVtbl->get_globalAlpha(This,p)
#define ICanvasRenderingContext2D_put_globalCompositeOperation(This,v) (This)->lpVtbl->put_globalCompositeOperation(This,v)
#define ICanvasRenderingContext2D_get_globalCompositeOperation(This,p) (This)->lpVtbl->get_globalCompositeOperation(This,p)
#define ICanvasRenderingContext2D_put_fillStyle(This,v) (This)->lpVtbl->put_fillStyle(This,v)
#define ICanvasRenderingContext2D_get_fillStyle(This,p) (This)->lpVtbl->get_fillStyle(This,p)
#define ICanvasRenderingContext2D_put_strokeStyle(This,v) (This)->lpVtbl->put_strokeStyle(This,v)
#define ICanvasRenderingContext2D_get_strokeStyle(This,p) (This)->lpVtbl->get_strokeStyle(This,p)
#define ICanvasRenderingContext2D_createLinearGradient(This,x0,y0,x1,y1,ppCanvasGradient) (This)->lpVtbl->createLinearGradient(This,x0,y0,x1,y1,ppCanvasGradient)
#define ICanvasRenderingContext2D_createRadialGradient(This,x0,y0,r0,x1,y1,r1,ppCanvasGradient) (This)->lpVtbl->createRadialGradient(This,x0,y0,r0,x1,y1,r1,ppCanvasGradient)
#define ICanvasRenderingContext2D_createPattern(This,image,repetition,ppCanvasPattern) (This)->lpVtbl->createPattern(This,image,repetition,ppCanvasPattern)
#define ICanvasRenderingContext2D_put_lineCap(This,v) (This)->lpVtbl->put_lineCap(This,v)
#define ICanvasRenderingContext2D_get_lineCap(This,p) (This)->lpVtbl->get_lineCap(This,p)
#define ICanvasRenderingContext2D_put_lineJoin(This,v) (This)->lpVtbl->put_lineJoin(This,v)
#define ICanvasRenderingContext2D_get_lineJoin(This,p) (This)->lpVtbl->get_lineJoin(This,p)
#define ICanvasRenderingContext2D_put_lineWidth(This,v) (This)->lpVtbl->put_lineWidth(This,v)
#define ICanvasRenderingContext2D_get_lineWidth(This,p) (This)->lpVtbl->get_lineWidth(This,p)
#define ICanvasRenderingContext2D_put_miterLimit(This,v) (This)->lpVtbl->put_miterLimit(This,v)
#define ICanvasRenderingContext2D_get_miterLimit(This,p) (This)->lpVtbl->get_miterLimit(This,p)
#define ICanvasRenderingContext2D_put_shadowBlur(This,v) (This)->lpVtbl->put_shadowBlur(This,v)
#define ICanvasRenderingContext2D_get_shadowBlur(This,p) (This)->lpVtbl->get_shadowBlur(This,p)
#define ICanvasRenderingContext2D_put_shadowColor(This,v) (This)->lpVtbl->put_shadowColor(This,v)
#define ICanvasRenderingContext2D_get_shadowColor(This,p) (This)->lpVtbl->get_shadowColor(This,p)
#define ICanvasRenderingContext2D_put_shadowOffsetX(This,v) (This)->lpVtbl->put_shadowOffsetX(This,v)
#define ICanvasRenderingContext2D_get_shadowOffsetX(This,p) (This)->lpVtbl->get_shadowOffsetX(This,p)
#define ICanvasRenderingContext2D_put_shadowOffsetY(This,v) (This)->lpVtbl->put_shadowOffsetY(This,v)
#define ICanvasRenderingContext2D_get_shadowOffsetY(This,p) (This)->lpVtbl->get_shadowOffsetY(This,p)
#define ICanvasRenderingContext2D_clearRect(This,x,y,w,h) (This)->lpVtbl->clearRect(This,x,y,w,h)
#define ICanvasRenderingContext2D_fillRect(This,x,y,w,h) (This)->lpVtbl->fillRect(This,x,y,w,h)
#define ICanvasRenderingContext2D_strokeRect(This,x,y,w,h) (This)->lpVtbl->strokeRect(This,x,y,w,h)
#define ICanvasRenderingContext2D_arc(This,x,y,radius,startAngle,endAngle,anticlockwise) (This)->lpVtbl->arc(This,x,y,radius,startAngle,endAngle,anticlockwise)
#define ICanvasRenderingContext2D_arcTo(This,x1,y1,x2,y2,radius) (This)->lpVtbl->arcTo(This,x1,y1,x2,y2,radius)
#define ICanvasRenderingContext2D_beginPath(This) (This)->lpVtbl->beginPath(This)
#define ICanvasRenderingContext2D_bezierCurveTo(This,cp1x,cp1y,cp2x,cp2y,x,y) (This)->lpVtbl->bezierCurveTo(This,cp1x,cp1y,cp2x,cp2y,x,y)
#define ICanvasRenderingContext2D_clip(This) (This)->lpVtbl->clip(This)
#define ICanvasRenderingContext2D_closePath(This) (This)->lpVtbl->closePath(This)
#define ICanvasRenderingContext2D_fill(This) (This)->lpVtbl->fill(This)
#define ICanvasRenderingContext2D_lineTo(This,x,y) (This)->lpVtbl->lineTo(This,x,y)
#define ICanvasRenderingContext2D_moveTo(This,x,y) (This)->lpVtbl->moveTo(This,x,y)
#define ICanvasRenderingContext2D_quadraticCurveTo(This,cpx,cpy,x,y) (This)->lpVtbl->quadraticCurveTo(This,cpx,cpy,x,y)
#define ICanvasRenderingContext2D_rect(This,x,y,w,h) (This)->lpVtbl->rect(This,x,y,w,h)
#define ICanvasRenderingContext2D_stroke(This) (This)->lpVtbl->stroke(This)
#define ICanvasRenderingContext2D_isPointInPath(This,x,y,pResult) (This)->lpVtbl->isPointInPath(This,x,y,pResult)
#define ICanvasRenderingContext2D_put_font(This,v) (This)->lpVtbl->put_font(This,v)
#define ICanvasRenderingContext2D_get_font(This,p) (This)->lpVtbl->get_font(This,p)
#define ICanvasRenderingContext2D_put_textAlign(This,v) (This)->lpVtbl->put_textAlign(This,v)
#define ICanvasRenderingContext2D_get_textAlign(This,p) (This)->lpVtbl->get_textAlign(This,p)
#define ICanvasRenderingContext2D_put_textBaseline(This,v) (This)->lpVtbl->put_textBaseline(This,v)
#define ICanvasRenderingContext2D_get_textBaseline(This,p) (This)->lpVtbl->get_textBaseline(This,p)
#define ICanvasRenderingContext2D_fillText(This,text,x,y,maxWidth) (This)->lpVtbl->fillText(This,text,x,y,maxWidth)
#define ICanvasRenderingContext2D_measureText(This,text,ppCanvasTextMetrics) (This)->lpVtbl->measureText(This,text,ppCanvasTextMetrics)
#define ICanvasRenderingContext2D_strokeText(This,text,x,y,maxWidth) (This)->lpVtbl->strokeText(This,text,x,y,maxWidth)
#define ICanvasRenderingContext2D_drawImage(This,pSrc,a1,a2,a3,a4,a5,a6,a7,a8) (This)->lpVtbl->drawImage(This,pSrc,a1,a2,a3,a4,a5,a6,a7,a8)
#define ICanvasRenderingContext2D_createImageData(This,a1,a2,ppCanvasImageData) (This)->lpVtbl->createImageData(This,a1,a2,ppCanvasImageData)
#define ICanvasRenderingContext2D_getImageData(This,sx,sy,sw,sh,ppCanvasImageData) (This)->lpVtbl->getImageData(This,sx,sy,sw,sh,ppCanvasImageData)
#define ICanvasRenderingContext2D_putImageData(This,imagedata,dx,dy,dirtyX,dirtyY,dirtyWidth,dirtyHeight) (This)->lpVtbl->putImageData(This,imagedata,dx,dy,dirtyX,dirtyY,dirtyWidth,dirtyHeight)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ICanvasRenderingContext2D_QueryInterface(ICanvasRenderingContext2D* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ICanvasRenderingContext2D_AddRef(ICanvasRenderingContext2D* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ICanvasRenderingContext2D_Release(ICanvasRenderingContext2D* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ICanvasRenderingContext2D_GetTypeInfoCount(ICanvasRenderingContext2D* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_GetTypeInfo(ICanvasRenderingContext2D* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_GetIDsOfNames(ICanvasRenderingContext2D* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_Invoke(ICanvasRenderingContext2D* 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);
}
/*** ICanvasRenderingContext2D methods ***/
static FORCEINLINE HRESULT ICanvasRenderingContext2D_get_canvas(ICanvasRenderingContext2D* This,IHTMLCanvasElement **p) {
    return This->lpVtbl->get_canvas(This,p);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_restore(ICanvasRenderingContext2D* This) {
    return This->lpVtbl->restore(This);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_save(ICanvasRenderingContext2D* This) {
    return This->lpVtbl->save(This);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_rotate(ICanvasRenderingContext2D* This,float angle) {
    return This->lpVtbl->rotate(This,angle);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_scale(ICanvasRenderingContext2D* This,float x,float y) {
    return This->lpVtbl->scale(This,x,y);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_setTransform(ICanvasRenderingContext2D* This,float m11,float m12,float m21,float m22,float dx,float dy) {
    return This->lpVtbl->setTransform(This,m11,m12,m21,m22,dx,dy);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_transform(ICanvasRenderingContext2D* This,float m11,float m12,float m21,float m22,float dx,float dy) {
    return This->lpVtbl->transform(This,m11,m12,m21,m22,dx,dy);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_translate(ICanvasRenderingContext2D* This,float x,float y) {
    return This->lpVtbl->translate(This,x,y);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_put_globalAlpha(ICanvasRenderingContext2D* This,float v) {
    return This->lpVtbl->put_globalAlpha(This,v);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_get_globalAlpha(ICanvasRenderingContext2D* This,float *p) {
    return This->lpVtbl->get_globalAlpha(This,p);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_put_globalCompositeOperation(ICanvasRenderingContext2D* This,BSTR v) {
    return This->lpVtbl->put_globalCompositeOperation(This,v);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_get_globalCompositeOperation(ICanvasRenderingContext2D* This,BSTR *p) {
    return This->lpVtbl->get_globalCompositeOperation(This,p);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_put_fillStyle(ICanvasRenderingContext2D* This,VARIANT v) {
    return This->lpVtbl->put_fillStyle(This,v);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_get_fillStyle(ICanvasRenderingContext2D* This,VARIANT *p) {
    return This->lpVtbl->get_fillStyle(This,p);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_put_strokeStyle(ICanvasRenderingContext2D* This,VARIANT v) {
    return This->lpVtbl->put_strokeStyle(This,v);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_get_strokeStyle(ICanvasRenderingContext2D* This,VARIANT *p) {
    return This->lpVtbl->get_strokeStyle(This,p);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_createLinearGradient(ICanvasRenderingContext2D* This,float x0,float y0,float x1,float y1,ICanvasGradient **ppCanvasGradient) {
    return This->lpVtbl->createLinearGradient(This,x0,y0,x1,y1,ppCanvasGradient);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_createRadialGradient(ICanvasRenderingContext2D* This,float x0,float y0,float r0,float x1,float y1,float r1,ICanvasGradient **ppCanvasGradient) {
    return This->lpVtbl->createRadialGradient(This,x0,y0,r0,x1,y1,r1,ppCanvasGradient);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_createPattern(ICanvasRenderingContext2D* This,IDispatch *image,VARIANT repetition,ICanvasPattern **ppCanvasPattern) {
    return This->lpVtbl->createPattern(This,image,repetition,ppCanvasPattern);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_put_lineCap(ICanvasRenderingContext2D* This,BSTR v) {
    return This->lpVtbl->put_lineCap(This,v);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_get_lineCap(ICanvasRenderingContext2D* This,BSTR *p) {
    return This->lpVtbl->get_lineCap(This,p);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_put_lineJoin(ICanvasRenderingContext2D* This,BSTR v) {
    return This->lpVtbl->put_lineJoin(This,v);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_get_lineJoin(ICanvasRenderingContext2D* This,BSTR *p) {
    return This->lpVtbl->get_lineJoin(This,p);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_put_lineWidth(ICanvasRenderingContext2D* This,float v) {
    return This->lpVtbl->put_lineWidth(This,v);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_get_lineWidth(ICanvasRenderingContext2D* This,float *p) {
    return This->lpVtbl->get_lineWidth(This,p);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_put_miterLimit(ICanvasRenderingContext2D* This,float v) {
    return This->lpVtbl->put_miterLimit(This,v);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_get_miterLimit(ICanvasRenderingContext2D* This,float *p) {
    return This->lpVtbl->get_miterLimit(This,p);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_put_shadowBlur(ICanvasRenderingContext2D* This,float v) {
    return This->lpVtbl->put_shadowBlur(This,v);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_get_shadowBlur(ICanvasRenderingContext2D* This,float *p) {
    return This->lpVtbl->get_shadowBlur(This,p);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_put_shadowColor(ICanvasRenderingContext2D* This,BSTR v) {
    return This->lpVtbl->put_shadowColor(This,v);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_get_shadowColor(ICanvasRenderingContext2D* This,BSTR *p) {
    return This->lpVtbl->get_shadowColor(This,p);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_put_shadowOffsetX(ICanvasRenderingContext2D* This,float v) {
    return This->lpVtbl->put_shadowOffsetX(This,v);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_get_shadowOffsetX(ICanvasRenderingContext2D* This,float *p) {
    return This->lpVtbl->get_shadowOffsetX(This,p);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_put_shadowOffsetY(ICanvasRenderingContext2D* This,float v) {
    return This->lpVtbl->put_shadowOffsetY(This,v);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_get_shadowOffsetY(ICanvasRenderingContext2D* This,float *p) {
    return This->lpVtbl->get_shadowOffsetY(This,p);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_clearRect(ICanvasRenderingContext2D* This,float x,float y,float w,float h) {
    return This->lpVtbl->clearRect(This,x,y,w,h);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_fillRect(ICanvasRenderingContext2D* This,float x,float y,float w,float h) {
    return This->lpVtbl->fillRect(This,x,y,w,h);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_strokeRect(ICanvasRenderingContext2D* This,float x,float y,float w,float h) {
    return This->lpVtbl->strokeRect(This,x,y,w,h);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_arc(ICanvasRenderingContext2D* This,float x,float y,float radius,float startAngle,float endAngle,WINBOOL anticlockwise) {
    return This->lpVtbl->arc(This,x,y,radius,startAngle,endAngle,anticlockwise);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_arcTo(ICanvasRenderingContext2D* This,float x1,float y1,float x2,float y2,float radius) {
    return This->lpVtbl->arcTo(This,x1,y1,x2,y2,radius);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_beginPath(ICanvasRenderingContext2D* This) {
    return This->lpVtbl->beginPath(This);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_bezierCurveTo(ICanvasRenderingContext2D* This,float cp1x,float cp1y,float cp2x,float cp2y,float x,float y) {
    return This->lpVtbl->bezierCurveTo(This,cp1x,cp1y,cp2x,cp2y,x,y);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_clip(ICanvasRenderingContext2D* This) {
    return This->lpVtbl->clip(This);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_closePath(ICanvasRenderingContext2D* This) {
    return This->lpVtbl->closePath(This);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_fill(ICanvasRenderingContext2D* This) {
    return This->lpVtbl->fill(This);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_lineTo(ICanvasRenderingContext2D* This,float x,float y) {
    return This->lpVtbl->lineTo(This,x,y);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_moveTo(ICanvasRenderingContext2D* This,float x,float y) {
    return This->lpVtbl->moveTo(This,x,y);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_quadraticCurveTo(ICanvasRenderingContext2D* This,float cpx,float cpy,float x,float y) {
    return This->lpVtbl->quadraticCurveTo(This,cpx,cpy,x,y);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_rect(ICanvasRenderingContext2D* This,float x,float y,float w,float h) {
    return This->lpVtbl->rect(This,x,y,w,h);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_stroke(ICanvasRenderingContext2D* This) {
    return This->lpVtbl->stroke(This);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_isPointInPath(ICanvasRenderingContext2D* This,float x,float y,VARIANT_BOOL *pResult) {
    return This->lpVtbl->isPointInPath(This,x,y,pResult);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_put_font(ICanvasRenderingContext2D* This,BSTR v) {
    return This->lpVtbl->put_font(This,v);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_get_font(ICanvasRenderingContext2D* This,BSTR *p) {
    return This->lpVtbl->get_font(This,p);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_put_textAlign(ICanvasRenderingContext2D* This,BSTR v) {
    return This->lpVtbl->put_textAlign(This,v);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_get_textAlign(ICanvasRenderingContext2D* This,BSTR *p) {
    return This->lpVtbl->get_textAlign(This,p);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_put_textBaseline(ICanvasRenderingContext2D* This,BSTR v) {
    return This->lpVtbl->put_textBaseline(This,v);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_get_textBaseline(ICanvasRenderingContext2D* This,BSTR *p) {
    return This->lpVtbl->get_textBaseline(This,p);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_fillText(ICanvasRenderingContext2D* This,BSTR text,float x,float y,VARIANT maxWidth) {
    return This->lpVtbl->fillText(This,text,x,y,maxWidth);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_measureText(ICanvasRenderingContext2D* This,BSTR text,ICanvasTextMetrics **ppCanvasTextMetrics) {
    return This->lpVtbl->measureText(This,text,ppCanvasTextMetrics);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_strokeText(ICanvasRenderingContext2D* This,BSTR text,float x,float y,VARIANT maxWidth) {
    return This->lpVtbl->strokeText(This,text,x,y,maxWidth);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_drawImage(ICanvasRenderingContext2D* This,IDispatch *pSrc,VARIANT a1,VARIANT a2,VARIANT a3,VARIANT a4,VARIANT a5,VARIANT a6,VARIANT a7,VARIANT a8) {
    return This->lpVtbl->drawImage(This,pSrc,a1,a2,a3,a4,a5,a6,a7,a8);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_createImageData(ICanvasRenderingContext2D* This,VARIANT a1,VARIANT a2,ICanvasImageData **ppCanvasImageData) {
    return This->lpVtbl->createImageData(This,a1,a2,ppCanvasImageData);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_getImageData(ICanvasRenderingContext2D* This,float sx,float sy,float sw,float sh,ICanvasImageData **ppCanvasImageData) {
    return This->lpVtbl->getImageData(This,sx,sy,sw,sh,ppCanvasImageData);
}
static FORCEINLINE HRESULT ICanvasRenderingContext2D_putImageData(ICanvasRenderingContext2D* This,ICanvasImageData *imagedata,float dx,float dy,VARIANT dirtyX,VARIANT dirtyY,VARIANT dirtyWidth,VARIANT dirtyHeight) {
    return This->lpVtbl->putImageData(This,imagedata,dx,dy,dirtyX,dirtyY,dirtyWidth,dirtyHeight);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_get_canvas_Proxy(
    ICanvasRenderingContext2D* This,
    IHTMLCanvasElement **p);
void __RPC_STUB ICanvasRenderingContext2D_get_canvas_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_restore_Proxy(
    ICanvasRenderingContext2D* This);
void __RPC_STUB ICanvasRenderingContext2D_restore_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_save_Proxy(
    ICanvasRenderingContext2D* This);
void __RPC_STUB ICanvasRenderingContext2D_save_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_rotate_Proxy(
    ICanvasRenderingContext2D* This,
    float angle);
void __RPC_STUB ICanvasRenderingContext2D_rotate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_scale_Proxy(
    ICanvasRenderingContext2D* This,
    float x,
    float y);
void __RPC_STUB ICanvasRenderingContext2D_scale_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_setTransform_Proxy(
    ICanvasRenderingContext2D* This,
    float m11,
    float m12,
    float m21,
    float m22,
    float dx,
    float dy);
void __RPC_STUB ICanvasRenderingContext2D_setTransform_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_transform_Proxy(
    ICanvasRenderingContext2D* This,
    float m11,
    float m12,
    float m21,
    float m22,
    float dx,
    float dy);
void __RPC_STUB ICanvasRenderingContext2D_transform_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_translate_Proxy(
    ICanvasRenderingContext2D* This,
    float x,
    float y);
void __RPC_STUB ICanvasRenderingContext2D_translate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_put_globalAlpha_Proxy(
    ICanvasRenderingContext2D* This,
    float v);
void __RPC_STUB ICanvasRenderingContext2D_put_globalAlpha_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_get_globalAlpha_Proxy(
    ICanvasRenderingContext2D* This,
    float *p);
void __RPC_STUB ICanvasRenderingContext2D_get_globalAlpha_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_put_globalCompositeOperation_Proxy(
    ICanvasRenderingContext2D* This,
    BSTR v);
void __RPC_STUB ICanvasRenderingContext2D_put_globalCompositeOperation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_get_globalCompositeOperation_Proxy(
    ICanvasRenderingContext2D* This,
    BSTR *p);
void __RPC_STUB ICanvasRenderingContext2D_get_globalCompositeOperation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_put_fillStyle_Proxy(
    ICanvasRenderingContext2D* This,
    VARIANT v);
void __RPC_STUB ICanvasRenderingContext2D_put_fillStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_get_fillStyle_Proxy(
    ICanvasRenderingContext2D* This,
    VARIANT *p);
void __RPC_STUB ICanvasRenderingContext2D_get_fillStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_put_strokeStyle_Proxy(
    ICanvasRenderingContext2D* This,
    VARIANT v);
void __RPC_STUB ICanvasRenderingContext2D_put_strokeStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_get_strokeStyle_Proxy(
    ICanvasRenderingContext2D* This,
    VARIANT *p);
void __RPC_STUB ICanvasRenderingContext2D_get_strokeStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_createLinearGradient_Proxy(
    ICanvasRenderingContext2D* This,
    float x0,
    float y0,
    float x1,
    float y1,
    ICanvasGradient **ppCanvasGradient);
void __RPC_STUB ICanvasRenderingContext2D_createLinearGradient_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_createRadialGradient_Proxy(
    ICanvasRenderingContext2D* This,
    float x0,
    float y0,
    float r0,
    float x1,
    float y1,
    float r1,
    ICanvasGradient **ppCanvasGradient);
void __RPC_STUB ICanvasRenderingContext2D_createRadialGradient_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_createPattern_Proxy(
    ICanvasRenderingContext2D* This,
    IDispatch *image,
    VARIANT repetition,
    ICanvasPattern **ppCanvasPattern);
void __RPC_STUB ICanvasRenderingContext2D_createPattern_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_put_lineCap_Proxy(
    ICanvasRenderingContext2D* This,
    BSTR v);
void __RPC_STUB ICanvasRenderingContext2D_put_lineCap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_get_lineCap_Proxy(
    ICanvasRenderingContext2D* This,
    BSTR *p);
void __RPC_STUB ICanvasRenderingContext2D_get_lineCap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_put_lineJoin_Proxy(
    ICanvasRenderingContext2D* This,
    BSTR v);
void __RPC_STUB ICanvasRenderingContext2D_put_lineJoin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_get_lineJoin_Proxy(
    ICanvasRenderingContext2D* This,
    BSTR *p);
void __RPC_STUB ICanvasRenderingContext2D_get_lineJoin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_put_lineWidth_Proxy(
    ICanvasRenderingContext2D* This,
    float v);
void __RPC_STUB ICanvasRenderingContext2D_put_lineWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_get_lineWidth_Proxy(
    ICanvasRenderingContext2D* This,
    float *p);
void __RPC_STUB ICanvasRenderingContext2D_get_lineWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_put_miterLimit_Proxy(
    ICanvasRenderingContext2D* This,
    float v);
void __RPC_STUB ICanvasRenderingContext2D_put_miterLimit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_get_miterLimit_Proxy(
    ICanvasRenderingContext2D* This,
    float *p);
void __RPC_STUB ICanvasRenderingContext2D_get_miterLimit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_put_shadowBlur_Proxy(
    ICanvasRenderingContext2D* This,
    float v);
void __RPC_STUB ICanvasRenderingContext2D_put_shadowBlur_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_get_shadowBlur_Proxy(
    ICanvasRenderingContext2D* This,
    float *p);
void __RPC_STUB ICanvasRenderingContext2D_get_shadowBlur_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_put_shadowColor_Proxy(
    ICanvasRenderingContext2D* This,
    BSTR v);
void __RPC_STUB ICanvasRenderingContext2D_put_shadowColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_get_shadowColor_Proxy(
    ICanvasRenderingContext2D* This,
    BSTR *p);
void __RPC_STUB ICanvasRenderingContext2D_get_shadowColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_put_shadowOffsetX_Proxy(
    ICanvasRenderingContext2D* This,
    float v);
void __RPC_STUB ICanvasRenderingContext2D_put_shadowOffsetX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_get_shadowOffsetX_Proxy(
    ICanvasRenderingContext2D* This,
    float *p);
void __RPC_STUB ICanvasRenderingContext2D_get_shadowOffsetX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_put_shadowOffsetY_Proxy(
    ICanvasRenderingContext2D* This,
    float v);
void __RPC_STUB ICanvasRenderingContext2D_put_shadowOffsetY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_get_shadowOffsetY_Proxy(
    ICanvasRenderingContext2D* This,
    float *p);
void __RPC_STUB ICanvasRenderingContext2D_get_shadowOffsetY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_clearRect_Proxy(
    ICanvasRenderingContext2D* This,
    float x,
    float y,
    float w,
    float h);
void __RPC_STUB ICanvasRenderingContext2D_clearRect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_fillRect_Proxy(
    ICanvasRenderingContext2D* This,
    float x,
    float y,
    float w,
    float h);
void __RPC_STUB ICanvasRenderingContext2D_fillRect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_strokeRect_Proxy(
    ICanvasRenderingContext2D* This,
    float x,
    float y,
    float w,
    float h);
void __RPC_STUB ICanvasRenderingContext2D_strokeRect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_arc_Proxy(
    ICanvasRenderingContext2D* This,
    float x,
    float y,
    float radius,
    float startAngle,
    float endAngle,
    WINBOOL anticlockwise);
void __RPC_STUB ICanvasRenderingContext2D_arc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_arcTo_Proxy(
    ICanvasRenderingContext2D* This,
    float x1,
    float y1,
    float x2,
    float y2,
    float radius);
void __RPC_STUB ICanvasRenderingContext2D_arcTo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_beginPath_Proxy(
    ICanvasRenderingContext2D* This);
void __RPC_STUB ICanvasRenderingContext2D_beginPath_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_bezierCurveTo_Proxy(
    ICanvasRenderingContext2D* This,
    float cp1x,
    float cp1y,
    float cp2x,
    float cp2y,
    float x,
    float y);
void __RPC_STUB ICanvasRenderingContext2D_bezierCurveTo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_clip_Proxy(
    ICanvasRenderingContext2D* This);
void __RPC_STUB ICanvasRenderingContext2D_clip_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_closePath_Proxy(
    ICanvasRenderingContext2D* This);
void __RPC_STUB ICanvasRenderingContext2D_closePath_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_fill_Proxy(
    ICanvasRenderingContext2D* This);
void __RPC_STUB ICanvasRenderingContext2D_fill_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_lineTo_Proxy(
    ICanvasRenderingContext2D* This,
    float x,
    float y);
void __RPC_STUB ICanvasRenderingContext2D_lineTo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_moveTo_Proxy(
    ICanvasRenderingContext2D* This,
    float x,
    float y);
void __RPC_STUB ICanvasRenderingContext2D_moveTo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_quadraticCurveTo_Proxy(
    ICanvasRenderingContext2D* This,
    float cpx,
    float cpy,
    float x,
    float y);
void __RPC_STUB ICanvasRenderingContext2D_quadraticCurveTo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_rect_Proxy(
    ICanvasRenderingContext2D* This,
    float x,
    float y,
    float w,
    float h);
void __RPC_STUB ICanvasRenderingContext2D_rect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_stroke_Proxy(
    ICanvasRenderingContext2D* This);
void __RPC_STUB ICanvasRenderingContext2D_stroke_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_isPointInPath_Proxy(
    ICanvasRenderingContext2D* This,
    float x,
    float y,
    VARIANT_BOOL *pResult);
void __RPC_STUB ICanvasRenderingContext2D_isPointInPath_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_put_font_Proxy(
    ICanvasRenderingContext2D* This,
    BSTR v);
void __RPC_STUB ICanvasRenderingContext2D_put_font_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_get_font_Proxy(
    ICanvasRenderingContext2D* This,
    BSTR *p);
void __RPC_STUB ICanvasRenderingContext2D_get_font_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_put_textAlign_Proxy(
    ICanvasRenderingContext2D* This,
    BSTR v);
void __RPC_STUB ICanvasRenderingContext2D_put_textAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_get_textAlign_Proxy(
    ICanvasRenderingContext2D* This,
    BSTR *p);
void __RPC_STUB ICanvasRenderingContext2D_get_textAlign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_put_textBaseline_Proxy(
    ICanvasRenderingContext2D* This,
    BSTR v);
void __RPC_STUB ICanvasRenderingContext2D_put_textBaseline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_get_textBaseline_Proxy(
    ICanvasRenderingContext2D* This,
    BSTR *p);
void __RPC_STUB ICanvasRenderingContext2D_get_textBaseline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_fillText_Proxy(
    ICanvasRenderingContext2D* This,
    BSTR text,
    float x,
    float y,
    VARIANT maxWidth);
void __RPC_STUB ICanvasRenderingContext2D_fillText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_measureText_Proxy(
    ICanvasRenderingContext2D* This,
    BSTR text,
    ICanvasTextMetrics **ppCanvasTextMetrics);
void __RPC_STUB ICanvasRenderingContext2D_measureText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_strokeText_Proxy(
    ICanvasRenderingContext2D* This,
    BSTR text,
    float x,
    float y,
    VARIANT maxWidth);
void __RPC_STUB ICanvasRenderingContext2D_strokeText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_drawImage_Proxy(
    ICanvasRenderingContext2D* This,
    IDispatch *pSrc,
    VARIANT a1,
    VARIANT a2,
    VARIANT a3,
    VARIANT a4,
    VARIANT a5,
    VARIANT a6,
    VARIANT a7,
    VARIANT a8);
void __RPC_STUB ICanvasRenderingContext2D_drawImage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_createImageData_Proxy(
    ICanvasRenderingContext2D* This,
    VARIANT a1,
    VARIANT a2,
    ICanvasImageData **ppCanvasImageData);
void __RPC_STUB ICanvasRenderingContext2D_createImageData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_getImageData_Proxy(
    ICanvasRenderingContext2D* This,
    float sx,
    float sy,
    float sw,
    float sh,
    ICanvasImageData **ppCanvasImageData);
void __RPC_STUB ICanvasRenderingContext2D_getImageData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICanvasRenderingContext2D_putImageData_Proxy(
    ICanvasRenderingContext2D* This,
    ICanvasImageData *imagedata,
    float dx,
    float dy,
    VARIANT dirtyX,
    VARIANT dirtyY,
    VARIANT dirtyWidth,
    VARIANT dirtyHeight);
void __RPC_STUB ICanvasRenderingContext2D_putImageData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ICanvasRenderingContext2D_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLCanvasElement interface
 */
#ifndef __IHTMLCanvasElement_INTERFACE_DEFINED__
#define __IHTMLCanvasElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLCanvasElement, 0x305106e4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106e4-98b5-11cf-bb82-00aa00bdce0b")
IHTMLCanvasElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_width(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_width(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_height(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_height(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE getContext(
        BSTR contextId,
        ICanvasRenderingContext2D **ppContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE toDataURL(
        BSTR type,
        VARIANT jpegquality,
        BSTR *pUrl) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLCanvasElement, 0x305106e4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLCanvasElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLCanvasElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLCanvasElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLCanvasElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLCanvasElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLCanvasElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLCanvasElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLCanvasElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLCanvasElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_width)(
        IHTMLCanvasElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_width)(
        IHTMLCanvasElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_height)(
        IHTMLCanvasElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_height)(
        IHTMLCanvasElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *getContext)(
        IHTMLCanvasElement* This,
        BSTR contextId,
        ICanvasRenderingContext2D **ppContext);

    HRESULT (STDMETHODCALLTYPE *toDataURL)(
        IHTMLCanvasElement* This,
        BSTR type,
        VARIANT jpegquality,
        BSTR *pUrl);

    END_INTERFACE
} IHTMLCanvasElementVtbl;
interface IHTMLCanvasElement {
    CONST_VTBL IHTMLCanvasElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLCanvasElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLCanvasElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLCanvasElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLCanvasElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLCanvasElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLCanvasElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLCanvasElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLCanvasElement methods ***/
#define IHTMLCanvasElement_put_width(This,v) (This)->lpVtbl->put_width(This,v)
#define IHTMLCanvasElement_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#define IHTMLCanvasElement_put_height(This,v) (This)->lpVtbl->put_height(This,v)
#define IHTMLCanvasElement_get_height(This,p) (This)->lpVtbl->get_height(This,p)
#define IHTMLCanvasElement_getContext(This,contextId,ppContext) (This)->lpVtbl->getContext(This,contextId,ppContext)
#define IHTMLCanvasElement_toDataURL(This,type,jpegquality,pUrl) (This)->lpVtbl->toDataURL(This,type,jpegquality,pUrl)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLCanvasElement_QueryInterface(IHTMLCanvasElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLCanvasElement_AddRef(IHTMLCanvasElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLCanvasElement_Release(IHTMLCanvasElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLCanvasElement_GetTypeInfoCount(IHTMLCanvasElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLCanvasElement_GetTypeInfo(IHTMLCanvasElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLCanvasElement_GetIDsOfNames(IHTMLCanvasElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLCanvasElement_Invoke(IHTMLCanvasElement* 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);
}
/*** IHTMLCanvasElement methods ***/
static FORCEINLINE HRESULT IHTMLCanvasElement_put_width(IHTMLCanvasElement* This,LONG v) {
    return This->lpVtbl->put_width(This,v);
}
static FORCEINLINE HRESULT IHTMLCanvasElement_get_width(IHTMLCanvasElement* This,LONG *p) {
    return This->lpVtbl->get_width(This,p);
}
static FORCEINLINE HRESULT IHTMLCanvasElement_put_height(IHTMLCanvasElement* This,LONG v) {
    return This->lpVtbl->put_height(This,v);
}
static FORCEINLINE HRESULT IHTMLCanvasElement_get_height(IHTMLCanvasElement* This,LONG *p) {
    return This->lpVtbl->get_height(This,p);
}
static FORCEINLINE HRESULT IHTMLCanvasElement_getContext(IHTMLCanvasElement* This,BSTR contextId,ICanvasRenderingContext2D **ppContext) {
    return This->lpVtbl->getContext(This,contextId,ppContext);
}
static FORCEINLINE HRESULT IHTMLCanvasElement_toDataURL(IHTMLCanvasElement* This,BSTR type,VARIANT jpegquality,BSTR *pUrl) {
    return This->lpVtbl->toDataURL(This,type,jpegquality,pUrl);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLCanvasElement_put_width_Proxy(
    IHTMLCanvasElement* This,
    LONG v);
void __RPC_STUB IHTMLCanvasElement_put_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCanvasElement_get_width_Proxy(
    IHTMLCanvasElement* This,
    LONG *p);
void __RPC_STUB IHTMLCanvasElement_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCanvasElement_put_height_Proxy(
    IHTMLCanvasElement* This,
    LONG v);
void __RPC_STUB IHTMLCanvasElement_put_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCanvasElement_get_height_Proxy(
    IHTMLCanvasElement* This,
    LONG *p);
void __RPC_STUB IHTMLCanvasElement_get_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCanvasElement_getContext_Proxy(
    IHTMLCanvasElement* This,
    BSTR contextId,
    ICanvasRenderingContext2D **ppContext);
void __RPC_STUB IHTMLCanvasElement_getContext_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCanvasElement_toDataURL_Proxy(
    IHTMLCanvasElement* This,
    BSTR type,
    VARIANT jpegquality,
    BSTR *pUrl);
void __RPC_STUB IHTMLCanvasElement_toDataURL_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLCanvasElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispCanvasGradient dispinterface
 */
#ifndef __DispCanvasGradient_DISPINTERFACE_DEFINED__
#define __DispCanvasGradient_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispCanvasGradient, 0x3059008c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059008c-98b5-11cf-bb82-00aa00bdce0b")
DispCanvasGradient : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispCanvasGradient, 0x3059008c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispCanvasGradientVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispCanvasGradient* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispCanvasGradient* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispCanvasGradient* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispCanvasGradient* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispCanvasGradient* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispCanvasGradient* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispCanvasGradient* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispCanvasGradientVtbl;
interface DispCanvasGradient {
    CONST_VTBL DispCanvasGradientVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispCanvasGradient_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispCanvasGradient_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispCanvasGradient_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispCanvasGradient_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispCanvasGradient_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispCanvasGradient_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispCanvasGradient_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 DispCanvasGradient_QueryInterface(DispCanvasGradient* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispCanvasGradient_AddRef(DispCanvasGradient* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispCanvasGradient_Release(DispCanvasGradient* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispCanvasGradient_GetTypeInfoCount(DispCanvasGradient* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispCanvasGradient_GetTypeInfo(DispCanvasGradient* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispCanvasGradient_GetIDsOfNames(DispCanvasGradient* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispCanvasGradient_Invoke(DispCanvasGradient* 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  /* __DispCanvasGradient_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * CanvasGradient coclass
 */

DEFINE_GUID(CLSID_CanvasGradient, 0x30510715, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510715-98b5-11cf-bb82-00aa00bdce0b") CanvasGradient;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(CanvasGradient, 0x30510715, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CCanvasGradient;
/*****************************************************************************
 * DispCanvasPattern dispinterface
 */
#ifndef __DispCanvasPattern_DISPINTERFACE_DEFINED__
#define __DispCanvasPattern_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispCanvasPattern, 0x3059008d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059008d-98b5-11cf-bb82-00aa00bdce0b")
DispCanvasPattern : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispCanvasPattern, 0x3059008d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispCanvasPatternVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispCanvasPattern* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispCanvasPattern* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispCanvasPattern* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispCanvasPattern* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispCanvasPattern* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispCanvasPattern* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispCanvasPattern* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispCanvasPatternVtbl;
interface DispCanvasPattern {
    CONST_VTBL DispCanvasPatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispCanvasPattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispCanvasPattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispCanvasPattern_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispCanvasPattern_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispCanvasPattern_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispCanvasPattern_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispCanvasPattern_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 DispCanvasPattern_QueryInterface(DispCanvasPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispCanvasPattern_AddRef(DispCanvasPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispCanvasPattern_Release(DispCanvasPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispCanvasPattern_GetTypeInfoCount(DispCanvasPattern* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispCanvasPattern_GetTypeInfo(DispCanvasPattern* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispCanvasPattern_GetIDsOfNames(DispCanvasPattern* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispCanvasPattern_Invoke(DispCanvasPattern* 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  /* __DispCanvasPattern_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * CanvasPattern coclass
 */

DEFINE_GUID(CLSID_CanvasPattern, 0x30510717, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510717-98b5-11cf-bb82-00aa00bdce0b") CanvasPattern;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(CanvasPattern, 0x30510717, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CCanvasPattern;
/*****************************************************************************
 * DispCanvasTextMetrics dispinterface
 */
#ifndef __DispCanvasTextMetrics_DISPINTERFACE_DEFINED__
#define __DispCanvasTextMetrics_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispCanvasTextMetrics, 0x3059008e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059008e-98b5-11cf-bb82-00aa00bdce0b")
DispCanvasTextMetrics : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispCanvasTextMetrics, 0x3059008e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispCanvasTextMetricsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispCanvasTextMetrics* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispCanvasTextMetrics* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispCanvasTextMetrics* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispCanvasTextMetrics* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispCanvasTextMetrics* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispCanvasTextMetrics* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispCanvasTextMetrics* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispCanvasTextMetricsVtbl;
interface DispCanvasTextMetrics {
    CONST_VTBL DispCanvasTextMetricsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispCanvasTextMetrics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispCanvasTextMetrics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispCanvasTextMetrics_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispCanvasTextMetrics_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispCanvasTextMetrics_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispCanvasTextMetrics_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispCanvasTextMetrics_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 DispCanvasTextMetrics_QueryInterface(DispCanvasTextMetrics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispCanvasTextMetrics_AddRef(DispCanvasTextMetrics* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispCanvasTextMetrics_Release(DispCanvasTextMetrics* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispCanvasTextMetrics_GetTypeInfoCount(DispCanvasTextMetrics* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispCanvasTextMetrics_GetTypeInfo(DispCanvasTextMetrics* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispCanvasTextMetrics_GetIDsOfNames(DispCanvasTextMetrics* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispCanvasTextMetrics_Invoke(DispCanvasTextMetrics* 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  /* __DispCanvasTextMetrics_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * CanvasTextMetrics coclass
 */

DEFINE_GUID(CLSID_CanvasTextMetrics, 0x30510719, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510719-98b5-11cf-bb82-00aa00bdce0b") CanvasTextMetrics;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(CanvasTextMetrics, 0x30510719, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CCanvasTextMetrics;
/*****************************************************************************
 * DispCanvasImageData dispinterface
 */
#ifndef __DispCanvasImageData_DISPINTERFACE_DEFINED__
#define __DispCanvasImageData_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispCanvasImageData, 0x3059008f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059008f-98b5-11cf-bb82-00aa00bdce0b")
DispCanvasImageData : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispCanvasImageData, 0x3059008f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispCanvasImageDataVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispCanvasImageData* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispCanvasImageData* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispCanvasImageData* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispCanvasImageData* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispCanvasImageData* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispCanvasImageData* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispCanvasImageData* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispCanvasImageDataVtbl;
interface DispCanvasImageData {
    CONST_VTBL DispCanvasImageDataVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispCanvasImageData_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispCanvasImageData_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispCanvasImageData_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispCanvasImageData_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispCanvasImageData_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispCanvasImageData_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispCanvasImageData_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 DispCanvasImageData_QueryInterface(DispCanvasImageData* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispCanvasImageData_AddRef(DispCanvasImageData* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispCanvasImageData_Release(DispCanvasImageData* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispCanvasImageData_GetTypeInfoCount(DispCanvasImageData* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispCanvasImageData_GetTypeInfo(DispCanvasImageData* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispCanvasImageData_GetIDsOfNames(DispCanvasImageData* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispCanvasImageData_Invoke(DispCanvasImageData* 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  /* __DispCanvasImageData_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * CanvasImageData coclass
 */

DEFINE_GUID(CLSID_CanvasImageData, 0x3051071b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3051071b-98b5-11cf-bb82-00aa00bdce0b") CanvasImageData;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(CanvasImageData, 0x3051071b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CCanvasImageData;
/*****************************************************************************
 * DispCanvasRenderingContext2D dispinterface
 */
#ifndef __DispCanvasRenderingContext2D_DISPINTERFACE_DEFINED__
#define __DispCanvasRenderingContext2D_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispCanvasRenderingContext2D, 0x30590082, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590082-98b5-11cf-bb82-00aa00bdce0b")
DispCanvasRenderingContext2D : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispCanvasRenderingContext2D, 0x30590082, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispCanvasRenderingContext2DVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispCanvasRenderingContext2D* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispCanvasRenderingContext2D* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispCanvasRenderingContext2D* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispCanvasRenderingContext2D* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispCanvasRenderingContext2D* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispCanvasRenderingContext2D* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispCanvasRenderingContext2D* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispCanvasRenderingContext2DVtbl;
interface DispCanvasRenderingContext2D {
    CONST_VTBL DispCanvasRenderingContext2DVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispCanvasRenderingContext2D_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispCanvasRenderingContext2D_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispCanvasRenderingContext2D_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispCanvasRenderingContext2D_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispCanvasRenderingContext2D_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispCanvasRenderingContext2D_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispCanvasRenderingContext2D_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 DispCanvasRenderingContext2D_QueryInterface(DispCanvasRenderingContext2D* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispCanvasRenderingContext2D_AddRef(DispCanvasRenderingContext2D* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispCanvasRenderingContext2D_Release(DispCanvasRenderingContext2D* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispCanvasRenderingContext2D_GetTypeInfoCount(DispCanvasRenderingContext2D* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispCanvasRenderingContext2D_GetTypeInfo(DispCanvasRenderingContext2D* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispCanvasRenderingContext2D_GetIDsOfNames(DispCanvasRenderingContext2D* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispCanvasRenderingContext2D_Invoke(DispCanvasRenderingContext2D* 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  /* __DispCanvasRenderingContext2D_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * CanvasRenderingContext2D coclass
 */

DEFINE_GUID(CLSID_CanvasRenderingContext2D, 0x30510700, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510700-98b5-11cf-bb82-00aa00bdce0b") CanvasRenderingContext2D;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(CanvasRenderingContext2D, 0x30510700, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CCanvasRenderingContext2D;
/*****************************************************************************
 * DispHTMLCanvasElement dispinterface
 */
#ifndef __DispHTMLCanvasElement_DISPINTERFACE_DEFINED__
#define __DispHTMLCanvasElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLCanvasElement, 0x3059007b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059007b-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLCanvasElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLCanvasElement, 0x3059007b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLCanvasElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLCanvasElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLCanvasElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLCanvasElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLCanvasElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLCanvasElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLCanvasElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLCanvasElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLCanvasElementVtbl;
interface DispHTMLCanvasElement {
    CONST_VTBL DispHTMLCanvasElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLCanvasElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLCanvasElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLCanvasElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLCanvasElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLCanvasElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLCanvasElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLCanvasElement_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 DispHTMLCanvasElement_QueryInterface(DispHTMLCanvasElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLCanvasElement_AddRef(DispHTMLCanvasElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLCanvasElement_Release(DispHTMLCanvasElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLCanvasElement_GetTypeInfoCount(DispHTMLCanvasElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLCanvasElement_GetTypeInfo(DispHTMLCanvasElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLCanvasElement_GetIDsOfNames(DispHTMLCanvasElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLCanvasElement_Invoke(DispHTMLCanvasElement* 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  /* __DispHTMLCanvasElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLCanvasElement coclass
 */

DEFINE_GUID(CLSID_HTMLCanvasElement, 0x305106e5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305106e5-98b5-11cf-bb82-00aa00bdce0b") HTMLCanvasElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLCanvasElement, 0x305106e5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CHTMLCanvasElement;
/*****************************************************************************
 * IDOMProgressEvent interface
 */
#ifndef __IDOMProgressEvent_INTERFACE_DEFINED__
#define __IDOMProgressEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMProgressEvent, 0x3051071e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051071e-98b5-11cf-bb82-00aa00bdce0b")
IDOMProgressEvent : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_lengthComputable(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_loaded(
        ULONGLONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_total(
        ULONGLONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE initProgressEvent(
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        VARIANT_BOOL lengthComputableArg,
        ULONGLONG loadedArg,
        ULONGLONG totalArg) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMProgressEvent, 0x3051071e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMProgressEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMProgressEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMProgressEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMProgressEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDOMProgressEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDOMProgressEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDOMProgressEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDOMProgressEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDOMProgressEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *get_lengthComputable)(
        IDOMProgressEvent* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_loaded)(
        IDOMProgressEvent* This,
        ULONGLONG *p);

    HRESULT (STDMETHODCALLTYPE *get_total)(
        IDOMProgressEvent* This,
        ULONGLONG *p);

    HRESULT (STDMETHODCALLTYPE *initProgressEvent)(
        IDOMProgressEvent* This,
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        VARIANT_BOOL lengthComputableArg,
        ULONGLONG loadedArg,
        ULONGLONG totalArg);

    END_INTERFACE
} IDOMProgressEventVtbl;
interface IDOMProgressEvent {
    CONST_VTBL IDOMProgressEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMProgressEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMProgressEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMProgressEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDOMProgressEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDOMProgressEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDOMProgressEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDOMProgressEvent_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDOMProgressEvent methods ***/
#define IDOMProgressEvent_get_lengthComputable(This,p) (This)->lpVtbl->get_lengthComputable(This,p)
#define IDOMProgressEvent_get_loaded(This,p) (This)->lpVtbl->get_loaded(This,p)
#define IDOMProgressEvent_get_total(This,p) (This)->lpVtbl->get_total(This,p)
#define IDOMProgressEvent_initProgressEvent(This,eventType,canBubble,cancelable,lengthComputableArg,loadedArg,totalArg) (This)->lpVtbl->initProgressEvent(This,eventType,canBubble,cancelable,lengthComputableArg,loadedArg,totalArg)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMProgressEvent_QueryInterface(IDOMProgressEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMProgressEvent_AddRef(IDOMProgressEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMProgressEvent_Release(IDOMProgressEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDOMProgressEvent_GetTypeInfoCount(IDOMProgressEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDOMProgressEvent_GetTypeInfo(IDOMProgressEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDOMProgressEvent_GetIDsOfNames(IDOMProgressEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDOMProgressEvent_Invoke(IDOMProgressEvent* 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);
}
/*** IDOMProgressEvent methods ***/
static FORCEINLINE HRESULT IDOMProgressEvent_get_lengthComputable(IDOMProgressEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_lengthComputable(This,p);
}
static FORCEINLINE HRESULT IDOMProgressEvent_get_loaded(IDOMProgressEvent* This,ULONGLONG *p) {
    return This->lpVtbl->get_loaded(This,p);
}
static FORCEINLINE HRESULT IDOMProgressEvent_get_total(IDOMProgressEvent* This,ULONGLONG *p) {
    return This->lpVtbl->get_total(This,p);
}
static FORCEINLINE HRESULT IDOMProgressEvent_initProgressEvent(IDOMProgressEvent* This,BSTR eventType,VARIANT_BOOL canBubble,VARIANT_BOOL cancelable,VARIANT_BOOL lengthComputableArg,ULONGLONG loadedArg,ULONGLONG totalArg) {
    return This->lpVtbl->initProgressEvent(This,eventType,canBubble,cancelable,lengthComputableArg,loadedArg,totalArg);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMProgressEvent_get_lengthComputable_Proxy(
    IDOMProgressEvent* This,
    VARIANT_BOOL *p);
void __RPC_STUB IDOMProgressEvent_get_lengthComputable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMProgressEvent_get_loaded_Proxy(
    IDOMProgressEvent* This,
    ULONGLONG *p);
void __RPC_STUB IDOMProgressEvent_get_loaded_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMProgressEvent_get_total_Proxy(
    IDOMProgressEvent* This,
    ULONGLONG *p);
void __RPC_STUB IDOMProgressEvent_get_total_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMProgressEvent_initProgressEvent_Proxy(
    IDOMProgressEvent* This,
    BSTR eventType,
    VARIANT_BOOL canBubble,
    VARIANT_BOOL cancelable,
    VARIANT_BOOL lengthComputableArg,
    ULONGLONG loadedArg,
    ULONGLONG totalArg);
void __RPC_STUB IDOMProgressEvent_initProgressEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMProgressEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispDOMProgressEvent dispinterface
 */
#ifndef __DispDOMProgressEvent_DISPINTERFACE_DEFINED__
#define __DispDOMProgressEvent_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispDOMProgressEvent, 0x30590091, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590091-98b5-11cf-bb82-00aa00bdce0b")
DispDOMProgressEvent : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispDOMProgressEvent, 0x30590091, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispDOMProgressEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispDOMProgressEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispDOMProgressEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispDOMProgressEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispDOMProgressEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispDOMProgressEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispDOMProgressEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispDOMProgressEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispDOMProgressEventVtbl;
interface DispDOMProgressEvent {
    CONST_VTBL DispDOMProgressEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispDOMProgressEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispDOMProgressEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispDOMProgressEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispDOMProgressEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispDOMProgressEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispDOMProgressEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispDOMProgressEvent_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 DispDOMProgressEvent_QueryInterface(DispDOMProgressEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispDOMProgressEvent_AddRef(DispDOMProgressEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispDOMProgressEvent_Release(DispDOMProgressEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispDOMProgressEvent_GetTypeInfoCount(DispDOMProgressEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispDOMProgressEvent_GetTypeInfo(DispDOMProgressEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispDOMProgressEvent_GetIDsOfNames(DispDOMProgressEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispDOMProgressEvent_Invoke(DispDOMProgressEvent* 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  /* __DispDOMProgressEvent_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * DOMProgressEvent coclass
 */

DEFINE_GUID(CLSID_DOMProgressEvent, 0x3051071f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3051071f-98b5-11cf-bb82-00aa00bdce0b") DOMProgressEvent;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMProgressEvent, 0x3051071f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDOMProgressEvent;
/*****************************************************************************
 * IDOMMessageEvent interface
 */
#ifndef __IDOMMessageEvent_INTERFACE_DEFINED__
#define __IDOMMessageEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMMessageEvent, 0x30510720, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510720-98b5-11cf-bb82-00aa00bdce0b")
IDOMMessageEvent : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_data(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_origin(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_source(
        IHTMLWindow2 **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE initMessageEvent(
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        BSTR data,
        BSTR origin,
        BSTR lastEventId,
        IHTMLWindow2 *source) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMMessageEvent, 0x30510720, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMMessageEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMMessageEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMMessageEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMMessageEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDOMMessageEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDOMMessageEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDOMMessageEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDOMMessageEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDOMMessageEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *get_data)(
        IDOMMessageEvent* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_origin)(
        IDOMMessageEvent* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_source)(
        IDOMMessageEvent* This,
        IHTMLWindow2 **p);

    HRESULT (STDMETHODCALLTYPE *initMessageEvent)(
        IDOMMessageEvent* This,
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        BSTR data,
        BSTR origin,
        BSTR lastEventId,
        IHTMLWindow2 *source);

    END_INTERFACE
} IDOMMessageEventVtbl;
interface IDOMMessageEvent {
    CONST_VTBL IDOMMessageEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMMessageEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMMessageEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMMessageEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDOMMessageEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDOMMessageEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDOMMessageEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDOMMessageEvent_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDOMMessageEvent methods ***/
#define IDOMMessageEvent_get_data(This,p) (This)->lpVtbl->get_data(This,p)
#define IDOMMessageEvent_get_origin(This,p) (This)->lpVtbl->get_origin(This,p)
#define IDOMMessageEvent_get_source(This,p) (This)->lpVtbl->get_source(This,p)
#define IDOMMessageEvent_initMessageEvent(This,eventType,canBubble,cancelable,data,origin,lastEventId,source) (This)->lpVtbl->initMessageEvent(This,eventType,canBubble,cancelable,data,origin,lastEventId,source)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMMessageEvent_QueryInterface(IDOMMessageEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMMessageEvent_AddRef(IDOMMessageEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMMessageEvent_Release(IDOMMessageEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDOMMessageEvent_GetTypeInfoCount(IDOMMessageEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDOMMessageEvent_GetTypeInfo(IDOMMessageEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDOMMessageEvent_GetIDsOfNames(IDOMMessageEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDOMMessageEvent_Invoke(IDOMMessageEvent* 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);
}
/*** IDOMMessageEvent methods ***/
static FORCEINLINE HRESULT IDOMMessageEvent_get_data(IDOMMessageEvent* This,BSTR *p) {
    return This->lpVtbl->get_data(This,p);
}
static FORCEINLINE HRESULT IDOMMessageEvent_get_origin(IDOMMessageEvent* This,BSTR *p) {
    return This->lpVtbl->get_origin(This,p);
}
static FORCEINLINE HRESULT IDOMMessageEvent_get_source(IDOMMessageEvent* This,IHTMLWindow2 **p) {
    return This->lpVtbl->get_source(This,p);
}
static FORCEINLINE HRESULT IDOMMessageEvent_initMessageEvent(IDOMMessageEvent* This,BSTR eventType,VARIANT_BOOL canBubble,VARIANT_BOOL cancelable,BSTR data,BSTR origin,BSTR lastEventId,IHTMLWindow2 *source) {
    return This->lpVtbl->initMessageEvent(This,eventType,canBubble,cancelable,data,origin,lastEventId,source);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMMessageEvent_get_data_Proxy(
    IDOMMessageEvent* This,
    BSTR *p);
void __RPC_STUB IDOMMessageEvent_get_data_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMessageEvent_get_origin_Proxy(
    IDOMMessageEvent* This,
    BSTR *p);
void __RPC_STUB IDOMMessageEvent_get_origin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMessageEvent_get_source_Proxy(
    IDOMMessageEvent* This,
    IHTMLWindow2 **p);
void __RPC_STUB IDOMMessageEvent_get_source_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMessageEvent_initMessageEvent_Proxy(
    IDOMMessageEvent* This,
    BSTR eventType,
    VARIANT_BOOL canBubble,
    VARIANT_BOOL cancelable,
    BSTR data,
    BSTR origin,
    BSTR lastEventId,
    IHTMLWindow2 *source);
void __RPC_STUB IDOMMessageEvent_initMessageEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMMessageEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispDOMMessageEvent dispinterface
 */
#ifndef __DispDOMMessageEvent_DISPINTERFACE_DEFINED__
#define __DispDOMMessageEvent_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispDOMMessageEvent, 0x30590092, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590092-98b5-11cf-bb82-00aa00bdce0b")
DispDOMMessageEvent : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispDOMMessageEvent, 0x30590092, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispDOMMessageEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispDOMMessageEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispDOMMessageEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispDOMMessageEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispDOMMessageEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispDOMMessageEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispDOMMessageEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispDOMMessageEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispDOMMessageEventVtbl;
interface DispDOMMessageEvent {
    CONST_VTBL DispDOMMessageEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispDOMMessageEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispDOMMessageEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispDOMMessageEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispDOMMessageEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispDOMMessageEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispDOMMessageEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispDOMMessageEvent_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 DispDOMMessageEvent_QueryInterface(DispDOMMessageEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispDOMMessageEvent_AddRef(DispDOMMessageEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispDOMMessageEvent_Release(DispDOMMessageEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispDOMMessageEvent_GetTypeInfoCount(DispDOMMessageEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispDOMMessageEvent_GetTypeInfo(DispDOMMessageEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispDOMMessageEvent_GetIDsOfNames(DispDOMMessageEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispDOMMessageEvent_Invoke(DispDOMMessageEvent* 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  /* __DispDOMMessageEvent_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * DOMMessageEvent coclass
 */

DEFINE_GUID(CLSID_DOMMessageEvent, 0x30510721, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510721-98b5-11cf-bb82-00aa00bdce0b") DOMMessageEvent;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMMessageEvent, 0x30510721, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDOMMessageEvent;
/*****************************************************************************
 * IDOMSiteModeEvent interface
 */
#ifndef __IDOMSiteModeEvent_INTERFACE_DEFINED__
#define __IDOMSiteModeEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMSiteModeEvent, 0x30510765, 0x98b6, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510765-98b6-11cf-bb82-00aa00bdce0b")
IDOMSiteModeEvent : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_buttonID(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_actionURL(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMSiteModeEvent, 0x30510765, 0x98b6, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMSiteModeEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMSiteModeEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMSiteModeEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMSiteModeEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDOMSiteModeEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDOMSiteModeEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDOMSiteModeEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDOMSiteModeEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDOMSiteModeEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *get_buttonID)(
        IDOMSiteModeEvent* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_actionURL)(
        IDOMSiteModeEvent* This,
        BSTR *p);

    END_INTERFACE
} IDOMSiteModeEventVtbl;
interface IDOMSiteModeEvent {
    CONST_VTBL IDOMSiteModeEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMSiteModeEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMSiteModeEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMSiteModeEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDOMSiteModeEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDOMSiteModeEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDOMSiteModeEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDOMSiteModeEvent_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDOMSiteModeEvent methods ***/
#define IDOMSiteModeEvent_get_buttonID(This,p) (This)->lpVtbl->get_buttonID(This,p)
#define IDOMSiteModeEvent_get_actionURL(This,p) (This)->lpVtbl->get_actionURL(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMSiteModeEvent_QueryInterface(IDOMSiteModeEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMSiteModeEvent_AddRef(IDOMSiteModeEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMSiteModeEvent_Release(IDOMSiteModeEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDOMSiteModeEvent_GetTypeInfoCount(IDOMSiteModeEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDOMSiteModeEvent_GetTypeInfo(IDOMSiteModeEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDOMSiteModeEvent_GetIDsOfNames(IDOMSiteModeEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDOMSiteModeEvent_Invoke(IDOMSiteModeEvent* 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);
}
/*** IDOMSiteModeEvent methods ***/
static FORCEINLINE HRESULT IDOMSiteModeEvent_get_buttonID(IDOMSiteModeEvent* This,LONG *p) {
    return This->lpVtbl->get_buttonID(This,p);
}
static FORCEINLINE HRESULT IDOMSiteModeEvent_get_actionURL(IDOMSiteModeEvent* This,BSTR *p) {
    return This->lpVtbl->get_actionURL(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMSiteModeEvent_get_buttonID_Proxy(
    IDOMSiteModeEvent* This,
    LONG *p);
void __RPC_STUB IDOMSiteModeEvent_get_buttonID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMSiteModeEvent_get_actionURL_Proxy(
    IDOMSiteModeEvent* This,
    BSTR *p);
void __RPC_STUB IDOMSiteModeEvent_get_actionURL_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMSiteModeEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispDOMSiteModeEvent dispinterface
 */
#ifndef __DispDOMSiteModeEvent_DISPINTERFACE_DEFINED__
#define __DispDOMSiteModeEvent_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispDOMSiteModeEvent, 0x305900a9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305900a9-98b5-11cf-bb82-00aa00bdce0b")
DispDOMSiteModeEvent : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispDOMSiteModeEvent, 0x305900a9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispDOMSiteModeEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispDOMSiteModeEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispDOMSiteModeEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispDOMSiteModeEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispDOMSiteModeEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispDOMSiteModeEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispDOMSiteModeEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispDOMSiteModeEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispDOMSiteModeEventVtbl;
interface DispDOMSiteModeEvent {
    CONST_VTBL DispDOMSiteModeEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispDOMSiteModeEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispDOMSiteModeEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispDOMSiteModeEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispDOMSiteModeEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispDOMSiteModeEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispDOMSiteModeEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispDOMSiteModeEvent_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 DispDOMSiteModeEvent_QueryInterface(DispDOMSiteModeEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispDOMSiteModeEvent_AddRef(DispDOMSiteModeEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispDOMSiteModeEvent_Release(DispDOMSiteModeEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispDOMSiteModeEvent_GetTypeInfoCount(DispDOMSiteModeEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispDOMSiteModeEvent_GetTypeInfo(DispDOMSiteModeEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispDOMSiteModeEvent_GetIDsOfNames(DispDOMSiteModeEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispDOMSiteModeEvent_Invoke(DispDOMSiteModeEvent* 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  /* __DispDOMSiteModeEvent_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * DOMSiteModeEvent coclass
 */

DEFINE_GUID(CLSID_DOMSiteModeEvent, 0x30510766, 0x98b6, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510766-98b6-11cf-bb82-00aa00bdce0b") DOMSiteModeEvent;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMSiteModeEvent, 0x30510766, 0x98b6, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDOMSiteModeEvent;
/*****************************************************************************
 * IDOMStorageEvent interface
 */
#ifndef __IDOMStorageEvent_INTERFACE_DEFINED__
#define __IDOMStorageEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMStorageEvent, 0x30510722, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510722-98b5-11cf-bb82-00aa00bdce0b")
IDOMStorageEvent : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_key(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_oldValue(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_newValue(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_url(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_storageArea(
        IHTMLStorage **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE initStorageEvent(
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        BSTR keyArg,
        BSTR oldValueArg,
        BSTR newValueArg,
        BSTR urlArg,
        IHTMLStorage *storageAreaArg) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMStorageEvent, 0x30510722, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMStorageEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMStorageEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMStorageEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMStorageEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDOMStorageEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDOMStorageEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDOMStorageEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDOMStorageEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDOMStorageEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *get_key)(
        IDOMStorageEvent* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_oldValue)(
        IDOMStorageEvent* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_newValue)(
        IDOMStorageEvent* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_url)(
        IDOMStorageEvent* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_storageArea)(
        IDOMStorageEvent* This,
        IHTMLStorage **p);

    HRESULT (STDMETHODCALLTYPE *initStorageEvent)(
        IDOMStorageEvent* This,
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        BSTR keyArg,
        BSTR oldValueArg,
        BSTR newValueArg,
        BSTR urlArg,
        IHTMLStorage *storageAreaArg);

    END_INTERFACE
} IDOMStorageEventVtbl;
interface IDOMStorageEvent {
    CONST_VTBL IDOMStorageEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMStorageEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMStorageEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMStorageEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDOMStorageEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDOMStorageEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDOMStorageEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDOMStorageEvent_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDOMStorageEvent methods ***/
#define IDOMStorageEvent_get_key(This,p) (This)->lpVtbl->get_key(This,p)
#define IDOMStorageEvent_get_oldValue(This,p) (This)->lpVtbl->get_oldValue(This,p)
#define IDOMStorageEvent_get_newValue(This,p) (This)->lpVtbl->get_newValue(This,p)
#define IDOMStorageEvent_get_url(This,p) (This)->lpVtbl->get_url(This,p)
#define IDOMStorageEvent_get_storageArea(This,p) (This)->lpVtbl->get_storageArea(This,p)
#define IDOMStorageEvent_initStorageEvent(This,eventType,canBubble,cancelable,keyArg,oldValueArg,newValueArg,urlArg,storageAreaArg) (This)->lpVtbl->initStorageEvent(This,eventType,canBubble,cancelable,keyArg,oldValueArg,newValueArg,urlArg,storageAreaArg)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMStorageEvent_QueryInterface(IDOMStorageEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMStorageEvent_AddRef(IDOMStorageEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMStorageEvent_Release(IDOMStorageEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDOMStorageEvent_GetTypeInfoCount(IDOMStorageEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDOMStorageEvent_GetTypeInfo(IDOMStorageEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDOMStorageEvent_GetIDsOfNames(IDOMStorageEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDOMStorageEvent_Invoke(IDOMStorageEvent* 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);
}
/*** IDOMStorageEvent methods ***/
static FORCEINLINE HRESULT IDOMStorageEvent_get_key(IDOMStorageEvent* This,BSTR *p) {
    return This->lpVtbl->get_key(This,p);
}
static FORCEINLINE HRESULT IDOMStorageEvent_get_oldValue(IDOMStorageEvent* This,BSTR *p) {
    return This->lpVtbl->get_oldValue(This,p);
}
static FORCEINLINE HRESULT IDOMStorageEvent_get_newValue(IDOMStorageEvent* This,BSTR *p) {
    return This->lpVtbl->get_newValue(This,p);
}
static FORCEINLINE HRESULT IDOMStorageEvent_get_url(IDOMStorageEvent* This,BSTR *p) {
    return This->lpVtbl->get_url(This,p);
}
static FORCEINLINE HRESULT IDOMStorageEvent_get_storageArea(IDOMStorageEvent* This,IHTMLStorage **p) {
    return This->lpVtbl->get_storageArea(This,p);
}
static FORCEINLINE HRESULT IDOMStorageEvent_initStorageEvent(IDOMStorageEvent* This,BSTR eventType,VARIANT_BOOL canBubble,VARIANT_BOOL cancelable,BSTR keyArg,BSTR oldValueArg,BSTR newValueArg,BSTR urlArg,IHTMLStorage *storageAreaArg) {
    return This->lpVtbl->initStorageEvent(This,eventType,canBubble,cancelable,keyArg,oldValueArg,newValueArg,urlArg,storageAreaArg);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMStorageEvent_get_key_Proxy(
    IDOMStorageEvent* This,
    BSTR *p);
void __RPC_STUB IDOMStorageEvent_get_key_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMStorageEvent_get_oldValue_Proxy(
    IDOMStorageEvent* This,
    BSTR *p);
void __RPC_STUB IDOMStorageEvent_get_oldValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMStorageEvent_get_newValue_Proxy(
    IDOMStorageEvent* This,
    BSTR *p);
void __RPC_STUB IDOMStorageEvent_get_newValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMStorageEvent_get_url_Proxy(
    IDOMStorageEvent* This,
    BSTR *p);
void __RPC_STUB IDOMStorageEvent_get_url_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMStorageEvent_get_storageArea_Proxy(
    IDOMStorageEvent* This,
    IHTMLStorage **p);
void __RPC_STUB IDOMStorageEvent_get_storageArea_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMStorageEvent_initStorageEvent_Proxy(
    IDOMStorageEvent* This,
    BSTR eventType,
    VARIANT_BOOL canBubble,
    VARIANT_BOOL cancelable,
    BSTR keyArg,
    BSTR oldValueArg,
    BSTR newValueArg,
    BSTR urlArg,
    IHTMLStorage *storageAreaArg);
void __RPC_STUB IDOMStorageEvent_initStorageEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMStorageEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispDOMStorageEvent dispinterface
 */
#ifndef __DispDOMStorageEvent_DISPINTERFACE_DEFINED__
#define __DispDOMStorageEvent_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispDOMStorageEvent, 0x30590093, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590093-98b5-11cf-bb82-00aa00bdce0b")
DispDOMStorageEvent : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispDOMStorageEvent, 0x30590093, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispDOMStorageEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispDOMStorageEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispDOMStorageEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispDOMStorageEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispDOMStorageEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispDOMStorageEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispDOMStorageEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispDOMStorageEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispDOMStorageEventVtbl;
interface DispDOMStorageEvent {
    CONST_VTBL DispDOMStorageEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispDOMStorageEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispDOMStorageEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispDOMStorageEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispDOMStorageEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispDOMStorageEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispDOMStorageEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispDOMStorageEvent_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 DispDOMStorageEvent_QueryInterface(DispDOMStorageEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispDOMStorageEvent_AddRef(DispDOMStorageEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispDOMStorageEvent_Release(DispDOMStorageEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispDOMStorageEvent_GetTypeInfoCount(DispDOMStorageEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispDOMStorageEvent_GetTypeInfo(DispDOMStorageEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispDOMStorageEvent_GetIDsOfNames(DispDOMStorageEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispDOMStorageEvent_Invoke(DispDOMStorageEvent* 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  /* __DispDOMStorageEvent_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * DOMStorageEvent coclass
 */

DEFINE_GUID(CLSID_DOMStorageEvent, 0x30510723, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510723-98b5-11cf-bb82-00aa00bdce0b") DOMStorageEvent;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMStorageEvent, 0x30510723, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDOMStorageEvent;
/*****************************************************************************
 * IXMLHttpRequestEventTarget interface
 */
#ifndef __IXMLHttpRequestEventTarget_INTERFACE_DEFINED__
#define __IXMLHttpRequestEventTarget_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLHttpRequestEventTarget, 0x30510830, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510830-98b5-11cf-bb82-00aa00bdce0b")
IXMLHttpRequestEventTarget : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLHttpRequestEventTarget, 0x30510830, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IXMLHttpRequestEventTargetVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXMLHttpRequestEventTarget* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXMLHttpRequestEventTarget* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXMLHttpRequestEventTarget* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXMLHttpRequestEventTarget* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXMLHttpRequestEventTarget* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXMLHttpRequestEventTarget* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXMLHttpRequestEventTarget* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} IXMLHttpRequestEventTargetVtbl;
interface IXMLHttpRequestEventTarget {
    CONST_VTBL IXMLHttpRequestEventTargetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLHttpRequestEventTarget_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLHttpRequestEventTarget_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLHttpRequestEventTarget_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXMLHttpRequestEventTarget_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXMLHttpRequestEventTarget_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXMLHttpRequestEventTarget_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXMLHttpRequestEventTarget_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 IXMLHttpRequestEventTarget_QueryInterface(IXMLHttpRequestEventTarget* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IXMLHttpRequestEventTarget_AddRef(IXMLHttpRequestEventTarget* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IXMLHttpRequestEventTarget_Release(IXMLHttpRequestEventTarget* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IXMLHttpRequestEventTarget_GetTypeInfoCount(IXMLHttpRequestEventTarget* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IXMLHttpRequestEventTarget_GetTypeInfo(IXMLHttpRequestEventTarget* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IXMLHttpRequestEventTarget_GetIDsOfNames(IXMLHttpRequestEventTarget* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IXMLHttpRequestEventTarget_Invoke(IXMLHttpRequestEventTarget* 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  /* __IXMLHttpRequestEventTarget_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispXMLHttpRequestEventTarget dispinterface
 */
#ifndef __DispXMLHttpRequestEventTarget_DISPINTERFACE_DEFINED__
#define __DispXMLHttpRequestEventTarget_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispXMLHttpRequestEventTarget, 0x305900e7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305900e7-98b5-11cf-bb82-00aa00bdce0b")
DispXMLHttpRequestEventTarget : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispXMLHttpRequestEventTarget, 0x305900e7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispXMLHttpRequestEventTargetVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispXMLHttpRequestEventTarget* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispXMLHttpRequestEventTarget* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispXMLHttpRequestEventTarget* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispXMLHttpRequestEventTarget* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispXMLHttpRequestEventTarget* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispXMLHttpRequestEventTarget* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispXMLHttpRequestEventTarget* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispXMLHttpRequestEventTargetVtbl;
interface DispXMLHttpRequestEventTarget {
    CONST_VTBL DispXMLHttpRequestEventTargetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispXMLHttpRequestEventTarget_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispXMLHttpRequestEventTarget_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispXMLHttpRequestEventTarget_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispXMLHttpRequestEventTarget_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispXMLHttpRequestEventTarget_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispXMLHttpRequestEventTarget_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispXMLHttpRequestEventTarget_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 DispXMLHttpRequestEventTarget_QueryInterface(DispXMLHttpRequestEventTarget* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispXMLHttpRequestEventTarget_AddRef(DispXMLHttpRequestEventTarget* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispXMLHttpRequestEventTarget_Release(DispXMLHttpRequestEventTarget* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispXMLHttpRequestEventTarget_GetTypeInfoCount(DispXMLHttpRequestEventTarget* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispXMLHttpRequestEventTarget_GetTypeInfo(DispXMLHttpRequestEventTarget* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispXMLHttpRequestEventTarget_GetIDsOfNames(DispXMLHttpRequestEventTarget* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispXMLHttpRequestEventTarget_Invoke(DispXMLHttpRequestEventTarget* 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  /* __DispXMLHttpRequestEventTarget_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * XMLHttpRequestEventTarget coclass
 */

DEFINE_GUID(CLSID_XMLHttpRequestEventTarget, 0x30510831, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510831-98b5-11cf-bb82-00aa00bdce0b") XMLHttpRequestEventTarget;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XMLHttpRequestEventTarget, 0x30510831, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CXMLHttpRequestEventTarget;
/*****************************************************************************
 * HTMLXMLHttpRequestEvents dispinterface
 */
#ifndef __HTMLXMLHttpRequestEvents_DISPINTERFACE_DEFINED__
#define __HTMLXMLHttpRequestEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLXMLHttpRequestEvents, 0x30510498, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510498-98b5-11cf-bb82-00aa00bdce0b")
HTMLXMLHttpRequestEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLXMLHttpRequestEvents, 0x30510498, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLXMLHttpRequestEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLXMLHttpRequestEvents* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLXMLHttpRequestEvents* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLXMLHttpRequestEvents* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLXMLHttpRequestEvents* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLXMLHttpRequestEvents* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLXMLHttpRequestEvents* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLXMLHttpRequestEvents* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLXMLHttpRequestEventsVtbl;
interface HTMLXMLHttpRequestEvents {
    CONST_VTBL HTMLXMLHttpRequestEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLXMLHttpRequestEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLXMLHttpRequestEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLXMLHttpRequestEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLXMLHttpRequestEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLXMLHttpRequestEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLXMLHttpRequestEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLXMLHttpRequestEvents_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 HTMLXMLHttpRequestEvents_QueryInterface(HTMLXMLHttpRequestEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLXMLHttpRequestEvents_AddRef(HTMLXMLHttpRequestEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLXMLHttpRequestEvents_Release(HTMLXMLHttpRequestEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLXMLHttpRequestEvents_GetTypeInfoCount(HTMLXMLHttpRequestEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLXMLHttpRequestEvents_GetTypeInfo(HTMLXMLHttpRequestEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLXMLHttpRequestEvents_GetIDsOfNames(HTMLXMLHttpRequestEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLXMLHttpRequestEvents_Invoke(HTMLXMLHttpRequestEvents* 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  /* __HTMLXMLHttpRequestEvents_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLXMLHttpRequest interface
 */
#ifndef __IHTMLXMLHttpRequest_INTERFACE_DEFINED__
#define __IHTMLXMLHttpRequest_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLXMLHttpRequest, 0x3051040a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051040a-98b5-11cf-bb82-00aa00bdce0b")
IHTMLXMLHttpRequest : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_readyState(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_responseBody(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_responseText(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_responseXML(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_status(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_statusText(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onreadystatechange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onreadystatechange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE abort(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE open(
        BSTR bstrMethod,
        BSTR bstrUrl,
        VARIANT varAsync,
        VARIANT varUser,
        VARIANT varPassword) = 0;

    virtual HRESULT STDMETHODCALLTYPE send(
        VARIANT varBody) = 0;

    virtual HRESULT STDMETHODCALLTYPE getAllResponseHeaders(
        BSTR *a) = 0;

    virtual HRESULT STDMETHODCALLTYPE getResponseHeader(
        BSTR bstrHeader,
        BSTR *a) = 0;

    virtual HRESULT STDMETHODCALLTYPE setRequestHeader(
        BSTR bstrHeader,
        BSTR bstrValue) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLXMLHttpRequest, 0x3051040a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLXMLHttpRequestVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLXMLHttpRequest* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLXMLHttpRequest* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLXMLHttpRequest* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLXMLHttpRequest* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLXMLHttpRequest* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLXMLHttpRequest* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLXMLHttpRequest* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLXMLHttpRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *get_readyState)(
        IHTMLXMLHttpRequest* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_responseBody)(
        IHTMLXMLHttpRequest* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_responseText)(
        IHTMLXMLHttpRequest* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_responseXML)(
        IHTMLXMLHttpRequest* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_status)(
        IHTMLXMLHttpRequest* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_statusText)(
        IHTMLXMLHttpRequest* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_onreadystatechange)(
        IHTMLXMLHttpRequest* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onreadystatechange)(
        IHTMLXMLHttpRequest* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *abort)(
        IHTMLXMLHttpRequest* This);

    HRESULT (STDMETHODCALLTYPE *open)(
        IHTMLXMLHttpRequest* This,
        BSTR bstrMethod,
        BSTR bstrUrl,
        VARIANT varAsync,
        VARIANT varUser,
        VARIANT varPassword);

    HRESULT (STDMETHODCALLTYPE *send)(
        IHTMLXMLHttpRequest* This,
        VARIANT varBody);

    HRESULT (STDMETHODCALLTYPE *getAllResponseHeaders)(
        IHTMLXMLHttpRequest* This,
        BSTR *a);

    HRESULT (STDMETHODCALLTYPE *getResponseHeader)(
        IHTMLXMLHttpRequest* This,
        BSTR bstrHeader,
        BSTR *a);

    HRESULT (STDMETHODCALLTYPE *setRequestHeader)(
        IHTMLXMLHttpRequest* This,
        BSTR bstrHeader,
        BSTR bstrValue);

    END_INTERFACE
} IHTMLXMLHttpRequestVtbl;
interface IHTMLXMLHttpRequest {
    CONST_VTBL IHTMLXMLHttpRequestVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLXMLHttpRequest_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLXMLHttpRequest_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLXMLHttpRequest_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLXMLHttpRequest_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLXMLHttpRequest_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLXMLHttpRequest_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLXMLHttpRequest_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLXMLHttpRequest methods ***/
#define IHTMLXMLHttpRequest_get_readyState(This,p) (This)->lpVtbl->get_readyState(This,p)
#define IHTMLXMLHttpRequest_get_responseBody(This,p) (This)->lpVtbl->get_responseBody(This,p)
#define IHTMLXMLHttpRequest_get_responseText(This,p) (This)->lpVtbl->get_responseText(This,p)
#define IHTMLXMLHttpRequest_get_responseXML(This,p) (This)->lpVtbl->get_responseXML(This,p)
#define IHTMLXMLHttpRequest_get_status(This,p) (This)->lpVtbl->get_status(This,p)
#define IHTMLXMLHttpRequest_get_statusText(This,p) (This)->lpVtbl->get_statusText(This,p)
#define IHTMLXMLHttpRequest_put_onreadystatechange(This,v) (This)->lpVtbl->put_onreadystatechange(This,v)
#define IHTMLXMLHttpRequest_get_onreadystatechange(This,p) (This)->lpVtbl->get_onreadystatechange(This,p)
#define IHTMLXMLHttpRequest_abort(This) (This)->lpVtbl->abort(This)
#define IHTMLXMLHttpRequest_open(This,bstrMethod,bstrUrl,varAsync,varUser,varPassword) (This)->lpVtbl->open(This,bstrMethod,bstrUrl,varAsync,varUser,varPassword)
#define IHTMLXMLHttpRequest_send(This,varBody) (This)->lpVtbl->send(This,varBody)
#define IHTMLXMLHttpRequest_getAllResponseHeaders(This,a) (This)->lpVtbl->getAllResponseHeaders(This,a)
#define IHTMLXMLHttpRequest_getResponseHeader(This,bstrHeader,a) (This)->lpVtbl->getResponseHeader(This,bstrHeader,a)
#define IHTMLXMLHttpRequest_setRequestHeader(This,bstrHeader,bstrValue) (This)->lpVtbl->setRequestHeader(This,bstrHeader,bstrValue)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLXMLHttpRequest_QueryInterface(IHTMLXMLHttpRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLXMLHttpRequest_AddRef(IHTMLXMLHttpRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLXMLHttpRequest_Release(IHTMLXMLHttpRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLXMLHttpRequest_GetTypeInfoCount(IHTMLXMLHttpRequest* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLXMLHttpRequest_GetTypeInfo(IHTMLXMLHttpRequest* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLXMLHttpRequest_GetIDsOfNames(IHTMLXMLHttpRequest* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLXMLHttpRequest_Invoke(IHTMLXMLHttpRequest* 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);
}
/*** IHTMLXMLHttpRequest methods ***/
static FORCEINLINE HRESULT IHTMLXMLHttpRequest_get_readyState(IHTMLXMLHttpRequest* This,LONG *p) {
    return This->lpVtbl->get_readyState(This,p);
}
static FORCEINLINE HRESULT IHTMLXMLHttpRequest_get_responseBody(IHTMLXMLHttpRequest* This,VARIANT *p) {
    return This->lpVtbl->get_responseBody(This,p);
}
static FORCEINLINE HRESULT IHTMLXMLHttpRequest_get_responseText(IHTMLXMLHttpRequest* This,BSTR *p) {
    return This->lpVtbl->get_responseText(This,p);
}
static FORCEINLINE HRESULT IHTMLXMLHttpRequest_get_responseXML(IHTMLXMLHttpRequest* This,IDispatch **p) {
    return This->lpVtbl->get_responseXML(This,p);
}
static FORCEINLINE HRESULT IHTMLXMLHttpRequest_get_status(IHTMLXMLHttpRequest* This,LONG *p) {
    return This->lpVtbl->get_status(This,p);
}
static FORCEINLINE HRESULT IHTMLXMLHttpRequest_get_statusText(IHTMLXMLHttpRequest* This,BSTR *p) {
    return This->lpVtbl->get_statusText(This,p);
}
static FORCEINLINE HRESULT IHTMLXMLHttpRequest_put_onreadystatechange(IHTMLXMLHttpRequest* This,VARIANT v) {
    return This->lpVtbl->put_onreadystatechange(This,v);
}
static FORCEINLINE HRESULT IHTMLXMLHttpRequest_get_onreadystatechange(IHTMLXMLHttpRequest* This,VARIANT *p) {
    return This->lpVtbl->get_onreadystatechange(This,p);
}
static FORCEINLINE HRESULT IHTMLXMLHttpRequest_abort(IHTMLXMLHttpRequest* This) {
    return This->lpVtbl->abort(This);
}
static FORCEINLINE HRESULT IHTMLXMLHttpRequest_open(IHTMLXMLHttpRequest* This,BSTR bstrMethod,BSTR bstrUrl,VARIANT varAsync,VARIANT varUser,VARIANT varPassword) {
    return This->lpVtbl->open(This,bstrMethod,bstrUrl,varAsync,varUser,varPassword);
}
static FORCEINLINE HRESULT IHTMLXMLHttpRequest_send(IHTMLXMLHttpRequest* This,VARIANT varBody) {
    return This->lpVtbl->send(This,varBody);
}
static FORCEINLINE HRESULT IHTMLXMLHttpRequest_getAllResponseHeaders(IHTMLXMLHttpRequest* This,BSTR *a) {
    return This->lpVtbl->getAllResponseHeaders(This,a);
}
static FORCEINLINE HRESULT IHTMLXMLHttpRequest_getResponseHeader(IHTMLXMLHttpRequest* This,BSTR bstrHeader,BSTR *a) {
    return This->lpVtbl->getResponseHeader(This,bstrHeader,a);
}
static FORCEINLINE HRESULT IHTMLXMLHttpRequest_setRequestHeader(IHTMLXMLHttpRequest* This,BSTR bstrHeader,BSTR bstrValue) {
    return This->lpVtbl->setRequestHeader(This,bstrHeader,bstrValue);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLXMLHttpRequest_get_readyState_Proxy(
    IHTMLXMLHttpRequest* This,
    LONG *p);
void __RPC_STUB IHTMLXMLHttpRequest_get_readyState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLXMLHttpRequest_get_responseBody_Proxy(
    IHTMLXMLHttpRequest* This,
    VARIANT *p);
void __RPC_STUB IHTMLXMLHttpRequest_get_responseBody_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLXMLHttpRequest_get_responseText_Proxy(
    IHTMLXMLHttpRequest* This,
    BSTR *p);
void __RPC_STUB IHTMLXMLHttpRequest_get_responseText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLXMLHttpRequest_get_responseXML_Proxy(
    IHTMLXMLHttpRequest* This,
    IDispatch **p);
void __RPC_STUB IHTMLXMLHttpRequest_get_responseXML_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLXMLHttpRequest_get_status_Proxy(
    IHTMLXMLHttpRequest* This,
    LONG *p);
void __RPC_STUB IHTMLXMLHttpRequest_get_status_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLXMLHttpRequest_get_statusText_Proxy(
    IHTMLXMLHttpRequest* This,
    BSTR *p);
void __RPC_STUB IHTMLXMLHttpRequest_get_statusText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLXMLHttpRequest_put_onreadystatechange_Proxy(
    IHTMLXMLHttpRequest* This,
    VARIANT v);
void __RPC_STUB IHTMLXMLHttpRequest_put_onreadystatechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLXMLHttpRequest_get_onreadystatechange_Proxy(
    IHTMLXMLHttpRequest* This,
    VARIANT *p);
void __RPC_STUB IHTMLXMLHttpRequest_get_onreadystatechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLXMLHttpRequest_abort_Proxy(
    IHTMLXMLHttpRequest* This);
void __RPC_STUB IHTMLXMLHttpRequest_abort_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLXMLHttpRequest_open_Proxy(
    IHTMLXMLHttpRequest* This,
    BSTR bstrMethod,
    BSTR bstrUrl,
    VARIANT varAsync,
    VARIANT varUser,
    VARIANT varPassword);
void __RPC_STUB IHTMLXMLHttpRequest_open_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLXMLHttpRequest_send_Proxy(
    IHTMLXMLHttpRequest* This,
    VARIANT varBody);
void __RPC_STUB IHTMLXMLHttpRequest_send_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLXMLHttpRequest_getAllResponseHeaders_Proxy(
    IHTMLXMLHttpRequest* This,
    BSTR *a);
void __RPC_STUB IHTMLXMLHttpRequest_getAllResponseHeaders_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLXMLHttpRequest_getResponseHeader_Proxy(
    IHTMLXMLHttpRequest* This,
    BSTR bstrHeader,
    BSTR *a);
void __RPC_STUB IHTMLXMLHttpRequest_getResponseHeader_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLXMLHttpRequest_setRequestHeader_Proxy(
    IHTMLXMLHttpRequest* This,
    BSTR bstrHeader,
    BSTR bstrValue);
void __RPC_STUB IHTMLXMLHttpRequest_setRequestHeader_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLXMLHttpRequest_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLXMLHttpRequest2 interface
 */
#ifndef __IHTMLXMLHttpRequest2_INTERFACE_DEFINED__
#define __IHTMLXMLHttpRequest2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLXMLHttpRequest2, 0x30510482, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510482-98b5-11cf-bb82-00aa00bdce0b")
IHTMLXMLHttpRequest2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_timeout(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_timeout(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ontimeout(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ontimeout(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLXMLHttpRequest2, 0x30510482, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLXMLHttpRequest2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLXMLHttpRequest2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLXMLHttpRequest2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLXMLHttpRequest2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLXMLHttpRequest2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLXMLHttpRequest2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLXMLHttpRequest2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLXMLHttpRequest2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLXMLHttpRequest2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_timeout)(
        IHTMLXMLHttpRequest2* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_timeout)(
        IHTMLXMLHttpRequest2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_ontimeout)(
        IHTMLXMLHttpRequest2* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ontimeout)(
        IHTMLXMLHttpRequest2* This,
        VARIANT *p);

    END_INTERFACE
} IHTMLXMLHttpRequest2Vtbl;
interface IHTMLXMLHttpRequest2 {
    CONST_VTBL IHTMLXMLHttpRequest2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLXMLHttpRequest2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLXMLHttpRequest2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLXMLHttpRequest2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLXMLHttpRequest2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLXMLHttpRequest2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLXMLHttpRequest2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLXMLHttpRequest2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLXMLHttpRequest2 methods ***/
#define IHTMLXMLHttpRequest2_put_timeout(This,v) (This)->lpVtbl->put_timeout(This,v)
#define IHTMLXMLHttpRequest2_get_timeout(This,p) (This)->lpVtbl->get_timeout(This,p)
#define IHTMLXMLHttpRequest2_put_ontimeout(This,v) (This)->lpVtbl->put_ontimeout(This,v)
#define IHTMLXMLHttpRequest2_get_ontimeout(This,p) (This)->lpVtbl->get_ontimeout(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLXMLHttpRequest2_QueryInterface(IHTMLXMLHttpRequest2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLXMLHttpRequest2_AddRef(IHTMLXMLHttpRequest2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLXMLHttpRequest2_Release(IHTMLXMLHttpRequest2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLXMLHttpRequest2_GetTypeInfoCount(IHTMLXMLHttpRequest2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLXMLHttpRequest2_GetTypeInfo(IHTMLXMLHttpRequest2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLXMLHttpRequest2_GetIDsOfNames(IHTMLXMLHttpRequest2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLXMLHttpRequest2_Invoke(IHTMLXMLHttpRequest2* 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);
}
/*** IHTMLXMLHttpRequest2 methods ***/
static FORCEINLINE HRESULT IHTMLXMLHttpRequest2_put_timeout(IHTMLXMLHttpRequest2* This,LONG v) {
    return This->lpVtbl->put_timeout(This,v);
}
static FORCEINLINE HRESULT IHTMLXMLHttpRequest2_get_timeout(IHTMLXMLHttpRequest2* This,LONG *p) {
    return This->lpVtbl->get_timeout(This,p);
}
static FORCEINLINE HRESULT IHTMLXMLHttpRequest2_put_ontimeout(IHTMLXMLHttpRequest2* This,VARIANT v) {
    return This->lpVtbl->put_ontimeout(This,v);
}
static FORCEINLINE HRESULT IHTMLXMLHttpRequest2_get_ontimeout(IHTMLXMLHttpRequest2* This,VARIANT *p) {
    return This->lpVtbl->get_ontimeout(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLXMLHttpRequest2_put_timeout_Proxy(
    IHTMLXMLHttpRequest2* This,
    LONG v);
void __RPC_STUB IHTMLXMLHttpRequest2_put_timeout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLXMLHttpRequest2_get_timeout_Proxy(
    IHTMLXMLHttpRequest2* This,
    LONG *p);
void __RPC_STUB IHTMLXMLHttpRequest2_get_timeout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLXMLHttpRequest2_put_ontimeout_Proxy(
    IHTMLXMLHttpRequest2* This,
    VARIANT v);
void __RPC_STUB IHTMLXMLHttpRequest2_put_ontimeout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLXMLHttpRequest2_get_ontimeout_Proxy(
    IHTMLXMLHttpRequest2* This,
    VARIANT *p);
void __RPC_STUB IHTMLXMLHttpRequest2_get_ontimeout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLXMLHttpRequest2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLXMLHttpRequestFactory interface
 */
#ifndef __IHTMLXMLHttpRequestFactory_INTERFACE_DEFINED__
#define __IHTMLXMLHttpRequestFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLXMLHttpRequestFactory, 0x3051040c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051040c-98b5-11cf-bb82-00aa00bdce0b")
IHTMLXMLHttpRequestFactory : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE create(
        IHTMLXMLHttpRequest **a) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLXMLHttpRequestFactory, 0x3051040c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLXMLHttpRequestFactoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLXMLHttpRequestFactory* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLXMLHttpRequestFactory* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLXMLHttpRequestFactory* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLXMLHttpRequestFactory* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLXMLHttpRequestFactory* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLXMLHttpRequestFactory* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLXMLHttpRequestFactory* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLXMLHttpRequestFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *create)(
        IHTMLXMLHttpRequestFactory* This,
        IHTMLXMLHttpRequest **a);

    END_INTERFACE
} IHTMLXMLHttpRequestFactoryVtbl;
interface IHTMLXMLHttpRequestFactory {
    CONST_VTBL IHTMLXMLHttpRequestFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLXMLHttpRequestFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLXMLHttpRequestFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLXMLHttpRequestFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLXMLHttpRequestFactory_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLXMLHttpRequestFactory_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLXMLHttpRequestFactory_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLXMLHttpRequestFactory_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLXMLHttpRequestFactory methods ***/
#define IHTMLXMLHttpRequestFactory_create(This,a) (This)->lpVtbl->create(This,a)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLXMLHttpRequestFactory_QueryInterface(IHTMLXMLHttpRequestFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLXMLHttpRequestFactory_AddRef(IHTMLXMLHttpRequestFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLXMLHttpRequestFactory_Release(IHTMLXMLHttpRequestFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLXMLHttpRequestFactory_GetTypeInfoCount(IHTMLXMLHttpRequestFactory* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLXMLHttpRequestFactory_GetTypeInfo(IHTMLXMLHttpRequestFactory* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLXMLHttpRequestFactory_GetIDsOfNames(IHTMLXMLHttpRequestFactory* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLXMLHttpRequestFactory_Invoke(IHTMLXMLHttpRequestFactory* 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);
}
/*** IHTMLXMLHttpRequestFactory methods ***/
static FORCEINLINE HRESULT IHTMLXMLHttpRequestFactory_create(IHTMLXMLHttpRequestFactory* This,IHTMLXMLHttpRequest **a) {
    return This->lpVtbl->create(This,a);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLXMLHttpRequestFactory_create_Proxy(
    IHTMLXMLHttpRequestFactory* This,
    IHTMLXMLHttpRequest **a);
void __RPC_STUB IHTMLXMLHttpRequestFactory_create_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLXMLHttpRequestFactory_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLXMLHttpRequest dispinterface
 */
#ifndef __DispHTMLXMLHttpRequest_DISPINTERFACE_DEFINED__
#define __DispHTMLXMLHttpRequest_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLXMLHttpRequest, 0x3050f596, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f596-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLXMLHttpRequest : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLXMLHttpRequest, 0x3050f596, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLXMLHttpRequestVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLXMLHttpRequest* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLXMLHttpRequest* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLXMLHttpRequest* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLXMLHttpRequest* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLXMLHttpRequest* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLXMLHttpRequest* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLXMLHttpRequest* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLXMLHttpRequestVtbl;
interface DispHTMLXMLHttpRequest {
    CONST_VTBL DispHTMLXMLHttpRequestVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLXMLHttpRequest_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLXMLHttpRequest_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLXMLHttpRequest_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLXMLHttpRequest_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLXMLHttpRequest_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLXMLHttpRequest_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLXMLHttpRequest_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 DispHTMLXMLHttpRequest_QueryInterface(DispHTMLXMLHttpRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLXMLHttpRequest_AddRef(DispHTMLXMLHttpRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLXMLHttpRequest_Release(DispHTMLXMLHttpRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLXMLHttpRequest_GetTypeInfoCount(DispHTMLXMLHttpRequest* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLXMLHttpRequest_GetTypeInfo(DispHTMLXMLHttpRequest* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLXMLHttpRequest_GetIDsOfNames(DispHTMLXMLHttpRequest* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLXMLHttpRequest_Invoke(DispHTMLXMLHttpRequest* 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  /* __DispHTMLXMLHttpRequest_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLXMLHttpRequest coclass
 */

DEFINE_GUID(CLSID_HTMLXMLHttpRequest, 0x3051040b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3051040b-98b5-11cf-bb82-00aa00bdce0b") HTMLXMLHttpRequest;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLXMLHttpRequest, 0x3051040b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CXMLHttpRequest;
/*****************************************************************************
 * HTMLXMLHttpRequestFactory coclass
 */

DEFINE_GUID(CLSID_HTMLXMLHttpRequestFactory, 0x3051040d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3051040d-98b5-11cf-bb82-00aa00bdce0b") HTMLXMLHttpRequestFactory;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLXMLHttpRequestFactory, 0x3051040d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CXMLHttpRequestFactory;
typedef enum _svgAngleType {
    SVG_ANGLETYPE_UNKNOWN = 0,
    SVG_ANGLETYPE_UNSPECIFIED = 1,
    SVG_ANGLETYPE_DEG = 2,
    SVG_ANGLETYPE_RAD = 3,
    SVG_ANGLETYPE_GRAD = 4,
    svgAngleType_Max = 0x7fffffff
} svgAngleType;
/*****************************************************************************
 * ISVGAngle interface
 */
#ifndef __ISVGAngle_INTERFACE_DEFINED__
#define __ISVGAngle_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGAngle, 0x305104d3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104d3-98b5-11cf-bb82-00aa00bdce0b")
ISVGAngle : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_unitType(
        short v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_unitType(
        short *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_value(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_value(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_valueInSpecifiedUnits(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_valueInSpecifiedUnits(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_valueAsString(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_valueAsString(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE newValueSpecifiedUnits(
        short unitType,
        float valueInSpecifiedUnits) = 0;

    virtual HRESULT STDMETHODCALLTYPE convertToSpecifiedUnits(
        short unitType) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGAngle, 0x305104d3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGAngleVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGAngle* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGAngle* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGAngle* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGAngle* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGAngle* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGAngle* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGAngle* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGAngle methods ***/
    HRESULT (STDMETHODCALLTYPE *put_unitType)(
        ISVGAngle* This,
        short v);

    HRESULT (STDMETHODCALLTYPE *get_unitType)(
        ISVGAngle* This,
        short *p);

    HRESULT (STDMETHODCALLTYPE *put_value)(
        ISVGAngle* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_value)(
        ISVGAngle* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_valueInSpecifiedUnits)(
        ISVGAngle* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_valueInSpecifiedUnits)(
        ISVGAngle* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_valueAsString)(
        ISVGAngle* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_valueAsString)(
        ISVGAngle* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *newValueSpecifiedUnits)(
        ISVGAngle* This,
        short unitType,
        float valueInSpecifiedUnits);

    HRESULT (STDMETHODCALLTYPE *convertToSpecifiedUnits)(
        ISVGAngle* This,
        short unitType);

    END_INTERFACE
} ISVGAngleVtbl;
interface ISVGAngle {
    CONST_VTBL ISVGAngleVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGAngle_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGAngle_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGAngle_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGAngle_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGAngle_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGAngle_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGAngle_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGAngle methods ***/
#define ISVGAngle_put_unitType(This,v) (This)->lpVtbl->put_unitType(This,v)
#define ISVGAngle_get_unitType(This,p) (This)->lpVtbl->get_unitType(This,p)
#define ISVGAngle_put_value(This,v) (This)->lpVtbl->put_value(This,v)
#define ISVGAngle_get_value(This,p) (This)->lpVtbl->get_value(This,p)
#define ISVGAngle_put_valueInSpecifiedUnits(This,v) (This)->lpVtbl->put_valueInSpecifiedUnits(This,v)
#define ISVGAngle_get_valueInSpecifiedUnits(This,p) (This)->lpVtbl->get_valueInSpecifiedUnits(This,p)
#define ISVGAngle_put_valueAsString(This,v) (This)->lpVtbl->put_valueAsString(This,v)
#define ISVGAngle_get_valueAsString(This,p) (This)->lpVtbl->get_valueAsString(This,p)
#define ISVGAngle_newValueSpecifiedUnits(This,unitType,valueInSpecifiedUnits) (This)->lpVtbl->newValueSpecifiedUnits(This,unitType,valueInSpecifiedUnits)
#define ISVGAngle_convertToSpecifiedUnits(This,unitType) (This)->lpVtbl->convertToSpecifiedUnits(This,unitType)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGAngle_QueryInterface(ISVGAngle* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGAngle_AddRef(ISVGAngle* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGAngle_Release(ISVGAngle* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGAngle_GetTypeInfoCount(ISVGAngle* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGAngle_GetTypeInfo(ISVGAngle* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGAngle_GetIDsOfNames(ISVGAngle* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGAngle_Invoke(ISVGAngle* 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);
}
/*** ISVGAngle methods ***/
static FORCEINLINE HRESULT ISVGAngle_put_unitType(ISVGAngle* This,short v) {
    return This->lpVtbl->put_unitType(This,v);
}
static FORCEINLINE HRESULT ISVGAngle_get_unitType(ISVGAngle* This,short *p) {
    return This->lpVtbl->get_unitType(This,p);
}
static FORCEINLINE HRESULT ISVGAngle_put_value(ISVGAngle* This,float v) {
    return This->lpVtbl->put_value(This,v);
}
static FORCEINLINE HRESULT ISVGAngle_get_value(ISVGAngle* This,float *p) {
    return This->lpVtbl->get_value(This,p);
}
static FORCEINLINE HRESULT ISVGAngle_put_valueInSpecifiedUnits(ISVGAngle* This,float v) {
    return This->lpVtbl->put_valueInSpecifiedUnits(This,v);
}
static FORCEINLINE HRESULT ISVGAngle_get_valueInSpecifiedUnits(ISVGAngle* This,float *p) {
    return This->lpVtbl->get_valueInSpecifiedUnits(This,p);
}
static FORCEINLINE HRESULT ISVGAngle_put_valueAsString(ISVGAngle* This,BSTR v) {
    return This->lpVtbl->put_valueAsString(This,v);
}
static FORCEINLINE HRESULT ISVGAngle_get_valueAsString(ISVGAngle* This,BSTR *p) {
    return This->lpVtbl->get_valueAsString(This,p);
}
static FORCEINLINE HRESULT ISVGAngle_newValueSpecifiedUnits(ISVGAngle* This,short unitType,float valueInSpecifiedUnits) {
    return This->lpVtbl->newValueSpecifiedUnits(This,unitType,valueInSpecifiedUnits);
}
static FORCEINLINE HRESULT ISVGAngle_convertToSpecifiedUnits(ISVGAngle* This,short unitType) {
    return This->lpVtbl->convertToSpecifiedUnits(This,unitType);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGAngle_put_unitType_Proxy(
    ISVGAngle* This,
    short v);
void __RPC_STUB ISVGAngle_put_unitType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAngle_get_unitType_Proxy(
    ISVGAngle* This,
    short *p);
void __RPC_STUB ISVGAngle_get_unitType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAngle_put_value_Proxy(
    ISVGAngle* This,
    float v);
void __RPC_STUB ISVGAngle_put_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAngle_get_value_Proxy(
    ISVGAngle* This,
    float *p);
void __RPC_STUB ISVGAngle_get_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAngle_put_valueInSpecifiedUnits_Proxy(
    ISVGAngle* This,
    float v);
void __RPC_STUB ISVGAngle_put_valueInSpecifiedUnits_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAngle_get_valueInSpecifiedUnits_Proxy(
    ISVGAngle* This,
    float *p);
void __RPC_STUB ISVGAngle_get_valueInSpecifiedUnits_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAngle_put_valueAsString_Proxy(
    ISVGAngle* This,
    BSTR v);
void __RPC_STUB ISVGAngle_put_valueAsString_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAngle_get_valueAsString_Proxy(
    ISVGAngle* This,
    BSTR *p);
void __RPC_STUB ISVGAngle_get_valueAsString_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAngle_newValueSpecifiedUnits_Proxy(
    ISVGAngle* This,
    short unitType,
    float valueInSpecifiedUnits);
void __RPC_STUB ISVGAngle_newValueSpecifiedUnits_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAngle_convertToSpecifiedUnits_Proxy(
    ISVGAngle* This,
    short unitType);
void __RPC_STUB ISVGAngle_convertToSpecifiedUnits_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGAngle_INTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGAngle coclass
 */

DEFINE_GUID(CLSID_SVGAngle, 0x30510584, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510584-98b5-11cf-bb82-00aa00bdce0b") SVGAngle;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGAngle, 0x30510584, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGAngle;
typedef enum _svgExternalResourcesRequired {
    svgExternalResourcesRequiredFalse = 0,
    svgExternalResourcesRequiredTrue = 1,
    svgExternalResourcesRequired_Max = 0x7fffffff
} svgExternalResourcesRequired;
#ifndef __ISVGElement_FWD_DEFINED__
#define __ISVGElement_FWD_DEFINED__
typedef interface ISVGElement ISVGElement;
#endif

#ifndef __ISVGRect_FWD_DEFINED__
#define __ISVGRect_FWD_DEFINED__
typedef interface ISVGRect ISVGRect;
#endif

#ifndef __ISVGMatrix_FWD_DEFINED__
#define __ISVGMatrix_FWD_DEFINED__
typedef interface ISVGMatrix ISVGMatrix;
#endif

#ifndef __ISVGStringList_FWD_DEFINED__
#define __ISVGStringList_FWD_DEFINED__
typedef interface ISVGStringList ISVGStringList;
#endif

#ifndef __ISVGAnimatedRect_FWD_DEFINED__
#define __ISVGAnimatedRect_FWD_DEFINED__
typedef interface ISVGAnimatedRect ISVGAnimatedRect;
#endif

#ifndef __ISVGAnimatedString_FWD_DEFINED__
#define __ISVGAnimatedString_FWD_DEFINED__
typedef interface ISVGAnimatedString ISVGAnimatedString;
#endif

#ifndef __ISVGAnimatedBoolean_FWD_DEFINED__
#define __ISVGAnimatedBoolean_FWD_DEFINED__
typedef interface ISVGAnimatedBoolean ISVGAnimatedBoolean;
#endif

#ifndef __ISVGAnimatedTransformList_FWD_DEFINED__
#define __ISVGAnimatedTransformList_FWD_DEFINED__
typedef interface ISVGAnimatedTransformList ISVGAnimatedTransformList;
#endif

#ifndef __ISVGAnimatedPreserveAspectRatio_FWD_DEFINED__
#define __ISVGAnimatedPreserveAspectRatio_FWD_DEFINED__
typedef interface ISVGAnimatedPreserveAspectRatio ISVGAnimatedPreserveAspectRatio;
#endif

/*****************************************************************************
 * ISVGStylable interface
 */
#ifndef __ISVGStylable_INTERFACE_DEFINED__
#define __ISVGStylable_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGStylable, 0x305104da, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104da-98b5-11cf-bb82-00aa00bdce0b")
ISVGStylable : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_className(
        ISVGAnimatedString **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGStylable, 0x305104da, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGStylableVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGStylable* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGStylable* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGStylable* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGStylable* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGStylable* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGStylable* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGStylable* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGStylable methods ***/
    HRESULT (STDMETHODCALLTYPE *get_className)(
        ISVGStylable* This,
        ISVGAnimatedString **p);

    END_INTERFACE
} ISVGStylableVtbl;
interface ISVGStylable {
    CONST_VTBL ISVGStylableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGStylable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGStylable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGStylable_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGStylable_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGStylable_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGStylable_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGStylable_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGStylable methods ***/
#define ISVGStylable_get_className(This,p) (This)->lpVtbl->get_className(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGStylable_QueryInterface(ISVGStylable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGStylable_AddRef(ISVGStylable* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGStylable_Release(ISVGStylable* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGStylable_GetTypeInfoCount(ISVGStylable* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGStylable_GetTypeInfo(ISVGStylable* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGStylable_GetIDsOfNames(ISVGStylable* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGStylable_Invoke(ISVGStylable* 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);
}
/*** ISVGStylable methods ***/
static FORCEINLINE HRESULT ISVGStylable_get_className(ISVGStylable* This,ISVGAnimatedString **p) {
    return This->lpVtbl->get_className(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGStylable_get_className_Proxy(
    ISVGStylable* This,
    ISVGAnimatedString **p);
void __RPC_STUB ISVGStylable_get_className_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGStylable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGLocatable interface
 */
#ifndef __ISVGLocatable_INTERFACE_DEFINED__
#define __ISVGLocatable_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGLocatable, 0x305104db, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104db-98b5-11cf-bb82-00aa00bdce0b")
ISVGLocatable : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_nearestViewportElement(
        ISVGElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_farthestViewportElement(
        ISVGElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE getBBox(
        ISVGRect **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE getCTM(
        ISVGMatrix **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE getScreenCTM(
        ISVGMatrix **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE getTransformToElement(
        ISVGElement *pElement,
        ISVGMatrix **ppResult) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGLocatable, 0x305104db, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGLocatableVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGLocatable* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGLocatable* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGLocatable* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGLocatable* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGLocatable* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGLocatable* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGLocatable* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGLocatable methods ***/
    HRESULT (STDMETHODCALLTYPE *get_nearestViewportElement)(
        ISVGLocatable* This,
        ISVGElement **p);

    HRESULT (STDMETHODCALLTYPE *get_farthestViewportElement)(
        ISVGLocatable* This,
        ISVGElement **p);

    HRESULT (STDMETHODCALLTYPE *getBBox)(
        ISVGLocatable* This,
        ISVGRect **ppResult);

    HRESULT (STDMETHODCALLTYPE *getCTM)(
        ISVGLocatable* This,
        ISVGMatrix **ppResult);

    HRESULT (STDMETHODCALLTYPE *getScreenCTM)(
        ISVGLocatable* This,
        ISVGMatrix **ppResult);

    HRESULT (STDMETHODCALLTYPE *getTransformToElement)(
        ISVGLocatable* This,
        ISVGElement *pElement,
        ISVGMatrix **ppResult);

    END_INTERFACE
} ISVGLocatableVtbl;
interface ISVGLocatable {
    CONST_VTBL ISVGLocatableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGLocatable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGLocatable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGLocatable_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGLocatable_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGLocatable_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGLocatable_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGLocatable_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGLocatable methods ***/
#define ISVGLocatable_get_nearestViewportElement(This,p) (This)->lpVtbl->get_nearestViewportElement(This,p)
#define ISVGLocatable_get_farthestViewportElement(This,p) (This)->lpVtbl->get_farthestViewportElement(This,p)
#define ISVGLocatable_getBBox(This,ppResult) (This)->lpVtbl->getBBox(This,ppResult)
#define ISVGLocatable_getCTM(This,ppResult) (This)->lpVtbl->getCTM(This,ppResult)
#define ISVGLocatable_getScreenCTM(This,ppResult) (This)->lpVtbl->getScreenCTM(This,ppResult)
#define ISVGLocatable_getTransformToElement(This,pElement,ppResult) (This)->lpVtbl->getTransformToElement(This,pElement,ppResult)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGLocatable_QueryInterface(ISVGLocatable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGLocatable_AddRef(ISVGLocatable* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGLocatable_Release(ISVGLocatable* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGLocatable_GetTypeInfoCount(ISVGLocatable* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGLocatable_GetTypeInfo(ISVGLocatable* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGLocatable_GetIDsOfNames(ISVGLocatable* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGLocatable_Invoke(ISVGLocatable* 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);
}
/*** ISVGLocatable methods ***/
static FORCEINLINE HRESULT ISVGLocatable_get_nearestViewportElement(ISVGLocatable* This,ISVGElement **p) {
    return This->lpVtbl->get_nearestViewportElement(This,p);
}
static FORCEINLINE HRESULT ISVGLocatable_get_farthestViewportElement(ISVGLocatable* This,ISVGElement **p) {
    return This->lpVtbl->get_farthestViewportElement(This,p);
}
static FORCEINLINE HRESULT ISVGLocatable_getBBox(ISVGLocatable* This,ISVGRect **ppResult) {
    return This->lpVtbl->getBBox(This,ppResult);
}
static FORCEINLINE HRESULT ISVGLocatable_getCTM(ISVGLocatable* This,ISVGMatrix **ppResult) {
    return This->lpVtbl->getCTM(This,ppResult);
}
static FORCEINLINE HRESULT ISVGLocatable_getScreenCTM(ISVGLocatable* This,ISVGMatrix **ppResult) {
    return This->lpVtbl->getScreenCTM(This,ppResult);
}
static FORCEINLINE HRESULT ISVGLocatable_getTransformToElement(ISVGLocatable* This,ISVGElement *pElement,ISVGMatrix **ppResult) {
    return This->lpVtbl->getTransformToElement(This,pElement,ppResult);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGLocatable_get_nearestViewportElement_Proxy(
    ISVGLocatable* This,
    ISVGElement **p);
void __RPC_STUB ISVGLocatable_get_nearestViewportElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLocatable_get_farthestViewportElement_Proxy(
    ISVGLocatable* This,
    ISVGElement **p);
void __RPC_STUB ISVGLocatable_get_farthestViewportElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLocatable_getBBox_Proxy(
    ISVGLocatable* This,
    ISVGRect **ppResult);
void __RPC_STUB ISVGLocatable_getBBox_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLocatable_getCTM_Proxy(
    ISVGLocatable* This,
    ISVGMatrix **ppResult);
void __RPC_STUB ISVGLocatable_getCTM_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLocatable_getScreenCTM_Proxy(
    ISVGLocatable* This,
    ISVGMatrix **ppResult);
void __RPC_STUB ISVGLocatable_getScreenCTM_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLocatable_getTransformToElement_Proxy(
    ISVGLocatable* This,
    ISVGElement *pElement,
    ISVGMatrix **ppResult);
void __RPC_STUB ISVGLocatable_getTransformToElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGLocatable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGTransformable interface
 */
#ifndef __ISVGTransformable_INTERFACE_DEFINED__
#define __ISVGTransformable_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGTransformable, 0x305104dc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104dc-98b5-11cf-bb82-00aa00bdce0b")
ISVGTransformable : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_transform(
        ISVGAnimatedTransformList **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGTransformable, 0x305104dc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGTransformableVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGTransformable* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGTransformable* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGTransformable* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGTransformable* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGTransformable* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGTransformable* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGTransformable* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGTransformable methods ***/
    HRESULT (STDMETHODCALLTYPE *get_transform)(
        ISVGTransformable* This,
        ISVGAnimatedTransformList **p);

    END_INTERFACE
} ISVGTransformableVtbl;
interface ISVGTransformable {
    CONST_VTBL ISVGTransformableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGTransformable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGTransformable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGTransformable_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGTransformable_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGTransformable_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGTransformable_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGTransformable_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGTransformable methods ***/
#define ISVGTransformable_get_transform(This,p) (This)->lpVtbl->get_transform(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGTransformable_QueryInterface(ISVGTransformable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGTransformable_AddRef(ISVGTransformable* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGTransformable_Release(ISVGTransformable* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGTransformable_GetTypeInfoCount(ISVGTransformable* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGTransformable_GetTypeInfo(ISVGTransformable* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGTransformable_GetIDsOfNames(ISVGTransformable* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGTransformable_Invoke(ISVGTransformable* 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);
}
/*** ISVGTransformable methods ***/
static FORCEINLINE HRESULT ISVGTransformable_get_transform(ISVGTransformable* This,ISVGAnimatedTransformList **p) {
    return This->lpVtbl->get_transform(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGTransformable_get_transform_Proxy(
    ISVGTransformable* This,
    ISVGAnimatedTransformList **p);
void __RPC_STUB ISVGTransformable_get_transform_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGTransformable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGTests interface
 */
#ifndef __ISVGTests_INTERFACE_DEFINED__
#define __ISVGTests_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGTests, 0x305104dd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104dd-98b5-11cf-bb82-00aa00bdce0b")
ISVGTests : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_requiredFeatures(
        ISVGStringList **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_requiredExtensions(
        ISVGStringList **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_systemLanguage(
        ISVGStringList **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE hasExtension(
        BSTR extension,
        VARIANT_BOOL *pResult) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGTests, 0x305104dd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGTestsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGTests* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGTests* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGTests* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGTests* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGTests* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGTests* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGTests* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGTests methods ***/
    HRESULT (STDMETHODCALLTYPE *get_requiredFeatures)(
        ISVGTests* This,
        ISVGStringList **p);

    HRESULT (STDMETHODCALLTYPE *get_requiredExtensions)(
        ISVGTests* This,
        ISVGStringList **p);

    HRESULT (STDMETHODCALLTYPE *get_systemLanguage)(
        ISVGTests* This,
        ISVGStringList **p);

    HRESULT (STDMETHODCALLTYPE *hasExtension)(
        ISVGTests* This,
        BSTR extension,
        VARIANT_BOOL *pResult);

    END_INTERFACE
} ISVGTestsVtbl;
interface ISVGTests {
    CONST_VTBL ISVGTestsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGTests_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGTests_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGTests_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGTests_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGTests_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGTests_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGTests_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGTests methods ***/
#define ISVGTests_get_requiredFeatures(This,p) (This)->lpVtbl->get_requiredFeatures(This,p)
#define ISVGTests_get_requiredExtensions(This,p) (This)->lpVtbl->get_requiredExtensions(This,p)
#define ISVGTests_get_systemLanguage(This,p) (This)->lpVtbl->get_systemLanguage(This,p)
#define ISVGTests_hasExtension(This,extension,pResult) (This)->lpVtbl->hasExtension(This,extension,pResult)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGTests_QueryInterface(ISVGTests* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGTests_AddRef(ISVGTests* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGTests_Release(ISVGTests* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGTests_GetTypeInfoCount(ISVGTests* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGTests_GetTypeInfo(ISVGTests* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGTests_GetIDsOfNames(ISVGTests* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGTests_Invoke(ISVGTests* 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);
}
/*** ISVGTests methods ***/
static FORCEINLINE HRESULT ISVGTests_get_requiredFeatures(ISVGTests* This,ISVGStringList **p) {
    return This->lpVtbl->get_requiredFeatures(This,p);
}
static FORCEINLINE HRESULT ISVGTests_get_requiredExtensions(ISVGTests* This,ISVGStringList **p) {
    return This->lpVtbl->get_requiredExtensions(This,p);
}
static FORCEINLINE HRESULT ISVGTests_get_systemLanguage(ISVGTests* This,ISVGStringList **p) {
    return This->lpVtbl->get_systemLanguage(This,p);
}
static FORCEINLINE HRESULT ISVGTests_hasExtension(ISVGTests* This,BSTR extension,VARIANT_BOOL *pResult) {
    return This->lpVtbl->hasExtension(This,extension,pResult);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGTests_get_requiredFeatures_Proxy(
    ISVGTests* This,
    ISVGStringList **p);
void __RPC_STUB ISVGTests_get_requiredFeatures_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTests_get_requiredExtensions_Proxy(
    ISVGTests* This,
    ISVGStringList **p);
void __RPC_STUB ISVGTests_get_requiredExtensions_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTests_get_systemLanguage_Proxy(
    ISVGTests* This,
    ISVGStringList **p);
void __RPC_STUB ISVGTests_get_systemLanguage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTests_hasExtension_Proxy(
    ISVGTests* This,
    BSTR extension,
    VARIANT_BOOL *pResult);
void __RPC_STUB ISVGTests_hasExtension_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGTests_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGLangSpace interface
 */
#ifndef __ISVGLangSpace_INTERFACE_DEFINED__
#define __ISVGLangSpace_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGLangSpace, 0x305104de, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104de-98b5-11cf-bb82-00aa00bdce0b")
ISVGLangSpace : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_xmllang(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_xmllang(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_xmlspace(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_xmlspace(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGLangSpace, 0x305104de, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGLangSpaceVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGLangSpace* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGLangSpace* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGLangSpace* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGLangSpace* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGLangSpace* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGLangSpace* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGLangSpace* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGLangSpace methods ***/
    HRESULT (STDMETHODCALLTYPE *put_xmllang)(
        ISVGLangSpace* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_xmllang)(
        ISVGLangSpace* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_xmlspace)(
        ISVGLangSpace* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_xmlspace)(
        ISVGLangSpace* This,
        BSTR *p);

    END_INTERFACE
} ISVGLangSpaceVtbl;
interface ISVGLangSpace {
    CONST_VTBL ISVGLangSpaceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGLangSpace_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGLangSpace_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGLangSpace_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGLangSpace_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGLangSpace_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGLangSpace_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGLangSpace_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGLangSpace methods ***/
#define ISVGLangSpace_put_xmllang(This,v) (This)->lpVtbl->put_xmllang(This,v)
#define ISVGLangSpace_get_xmllang(This,p) (This)->lpVtbl->get_xmllang(This,p)
#define ISVGLangSpace_put_xmlspace(This,v) (This)->lpVtbl->put_xmlspace(This,v)
#define ISVGLangSpace_get_xmlspace(This,p) (This)->lpVtbl->get_xmlspace(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGLangSpace_QueryInterface(ISVGLangSpace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGLangSpace_AddRef(ISVGLangSpace* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGLangSpace_Release(ISVGLangSpace* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGLangSpace_GetTypeInfoCount(ISVGLangSpace* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGLangSpace_GetTypeInfo(ISVGLangSpace* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGLangSpace_GetIDsOfNames(ISVGLangSpace* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGLangSpace_Invoke(ISVGLangSpace* 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);
}
/*** ISVGLangSpace methods ***/
static FORCEINLINE HRESULT ISVGLangSpace_put_xmllang(ISVGLangSpace* This,BSTR v) {
    return This->lpVtbl->put_xmllang(This,v);
}
static FORCEINLINE HRESULT ISVGLangSpace_get_xmllang(ISVGLangSpace* This,BSTR *p) {
    return This->lpVtbl->get_xmllang(This,p);
}
static FORCEINLINE HRESULT ISVGLangSpace_put_xmlspace(ISVGLangSpace* This,BSTR v) {
    return This->lpVtbl->put_xmlspace(This,v);
}
static FORCEINLINE HRESULT ISVGLangSpace_get_xmlspace(ISVGLangSpace* This,BSTR *p) {
    return This->lpVtbl->get_xmlspace(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGLangSpace_put_xmllang_Proxy(
    ISVGLangSpace* This,
    BSTR v);
void __RPC_STUB ISVGLangSpace_put_xmllang_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLangSpace_get_xmllang_Proxy(
    ISVGLangSpace* This,
    BSTR *p);
void __RPC_STUB ISVGLangSpace_get_xmllang_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLangSpace_put_xmlspace_Proxy(
    ISVGLangSpace* This,
    BSTR v);
void __RPC_STUB ISVGLangSpace_put_xmlspace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLangSpace_get_xmlspace_Proxy(
    ISVGLangSpace* This,
    BSTR *p);
void __RPC_STUB ISVGLangSpace_get_xmlspace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGLangSpace_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGExternalResourcesRequired interface
 */
#ifndef __ISVGExternalResourcesRequired_INTERFACE_DEFINED__
#define __ISVGExternalResourcesRequired_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGExternalResourcesRequired, 0x305104df, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104df-98b5-11cf-bb82-00aa00bdce0b")
ISVGExternalResourcesRequired : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_externalResourcesRequired(
        ISVGAnimatedBoolean **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGExternalResourcesRequired, 0x305104df, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGExternalResourcesRequiredVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGExternalResourcesRequired* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGExternalResourcesRequired* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGExternalResourcesRequired* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGExternalResourcesRequired* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGExternalResourcesRequired* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGExternalResourcesRequired* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGExternalResourcesRequired* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGExternalResourcesRequired methods ***/
    HRESULT (STDMETHODCALLTYPE *get_externalResourcesRequired)(
        ISVGExternalResourcesRequired* This,
        ISVGAnimatedBoolean **p);

    END_INTERFACE
} ISVGExternalResourcesRequiredVtbl;
interface ISVGExternalResourcesRequired {
    CONST_VTBL ISVGExternalResourcesRequiredVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGExternalResourcesRequired_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGExternalResourcesRequired_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGExternalResourcesRequired_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGExternalResourcesRequired_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGExternalResourcesRequired_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGExternalResourcesRequired_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGExternalResourcesRequired_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGExternalResourcesRequired methods ***/
#define ISVGExternalResourcesRequired_get_externalResourcesRequired(This,p) (This)->lpVtbl->get_externalResourcesRequired(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGExternalResourcesRequired_QueryInterface(ISVGExternalResourcesRequired* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGExternalResourcesRequired_AddRef(ISVGExternalResourcesRequired* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGExternalResourcesRequired_Release(ISVGExternalResourcesRequired* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGExternalResourcesRequired_GetTypeInfoCount(ISVGExternalResourcesRequired* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGExternalResourcesRequired_GetTypeInfo(ISVGExternalResourcesRequired* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGExternalResourcesRequired_GetIDsOfNames(ISVGExternalResourcesRequired* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGExternalResourcesRequired_Invoke(ISVGExternalResourcesRequired* 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);
}
/*** ISVGExternalResourcesRequired methods ***/
static FORCEINLINE HRESULT ISVGExternalResourcesRequired_get_externalResourcesRequired(ISVGExternalResourcesRequired* This,ISVGAnimatedBoolean **p) {
    return This->lpVtbl->get_externalResourcesRequired(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGExternalResourcesRequired_get_externalResourcesRequired_Proxy(
    ISVGExternalResourcesRequired* This,
    ISVGAnimatedBoolean **p);
void __RPC_STUB ISVGExternalResourcesRequired_get_externalResourcesRequired_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGExternalResourcesRequired_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGFitToViewBox interface
 */
#ifndef __ISVGFitToViewBox_INTERFACE_DEFINED__
#define __ISVGFitToViewBox_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGFitToViewBox, 0x305104e0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104e0-98b5-11cf-bb82-00aa00bdce0b")
ISVGFitToViewBox : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_viewBox(
        ISVGAnimatedRect **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_preserveAspectRatio(
        ISVGAnimatedPreserveAspectRatio *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_preserveAspectRatio(
        ISVGAnimatedPreserveAspectRatio **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGFitToViewBox, 0x305104e0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGFitToViewBoxVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGFitToViewBox* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGFitToViewBox* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGFitToViewBox* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGFitToViewBox* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGFitToViewBox* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGFitToViewBox* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGFitToViewBox* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGFitToViewBox methods ***/
    HRESULT (STDMETHODCALLTYPE *get_viewBox)(
        ISVGFitToViewBox* This,
        ISVGAnimatedRect **p);

    HRESULT (STDMETHODCALLTYPE *putref_preserveAspectRatio)(
        ISVGFitToViewBox* This,
        ISVGAnimatedPreserveAspectRatio *v);

    HRESULT (STDMETHODCALLTYPE *get_preserveAspectRatio)(
        ISVGFitToViewBox* This,
        ISVGAnimatedPreserveAspectRatio **p);

    END_INTERFACE
} ISVGFitToViewBoxVtbl;
interface ISVGFitToViewBox {
    CONST_VTBL ISVGFitToViewBoxVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGFitToViewBox_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGFitToViewBox_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGFitToViewBox_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGFitToViewBox_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGFitToViewBox_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGFitToViewBox_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGFitToViewBox_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGFitToViewBox methods ***/
#define ISVGFitToViewBox_get_viewBox(This,p) (This)->lpVtbl->get_viewBox(This,p)
#define ISVGFitToViewBox_putref_preserveAspectRatio(This,v) (This)->lpVtbl->putref_preserveAspectRatio(This,v)
#define ISVGFitToViewBox_get_preserveAspectRatio(This,p) (This)->lpVtbl->get_preserveAspectRatio(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGFitToViewBox_QueryInterface(ISVGFitToViewBox* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGFitToViewBox_AddRef(ISVGFitToViewBox* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGFitToViewBox_Release(ISVGFitToViewBox* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGFitToViewBox_GetTypeInfoCount(ISVGFitToViewBox* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGFitToViewBox_GetTypeInfo(ISVGFitToViewBox* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGFitToViewBox_GetIDsOfNames(ISVGFitToViewBox* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGFitToViewBox_Invoke(ISVGFitToViewBox* 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);
}
/*** ISVGFitToViewBox methods ***/
static FORCEINLINE HRESULT ISVGFitToViewBox_get_viewBox(ISVGFitToViewBox* This,ISVGAnimatedRect **p) {
    return This->lpVtbl->get_viewBox(This,p);
}
static FORCEINLINE HRESULT ISVGFitToViewBox_putref_preserveAspectRatio(ISVGFitToViewBox* This,ISVGAnimatedPreserveAspectRatio *v) {
    return This->lpVtbl->putref_preserveAspectRatio(This,v);
}
static FORCEINLINE HRESULT ISVGFitToViewBox_get_preserveAspectRatio(ISVGFitToViewBox* This,ISVGAnimatedPreserveAspectRatio **p) {
    return This->lpVtbl->get_preserveAspectRatio(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGFitToViewBox_get_viewBox_Proxy(
    ISVGFitToViewBox* This,
    ISVGAnimatedRect **p);
void __RPC_STUB ISVGFitToViewBox_get_viewBox_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGFitToViewBox_putref_preserveAspectRatio_Proxy(
    ISVGFitToViewBox* This,
    ISVGAnimatedPreserveAspectRatio *v);
void __RPC_STUB ISVGFitToViewBox_putref_preserveAspectRatio_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGFitToViewBox_get_preserveAspectRatio_Proxy(
    ISVGFitToViewBox* This,
    ISVGAnimatedPreserveAspectRatio **p);
void __RPC_STUB ISVGFitToViewBox_get_preserveAspectRatio_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGFitToViewBox_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGZoomAndPan interface
 */
#ifndef __ISVGZoomAndPan_INTERFACE_DEFINED__
#define __ISVGZoomAndPan_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGZoomAndPan, 0x305104e1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104e1-98b5-11cf-bb82-00aa00bdce0b")
ISVGZoomAndPan : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_zoomAndPan(
        short *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGZoomAndPan, 0x305104e1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGZoomAndPanVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGZoomAndPan* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGZoomAndPan* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGZoomAndPan* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGZoomAndPan* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGZoomAndPan* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGZoomAndPan* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGZoomAndPan* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGZoomAndPan methods ***/
    HRESULT (STDMETHODCALLTYPE *get_zoomAndPan)(
        ISVGZoomAndPan* This,
        short *p);

    END_INTERFACE
} ISVGZoomAndPanVtbl;
interface ISVGZoomAndPan {
    CONST_VTBL ISVGZoomAndPanVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGZoomAndPan_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGZoomAndPan_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGZoomAndPan_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGZoomAndPan_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGZoomAndPan_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGZoomAndPan_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGZoomAndPan_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGZoomAndPan methods ***/
#define ISVGZoomAndPan_get_zoomAndPan(This,p) (This)->lpVtbl->get_zoomAndPan(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGZoomAndPan_QueryInterface(ISVGZoomAndPan* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGZoomAndPan_AddRef(ISVGZoomAndPan* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGZoomAndPan_Release(ISVGZoomAndPan* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGZoomAndPan_GetTypeInfoCount(ISVGZoomAndPan* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGZoomAndPan_GetTypeInfo(ISVGZoomAndPan* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGZoomAndPan_GetIDsOfNames(ISVGZoomAndPan* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGZoomAndPan_Invoke(ISVGZoomAndPan* 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);
}
/*** ISVGZoomAndPan methods ***/
static FORCEINLINE HRESULT ISVGZoomAndPan_get_zoomAndPan(ISVGZoomAndPan* This,short *p) {
    return This->lpVtbl->get_zoomAndPan(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGZoomAndPan_get_zoomAndPan_Proxy(
    ISVGZoomAndPan* This,
    short *p);
void __RPC_STUB ISVGZoomAndPan_get_zoomAndPan_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGZoomAndPan_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGURIReference interface
 */
#ifndef __ISVGURIReference_INTERFACE_DEFINED__
#define __ISVGURIReference_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGURIReference, 0x305104e3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104e3-98b5-11cf-bb82-00aa00bdce0b")
ISVGURIReference : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_href(
        ISVGAnimatedString **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGURIReference, 0x305104e3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGURIReferenceVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGURIReference* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGURIReference* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGURIReference* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGURIReference* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGURIReference* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGURIReference* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGURIReference* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGURIReference methods ***/
    HRESULT (STDMETHODCALLTYPE *get_href)(
        ISVGURIReference* This,
        ISVGAnimatedString **p);

    END_INTERFACE
} ISVGURIReferenceVtbl;
interface ISVGURIReference {
    CONST_VTBL ISVGURIReferenceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGURIReference_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGURIReference_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGURIReference_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGURIReference_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGURIReference_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGURIReference_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGURIReference_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGURIReference methods ***/
#define ISVGURIReference_get_href(This,p) (This)->lpVtbl->get_href(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGURIReference_QueryInterface(ISVGURIReference* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGURIReference_AddRef(ISVGURIReference* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGURIReference_Release(ISVGURIReference* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGURIReference_GetTypeInfoCount(ISVGURIReference* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGURIReference_GetTypeInfo(ISVGURIReference* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGURIReference_GetIDsOfNames(ISVGURIReference* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGURIReference_Invoke(ISVGURIReference* 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);
}
/*** ISVGURIReference methods ***/
static FORCEINLINE HRESULT ISVGURIReference_get_href(ISVGURIReference* This,ISVGAnimatedString **p) {
    return This->lpVtbl->get_href(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGURIReference_get_href_Proxy(
    ISVGURIReference* This,
    ISVGAnimatedString **p);
void __RPC_STUB ISVGURIReference_get_href_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGURIReference_INTERFACE_DEFINED__ */

#ifndef __ISVGAngle_FWD_DEFINED__
#define __ISVGAngle_FWD_DEFINED__
typedef interface ISVGAngle ISVGAngle;
#endif

/*****************************************************************************
 * ISVGAnimatedAngle interface
 */
#ifndef __ISVGAnimatedAngle_INTERFACE_DEFINED__
#define __ISVGAnimatedAngle_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGAnimatedAngle, 0x305104d4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104d4-98b5-11cf-bb82-00aa00bdce0b")
ISVGAnimatedAngle : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_baseVal(
        ISVGAngle *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_baseVal(
        ISVGAngle **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_animVal(
        ISVGAngle *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_animVal(
        ISVGAngle **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGAnimatedAngle, 0x305104d4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGAnimatedAngleVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGAnimatedAngle* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGAnimatedAngle* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGAnimatedAngle* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGAnimatedAngle* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGAnimatedAngle* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGAnimatedAngle* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGAnimatedAngle* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGAnimatedAngle methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_baseVal)(
        ISVGAnimatedAngle* This,
        ISVGAngle *v);

    HRESULT (STDMETHODCALLTYPE *get_baseVal)(
        ISVGAnimatedAngle* This,
        ISVGAngle **p);

    HRESULT (STDMETHODCALLTYPE *putref_animVal)(
        ISVGAnimatedAngle* This,
        ISVGAngle *v);

    HRESULT (STDMETHODCALLTYPE *get_animVal)(
        ISVGAnimatedAngle* This,
        ISVGAngle **p);

    END_INTERFACE
} ISVGAnimatedAngleVtbl;
interface ISVGAnimatedAngle {
    CONST_VTBL ISVGAnimatedAngleVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGAnimatedAngle_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGAnimatedAngle_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGAnimatedAngle_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGAnimatedAngle_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGAnimatedAngle_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGAnimatedAngle_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGAnimatedAngle_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGAnimatedAngle methods ***/
#define ISVGAnimatedAngle_putref_baseVal(This,v) (This)->lpVtbl->putref_baseVal(This,v)
#define ISVGAnimatedAngle_get_baseVal(This,p) (This)->lpVtbl->get_baseVal(This,p)
#define ISVGAnimatedAngle_putref_animVal(This,v) (This)->lpVtbl->putref_animVal(This,v)
#define ISVGAnimatedAngle_get_animVal(This,p) (This)->lpVtbl->get_animVal(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGAnimatedAngle_QueryInterface(ISVGAnimatedAngle* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGAnimatedAngle_AddRef(ISVGAnimatedAngle* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGAnimatedAngle_Release(ISVGAnimatedAngle* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGAnimatedAngle_GetTypeInfoCount(ISVGAnimatedAngle* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGAnimatedAngle_GetTypeInfo(ISVGAnimatedAngle* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGAnimatedAngle_GetIDsOfNames(ISVGAnimatedAngle* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGAnimatedAngle_Invoke(ISVGAnimatedAngle* 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);
}
/*** ISVGAnimatedAngle methods ***/
static FORCEINLINE HRESULT ISVGAnimatedAngle_putref_baseVal(ISVGAnimatedAngle* This,ISVGAngle *v) {
    return This->lpVtbl->putref_baseVal(This,v);
}
static FORCEINLINE HRESULT ISVGAnimatedAngle_get_baseVal(ISVGAnimatedAngle* This,ISVGAngle **p) {
    return This->lpVtbl->get_baseVal(This,p);
}
static FORCEINLINE HRESULT ISVGAnimatedAngle_putref_animVal(ISVGAnimatedAngle* This,ISVGAngle *v) {
    return This->lpVtbl->putref_animVal(This,v);
}
static FORCEINLINE HRESULT ISVGAnimatedAngle_get_animVal(ISVGAnimatedAngle* This,ISVGAngle **p) {
    return This->lpVtbl->get_animVal(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGAnimatedAngle_putref_baseVal_Proxy(
    ISVGAnimatedAngle* This,
    ISVGAngle *v);
void __RPC_STUB ISVGAnimatedAngle_putref_baseVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedAngle_get_baseVal_Proxy(
    ISVGAnimatedAngle* This,
    ISVGAngle **p);
void __RPC_STUB ISVGAnimatedAngle_get_baseVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedAngle_putref_animVal_Proxy(
    ISVGAnimatedAngle* This,
    ISVGAngle *v);
void __RPC_STUB ISVGAnimatedAngle_putref_animVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedAngle_get_animVal_Proxy(
    ISVGAnimatedAngle* This,
    ISVGAngle **p);
void __RPC_STUB ISVGAnimatedAngle_get_animVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGAnimatedAngle_INTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGAnimatedAngle coclass
 */

DEFINE_GUID(CLSID_SVGAnimatedAngle, 0x305105e4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105e4-98b5-11cf-bb82-00aa00bdce0b") SVGAnimatedAngle;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGAnimatedAngle, 0x305105e4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGAnimatedAngle;
#ifndef __ISVGTransformList_FWD_DEFINED__
#define __ISVGTransformList_FWD_DEFINED__
typedef interface ISVGTransformList ISVGTransformList;
#endif

/*****************************************************************************
 * ISVGAnimatedTransformList interface
 */
#ifndef __ISVGAnimatedTransformList_INTERFACE_DEFINED__
#define __ISVGAnimatedTransformList_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGAnimatedTransformList, 0x305104f9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104f9-98b5-11cf-bb82-00aa00bdce0b")
ISVGAnimatedTransformList : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_baseVal(
        ISVGTransformList *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_baseVal(
        ISVGTransformList **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_animVal(
        ISVGTransformList *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_animVal(
        ISVGTransformList **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGAnimatedTransformList, 0x305104f9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGAnimatedTransformListVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGAnimatedTransformList* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGAnimatedTransformList* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGAnimatedTransformList* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGAnimatedTransformList* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGAnimatedTransformList* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGAnimatedTransformList* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGAnimatedTransformList* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGAnimatedTransformList methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_baseVal)(
        ISVGAnimatedTransformList* This,
        ISVGTransformList *v);

    HRESULT (STDMETHODCALLTYPE *get_baseVal)(
        ISVGAnimatedTransformList* This,
        ISVGTransformList **p);

    HRESULT (STDMETHODCALLTYPE *putref_animVal)(
        ISVGAnimatedTransformList* This,
        ISVGTransformList *v);

    HRESULT (STDMETHODCALLTYPE *get_animVal)(
        ISVGAnimatedTransformList* This,
        ISVGTransformList **p);

    END_INTERFACE
} ISVGAnimatedTransformListVtbl;
interface ISVGAnimatedTransformList {
    CONST_VTBL ISVGAnimatedTransformListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGAnimatedTransformList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGAnimatedTransformList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGAnimatedTransformList_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGAnimatedTransformList_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGAnimatedTransformList_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGAnimatedTransformList_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGAnimatedTransformList_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGAnimatedTransformList methods ***/
#define ISVGAnimatedTransformList_putref_baseVal(This,v) (This)->lpVtbl->putref_baseVal(This,v)
#define ISVGAnimatedTransformList_get_baseVal(This,p) (This)->lpVtbl->get_baseVal(This,p)
#define ISVGAnimatedTransformList_putref_animVal(This,v) (This)->lpVtbl->putref_animVal(This,v)
#define ISVGAnimatedTransformList_get_animVal(This,p) (This)->lpVtbl->get_animVal(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGAnimatedTransformList_QueryInterface(ISVGAnimatedTransformList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGAnimatedTransformList_AddRef(ISVGAnimatedTransformList* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGAnimatedTransformList_Release(ISVGAnimatedTransformList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGAnimatedTransformList_GetTypeInfoCount(ISVGAnimatedTransformList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGAnimatedTransformList_GetTypeInfo(ISVGAnimatedTransformList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGAnimatedTransformList_GetIDsOfNames(ISVGAnimatedTransformList* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGAnimatedTransformList_Invoke(ISVGAnimatedTransformList* 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);
}
/*** ISVGAnimatedTransformList methods ***/
static FORCEINLINE HRESULT ISVGAnimatedTransformList_putref_baseVal(ISVGAnimatedTransformList* This,ISVGTransformList *v) {
    return This->lpVtbl->putref_baseVal(This,v);
}
static FORCEINLINE HRESULT ISVGAnimatedTransformList_get_baseVal(ISVGAnimatedTransformList* This,ISVGTransformList **p) {
    return This->lpVtbl->get_baseVal(This,p);
}
static FORCEINLINE HRESULT ISVGAnimatedTransformList_putref_animVal(ISVGAnimatedTransformList* This,ISVGTransformList *v) {
    return This->lpVtbl->putref_animVal(This,v);
}
static FORCEINLINE HRESULT ISVGAnimatedTransformList_get_animVal(ISVGAnimatedTransformList* This,ISVGTransformList **p) {
    return This->lpVtbl->get_animVal(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGAnimatedTransformList_putref_baseVal_Proxy(
    ISVGAnimatedTransformList* This,
    ISVGTransformList *v);
void __RPC_STUB ISVGAnimatedTransformList_putref_baseVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedTransformList_get_baseVal_Proxy(
    ISVGAnimatedTransformList* This,
    ISVGTransformList **p);
void __RPC_STUB ISVGAnimatedTransformList_get_baseVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedTransformList_putref_animVal_Proxy(
    ISVGAnimatedTransformList* This,
    ISVGTransformList *v);
void __RPC_STUB ISVGAnimatedTransformList_putref_animVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedTransformList_get_animVal_Proxy(
    ISVGAnimatedTransformList* This,
    ISVGTransformList **p);
void __RPC_STUB ISVGAnimatedTransformList_get_animVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGAnimatedTransformList_INTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGAnimatedTransformList coclass
 */

DEFINE_GUID(CLSID_SVGAnimatedTransformList, 0x305105b1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105b1-98b5-11cf-bb82-00aa00bdce0b") SVGAnimatedTransformList;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGAnimatedTransformList, 0x305105b1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGAnimatedTransformList;
/*****************************************************************************
 * ISVGAnimatedBoolean interface
 */
#ifndef __ISVGAnimatedBoolean_INTERFACE_DEFINED__
#define __ISVGAnimatedBoolean_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGAnimatedBoolean, 0x305104c6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104c6-98b5-11cf-bb82-00aa00bdce0b")
ISVGAnimatedBoolean : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_baseVal(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_baseVal(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_animVal(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_animVal(
        VARIANT_BOOL *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGAnimatedBoolean, 0x305104c6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGAnimatedBooleanVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGAnimatedBoolean* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGAnimatedBoolean* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGAnimatedBoolean* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGAnimatedBoolean* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGAnimatedBoolean* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGAnimatedBoolean* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGAnimatedBoolean* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGAnimatedBoolean methods ***/
    HRESULT (STDMETHODCALLTYPE *put_baseVal)(
        ISVGAnimatedBoolean* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_baseVal)(
        ISVGAnimatedBoolean* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_animVal)(
        ISVGAnimatedBoolean* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_animVal)(
        ISVGAnimatedBoolean* This,
        VARIANT_BOOL *p);

    END_INTERFACE
} ISVGAnimatedBooleanVtbl;
interface ISVGAnimatedBoolean {
    CONST_VTBL ISVGAnimatedBooleanVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGAnimatedBoolean_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGAnimatedBoolean_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGAnimatedBoolean_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGAnimatedBoolean_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGAnimatedBoolean_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGAnimatedBoolean_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGAnimatedBoolean_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGAnimatedBoolean methods ***/
#define ISVGAnimatedBoolean_put_baseVal(This,v) (This)->lpVtbl->put_baseVal(This,v)
#define ISVGAnimatedBoolean_get_baseVal(This,p) (This)->lpVtbl->get_baseVal(This,p)
#define ISVGAnimatedBoolean_put_animVal(This,v) (This)->lpVtbl->put_animVal(This,v)
#define ISVGAnimatedBoolean_get_animVal(This,p) (This)->lpVtbl->get_animVal(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGAnimatedBoolean_QueryInterface(ISVGAnimatedBoolean* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGAnimatedBoolean_AddRef(ISVGAnimatedBoolean* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGAnimatedBoolean_Release(ISVGAnimatedBoolean* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGAnimatedBoolean_GetTypeInfoCount(ISVGAnimatedBoolean* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGAnimatedBoolean_GetTypeInfo(ISVGAnimatedBoolean* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGAnimatedBoolean_GetIDsOfNames(ISVGAnimatedBoolean* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGAnimatedBoolean_Invoke(ISVGAnimatedBoolean* 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);
}
/*** ISVGAnimatedBoolean methods ***/
static FORCEINLINE HRESULT ISVGAnimatedBoolean_put_baseVal(ISVGAnimatedBoolean* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_baseVal(This,v);
}
static FORCEINLINE HRESULT ISVGAnimatedBoolean_get_baseVal(ISVGAnimatedBoolean* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_baseVal(This,p);
}
static FORCEINLINE HRESULT ISVGAnimatedBoolean_put_animVal(ISVGAnimatedBoolean* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_animVal(This,v);
}
static FORCEINLINE HRESULT ISVGAnimatedBoolean_get_animVal(ISVGAnimatedBoolean* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_animVal(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGAnimatedBoolean_put_baseVal_Proxy(
    ISVGAnimatedBoolean* This,
    VARIANT_BOOL v);
void __RPC_STUB ISVGAnimatedBoolean_put_baseVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedBoolean_get_baseVal_Proxy(
    ISVGAnimatedBoolean* This,
    VARIANT_BOOL *p);
void __RPC_STUB ISVGAnimatedBoolean_get_baseVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedBoolean_put_animVal_Proxy(
    ISVGAnimatedBoolean* This,
    VARIANT_BOOL v);
void __RPC_STUB ISVGAnimatedBoolean_put_animVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedBoolean_get_animVal_Proxy(
    ISVGAnimatedBoolean* This,
    VARIANT_BOOL *p);
void __RPC_STUB ISVGAnimatedBoolean_get_animVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGAnimatedBoolean_INTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGAnimatedBoolean coclass
 */

DEFINE_GUID(CLSID_SVGAnimatedBoolean, 0x3051058b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3051058b-98b5-11cf-bb82-00aa00bdce0b") SVGAnimatedBoolean;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGAnimatedBoolean, 0x3051058b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGAnimatedBoolean;
/*****************************************************************************
 * ISVGAnimatedEnumeration interface
 */
#ifndef __ISVGAnimatedEnumeration_INTERFACE_DEFINED__
#define __ISVGAnimatedEnumeration_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGAnimatedEnumeration, 0x305104c9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104c9-98b5-11cf-bb82-00aa00bdce0b")
ISVGAnimatedEnumeration : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_baseVal(
        USHORT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_baseVal(
        USHORT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_animVal(
        USHORT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_animVal(
        USHORT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGAnimatedEnumeration, 0x305104c9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGAnimatedEnumerationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGAnimatedEnumeration* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGAnimatedEnumeration* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGAnimatedEnumeration* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGAnimatedEnumeration* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGAnimatedEnumeration* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGAnimatedEnumeration* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGAnimatedEnumeration* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGAnimatedEnumeration methods ***/
    HRESULT (STDMETHODCALLTYPE *put_baseVal)(
        ISVGAnimatedEnumeration* This,
        USHORT v);

    HRESULT (STDMETHODCALLTYPE *get_baseVal)(
        ISVGAnimatedEnumeration* This,
        USHORT *p);

    HRESULT (STDMETHODCALLTYPE *put_animVal)(
        ISVGAnimatedEnumeration* This,
        USHORT v);

    HRESULT (STDMETHODCALLTYPE *get_animVal)(
        ISVGAnimatedEnumeration* This,
        USHORT *p);

    END_INTERFACE
} ISVGAnimatedEnumerationVtbl;
interface ISVGAnimatedEnumeration {
    CONST_VTBL ISVGAnimatedEnumerationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGAnimatedEnumeration_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGAnimatedEnumeration_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGAnimatedEnumeration_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGAnimatedEnumeration_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGAnimatedEnumeration_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGAnimatedEnumeration_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGAnimatedEnumeration_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGAnimatedEnumeration methods ***/
#define ISVGAnimatedEnumeration_put_baseVal(This,v) (This)->lpVtbl->put_baseVal(This,v)
#define ISVGAnimatedEnumeration_get_baseVal(This,p) (This)->lpVtbl->get_baseVal(This,p)
#define ISVGAnimatedEnumeration_put_animVal(This,v) (This)->lpVtbl->put_animVal(This,v)
#define ISVGAnimatedEnumeration_get_animVal(This,p) (This)->lpVtbl->get_animVal(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGAnimatedEnumeration_QueryInterface(ISVGAnimatedEnumeration* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGAnimatedEnumeration_AddRef(ISVGAnimatedEnumeration* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGAnimatedEnumeration_Release(ISVGAnimatedEnumeration* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGAnimatedEnumeration_GetTypeInfoCount(ISVGAnimatedEnumeration* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGAnimatedEnumeration_GetTypeInfo(ISVGAnimatedEnumeration* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGAnimatedEnumeration_GetIDsOfNames(ISVGAnimatedEnumeration* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGAnimatedEnumeration_Invoke(ISVGAnimatedEnumeration* 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);
}
/*** ISVGAnimatedEnumeration methods ***/
static FORCEINLINE HRESULT ISVGAnimatedEnumeration_put_baseVal(ISVGAnimatedEnumeration* This,USHORT v) {
    return This->lpVtbl->put_baseVal(This,v);
}
static FORCEINLINE HRESULT ISVGAnimatedEnumeration_get_baseVal(ISVGAnimatedEnumeration* This,USHORT *p) {
    return This->lpVtbl->get_baseVal(This,p);
}
static FORCEINLINE HRESULT ISVGAnimatedEnumeration_put_animVal(ISVGAnimatedEnumeration* This,USHORT v) {
    return This->lpVtbl->put_animVal(This,v);
}
static FORCEINLINE HRESULT ISVGAnimatedEnumeration_get_animVal(ISVGAnimatedEnumeration* This,USHORT *p) {
    return This->lpVtbl->get_animVal(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGAnimatedEnumeration_put_baseVal_Proxy(
    ISVGAnimatedEnumeration* This,
    USHORT v);
void __RPC_STUB ISVGAnimatedEnumeration_put_baseVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedEnumeration_get_baseVal_Proxy(
    ISVGAnimatedEnumeration* This,
    USHORT *p);
void __RPC_STUB ISVGAnimatedEnumeration_get_baseVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedEnumeration_put_animVal_Proxy(
    ISVGAnimatedEnumeration* This,
    USHORT v);
void __RPC_STUB ISVGAnimatedEnumeration_put_animVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedEnumeration_get_animVal_Proxy(
    ISVGAnimatedEnumeration* This,
    USHORT *p);
void __RPC_STUB ISVGAnimatedEnumeration_get_animVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGAnimatedEnumeration_INTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGAnimatedEnumeration coclass
 */

DEFINE_GUID(CLSID_SVGAnimatedEnumeration, 0x3051058e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3051058e-98b5-11cf-bb82-00aa00bdce0b") SVGAnimatedEnumeration;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGAnimatedEnumeration, 0x3051058e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGAnimatedEnumeration;
/*****************************************************************************
 * ISVGAnimatedInteger interface
 */
#ifndef __ISVGAnimatedInteger_INTERFACE_DEFINED__
#define __ISVGAnimatedInteger_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGAnimatedInteger, 0x305104ca, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104ca-98b5-11cf-bb82-00aa00bdce0b")
ISVGAnimatedInteger : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_baseVal(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_baseVal(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_animVal(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_animVal(
        LONG *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGAnimatedInteger, 0x305104ca, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGAnimatedIntegerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGAnimatedInteger* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGAnimatedInteger* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGAnimatedInteger* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGAnimatedInteger* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGAnimatedInteger* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGAnimatedInteger* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGAnimatedInteger* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGAnimatedInteger methods ***/
    HRESULT (STDMETHODCALLTYPE *put_baseVal)(
        ISVGAnimatedInteger* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_baseVal)(
        ISVGAnimatedInteger* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_animVal)(
        ISVGAnimatedInteger* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_animVal)(
        ISVGAnimatedInteger* This,
        LONG *p);

    END_INTERFACE
} ISVGAnimatedIntegerVtbl;
interface ISVGAnimatedInteger {
    CONST_VTBL ISVGAnimatedIntegerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGAnimatedInteger_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGAnimatedInteger_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGAnimatedInteger_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGAnimatedInteger_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGAnimatedInteger_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGAnimatedInteger_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGAnimatedInteger_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGAnimatedInteger methods ***/
#define ISVGAnimatedInteger_put_baseVal(This,v) (This)->lpVtbl->put_baseVal(This,v)
#define ISVGAnimatedInteger_get_baseVal(This,p) (This)->lpVtbl->get_baseVal(This,p)
#define ISVGAnimatedInteger_put_animVal(This,v) (This)->lpVtbl->put_animVal(This,v)
#define ISVGAnimatedInteger_get_animVal(This,p) (This)->lpVtbl->get_animVal(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGAnimatedInteger_QueryInterface(ISVGAnimatedInteger* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGAnimatedInteger_AddRef(ISVGAnimatedInteger* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGAnimatedInteger_Release(ISVGAnimatedInteger* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGAnimatedInteger_GetTypeInfoCount(ISVGAnimatedInteger* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGAnimatedInteger_GetTypeInfo(ISVGAnimatedInteger* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGAnimatedInteger_GetIDsOfNames(ISVGAnimatedInteger* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGAnimatedInteger_Invoke(ISVGAnimatedInteger* 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);
}
/*** ISVGAnimatedInteger methods ***/
static FORCEINLINE HRESULT ISVGAnimatedInteger_put_baseVal(ISVGAnimatedInteger* This,LONG v) {
    return This->lpVtbl->put_baseVal(This,v);
}
static FORCEINLINE HRESULT ISVGAnimatedInteger_get_baseVal(ISVGAnimatedInteger* This,LONG *p) {
    return This->lpVtbl->get_baseVal(This,p);
}
static FORCEINLINE HRESULT ISVGAnimatedInteger_put_animVal(ISVGAnimatedInteger* This,LONG v) {
    return This->lpVtbl->put_animVal(This,v);
}
static FORCEINLINE HRESULT ISVGAnimatedInteger_get_animVal(ISVGAnimatedInteger* This,LONG *p) {
    return This->lpVtbl->get_animVal(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGAnimatedInteger_put_baseVal_Proxy(
    ISVGAnimatedInteger* This,
    LONG v);
void __RPC_STUB ISVGAnimatedInteger_put_baseVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedInteger_get_baseVal_Proxy(
    ISVGAnimatedInteger* This,
    LONG *p);
void __RPC_STUB ISVGAnimatedInteger_get_baseVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedInteger_put_animVal_Proxy(
    ISVGAnimatedInteger* This,
    LONG v);
void __RPC_STUB ISVGAnimatedInteger_put_animVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedInteger_get_animVal_Proxy(
    ISVGAnimatedInteger* This,
    LONG *p);
void __RPC_STUB ISVGAnimatedInteger_get_animVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGAnimatedInteger_INTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGAnimatedInteger coclass
 */

DEFINE_GUID(CLSID_SVGAnimatedInteger, 0x3051058f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3051058f-98b5-11cf-bb82-00aa00bdce0b") SVGAnimatedInteger;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGAnimatedInteger, 0x3051058f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGAnimatedInteger;
#ifndef __ISVGLength_FWD_DEFINED__
#define __ISVGLength_FWD_DEFINED__
typedef interface ISVGLength ISVGLength;
#endif

/*****************************************************************************
 * ISVGAnimatedLength interface
 */
#ifndef __ISVGAnimatedLength_INTERFACE_DEFINED__
#define __ISVGAnimatedLength_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGAnimatedLength, 0x305104d0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104d0-98b5-11cf-bb82-00aa00bdce0b")
ISVGAnimatedLength : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_baseVal(
        ISVGLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_baseVal(
        ISVGLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_animVal(
        ISVGLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_animVal(
        ISVGLength **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGAnimatedLength, 0x305104d0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGAnimatedLengthVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGAnimatedLength* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGAnimatedLength* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGAnimatedLength* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGAnimatedLength* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGAnimatedLength* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGAnimatedLength* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGAnimatedLength* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGAnimatedLength methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_baseVal)(
        ISVGAnimatedLength* This,
        ISVGLength *v);

    HRESULT (STDMETHODCALLTYPE *get_baseVal)(
        ISVGAnimatedLength* This,
        ISVGLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_animVal)(
        ISVGAnimatedLength* This,
        ISVGLength *v);

    HRESULT (STDMETHODCALLTYPE *get_animVal)(
        ISVGAnimatedLength* This,
        ISVGLength **p);

    END_INTERFACE
} ISVGAnimatedLengthVtbl;
interface ISVGAnimatedLength {
    CONST_VTBL ISVGAnimatedLengthVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGAnimatedLength_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGAnimatedLength_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGAnimatedLength_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGAnimatedLength_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGAnimatedLength_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGAnimatedLength_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGAnimatedLength_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGAnimatedLength methods ***/
#define ISVGAnimatedLength_putref_baseVal(This,v) (This)->lpVtbl->putref_baseVal(This,v)
#define ISVGAnimatedLength_get_baseVal(This,p) (This)->lpVtbl->get_baseVal(This,p)
#define ISVGAnimatedLength_putref_animVal(This,v) (This)->lpVtbl->putref_animVal(This,v)
#define ISVGAnimatedLength_get_animVal(This,p) (This)->lpVtbl->get_animVal(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGAnimatedLength_QueryInterface(ISVGAnimatedLength* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGAnimatedLength_AddRef(ISVGAnimatedLength* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGAnimatedLength_Release(ISVGAnimatedLength* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGAnimatedLength_GetTypeInfoCount(ISVGAnimatedLength* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGAnimatedLength_GetTypeInfo(ISVGAnimatedLength* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGAnimatedLength_GetIDsOfNames(ISVGAnimatedLength* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGAnimatedLength_Invoke(ISVGAnimatedLength* 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);
}
/*** ISVGAnimatedLength methods ***/
static FORCEINLINE HRESULT ISVGAnimatedLength_putref_baseVal(ISVGAnimatedLength* This,ISVGLength *v) {
    return This->lpVtbl->putref_baseVal(This,v);
}
static FORCEINLINE HRESULT ISVGAnimatedLength_get_baseVal(ISVGAnimatedLength* This,ISVGLength **p) {
    return This->lpVtbl->get_baseVal(This,p);
}
static FORCEINLINE HRESULT ISVGAnimatedLength_putref_animVal(ISVGAnimatedLength* This,ISVGLength *v) {
    return This->lpVtbl->putref_animVal(This,v);
}
static FORCEINLINE HRESULT ISVGAnimatedLength_get_animVal(ISVGAnimatedLength* This,ISVGLength **p) {
    return This->lpVtbl->get_animVal(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGAnimatedLength_putref_baseVal_Proxy(
    ISVGAnimatedLength* This,
    ISVGLength *v);
void __RPC_STUB ISVGAnimatedLength_putref_baseVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedLength_get_baseVal_Proxy(
    ISVGAnimatedLength* This,
    ISVGLength **p);
void __RPC_STUB ISVGAnimatedLength_get_baseVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedLength_putref_animVal_Proxy(
    ISVGAnimatedLength* This,
    ISVGLength *v);
void __RPC_STUB ISVGAnimatedLength_putref_animVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedLength_get_animVal_Proxy(
    ISVGAnimatedLength* This,
    ISVGLength **p);
void __RPC_STUB ISVGAnimatedLength_get_animVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGAnimatedLength_INTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGAnimatedLength coclass
 */

DEFINE_GUID(CLSID_SVGAnimatedLength, 0x30510581, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510581-98b5-11cf-bb82-00aa00bdce0b") SVGAnimatedLength;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGAnimatedLength, 0x30510581, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGAnimatedLength;
#ifndef __ISVGLengthList_FWD_DEFINED__
#define __ISVGLengthList_FWD_DEFINED__
typedef interface ISVGLengthList ISVGLengthList;
#endif

/*****************************************************************************
 * ISVGAnimatedLengthList interface
 */
#ifndef __ISVGAnimatedLengthList_INTERFACE_DEFINED__
#define __ISVGAnimatedLengthList_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGAnimatedLengthList, 0x305104d2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104d2-98b5-11cf-bb82-00aa00bdce0b")
ISVGAnimatedLengthList : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_baseVal(
        ISVGLengthList *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_baseVal(
        ISVGLengthList **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_animVal(
        ISVGLengthList *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_animVal(
        ISVGLengthList **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGAnimatedLengthList, 0x305104d2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGAnimatedLengthListVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGAnimatedLengthList* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGAnimatedLengthList* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGAnimatedLengthList* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGAnimatedLengthList* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGAnimatedLengthList* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGAnimatedLengthList* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGAnimatedLengthList* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGAnimatedLengthList methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_baseVal)(
        ISVGAnimatedLengthList* This,
        ISVGLengthList *v);

    HRESULT (STDMETHODCALLTYPE *get_baseVal)(
        ISVGAnimatedLengthList* This,
        ISVGLengthList **p);

    HRESULT (STDMETHODCALLTYPE *putref_animVal)(
        ISVGAnimatedLengthList* This,
        ISVGLengthList *v);

    HRESULT (STDMETHODCALLTYPE *get_animVal)(
        ISVGAnimatedLengthList* This,
        ISVGLengthList **p);

    END_INTERFACE
} ISVGAnimatedLengthListVtbl;
interface ISVGAnimatedLengthList {
    CONST_VTBL ISVGAnimatedLengthListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGAnimatedLengthList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGAnimatedLengthList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGAnimatedLengthList_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGAnimatedLengthList_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGAnimatedLengthList_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGAnimatedLengthList_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGAnimatedLengthList_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGAnimatedLengthList methods ***/
#define ISVGAnimatedLengthList_putref_baseVal(This,v) (This)->lpVtbl->putref_baseVal(This,v)
#define ISVGAnimatedLengthList_get_baseVal(This,p) (This)->lpVtbl->get_baseVal(This,p)
#define ISVGAnimatedLengthList_putref_animVal(This,v) (This)->lpVtbl->putref_animVal(This,v)
#define ISVGAnimatedLengthList_get_animVal(This,p) (This)->lpVtbl->get_animVal(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGAnimatedLengthList_QueryInterface(ISVGAnimatedLengthList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGAnimatedLengthList_AddRef(ISVGAnimatedLengthList* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGAnimatedLengthList_Release(ISVGAnimatedLengthList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGAnimatedLengthList_GetTypeInfoCount(ISVGAnimatedLengthList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGAnimatedLengthList_GetTypeInfo(ISVGAnimatedLengthList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGAnimatedLengthList_GetIDsOfNames(ISVGAnimatedLengthList* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGAnimatedLengthList_Invoke(ISVGAnimatedLengthList* 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);
}
/*** ISVGAnimatedLengthList methods ***/
static FORCEINLINE HRESULT ISVGAnimatedLengthList_putref_baseVal(ISVGAnimatedLengthList* This,ISVGLengthList *v) {
    return This->lpVtbl->putref_baseVal(This,v);
}
static FORCEINLINE HRESULT ISVGAnimatedLengthList_get_baseVal(ISVGAnimatedLengthList* This,ISVGLengthList **p) {
    return This->lpVtbl->get_baseVal(This,p);
}
static FORCEINLINE HRESULT ISVGAnimatedLengthList_putref_animVal(ISVGAnimatedLengthList* This,ISVGLengthList *v) {
    return This->lpVtbl->putref_animVal(This,v);
}
static FORCEINLINE HRESULT ISVGAnimatedLengthList_get_animVal(ISVGAnimatedLengthList* This,ISVGLengthList **p) {
    return This->lpVtbl->get_animVal(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGAnimatedLengthList_putref_baseVal_Proxy(
    ISVGAnimatedLengthList* This,
    ISVGLengthList *v);
void __RPC_STUB ISVGAnimatedLengthList_putref_baseVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedLengthList_get_baseVal_Proxy(
    ISVGAnimatedLengthList* This,
    ISVGLengthList **p);
void __RPC_STUB ISVGAnimatedLengthList_get_baseVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedLengthList_putref_animVal_Proxy(
    ISVGAnimatedLengthList* This,
    ISVGLengthList *v);
void __RPC_STUB ISVGAnimatedLengthList_putref_animVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedLengthList_get_animVal_Proxy(
    ISVGAnimatedLengthList* This,
    ISVGLengthList **p);
void __RPC_STUB ISVGAnimatedLengthList_get_animVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGAnimatedLengthList_INTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGAnimatedLengthList coclass
 */

DEFINE_GUID(CLSID_SVGAnimatedLengthList, 0x30510582, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510582-98b5-11cf-bb82-00aa00bdce0b") SVGAnimatedLengthList;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGAnimatedLengthList, 0x30510582, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGAnimatedLengthList;
#ifndef __ISVGNumber_FWD_DEFINED__
#define __ISVGNumber_FWD_DEFINED__
typedef interface ISVGNumber ISVGNumber;
#endif

/*****************************************************************************
 * ISVGAnimatedNumber interface
 */
#ifndef __ISVGAnimatedNumber_INTERFACE_DEFINED__
#define __ISVGAnimatedNumber_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGAnimatedNumber, 0x305104cc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104cc-98b5-11cf-bb82-00aa00bdce0b")
ISVGAnimatedNumber : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_baseVal(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_baseVal(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_animVal(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_animVal(
        float *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGAnimatedNumber, 0x305104cc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGAnimatedNumberVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGAnimatedNumber* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGAnimatedNumber* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGAnimatedNumber* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGAnimatedNumber* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGAnimatedNumber* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGAnimatedNumber* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGAnimatedNumber* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGAnimatedNumber methods ***/
    HRESULT (STDMETHODCALLTYPE *put_baseVal)(
        ISVGAnimatedNumber* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_baseVal)(
        ISVGAnimatedNumber* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_animVal)(
        ISVGAnimatedNumber* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_animVal)(
        ISVGAnimatedNumber* This,
        float *p);

    END_INTERFACE
} ISVGAnimatedNumberVtbl;
interface ISVGAnimatedNumber {
    CONST_VTBL ISVGAnimatedNumberVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGAnimatedNumber_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGAnimatedNumber_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGAnimatedNumber_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGAnimatedNumber_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGAnimatedNumber_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGAnimatedNumber_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGAnimatedNumber_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGAnimatedNumber methods ***/
#define ISVGAnimatedNumber_put_baseVal(This,v) (This)->lpVtbl->put_baseVal(This,v)
#define ISVGAnimatedNumber_get_baseVal(This,p) (This)->lpVtbl->get_baseVal(This,p)
#define ISVGAnimatedNumber_put_animVal(This,v) (This)->lpVtbl->put_animVal(This,v)
#define ISVGAnimatedNumber_get_animVal(This,p) (This)->lpVtbl->get_animVal(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGAnimatedNumber_QueryInterface(ISVGAnimatedNumber* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGAnimatedNumber_AddRef(ISVGAnimatedNumber* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGAnimatedNumber_Release(ISVGAnimatedNumber* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGAnimatedNumber_GetTypeInfoCount(ISVGAnimatedNumber* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGAnimatedNumber_GetTypeInfo(ISVGAnimatedNumber* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGAnimatedNumber_GetIDsOfNames(ISVGAnimatedNumber* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGAnimatedNumber_Invoke(ISVGAnimatedNumber* 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);
}
/*** ISVGAnimatedNumber methods ***/
static FORCEINLINE HRESULT ISVGAnimatedNumber_put_baseVal(ISVGAnimatedNumber* This,float v) {
    return This->lpVtbl->put_baseVal(This,v);
}
static FORCEINLINE HRESULT ISVGAnimatedNumber_get_baseVal(ISVGAnimatedNumber* This,float *p) {
    return This->lpVtbl->get_baseVal(This,p);
}
static FORCEINLINE HRESULT ISVGAnimatedNumber_put_animVal(ISVGAnimatedNumber* This,float v) {
    return This->lpVtbl->put_animVal(This,v);
}
static FORCEINLINE HRESULT ISVGAnimatedNumber_get_animVal(ISVGAnimatedNumber* This,float *p) {
    return This->lpVtbl->get_animVal(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGAnimatedNumber_put_baseVal_Proxy(
    ISVGAnimatedNumber* This,
    float v);
void __RPC_STUB ISVGAnimatedNumber_put_baseVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedNumber_get_baseVal_Proxy(
    ISVGAnimatedNumber* This,
    float *p);
void __RPC_STUB ISVGAnimatedNumber_get_baseVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedNumber_put_animVal_Proxy(
    ISVGAnimatedNumber* This,
    float v);
void __RPC_STUB ISVGAnimatedNumber_put_animVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedNumber_get_animVal_Proxy(
    ISVGAnimatedNumber* This,
    float *p);
void __RPC_STUB ISVGAnimatedNumber_get_animVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGAnimatedNumber_INTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGAnimatedNumber coclass
 */

DEFINE_GUID(CLSID_SVGAnimatedNumber, 0x30510588, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510588-98b5-11cf-bb82-00aa00bdce0b") SVGAnimatedNumber;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGAnimatedNumber, 0x30510588, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGAnimatedNumber;
#ifndef __ISVGNumberList_FWD_DEFINED__
#define __ISVGNumberList_FWD_DEFINED__
typedef interface ISVGNumberList ISVGNumberList;
#endif

/*****************************************************************************
 * ISVGAnimatedNumberList interface
 */
#ifndef __ISVGAnimatedNumberList_INTERFACE_DEFINED__
#define __ISVGAnimatedNumberList_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGAnimatedNumberList, 0x305104ce, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104ce-98b5-11cf-bb82-00aa00bdce0b")
ISVGAnimatedNumberList : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_baseVal(
        ISVGNumberList *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_baseVal(
        ISVGNumberList **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_animVal(
        ISVGNumberList *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_animVal(
        ISVGNumberList **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGAnimatedNumberList, 0x305104ce, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGAnimatedNumberListVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGAnimatedNumberList* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGAnimatedNumberList* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGAnimatedNumberList* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGAnimatedNumberList* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGAnimatedNumberList* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGAnimatedNumberList* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGAnimatedNumberList* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGAnimatedNumberList methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_baseVal)(
        ISVGAnimatedNumberList* This,
        ISVGNumberList *v);

    HRESULT (STDMETHODCALLTYPE *get_baseVal)(
        ISVGAnimatedNumberList* This,
        ISVGNumberList **p);

    HRESULT (STDMETHODCALLTYPE *putref_animVal)(
        ISVGAnimatedNumberList* This,
        ISVGNumberList *v);

    HRESULT (STDMETHODCALLTYPE *get_animVal)(
        ISVGAnimatedNumberList* This,
        ISVGNumberList **p);

    END_INTERFACE
} ISVGAnimatedNumberListVtbl;
interface ISVGAnimatedNumberList {
    CONST_VTBL ISVGAnimatedNumberListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGAnimatedNumberList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGAnimatedNumberList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGAnimatedNumberList_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGAnimatedNumberList_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGAnimatedNumberList_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGAnimatedNumberList_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGAnimatedNumberList_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGAnimatedNumberList methods ***/
#define ISVGAnimatedNumberList_putref_baseVal(This,v) (This)->lpVtbl->putref_baseVal(This,v)
#define ISVGAnimatedNumberList_get_baseVal(This,p) (This)->lpVtbl->get_baseVal(This,p)
#define ISVGAnimatedNumberList_putref_animVal(This,v) (This)->lpVtbl->putref_animVal(This,v)
#define ISVGAnimatedNumberList_get_animVal(This,p) (This)->lpVtbl->get_animVal(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGAnimatedNumberList_QueryInterface(ISVGAnimatedNumberList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGAnimatedNumberList_AddRef(ISVGAnimatedNumberList* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGAnimatedNumberList_Release(ISVGAnimatedNumberList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGAnimatedNumberList_GetTypeInfoCount(ISVGAnimatedNumberList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGAnimatedNumberList_GetTypeInfo(ISVGAnimatedNumberList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGAnimatedNumberList_GetIDsOfNames(ISVGAnimatedNumberList* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGAnimatedNumberList_Invoke(ISVGAnimatedNumberList* 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);
}
/*** ISVGAnimatedNumberList methods ***/
static FORCEINLINE HRESULT ISVGAnimatedNumberList_putref_baseVal(ISVGAnimatedNumberList* This,ISVGNumberList *v) {
    return This->lpVtbl->putref_baseVal(This,v);
}
static FORCEINLINE HRESULT ISVGAnimatedNumberList_get_baseVal(ISVGAnimatedNumberList* This,ISVGNumberList **p) {
    return This->lpVtbl->get_baseVal(This,p);
}
static FORCEINLINE HRESULT ISVGAnimatedNumberList_putref_animVal(ISVGAnimatedNumberList* This,ISVGNumberList *v) {
    return This->lpVtbl->putref_animVal(This,v);
}
static FORCEINLINE HRESULT ISVGAnimatedNumberList_get_animVal(ISVGAnimatedNumberList* This,ISVGNumberList **p) {
    return This->lpVtbl->get_animVal(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGAnimatedNumberList_putref_baseVal_Proxy(
    ISVGAnimatedNumberList* This,
    ISVGNumberList *v);
void __RPC_STUB ISVGAnimatedNumberList_putref_baseVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedNumberList_get_baseVal_Proxy(
    ISVGAnimatedNumberList* This,
    ISVGNumberList **p);
void __RPC_STUB ISVGAnimatedNumberList_get_baseVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedNumberList_putref_animVal_Proxy(
    ISVGAnimatedNumberList* This,
    ISVGNumberList *v);
void __RPC_STUB ISVGAnimatedNumberList_putref_animVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedNumberList_get_animVal_Proxy(
    ISVGAnimatedNumberList* This,
    ISVGNumberList **p);
void __RPC_STUB ISVGAnimatedNumberList_get_animVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGAnimatedNumberList_INTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGAnimatedNumberList coclass
 */

DEFINE_GUID(CLSID_SVGAnimatedNumberList, 0x3051058a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3051058a-98b5-11cf-bb82-00aa00bdce0b") SVGAnimatedNumberList;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGAnimatedNumberList, 0x3051058a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGAnimatedNumberList;
#ifndef __ISVGRect_FWD_DEFINED__
#define __ISVGRect_FWD_DEFINED__
typedef interface ISVGRect ISVGRect;
#endif

/*****************************************************************************
 * ISVGAnimatedRect interface
 */
#ifndef __ISVGAnimatedRect_INTERFACE_DEFINED__
#define __ISVGAnimatedRect_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGAnimatedRect, 0x305104d8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104d8-98b5-11cf-bb82-00aa00bdce0b")
ISVGAnimatedRect : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_baseVal(
        ISVGRect *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_baseVal(
        ISVGRect **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_animVal(
        ISVGRect *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_animVal(
        ISVGRect **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGAnimatedRect, 0x305104d8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGAnimatedRectVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGAnimatedRect* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGAnimatedRect* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGAnimatedRect* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGAnimatedRect* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGAnimatedRect* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGAnimatedRect* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGAnimatedRect* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGAnimatedRect methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_baseVal)(
        ISVGAnimatedRect* This,
        ISVGRect *v);

    HRESULT (STDMETHODCALLTYPE *get_baseVal)(
        ISVGAnimatedRect* This,
        ISVGRect **p);

    HRESULT (STDMETHODCALLTYPE *putref_animVal)(
        ISVGAnimatedRect* This,
        ISVGRect *v);

    HRESULT (STDMETHODCALLTYPE *get_animVal)(
        ISVGAnimatedRect* This,
        ISVGRect **p);

    END_INTERFACE
} ISVGAnimatedRectVtbl;
interface ISVGAnimatedRect {
    CONST_VTBL ISVGAnimatedRectVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGAnimatedRect_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGAnimatedRect_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGAnimatedRect_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGAnimatedRect_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGAnimatedRect_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGAnimatedRect_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGAnimatedRect_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGAnimatedRect methods ***/
#define ISVGAnimatedRect_putref_baseVal(This,v) (This)->lpVtbl->putref_baseVal(This,v)
#define ISVGAnimatedRect_get_baseVal(This,p) (This)->lpVtbl->get_baseVal(This,p)
#define ISVGAnimatedRect_putref_animVal(This,v) (This)->lpVtbl->putref_animVal(This,v)
#define ISVGAnimatedRect_get_animVal(This,p) (This)->lpVtbl->get_animVal(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGAnimatedRect_QueryInterface(ISVGAnimatedRect* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGAnimatedRect_AddRef(ISVGAnimatedRect* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGAnimatedRect_Release(ISVGAnimatedRect* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGAnimatedRect_GetTypeInfoCount(ISVGAnimatedRect* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGAnimatedRect_GetTypeInfo(ISVGAnimatedRect* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGAnimatedRect_GetIDsOfNames(ISVGAnimatedRect* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGAnimatedRect_Invoke(ISVGAnimatedRect* 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);
}
/*** ISVGAnimatedRect methods ***/
static FORCEINLINE HRESULT ISVGAnimatedRect_putref_baseVal(ISVGAnimatedRect* This,ISVGRect *v) {
    return This->lpVtbl->putref_baseVal(This,v);
}
static FORCEINLINE HRESULT ISVGAnimatedRect_get_baseVal(ISVGAnimatedRect* This,ISVGRect **p) {
    return This->lpVtbl->get_baseVal(This,p);
}
static FORCEINLINE HRESULT ISVGAnimatedRect_putref_animVal(ISVGAnimatedRect* This,ISVGRect *v) {
    return This->lpVtbl->putref_animVal(This,v);
}
static FORCEINLINE HRESULT ISVGAnimatedRect_get_animVal(ISVGAnimatedRect* This,ISVGRect **p) {
    return This->lpVtbl->get_animVal(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGAnimatedRect_putref_baseVal_Proxy(
    ISVGAnimatedRect* This,
    ISVGRect *v);
void __RPC_STUB ISVGAnimatedRect_putref_baseVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedRect_get_baseVal_Proxy(
    ISVGAnimatedRect* This,
    ISVGRect **p);
void __RPC_STUB ISVGAnimatedRect_get_baseVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedRect_putref_animVal_Proxy(
    ISVGAnimatedRect* This,
    ISVGRect *v);
void __RPC_STUB ISVGAnimatedRect_putref_animVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedRect_get_animVal_Proxy(
    ISVGAnimatedRect* This,
    ISVGRect **p);
void __RPC_STUB ISVGAnimatedRect_get_animVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGAnimatedRect_INTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGAnimatedRect coclass
 */

DEFINE_GUID(CLSID_SVGAnimatedRect, 0x30510586, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510586-98b5-11cf-bb82-00aa00bdce0b") SVGAnimatedRect;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGAnimatedRect, 0x30510586, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGAnimatedRect;
/*****************************************************************************
 * ISVGAnimatedString interface
 */
#ifndef __ISVGAnimatedString_INTERFACE_DEFINED__
#define __ISVGAnimatedString_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGAnimatedString, 0x305104c7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104c7-98b5-11cf-bb82-00aa00bdce0b")
ISVGAnimatedString : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_baseVal(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_baseVal(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_animVal(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGAnimatedString, 0x305104c7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGAnimatedStringVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGAnimatedString* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGAnimatedString* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGAnimatedString* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGAnimatedString* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGAnimatedString* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGAnimatedString* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGAnimatedString* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGAnimatedString methods ***/
    HRESULT (STDMETHODCALLTYPE *put_baseVal)(
        ISVGAnimatedString* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_baseVal)(
        ISVGAnimatedString* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_animVal)(
        ISVGAnimatedString* This,
        BSTR *p);

    END_INTERFACE
} ISVGAnimatedStringVtbl;
interface ISVGAnimatedString {
    CONST_VTBL ISVGAnimatedStringVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGAnimatedString_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGAnimatedString_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGAnimatedString_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGAnimatedString_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGAnimatedString_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGAnimatedString_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGAnimatedString_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGAnimatedString methods ***/
#define ISVGAnimatedString_put_baseVal(This,v) (This)->lpVtbl->put_baseVal(This,v)
#define ISVGAnimatedString_get_baseVal(This,p) (This)->lpVtbl->get_baseVal(This,p)
#define ISVGAnimatedString_get_animVal(This,p) (This)->lpVtbl->get_animVal(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGAnimatedString_QueryInterface(ISVGAnimatedString* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGAnimatedString_AddRef(ISVGAnimatedString* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGAnimatedString_Release(ISVGAnimatedString* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGAnimatedString_GetTypeInfoCount(ISVGAnimatedString* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGAnimatedString_GetTypeInfo(ISVGAnimatedString* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGAnimatedString_GetIDsOfNames(ISVGAnimatedString* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGAnimatedString_Invoke(ISVGAnimatedString* 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);
}
/*** ISVGAnimatedString methods ***/
static FORCEINLINE HRESULT ISVGAnimatedString_put_baseVal(ISVGAnimatedString* This,BSTR v) {
    return This->lpVtbl->put_baseVal(This,v);
}
static FORCEINLINE HRESULT ISVGAnimatedString_get_baseVal(ISVGAnimatedString* This,BSTR *p) {
    return This->lpVtbl->get_baseVal(This,p);
}
static FORCEINLINE HRESULT ISVGAnimatedString_get_animVal(ISVGAnimatedString* This,BSTR *p) {
    return This->lpVtbl->get_animVal(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGAnimatedString_put_baseVal_Proxy(
    ISVGAnimatedString* This,
    BSTR v);
void __RPC_STUB ISVGAnimatedString_put_baseVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedString_get_baseVal_Proxy(
    ISVGAnimatedString* This,
    BSTR *p);
void __RPC_STUB ISVGAnimatedString_get_baseVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedString_get_animVal_Proxy(
    ISVGAnimatedString* This,
    BSTR *p);
void __RPC_STUB ISVGAnimatedString_get_animVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGAnimatedString_INTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGAnimatedString coclass
 */

DEFINE_GUID(CLSID_SVGAnimatedString, 0x3051058c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3051058c-98b5-11cf-bb82-00aa00bdce0b") SVGAnimatedString;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGAnimatedString, 0x3051058c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGAnimatedString;
/*****************************************************************************
 * ISVGClipPathElement interface
 */
#ifndef __ISVGClipPathElement_INTERFACE_DEFINED__
#define __ISVGClipPathElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGClipPathElement, 0x3051052d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051052d-98b5-11cf-bb82-00aa00bdce0b")
ISVGClipPathElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_clipPathUnits(
        ISVGAnimatedEnumeration *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_clipPathUnits(
        ISVGAnimatedEnumeration **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGClipPathElement, 0x3051052d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGClipPathElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGClipPathElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGClipPathElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGClipPathElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGClipPathElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGClipPathElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGClipPathElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGClipPathElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGClipPathElement methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_clipPathUnits)(
        ISVGClipPathElement* This,
        ISVGAnimatedEnumeration *v);

    HRESULT (STDMETHODCALLTYPE *get_clipPathUnits)(
        ISVGClipPathElement* This,
        ISVGAnimatedEnumeration **p);

    END_INTERFACE
} ISVGClipPathElementVtbl;
interface ISVGClipPathElement {
    CONST_VTBL ISVGClipPathElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGClipPathElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGClipPathElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGClipPathElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGClipPathElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGClipPathElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGClipPathElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGClipPathElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGClipPathElement methods ***/
#define ISVGClipPathElement_putref_clipPathUnits(This,v) (This)->lpVtbl->putref_clipPathUnits(This,v)
#define ISVGClipPathElement_get_clipPathUnits(This,p) (This)->lpVtbl->get_clipPathUnits(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGClipPathElement_QueryInterface(ISVGClipPathElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGClipPathElement_AddRef(ISVGClipPathElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGClipPathElement_Release(ISVGClipPathElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGClipPathElement_GetTypeInfoCount(ISVGClipPathElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGClipPathElement_GetTypeInfo(ISVGClipPathElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGClipPathElement_GetIDsOfNames(ISVGClipPathElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGClipPathElement_Invoke(ISVGClipPathElement* 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);
}
/*** ISVGClipPathElement methods ***/
static FORCEINLINE HRESULT ISVGClipPathElement_putref_clipPathUnits(ISVGClipPathElement* This,ISVGAnimatedEnumeration *v) {
    return This->lpVtbl->putref_clipPathUnits(This,v);
}
static FORCEINLINE HRESULT ISVGClipPathElement_get_clipPathUnits(ISVGClipPathElement* This,ISVGAnimatedEnumeration **p) {
    return This->lpVtbl->get_clipPathUnits(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGClipPathElement_putref_clipPathUnits_Proxy(
    ISVGClipPathElement* This,
    ISVGAnimatedEnumeration *v);
void __RPC_STUB ISVGClipPathElement_putref_clipPathUnits_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGClipPathElement_get_clipPathUnits_Proxy(
    ISVGClipPathElement* This,
    ISVGAnimatedEnumeration **p);
void __RPC_STUB ISVGClipPathElement_get_clipPathUnits_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGClipPathElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGClipPathElement dispinterface
 */
#ifndef __DispSVGClipPathElement_DISPINTERFACE_DEFINED__
#define __DispSVGClipPathElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGClipPathElement, 0x3059003b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059003b-98b5-11cf-bb82-00aa00bdce0b")
DispSVGClipPathElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGClipPathElement, 0x3059003b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGClipPathElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGClipPathElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGClipPathElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGClipPathElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGClipPathElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGClipPathElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGClipPathElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGClipPathElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGClipPathElementVtbl;
interface DispSVGClipPathElement {
    CONST_VTBL DispSVGClipPathElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGClipPathElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGClipPathElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGClipPathElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGClipPathElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGClipPathElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGClipPathElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGClipPathElement_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 DispSVGClipPathElement_QueryInterface(DispSVGClipPathElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGClipPathElement_AddRef(DispSVGClipPathElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGClipPathElement_Release(DispSVGClipPathElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGClipPathElement_GetTypeInfoCount(DispSVGClipPathElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGClipPathElement_GetTypeInfo(DispSVGClipPathElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGClipPathElement_GetIDsOfNames(DispSVGClipPathElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGClipPathElement_Invoke(DispSVGClipPathElement* 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  /* __DispSVGClipPathElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGClipPathElement coclass
 */

DEFINE_GUID(CLSID_SVGClipPathElement, 0x305105e6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105e6-98b5-11cf-bb82-00aa00bdce0b") SVGClipPathElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGClipPathElement, 0x305105e6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGClipPathElement;
/*****************************************************************************
 * ISVGDocument interface
 */
#ifndef __ISVGDocument_INTERFACE_DEFINED__
#define __ISVGDocument_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGDocument, 0x305104e6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104e6-98b5-11cf-bb82-00aa00bdce0b")
ISVGDocument : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_rootElement(
        ISVGSVGElement **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGDocument, 0x305104e6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGDocumentVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGDocument* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGDocument* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGDocument* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGDocument* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGDocument* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGDocument* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGDocument* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGDocument methods ***/
    HRESULT (STDMETHODCALLTYPE *get_rootElement)(
        ISVGDocument* This,
        ISVGSVGElement **p);

    END_INTERFACE
} ISVGDocumentVtbl;
interface ISVGDocument {
    CONST_VTBL ISVGDocumentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGDocument_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGDocument_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGDocument_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGDocument_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGDocument_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGDocument_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGDocument_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGDocument methods ***/
#define ISVGDocument_get_rootElement(This,p) (This)->lpVtbl->get_rootElement(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGDocument_QueryInterface(ISVGDocument* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGDocument_AddRef(ISVGDocument* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGDocument_Release(ISVGDocument* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGDocument_GetTypeInfoCount(ISVGDocument* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGDocument_GetTypeInfo(ISVGDocument* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGDocument_GetIDsOfNames(ISVGDocument* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGDocument_Invoke(ISVGDocument* 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);
}
/*** ISVGDocument methods ***/
static FORCEINLINE HRESULT ISVGDocument_get_rootElement(ISVGDocument* This,ISVGSVGElement **p) {
    return This->lpVtbl->get_rootElement(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGDocument_get_rootElement_Proxy(
    ISVGDocument* This,
    ISVGSVGElement **p);
void __RPC_STUB ISVGDocument_get_rootElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGDocument_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IGetSVGDocument interface
 */
#ifndef __IGetSVGDocument_INTERFACE_DEFINED__
#define __IGetSVGDocument_INTERFACE_DEFINED__

DEFINE_GUID(IID_IGetSVGDocument, 0x305105ab, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305105ab-98b5-11cf-bb82-00aa00bdce0b")
IGetSVGDocument : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE getSVGDocument(
        IDispatch **ppSVGDocument) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IGetSVGDocument, 0x305105ab, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IGetSVGDocumentVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IGetSVGDocument* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IGetSVGDocument* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IGetSVGDocument* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IGetSVGDocument* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IGetSVGDocument* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IGetSVGDocument* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IGetSVGDocument* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IGetSVGDocument methods ***/
    HRESULT (STDMETHODCALLTYPE *getSVGDocument)(
        IGetSVGDocument* This,
        IDispatch **ppSVGDocument);

    END_INTERFACE
} IGetSVGDocumentVtbl;
interface IGetSVGDocument {
    CONST_VTBL IGetSVGDocumentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IGetSVGDocument_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IGetSVGDocument_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IGetSVGDocument_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IGetSVGDocument_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IGetSVGDocument_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IGetSVGDocument_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IGetSVGDocument_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IGetSVGDocument methods ***/
#define IGetSVGDocument_getSVGDocument(This,ppSVGDocument) (This)->lpVtbl->getSVGDocument(This,ppSVGDocument)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IGetSVGDocument_QueryInterface(IGetSVGDocument* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IGetSVGDocument_AddRef(IGetSVGDocument* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IGetSVGDocument_Release(IGetSVGDocument* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IGetSVGDocument_GetTypeInfoCount(IGetSVGDocument* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IGetSVGDocument_GetTypeInfo(IGetSVGDocument* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IGetSVGDocument_GetIDsOfNames(IGetSVGDocument* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IGetSVGDocument_Invoke(IGetSVGDocument* 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);
}
/*** IGetSVGDocument methods ***/
static FORCEINLINE HRESULT IGetSVGDocument_getSVGDocument(IGetSVGDocument* This,IDispatch **ppSVGDocument) {
    return This->lpVtbl->getSVGDocument(This,ppSVGDocument);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IGetSVGDocument_getSVGDocument_Proxy(
    IGetSVGDocument* This,
    IDispatch **ppSVGDocument);
void __RPC_STUB IGetSVGDocument_getSVGDocument_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IGetSVGDocument_INTERFACE_DEFINED__ */

typedef enum _svgFocusable {
    svgFocusableNotSet = 0,
    svgFocusableAuto = 1,
    svgFocusableTrue = 2,
    svgFocusableFalse = 3,
    svgFocusable_Max = 0x7fffffff
} svgFocusable;
#ifndef __ISVGSVGElement_FWD_DEFINED__
#define __ISVGSVGElement_FWD_DEFINED__
typedef interface ISVGSVGElement ISVGSVGElement;
#endif

/*****************************************************************************
 * ISVGElement interface
 */
#ifndef __ISVGElement_INTERFACE_DEFINED__
#define __ISVGElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGElement, 0x305104c5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104c5-98b5-11cf-bb82-00aa00bdce0b")
ISVGElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_xmlbase(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_xmlbase(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_ownerSVGElement(
        ISVGSVGElement *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ownerSVGElement(
        ISVGSVGElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_viewportElement(
        ISVGElement *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_viewportElement(
        ISVGElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_focusable(
        ISVGAnimatedEnumeration *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_focusable(
        ISVGAnimatedEnumeration **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGElement, 0x305104c5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_xmlbase)(
        ISVGElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_xmlbase)(
        ISVGElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *putref_ownerSVGElement)(
        ISVGElement* This,
        ISVGSVGElement *v);

    HRESULT (STDMETHODCALLTYPE *get_ownerSVGElement)(
        ISVGElement* This,
        ISVGSVGElement **p);

    HRESULT (STDMETHODCALLTYPE *putref_viewportElement)(
        ISVGElement* This,
        ISVGElement *v);

    HRESULT (STDMETHODCALLTYPE *get_viewportElement)(
        ISVGElement* This,
        ISVGElement **p);

    HRESULT (STDMETHODCALLTYPE *putref_focusable)(
        ISVGElement* This,
        ISVGAnimatedEnumeration *v);

    HRESULT (STDMETHODCALLTYPE *get_focusable)(
        ISVGElement* This,
        ISVGAnimatedEnumeration **p);

    END_INTERFACE
} ISVGElementVtbl;
interface ISVGElement {
    CONST_VTBL ISVGElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGElement methods ***/
#define ISVGElement_put_xmlbase(This,v) (This)->lpVtbl->put_xmlbase(This,v)
#define ISVGElement_get_xmlbase(This,p) (This)->lpVtbl->get_xmlbase(This,p)
#define ISVGElement_putref_ownerSVGElement(This,v) (This)->lpVtbl->putref_ownerSVGElement(This,v)
#define ISVGElement_get_ownerSVGElement(This,p) (This)->lpVtbl->get_ownerSVGElement(This,p)
#define ISVGElement_putref_viewportElement(This,v) (This)->lpVtbl->putref_viewportElement(This,v)
#define ISVGElement_get_viewportElement(This,p) (This)->lpVtbl->get_viewportElement(This,p)
#define ISVGElement_putref_focusable(This,v) (This)->lpVtbl->putref_focusable(This,v)
#define ISVGElement_get_focusable(This,p) (This)->lpVtbl->get_focusable(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGElement_QueryInterface(ISVGElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGElement_AddRef(ISVGElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGElement_Release(ISVGElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGElement_GetTypeInfoCount(ISVGElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGElement_GetTypeInfo(ISVGElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGElement_GetIDsOfNames(ISVGElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGElement_Invoke(ISVGElement* 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);
}
/*** ISVGElement methods ***/
static FORCEINLINE HRESULT ISVGElement_put_xmlbase(ISVGElement* This,BSTR v) {
    return This->lpVtbl->put_xmlbase(This,v);
}
static FORCEINLINE HRESULT ISVGElement_get_xmlbase(ISVGElement* This,BSTR *p) {
    return This->lpVtbl->get_xmlbase(This,p);
}
static FORCEINLINE HRESULT ISVGElement_putref_ownerSVGElement(ISVGElement* This,ISVGSVGElement *v) {
    return This->lpVtbl->putref_ownerSVGElement(This,v);
}
static FORCEINLINE HRESULT ISVGElement_get_ownerSVGElement(ISVGElement* This,ISVGSVGElement **p) {
    return This->lpVtbl->get_ownerSVGElement(This,p);
}
static FORCEINLINE HRESULT ISVGElement_putref_viewportElement(ISVGElement* This,ISVGElement *v) {
    return This->lpVtbl->putref_viewportElement(This,v);
}
static FORCEINLINE HRESULT ISVGElement_get_viewportElement(ISVGElement* This,ISVGElement **p) {
    return This->lpVtbl->get_viewportElement(This,p);
}
static FORCEINLINE HRESULT ISVGElement_putref_focusable(ISVGElement* This,ISVGAnimatedEnumeration *v) {
    return This->lpVtbl->putref_focusable(This,v);
}
static FORCEINLINE HRESULT ISVGElement_get_focusable(ISVGElement* This,ISVGAnimatedEnumeration **p) {
    return This->lpVtbl->get_focusable(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGElement_put_xmlbase_Proxy(
    ISVGElement* This,
    BSTR v);
void __RPC_STUB ISVGElement_put_xmlbase_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGElement_get_xmlbase_Proxy(
    ISVGElement* This,
    BSTR *p);
void __RPC_STUB ISVGElement_get_xmlbase_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGElement_putref_ownerSVGElement_Proxy(
    ISVGElement* This,
    ISVGSVGElement *v);
void __RPC_STUB ISVGElement_putref_ownerSVGElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGElement_get_ownerSVGElement_Proxy(
    ISVGElement* This,
    ISVGSVGElement **p);
void __RPC_STUB ISVGElement_get_ownerSVGElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGElement_putref_viewportElement_Proxy(
    ISVGElement* This,
    ISVGElement *v);
void __RPC_STUB ISVGElement_putref_viewportElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGElement_get_viewportElement_Proxy(
    ISVGElement* This,
    ISVGElement **p);
void __RPC_STUB ISVGElement_get_viewportElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGElement_putref_focusable_Proxy(
    ISVGElement* This,
    ISVGAnimatedEnumeration *v);
void __RPC_STUB ISVGElement_putref_focusable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGElement_get_focusable_Proxy(
    ISVGElement* This,
    ISVGAnimatedEnumeration **p);
void __RPC_STUB ISVGElement_get_focusable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGElement dispinterface
 */
#ifndef __DispSVGElement_DISPINTERFACE_DEFINED__
#define __DispSVGElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGElement, 0x30590000, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590000-98b5-11cf-bb82-00aa00bdce0b")
DispSVGElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGElement, 0x30590000, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGElementVtbl;
interface DispSVGElement {
    CONST_VTBL DispSVGElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGElement_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 DispSVGElement_QueryInterface(DispSVGElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGElement_AddRef(DispSVGElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGElement_Release(DispSVGElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGElement_GetTypeInfoCount(DispSVGElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGElement_GetTypeInfo(DispSVGElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGElement_GetIDsOfNames(DispSVGElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGElement_Invoke(DispSVGElement* 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  /* __DispSVGElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGElement coclass
 */

DEFINE_GUID(CLSID_SVGElement, 0x30510564, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510564-98b5-11cf-bb82-00aa00bdce0b") SVGElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGElement, 0x30510564, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGElement;
/*****************************************************************************
 * IICCSVGColor interface
 */
#ifndef __IICCSVGColor_INTERFACE_DEFINED__
#define __IICCSVGColor_INTERFACE_DEFINED__

DEFINE_GUID(IID_IICCSVGColor, 0x305104d6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104d6-98b5-11cf-bb82-00aa00bdce0b")
IICCSVGColor : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IICCSVGColor, 0x305104d6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IICCSVGColorVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IICCSVGColor* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IICCSVGColor* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IICCSVGColor* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IICCSVGColor* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IICCSVGColor* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IICCSVGColor* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IICCSVGColor* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} IICCSVGColorVtbl;
interface IICCSVGColor {
    CONST_VTBL IICCSVGColorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IICCSVGColor_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IICCSVGColor_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IICCSVGColor_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IICCSVGColor_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IICCSVGColor_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IICCSVGColor_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IICCSVGColor_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 IICCSVGColor_QueryInterface(IICCSVGColor* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IICCSVGColor_AddRef(IICCSVGColor* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IICCSVGColor_Release(IICCSVGColor* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IICCSVGColor_GetTypeInfoCount(IICCSVGColor* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IICCSVGColor_GetTypeInfo(IICCSVGColor* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IICCSVGColor_GetIDsOfNames(IICCSVGColor* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IICCSVGColor_Invoke(IICCSVGColor* 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  /* __IICCSVGColor_INTERFACE_DEFINED__ */

typedef enum _svgLengthType {
    SVG_LENGTHTYPE_UNKNOWN = 0,
    SVG_LENGTHTYPE_NUMBER = 1,
    SVG_LENGTHTYPE_PERCENTAGE = 2,
    SVG_LENGTHTYPE_EMS = 3,
    SVG_LENGTHTYPE_EXS = 4,
    SVG_LENGTHTYPE_PX = 5,
    SVG_LENGTHTYPE_CM = 6,
    SVG_LENGTHTYPE_MM = 7,
    SVG_LENGTHTYPE_IN = 8,
    SVG_LENGTHTYPE_PT = 9,
    SVG_LENGTHTYPE_PC = 10,
    svgLengthType_Max = 0x7fffffff
} svgLengthType;
/*****************************************************************************
 * ISVGLength interface
 */
#ifndef __ISVGLength_INTERFACE_DEFINED__
#define __ISVGLength_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGLength, 0x305104cf, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104cf-98b5-11cf-bb82-00aa00bdce0b")
ISVGLength : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_unitType(
        short v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_unitType(
        short *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_value(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_value(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_valueInSpecifiedUnits(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_valueInSpecifiedUnits(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_valueAsString(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_valueAsString(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE newValueSpecifiedUnits(
        short unitType,
        float valueInSpecifiedUnits) = 0;

    virtual HRESULT STDMETHODCALLTYPE convertToSpecifiedUnits(
        short unitType) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGLength, 0x305104cf, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGLengthVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGLength* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGLength* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGLength* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGLength* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGLength* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGLength* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGLength* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGLength methods ***/
    HRESULT (STDMETHODCALLTYPE *put_unitType)(
        ISVGLength* This,
        short v);

    HRESULT (STDMETHODCALLTYPE *get_unitType)(
        ISVGLength* This,
        short *p);

    HRESULT (STDMETHODCALLTYPE *put_value)(
        ISVGLength* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_value)(
        ISVGLength* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_valueInSpecifiedUnits)(
        ISVGLength* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_valueInSpecifiedUnits)(
        ISVGLength* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_valueAsString)(
        ISVGLength* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_valueAsString)(
        ISVGLength* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *newValueSpecifiedUnits)(
        ISVGLength* This,
        short unitType,
        float valueInSpecifiedUnits);

    HRESULT (STDMETHODCALLTYPE *convertToSpecifiedUnits)(
        ISVGLength* This,
        short unitType);

    END_INTERFACE
} ISVGLengthVtbl;
interface ISVGLength {
    CONST_VTBL ISVGLengthVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGLength_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGLength_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGLength_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGLength_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGLength_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGLength_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGLength_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGLength methods ***/
#define ISVGLength_put_unitType(This,v) (This)->lpVtbl->put_unitType(This,v)
#define ISVGLength_get_unitType(This,p) (This)->lpVtbl->get_unitType(This,p)
#define ISVGLength_put_value(This,v) (This)->lpVtbl->put_value(This,v)
#define ISVGLength_get_value(This,p) (This)->lpVtbl->get_value(This,p)
#define ISVGLength_put_valueInSpecifiedUnits(This,v) (This)->lpVtbl->put_valueInSpecifiedUnits(This,v)
#define ISVGLength_get_valueInSpecifiedUnits(This,p) (This)->lpVtbl->get_valueInSpecifiedUnits(This,p)
#define ISVGLength_put_valueAsString(This,v) (This)->lpVtbl->put_valueAsString(This,v)
#define ISVGLength_get_valueAsString(This,p) (This)->lpVtbl->get_valueAsString(This,p)
#define ISVGLength_newValueSpecifiedUnits(This,unitType,valueInSpecifiedUnits) (This)->lpVtbl->newValueSpecifiedUnits(This,unitType,valueInSpecifiedUnits)
#define ISVGLength_convertToSpecifiedUnits(This,unitType) (This)->lpVtbl->convertToSpecifiedUnits(This,unitType)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGLength_QueryInterface(ISVGLength* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGLength_AddRef(ISVGLength* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGLength_Release(ISVGLength* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGLength_GetTypeInfoCount(ISVGLength* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGLength_GetTypeInfo(ISVGLength* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGLength_GetIDsOfNames(ISVGLength* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGLength_Invoke(ISVGLength* 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);
}
/*** ISVGLength methods ***/
static FORCEINLINE HRESULT ISVGLength_put_unitType(ISVGLength* This,short v) {
    return This->lpVtbl->put_unitType(This,v);
}
static FORCEINLINE HRESULT ISVGLength_get_unitType(ISVGLength* This,short *p) {
    return This->lpVtbl->get_unitType(This,p);
}
static FORCEINLINE HRESULT ISVGLength_put_value(ISVGLength* This,float v) {
    return This->lpVtbl->put_value(This,v);
}
static FORCEINLINE HRESULT ISVGLength_get_value(ISVGLength* This,float *p) {
    return This->lpVtbl->get_value(This,p);
}
static FORCEINLINE HRESULT ISVGLength_put_valueInSpecifiedUnits(ISVGLength* This,float v) {
    return This->lpVtbl->put_valueInSpecifiedUnits(This,v);
}
static FORCEINLINE HRESULT ISVGLength_get_valueInSpecifiedUnits(ISVGLength* This,float *p) {
    return This->lpVtbl->get_valueInSpecifiedUnits(This,p);
}
static FORCEINLINE HRESULT ISVGLength_put_valueAsString(ISVGLength* This,BSTR v) {
    return This->lpVtbl->put_valueAsString(This,v);
}
static FORCEINLINE HRESULT ISVGLength_get_valueAsString(ISVGLength* This,BSTR *p) {
    return This->lpVtbl->get_valueAsString(This,p);
}
static FORCEINLINE HRESULT ISVGLength_newValueSpecifiedUnits(ISVGLength* This,short unitType,float valueInSpecifiedUnits) {
    return This->lpVtbl->newValueSpecifiedUnits(This,unitType,valueInSpecifiedUnits);
}
static FORCEINLINE HRESULT ISVGLength_convertToSpecifiedUnits(ISVGLength* This,short unitType) {
    return This->lpVtbl->convertToSpecifiedUnits(This,unitType);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGLength_put_unitType_Proxy(
    ISVGLength* This,
    short v);
void __RPC_STUB ISVGLength_put_unitType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLength_get_unitType_Proxy(
    ISVGLength* This,
    short *p);
void __RPC_STUB ISVGLength_get_unitType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLength_put_value_Proxy(
    ISVGLength* This,
    float v);
void __RPC_STUB ISVGLength_put_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLength_get_value_Proxy(
    ISVGLength* This,
    float *p);
void __RPC_STUB ISVGLength_get_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLength_put_valueInSpecifiedUnits_Proxy(
    ISVGLength* This,
    float v);
void __RPC_STUB ISVGLength_put_valueInSpecifiedUnits_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLength_get_valueInSpecifiedUnits_Proxy(
    ISVGLength* This,
    float *p);
void __RPC_STUB ISVGLength_get_valueInSpecifiedUnits_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLength_put_valueAsString_Proxy(
    ISVGLength* This,
    BSTR v);
void __RPC_STUB ISVGLength_put_valueAsString_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLength_get_valueAsString_Proxy(
    ISVGLength* This,
    BSTR *p);
void __RPC_STUB ISVGLength_get_valueAsString_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLength_newValueSpecifiedUnits_Proxy(
    ISVGLength* This,
    short unitType,
    float valueInSpecifiedUnits);
void __RPC_STUB ISVGLength_newValueSpecifiedUnits_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLength_convertToSpecifiedUnits_Proxy(
    ISVGLength* This,
    short unitType);
void __RPC_STUB ISVGLength_convertToSpecifiedUnits_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGLength_INTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGLength coclass
 */

DEFINE_GUID(CLSID_SVGLength, 0x3051057e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3051057e-98b5-11cf-bb82-00aa00bdce0b") SVGLength;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGLength, 0x3051057e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGLength;
#ifndef __ISVGLength_FWD_DEFINED__
#define __ISVGLength_FWD_DEFINED__
typedef interface ISVGLength ISVGLength;
#endif

/*****************************************************************************
 * ISVGLengthList interface
 */
#ifndef __ISVGLengthList_INTERFACE_DEFINED__
#define __ISVGLengthList_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGLengthList, 0x305104d1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104d1-98b5-11cf-bb82-00aa00bdce0b")
ISVGLengthList : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_numberOfItems(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_numberOfItems(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE clear(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE initialize(
        ISVGLength *newItem,
        ISVGLength **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE getItem(
        LONG index,
        ISVGLength **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE insertItemBefore(
        ISVGLength *newItem,
        LONG index,
        ISVGLength **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE replaceItem(
        ISVGLength *newItem,
        LONG index,
        ISVGLength **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeItem(
        LONG index,
        ISVGLength **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE appendItem(
        ISVGLength *newItem,
        ISVGLength **ppResult) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGLengthList, 0x305104d1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGLengthListVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGLengthList* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGLengthList* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGLengthList* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGLengthList* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGLengthList* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGLengthList* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGLengthList* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGLengthList methods ***/
    HRESULT (STDMETHODCALLTYPE *put_numberOfItems)(
        ISVGLengthList* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_numberOfItems)(
        ISVGLengthList* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *clear)(
        ISVGLengthList* This);

    HRESULT (STDMETHODCALLTYPE *initialize)(
        ISVGLengthList* This,
        ISVGLength *newItem,
        ISVGLength **ppResult);

    HRESULT (STDMETHODCALLTYPE *getItem)(
        ISVGLengthList* This,
        LONG index,
        ISVGLength **ppResult);

    HRESULT (STDMETHODCALLTYPE *insertItemBefore)(
        ISVGLengthList* This,
        ISVGLength *newItem,
        LONG index,
        ISVGLength **ppResult);

    HRESULT (STDMETHODCALLTYPE *replaceItem)(
        ISVGLengthList* This,
        ISVGLength *newItem,
        LONG index,
        ISVGLength **ppResult);

    HRESULT (STDMETHODCALLTYPE *removeItem)(
        ISVGLengthList* This,
        LONG index,
        ISVGLength **ppResult);

    HRESULT (STDMETHODCALLTYPE *appendItem)(
        ISVGLengthList* This,
        ISVGLength *newItem,
        ISVGLength **ppResult);

    END_INTERFACE
} ISVGLengthListVtbl;
interface ISVGLengthList {
    CONST_VTBL ISVGLengthListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGLengthList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGLengthList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGLengthList_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGLengthList_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGLengthList_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGLengthList_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGLengthList_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGLengthList methods ***/
#define ISVGLengthList_put_numberOfItems(This,v) (This)->lpVtbl->put_numberOfItems(This,v)
#define ISVGLengthList_get_numberOfItems(This,p) (This)->lpVtbl->get_numberOfItems(This,p)
#define ISVGLengthList_clear(This) (This)->lpVtbl->clear(This)
#define ISVGLengthList_initialize(This,newItem,ppResult) (This)->lpVtbl->initialize(This,newItem,ppResult)
#define ISVGLengthList_getItem(This,index,ppResult) (This)->lpVtbl->getItem(This,index,ppResult)
#define ISVGLengthList_insertItemBefore(This,newItem,index,ppResult) (This)->lpVtbl->insertItemBefore(This,newItem,index,ppResult)
#define ISVGLengthList_replaceItem(This,newItem,index,ppResult) (This)->lpVtbl->replaceItem(This,newItem,index,ppResult)
#define ISVGLengthList_removeItem(This,index,ppResult) (This)->lpVtbl->removeItem(This,index,ppResult)
#define ISVGLengthList_appendItem(This,newItem,ppResult) (This)->lpVtbl->appendItem(This,newItem,ppResult)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGLengthList_QueryInterface(ISVGLengthList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGLengthList_AddRef(ISVGLengthList* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGLengthList_Release(ISVGLengthList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGLengthList_GetTypeInfoCount(ISVGLengthList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGLengthList_GetTypeInfo(ISVGLengthList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGLengthList_GetIDsOfNames(ISVGLengthList* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGLengthList_Invoke(ISVGLengthList* 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);
}
/*** ISVGLengthList methods ***/
static FORCEINLINE HRESULT ISVGLengthList_put_numberOfItems(ISVGLengthList* This,LONG v) {
    return This->lpVtbl->put_numberOfItems(This,v);
}
static FORCEINLINE HRESULT ISVGLengthList_get_numberOfItems(ISVGLengthList* This,LONG *p) {
    return This->lpVtbl->get_numberOfItems(This,p);
}
static FORCEINLINE HRESULT ISVGLengthList_clear(ISVGLengthList* This) {
    return This->lpVtbl->clear(This);
}
static FORCEINLINE HRESULT ISVGLengthList_initialize(ISVGLengthList* This,ISVGLength *newItem,ISVGLength **ppResult) {
    return This->lpVtbl->initialize(This,newItem,ppResult);
}
static FORCEINLINE HRESULT ISVGLengthList_getItem(ISVGLengthList* This,LONG index,ISVGLength **ppResult) {
    return This->lpVtbl->getItem(This,index,ppResult);
}
static FORCEINLINE HRESULT ISVGLengthList_insertItemBefore(ISVGLengthList* This,ISVGLength *newItem,LONG index,ISVGLength **ppResult) {
    return This->lpVtbl->insertItemBefore(This,newItem,index,ppResult);
}
static FORCEINLINE HRESULT ISVGLengthList_replaceItem(ISVGLengthList* This,ISVGLength *newItem,LONG index,ISVGLength **ppResult) {
    return This->lpVtbl->replaceItem(This,newItem,index,ppResult);
}
static FORCEINLINE HRESULT ISVGLengthList_removeItem(ISVGLengthList* This,LONG index,ISVGLength **ppResult) {
    return This->lpVtbl->removeItem(This,index,ppResult);
}
static FORCEINLINE HRESULT ISVGLengthList_appendItem(ISVGLengthList* This,ISVGLength *newItem,ISVGLength **ppResult) {
    return This->lpVtbl->appendItem(This,newItem,ppResult);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGLengthList_put_numberOfItems_Proxy(
    ISVGLengthList* This,
    LONG v);
void __RPC_STUB ISVGLengthList_put_numberOfItems_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLengthList_get_numberOfItems_Proxy(
    ISVGLengthList* This,
    LONG *p);
void __RPC_STUB ISVGLengthList_get_numberOfItems_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLengthList_clear_Proxy(
    ISVGLengthList* This);
void __RPC_STUB ISVGLengthList_clear_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLengthList_initialize_Proxy(
    ISVGLengthList* This,
    ISVGLength *newItem,
    ISVGLength **ppResult);
void __RPC_STUB ISVGLengthList_initialize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLengthList_getItem_Proxy(
    ISVGLengthList* This,
    LONG index,
    ISVGLength **ppResult);
void __RPC_STUB ISVGLengthList_getItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLengthList_insertItemBefore_Proxy(
    ISVGLengthList* This,
    ISVGLength *newItem,
    LONG index,
    ISVGLength **ppResult);
void __RPC_STUB ISVGLengthList_insertItemBefore_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLengthList_replaceItem_Proxy(
    ISVGLengthList* This,
    ISVGLength *newItem,
    LONG index,
    ISVGLength **ppResult);
void __RPC_STUB ISVGLengthList_replaceItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLengthList_removeItem_Proxy(
    ISVGLengthList* This,
    LONG index,
    ISVGLength **ppResult);
void __RPC_STUB ISVGLengthList_removeItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLengthList_appendItem_Proxy(
    ISVGLengthList* This,
    ISVGLength *newItem,
    ISVGLength **ppResult);
void __RPC_STUB ISVGLengthList_appendItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGLengthList_INTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGLengthList coclass
 */

DEFINE_GUID(CLSID_SVGLengthList, 0x30510580, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510580-98b5-11cf-bb82-00aa00bdce0b") SVGLengthList;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGLengthList, 0x30510580, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGLengthList;
/*****************************************************************************
 * ISVGMatrix interface
 */
#ifndef __ISVGMatrix_INTERFACE_DEFINED__
#define __ISVGMatrix_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGMatrix, 0x305104f6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104f6-98b5-11cf-bb82-00aa00bdce0b")
ISVGMatrix : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_a(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_a(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_b(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_b(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_c(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_c(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_d(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_d(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_e(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_e(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_f(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_f(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE multiply(
        ISVGMatrix *secondMatrix,
        ISVGMatrix **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE inverse(
        ISVGMatrix **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE translate(
        float x,
        float y,
        ISVGMatrix **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE scale(
        float scaleFactor,
        ISVGMatrix **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE scaleNonUniform(
        float scaleFactorX,
        float scaleFactorY,
        ISVGMatrix **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE rotate(
        float angle,
        ISVGMatrix **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE rotateFromVector(
        float x,
        float y,
        ISVGMatrix **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE flipX(
        ISVGMatrix **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE flipY(
        ISVGMatrix **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE skewX(
        float angle,
        ISVGMatrix **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE skewY(
        float angle,
        ISVGMatrix **ppResult) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGMatrix, 0x305104f6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGMatrixVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGMatrix* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGMatrix* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGMatrix* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGMatrix* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGMatrix* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGMatrix* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGMatrix* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGMatrix methods ***/
    HRESULT (STDMETHODCALLTYPE *put_a)(
        ISVGMatrix* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_a)(
        ISVGMatrix* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_b)(
        ISVGMatrix* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_b)(
        ISVGMatrix* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_c)(
        ISVGMatrix* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_c)(
        ISVGMatrix* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_d)(
        ISVGMatrix* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_d)(
        ISVGMatrix* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_e)(
        ISVGMatrix* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_e)(
        ISVGMatrix* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_f)(
        ISVGMatrix* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_f)(
        ISVGMatrix* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *multiply)(
        ISVGMatrix* This,
        ISVGMatrix *secondMatrix,
        ISVGMatrix **ppResult);

    HRESULT (STDMETHODCALLTYPE *inverse)(
        ISVGMatrix* This,
        ISVGMatrix **ppResult);

    HRESULT (STDMETHODCALLTYPE *translate)(
        ISVGMatrix* This,
        float x,
        float y,
        ISVGMatrix **ppResult);

    HRESULT (STDMETHODCALLTYPE *scale)(
        ISVGMatrix* This,
        float scaleFactor,
        ISVGMatrix **ppResult);

    HRESULT (STDMETHODCALLTYPE *scaleNonUniform)(
        ISVGMatrix* This,
        float scaleFactorX,
        float scaleFactorY,
        ISVGMatrix **ppResult);

    HRESULT (STDMETHODCALLTYPE *rotate)(
        ISVGMatrix* This,
        float angle,
        ISVGMatrix **ppResult);

    HRESULT (STDMETHODCALLTYPE *rotateFromVector)(
        ISVGMatrix* This,
        float x,
        float y,
        ISVGMatrix **ppResult);

    HRESULT (STDMETHODCALLTYPE *flipX)(
        ISVGMatrix* This,
        ISVGMatrix **ppResult);

    HRESULT (STDMETHODCALLTYPE *flipY)(
        ISVGMatrix* This,
        ISVGMatrix **ppResult);

    HRESULT (STDMETHODCALLTYPE *skewX)(
        ISVGMatrix* This,
        float angle,
        ISVGMatrix **ppResult);

    HRESULT (STDMETHODCALLTYPE *skewY)(
        ISVGMatrix* This,
        float angle,
        ISVGMatrix **ppResult);

    END_INTERFACE
} ISVGMatrixVtbl;
interface ISVGMatrix {
    CONST_VTBL ISVGMatrixVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGMatrix_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGMatrix_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGMatrix_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGMatrix_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGMatrix_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGMatrix_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGMatrix_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGMatrix methods ***/
#define ISVGMatrix_put_a(This,v) (This)->lpVtbl->put_a(This,v)
#define ISVGMatrix_get_a(This,p) (This)->lpVtbl->get_a(This,p)
#define ISVGMatrix_put_b(This,v) (This)->lpVtbl->put_b(This,v)
#define ISVGMatrix_get_b(This,p) (This)->lpVtbl->get_b(This,p)
#define ISVGMatrix_put_c(This,v) (This)->lpVtbl->put_c(This,v)
#define ISVGMatrix_get_c(This,p) (This)->lpVtbl->get_c(This,p)
#define ISVGMatrix_put_d(This,v) (This)->lpVtbl->put_d(This,v)
#define ISVGMatrix_get_d(This,p) (This)->lpVtbl->get_d(This,p)
#define ISVGMatrix_put_e(This,v) (This)->lpVtbl->put_e(This,v)
#define ISVGMatrix_get_e(This,p) (This)->lpVtbl->get_e(This,p)
#define ISVGMatrix_put_f(This,v) (This)->lpVtbl->put_f(This,v)
#define ISVGMatrix_get_f(This,p) (This)->lpVtbl->get_f(This,p)
#define ISVGMatrix_multiply(This,secondMatrix,ppResult) (This)->lpVtbl->multiply(This,secondMatrix,ppResult)
#define ISVGMatrix_inverse(This,ppResult) (This)->lpVtbl->inverse(This,ppResult)
#define ISVGMatrix_translate(This,x,y,ppResult) (This)->lpVtbl->translate(This,x,y,ppResult)
#define ISVGMatrix_scale(This,scaleFactor,ppResult) (This)->lpVtbl->scale(This,scaleFactor,ppResult)
#define ISVGMatrix_scaleNonUniform(This,scaleFactorX,scaleFactorY,ppResult) (This)->lpVtbl->scaleNonUniform(This,scaleFactorX,scaleFactorY,ppResult)
#define ISVGMatrix_rotate(This,angle,ppResult) (This)->lpVtbl->rotate(This,angle,ppResult)
#define ISVGMatrix_rotateFromVector(This,x,y,ppResult) (This)->lpVtbl->rotateFromVector(This,x,y,ppResult)
#define ISVGMatrix_flipX(This,ppResult) (This)->lpVtbl->flipX(This,ppResult)
#define ISVGMatrix_flipY(This,ppResult) (This)->lpVtbl->flipY(This,ppResult)
#define ISVGMatrix_skewX(This,angle,ppResult) (This)->lpVtbl->skewX(This,angle,ppResult)
#define ISVGMatrix_skewY(This,angle,ppResult) (This)->lpVtbl->skewY(This,angle,ppResult)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGMatrix_QueryInterface(ISVGMatrix* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGMatrix_AddRef(ISVGMatrix* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGMatrix_Release(ISVGMatrix* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGMatrix_GetTypeInfoCount(ISVGMatrix* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGMatrix_GetTypeInfo(ISVGMatrix* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGMatrix_GetIDsOfNames(ISVGMatrix* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGMatrix_Invoke(ISVGMatrix* 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);
}
/*** ISVGMatrix methods ***/
static FORCEINLINE HRESULT ISVGMatrix_put_a(ISVGMatrix* This,float v) {
    return This->lpVtbl->put_a(This,v);
}
static FORCEINLINE HRESULT ISVGMatrix_get_a(ISVGMatrix* This,float *p) {
    return This->lpVtbl->get_a(This,p);
}
static FORCEINLINE HRESULT ISVGMatrix_put_b(ISVGMatrix* This,float v) {
    return This->lpVtbl->put_b(This,v);
}
static FORCEINLINE HRESULT ISVGMatrix_get_b(ISVGMatrix* This,float *p) {
    return This->lpVtbl->get_b(This,p);
}
static FORCEINLINE HRESULT ISVGMatrix_put_c(ISVGMatrix* This,float v) {
    return This->lpVtbl->put_c(This,v);
}
static FORCEINLINE HRESULT ISVGMatrix_get_c(ISVGMatrix* This,float *p) {
    return This->lpVtbl->get_c(This,p);
}
static FORCEINLINE HRESULT ISVGMatrix_put_d(ISVGMatrix* This,float v) {
    return This->lpVtbl->put_d(This,v);
}
static FORCEINLINE HRESULT ISVGMatrix_get_d(ISVGMatrix* This,float *p) {
    return This->lpVtbl->get_d(This,p);
}
static FORCEINLINE HRESULT ISVGMatrix_put_e(ISVGMatrix* This,float v) {
    return This->lpVtbl->put_e(This,v);
}
static FORCEINLINE HRESULT ISVGMatrix_get_e(ISVGMatrix* This,float *p) {
    return This->lpVtbl->get_e(This,p);
}
static FORCEINLINE HRESULT ISVGMatrix_put_f(ISVGMatrix* This,float v) {
    return This->lpVtbl->put_f(This,v);
}
static FORCEINLINE HRESULT ISVGMatrix_get_f(ISVGMatrix* This,float *p) {
    return This->lpVtbl->get_f(This,p);
}
static FORCEINLINE HRESULT ISVGMatrix_multiply(ISVGMatrix* This,ISVGMatrix *secondMatrix,ISVGMatrix **ppResult) {
    return This->lpVtbl->multiply(This,secondMatrix,ppResult);
}
static FORCEINLINE HRESULT ISVGMatrix_inverse(ISVGMatrix* This,ISVGMatrix **ppResult) {
    return This->lpVtbl->inverse(This,ppResult);
}
static FORCEINLINE HRESULT ISVGMatrix_translate(ISVGMatrix* This,float x,float y,ISVGMatrix **ppResult) {
    return This->lpVtbl->translate(This,x,y,ppResult);
}
static FORCEINLINE HRESULT ISVGMatrix_scale(ISVGMatrix* This,float scaleFactor,ISVGMatrix **ppResult) {
    return This->lpVtbl->scale(This,scaleFactor,ppResult);
}
static FORCEINLINE HRESULT ISVGMatrix_scaleNonUniform(ISVGMatrix* This,float scaleFactorX,float scaleFactorY,ISVGMatrix **ppResult) {
    return This->lpVtbl->scaleNonUniform(This,scaleFactorX,scaleFactorY,ppResult);
}
static FORCEINLINE HRESULT ISVGMatrix_rotate(ISVGMatrix* This,float angle,ISVGMatrix **ppResult) {
    return This->lpVtbl->rotate(This,angle,ppResult);
}
static FORCEINLINE HRESULT ISVGMatrix_rotateFromVector(ISVGMatrix* This,float x,float y,ISVGMatrix **ppResult) {
    return This->lpVtbl->rotateFromVector(This,x,y,ppResult);
}
static FORCEINLINE HRESULT ISVGMatrix_flipX(ISVGMatrix* This,ISVGMatrix **ppResult) {
    return This->lpVtbl->flipX(This,ppResult);
}
static FORCEINLINE HRESULT ISVGMatrix_flipY(ISVGMatrix* This,ISVGMatrix **ppResult) {
    return This->lpVtbl->flipY(This,ppResult);
}
static FORCEINLINE HRESULT ISVGMatrix_skewX(ISVGMatrix* This,float angle,ISVGMatrix **ppResult) {
    return This->lpVtbl->skewX(This,angle,ppResult);
}
static FORCEINLINE HRESULT ISVGMatrix_skewY(ISVGMatrix* This,float angle,ISVGMatrix **ppResult) {
    return This->lpVtbl->skewY(This,angle,ppResult);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGMatrix_put_a_Proxy(
    ISVGMatrix* This,
    float v);
void __RPC_STUB ISVGMatrix_put_a_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMatrix_get_a_Proxy(
    ISVGMatrix* This,
    float *p);
void __RPC_STUB ISVGMatrix_get_a_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMatrix_put_b_Proxy(
    ISVGMatrix* This,
    float v);
void __RPC_STUB ISVGMatrix_put_b_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMatrix_get_b_Proxy(
    ISVGMatrix* This,
    float *p);
void __RPC_STUB ISVGMatrix_get_b_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMatrix_put_c_Proxy(
    ISVGMatrix* This,
    float v);
void __RPC_STUB ISVGMatrix_put_c_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMatrix_get_c_Proxy(
    ISVGMatrix* This,
    float *p);
void __RPC_STUB ISVGMatrix_get_c_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMatrix_put_d_Proxy(
    ISVGMatrix* This,
    float v);
void __RPC_STUB ISVGMatrix_put_d_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMatrix_get_d_Proxy(
    ISVGMatrix* This,
    float *p);
void __RPC_STUB ISVGMatrix_get_d_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMatrix_put_e_Proxy(
    ISVGMatrix* This,
    float v);
void __RPC_STUB ISVGMatrix_put_e_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMatrix_get_e_Proxy(
    ISVGMatrix* This,
    float *p);
void __RPC_STUB ISVGMatrix_get_e_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMatrix_put_f_Proxy(
    ISVGMatrix* This,
    float v);
void __RPC_STUB ISVGMatrix_put_f_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMatrix_get_f_Proxy(
    ISVGMatrix* This,
    float *p);
void __RPC_STUB ISVGMatrix_get_f_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMatrix_multiply_Proxy(
    ISVGMatrix* This,
    ISVGMatrix *secondMatrix,
    ISVGMatrix **ppResult);
void __RPC_STUB ISVGMatrix_multiply_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMatrix_inverse_Proxy(
    ISVGMatrix* This,
    ISVGMatrix **ppResult);
void __RPC_STUB ISVGMatrix_inverse_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMatrix_translate_Proxy(
    ISVGMatrix* This,
    float x,
    float y,
    ISVGMatrix **ppResult);
void __RPC_STUB ISVGMatrix_translate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMatrix_scale_Proxy(
    ISVGMatrix* This,
    float scaleFactor,
    ISVGMatrix **ppResult);
void __RPC_STUB ISVGMatrix_scale_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMatrix_scaleNonUniform_Proxy(
    ISVGMatrix* This,
    float scaleFactorX,
    float scaleFactorY,
    ISVGMatrix **ppResult);
void __RPC_STUB ISVGMatrix_scaleNonUniform_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMatrix_rotate_Proxy(
    ISVGMatrix* This,
    float angle,
    ISVGMatrix **ppResult);
void __RPC_STUB ISVGMatrix_rotate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMatrix_rotateFromVector_Proxy(
    ISVGMatrix* This,
    float x,
    float y,
    ISVGMatrix **ppResult);
void __RPC_STUB ISVGMatrix_rotateFromVector_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMatrix_flipX_Proxy(
    ISVGMatrix* This,
    ISVGMatrix **ppResult);
void __RPC_STUB ISVGMatrix_flipX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMatrix_flipY_Proxy(
    ISVGMatrix* This,
    ISVGMatrix **ppResult);
void __RPC_STUB ISVGMatrix_flipY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMatrix_skewX_Proxy(
    ISVGMatrix* This,
    float angle,
    ISVGMatrix **ppResult);
void __RPC_STUB ISVGMatrix_skewX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMatrix_skewY_Proxy(
    ISVGMatrix* This,
    float angle,
    ISVGMatrix **ppResult);
void __RPC_STUB ISVGMatrix_skewY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGMatrix_INTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGMatrix coclass
 */

DEFINE_GUID(CLSID_SVGMatrix, 0x305105ae, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105ae-98b5-11cf-bb82-00aa00bdce0b") SVGMatrix;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGMatrix, 0x305105ae, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGMatrix;
/*****************************************************************************
 * ISVGNumber interface
 */
#ifndef __ISVGNumber_INTERFACE_DEFINED__
#define __ISVGNumber_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGNumber, 0x305104cb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104cb-98b5-11cf-bb82-00aa00bdce0b")
ISVGNumber : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_value(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_value(
        float *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGNumber, 0x305104cb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGNumberVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGNumber* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGNumber* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGNumber* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGNumber* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGNumber* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGNumber* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGNumber* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGNumber methods ***/
    HRESULT (STDMETHODCALLTYPE *put_value)(
        ISVGNumber* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_value)(
        ISVGNumber* This,
        float *p);

    END_INTERFACE
} ISVGNumberVtbl;
interface ISVGNumber {
    CONST_VTBL ISVGNumberVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGNumber_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGNumber_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGNumber_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGNumber_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGNumber_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGNumber_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGNumber_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGNumber methods ***/
#define ISVGNumber_put_value(This,v) (This)->lpVtbl->put_value(This,v)
#define ISVGNumber_get_value(This,p) (This)->lpVtbl->get_value(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGNumber_QueryInterface(ISVGNumber* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGNumber_AddRef(ISVGNumber* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGNumber_Release(ISVGNumber* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGNumber_GetTypeInfoCount(ISVGNumber* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGNumber_GetTypeInfo(ISVGNumber* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGNumber_GetIDsOfNames(ISVGNumber* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGNumber_Invoke(ISVGNumber* 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);
}
/*** ISVGNumber methods ***/
static FORCEINLINE HRESULT ISVGNumber_put_value(ISVGNumber* This,float v) {
    return This->lpVtbl->put_value(This,v);
}
static FORCEINLINE HRESULT ISVGNumber_get_value(ISVGNumber* This,float *p) {
    return This->lpVtbl->get_value(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGNumber_put_value_Proxy(
    ISVGNumber* This,
    float v);
void __RPC_STUB ISVGNumber_put_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGNumber_get_value_Proxy(
    ISVGNumber* This,
    float *p);
void __RPC_STUB ISVGNumber_get_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGNumber_INTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGNumber coclass
 */

DEFINE_GUID(CLSID_SVGNumber, 0x30510587, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510587-98b5-11cf-bb82-00aa00bdce0b") SVGNumber;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGNumber, 0x30510587, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGNumber;
#ifndef __ISVGNumber_FWD_DEFINED__
#define __ISVGNumber_FWD_DEFINED__
typedef interface ISVGNumber ISVGNumber;
#endif

/*****************************************************************************
 * ISVGNumberList interface
 */
#ifndef __ISVGNumberList_INTERFACE_DEFINED__
#define __ISVGNumberList_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGNumberList, 0x305104cd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104cd-98b5-11cf-bb82-00aa00bdce0b")
ISVGNumberList : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_numberOfItems(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_numberOfItems(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE clear(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE initialize(
        ISVGNumber *newItem,
        ISVGNumber **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE getItem(
        LONG index,
        ISVGNumber **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE insertItemBefore(
        ISVGNumber *newItem,
        LONG index,
        ISVGNumber **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE replaceItem(
        ISVGNumber *newItem,
        LONG index,
        ISVGNumber **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeItem(
        LONG index,
        ISVGNumber **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE appendItem(
        ISVGNumber *newItem,
        ISVGNumber **ppResult) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGNumberList, 0x305104cd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGNumberListVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGNumberList* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGNumberList* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGNumberList* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGNumberList* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGNumberList* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGNumberList* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGNumberList* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGNumberList methods ***/
    HRESULT (STDMETHODCALLTYPE *put_numberOfItems)(
        ISVGNumberList* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_numberOfItems)(
        ISVGNumberList* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *clear)(
        ISVGNumberList* This);

    HRESULT (STDMETHODCALLTYPE *initialize)(
        ISVGNumberList* This,
        ISVGNumber *newItem,
        ISVGNumber **ppResult);

    HRESULT (STDMETHODCALLTYPE *getItem)(
        ISVGNumberList* This,
        LONG index,
        ISVGNumber **ppResult);

    HRESULT (STDMETHODCALLTYPE *insertItemBefore)(
        ISVGNumberList* This,
        ISVGNumber *newItem,
        LONG index,
        ISVGNumber **ppResult);

    HRESULT (STDMETHODCALLTYPE *replaceItem)(
        ISVGNumberList* This,
        ISVGNumber *newItem,
        LONG index,
        ISVGNumber **ppResult);

    HRESULT (STDMETHODCALLTYPE *removeItem)(
        ISVGNumberList* This,
        LONG index,
        ISVGNumber **ppResult);

    HRESULT (STDMETHODCALLTYPE *appendItem)(
        ISVGNumberList* This,
        ISVGNumber *newItem,
        ISVGNumber **ppResult);

    END_INTERFACE
} ISVGNumberListVtbl;
interface ISVGNumberList {
    CONST_VTBL ISVGNumberListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGNumberList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGNumberList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGNumberList_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGNumberList_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGNumberList_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGNumberList_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGNumberList_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGNumberList methods ***/
#define ISVGNumberList_put_numberOfItems(This,v) (This)->lpVtbl->put_numberOfItems(This,v)
#define ISVGNumberList_get_numberOfItems(This,p) (This)->lpVtbl->get_numberOfItems(This,p)
#define ISVGNumberList_clear(This) (This)->lpVtbl->clear(This)
#define ISVGNumberList_initialize(This,newItem,ppResult) (This)->lpVtbl->initialize(This,newItem,ppResult)
#define ISVGNumberList_getItem(This,index,ppResult) (This)->lpVtbl->getItem(This,index,ppResult)
#define ISVGNumberList_insertItemBefore(This,newItem,index,ppResult) (This)->lpVtbl->insertItemBefore(This,newItem,index,ppResult)
#define ISVGNumberList_replaceItem(This,newItem,index,ppResult) (This)->lpVtbl->replaceItem(This,newItem,index,ppResult)
#define ISVGNumberList_removeItem(This,index,ppResult) (This)->lpVtbl->removeItem(This,index,ppResult)
#define ISVGNumberList_appendItem(This,newItem,ppResult) (This)->lpVtbl->appendItem(This,newItem,ppResult)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGNumberList_QueryInterface(ISVGNumberList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGNumberList_AddRef(ISVGNumberList* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGNumberList_Release(ISVGNumberList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGNumberList_GetTypeInfoCount(ISVGNumberList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGNumberList_GetTypeInfo(ISVGNumberList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGNumberList_GetIDsOfNames(ISVGNumberList* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGNumberList_Invoke(ISVGNumberList* 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);
}
/*** ISVGNumberList methods ***/
static FORCEINLINE HRESULT ISVGNumberList_put_numberOfItems(ISVGNumberList* This,LONG v) {
    return This->lpVtbl->put_numberOfItems(This,v);
}
static FORCEINLINE HRESULT ISVGNumberList_get_numberOfItems(ISVGNumberList* This,LONG *p) {
    return This->lpVtbl->get_numberOfItems(This,p);
}
static FORCEINLINE HRESULT ISVGNumberList_clear(ISVGNumberList* This) {
    return This->lpVtbl->clear(This);
}
static FORCEINLINE HRESULT ISVGNumberList_initialize(ISVGNumberList* This,ISVGNumber *newItem,ISVGNumber **ppResult) {
    return This->lpVtbl->initialize(This,newItem,ppResult);
}
static FORCEINLINE HRESULT ISVGNumberList_getItem(ISVGNumberList* This,LONG index,ISVGNumber **ppResult) {
    return This->lpVtbl->getItem(This,index,ppResult);
}
static FORCEINLINE HRESULT ISVGNumberList_insertItemBefore(ISVGNumberList* This,ISVGNumber *newItem,LONG index,ISVGNumber **ppResult) {
    return This->lpVtbl->insertItemBefore(This,newItem,index,ppResult);
}
static FORCEINLINE HRESULT ISVGNumberList_replaceItem(ISVGNumberList* This,ISVGNumber *newItem,LONG index,ISVGNumber **ppResult) {
    return This->lpVtbl->replaceItem(This,newItem,index,ppResult);
}
static FORCEINLINE HRESULT ISVGNumberList_removeItem(ISVGNumberList* This,LONG index,ISVGNumber **ppResult) {
    return This->lpVtbl->removeItem(This,index,ppResult);
}
static FORCEINLINE HRESULT ISVGNumberList_appendItem(ISVGNumberList* This,ISVGNumber *newItem,ISVGNumber **ppResult) {
    return This->lpVtbl->appendItem(This,newItem,ppResult);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGNumberList_put_numberOfItems_Proxy(
    ISVGNumberList* This,
    LONG v);
void __RPC_STUB ISVGNumberList_put_numberOfItems_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGNumberList_get_numberOfItems_Proxy(
    ISVGNumberList* This,
    LONG *p);
void __RPC_STUB ISVGNumberList_get_numberOfItems_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGNumberList_clear_Proxy(
    ISVGNumberList* This);
void __RPC_STUB ISVGNumberList_clear_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGNumberList_initialize_Proxy(
    ISVGNumberList* This,
    ISVGNumber *newItem,
    ISVGNumber **ppResult);
void __RPC_STUB ISVGNumberList_initialize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGNumberList_getItem_Proxy(
    ISVGNumberList* This,
    LONG index,
    ISVGNumber **ppResult);
void __RPC_STUB ISVGNumberList_getItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGNumberList_insertItemBefore_Proxy(
    ISVGNumberList* This,
    ISVGNumber *newItem,
    LONG index,
    ISVGNumber **ppResult);
void __RPC_STUB ISVGNumberList_insertItemBefore_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGNumberList_replaceItem_Proxy(
    ISVGNumberList* This,
    ISVGNumber *newItem,
    LONG index,
    ISVGNumber **ppResult);
void __RPC_STUB ISVGNumberList_replaceItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGNumberList_removeItem_Proxy(
    ISVGNumberList* This,
    LONG index,
    ISVGNumber **ppResult);
void __RPC_STUB ISVGNumberList_removeItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGNumberList_appendItem_Proxy(
    ISVGNumberList* This,
    ISVGNumber *newItem,
    ISVGNumber **ppResult);
void __RPC_STUB ISVGNumberList_appendItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGNumberList_INTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGNumberList coclass
 */

DEFINE_GUID(CLSID_SVGNumberList, 0x30510589, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510589-98b5-11cf-bb82-00aa00bdce0b") SVGNumberList;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGNumberList, 0x30510589, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGNumberList;
/*****************************************************************************
 * ISVGPaint interface
 */
#ifndef __ISVGPaint_INTERFACE_DEFINED__
#define __ISVGPaint_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGPaint, 0x30510524, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510524-98b5-11cf-bb82-00aa00bdce0b")
ISVGPaint : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGPaint, 0x30510524, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGPaintVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGPaint* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGPaint* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGPaint* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGPaint* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGPaint* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGPaint* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGPaint* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} ISVGPaintVtbl;
interface ISVGPaint {
    CONST_VTBL ISVGPaintVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGPaint_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGPaint_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGPaint_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGPaint_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGPaint_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGPaint_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGPaint_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 ISVGPaint_QueryInterface(ISVGPaint* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGPaint_AddRef(ISVGPaint* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGPaint_Release(ISVGPaint* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGPaint_GetTypeInfoCount(ISVGPaint* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGPaint_GetTypeInfo(ISVGPaint* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGPaint_GetIDsOfNames(ISVGPaint* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGPaint_Invoke(ISVGPaint* 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  /* __ISVGPaint_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGPatternElement interface
 */
#ifndef __ISVGPatternElement_INTERFACE_DEFINED__
#define __ISVGPatternElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGPatternElement, 0x3051052c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051052c-98b5-11cf-bb82-00aa00bdce0b")
ISVGPatternElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_patternUnits(
        ISVGAnimatedEnumeration *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_patternUnits(
        ISVGAnimatedEnumeration **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_patternContentUnits(
        ISVGAnimatedEnumeration *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_patternContentUnits(
        ISVGAnimatedEnumeration **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_patternTransform(
        ISVGAnimatedTransformList *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_patternTransform(
        ISVGAnimatedTransformList **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_x(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_y(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_width(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_width(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_height(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_height(
        ISVGAnimatedLength **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGPatternElement, 0x3051052c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGPatternElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGPatternElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGPatternElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGPatternElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGPatternElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGPatternElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGPatternElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGPatternElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGPatternElement methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_patternUnits)(
        ISVGPatternElement* This,
        ISVGAnimatedEnumeration *v);

    HRESULT (STDMETHODCALLTYPE *get_patternUnits)(
        ISVGPatternElement* This,
        ISVGAnimatedEnumeration **p);

    HRESULT (STDMETHODCALLTYPE *putref_patternContentUnits)(
        ISVGPatternElement* This,
        ISVGAnimatedEnumeration *v);

    HRESULT (STDMETHODCALLTYPE *get_patternContentUnits)(
        ISVGPatternElement* This,
        ISVGAnimatedEnumeration **p);

    HRESULT (STDMETHODCALLTYPE *putref_patternTransform)(
        ISVGPatternElement* This,
        ISVGAnimatedTransformList *v);

    HRESULT (STDMETHODCALLTYPE *get_patternTransform)(
        ISVGPatternElement* This,
        ISVGAnimatedTransformList **p);

    HRESULT (STDMETHODCALLTYPE *putref_x)(
        ISVGPatternElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_x)(
        ISVGPatternElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_y)(
        ISVGPatternElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_y)(
        ISVGPatternElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_width)(
        ISVGPatternElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_width)(
        ISVGPatternElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_height)(
        ISVGPatternElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_height)(
        ISVGPatternElement* This,
        ISVGAnimatedLength **p);

    END_INTERFACE
} ISVGPatternElementVtbl;
interface ISVGPatternElement {
    CONST_VTBL ISVGPatternElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGPatternElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGPatternElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGPatternElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGPatternElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGPatternElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGPatternElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGPatternElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGPatternElement methods ***/
#define ISVGPatternElement_putref_patternUnits(This,v) (This)->lpVtbl->putref_patternUnits(This,v)
#define ISVGPatternElement_get_patternUnits(This,p) (This)->lpVtbl->get_patternUnits(This,p)
#define ISVGPatternElement_putref_patternContentUnits(This,v) (This)->lpVtbl->putref_patternContentUnits(This,v)
#define ISVGPatternElement_get_patternContentUnits(This,p) (This)->lpVtbl->get_patternContentUnits(This,p)
#define ISVGPatternElement_putref_patternTransform(This,v) (This)->lpVtbl->putref_patternTransform(This,v)
#define ISVGPatternElement_get_patternTransform(This,p) (This)->lpVtbl->get_patternTransform(This,p)
#define ISVGPatternElement_putref_x(This,v) (This)->lpVtbl->putref_x(This,v)
#define ISVGPatternElement_get_x(This,p) (This)->lpVtbl->get_x(This,p)
#define ISVGPatternElement_putref_y(This,v) (This)->lpVtbl->putref_y(This,v)
#define ISVGPatternElement_get_y(This,p) (This)->lpVtbl->get_y(This,p)
#define ISVGPatternElement_putref_width(This,v) (This)->lpVtbl->putref_width(This,v)
#define ISVGPatternElement_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#define ISVGPatternElement_putref_height(This,v) (This)->lpVtbl->putref_height(This,v)
#define ISVGPatternElement_get_height(This,p) (This)->lpVtbl->get_height(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGPatternElement_QueryInterface(ISVGPatternElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGPatternElement_AddRef(ISVGPatternElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGPatternElement_Release(ISVGPatternElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGPatternElement_GetTypeInfoCount(ISVGPatternElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGPatternElement_GetTypeInfo(ISVGPatternElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGPatternElement_GetIDsOfNames(ISVGPatternElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGPatternElement_Invoke(ISVGPatternElement* 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);
}
/*** ISVGPatternElement methods ***/
static FORCEINLINE HRESULT ISVGPatternElement_putref_patternUnits(ISVGPatternElement* This,ISVGAnimatedEnumeration *v) {
    return This->lpVtbl->putref_patternUnits(This,v);
}
static FORCEINLINE HRESULT ISVGPatternElement_get_patternUnits(ISVGPatternElement* This,ISVGAnimatedEnumeration **p) {
    return This->lpVtbl->get_patternUnits(This,p);
}
static FORCEINLINE HRESULT ISVGPatternElement_putref_patternContentUnits(ISVGPatternElement* This,ISVGAnimatedEnumeration *v) {
    return This->lpVtbl->putref_patternContentUnits(This,v);
}
static FORCEINLINE HRESULT ISVGPatternElement_get_patternContentUnits(ISVGPatternElement* This,ISVGAnimatedEnumeration **p) {
    return This->lpVtbl->get_patternContentUnits(This,p);
}
static FORCEINLINE HRESULT ISVGPatternElement_putref_patternTransform(ISVGPatternElement* This,ISVGAnimatedTransformList *v) {
    return This->lpVtbl->putref_patternTransform(This,v);
}
static FORCEINLINE HRESULT ISVGPatternElement_get_patternTransform(ISVGPatternElement* This,ISVGAnimatedTransformList **p) {
    return This->lpVtbl->get_patternTransform(This,p);
}
static FORCEINLINE HRESULT ISVGPatternElement_putref_x(ISVGPatternElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_x(This,v);
}
static FORCEINLINE HRESULT ISVGPatternElement_get_x(ISVGPatternElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_x(This,p);
}
static FORCEINLINE HRESULT ISVGPatternElement_putref_y(ISVGPatternElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_y(This,v);
}
static FORCEINLINE HRESULT ISVGPatternElement_get_y(ISVGPatternElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_y(This,p);
}
static FORCEINLINE HRESULT ISVGPatternElement_putref_width(ISVGPatternElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_width(This,v);
}
static FORCEINLINE HRESULT ISVGPatternElement_get_width(ISVGPatternElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_width(This,p);
}
static FORCEINLINE HRESULT ISVGPatternElement_putref_height(ISVGPatternElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_height(This,v);
}
static FORCEINLINE HRESULT ISVGPatternElement_get_height(ISVGPatternElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_height(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGPatternElement_putref_patternUnits_Proxy(
    ISVGPatternElement* This,
    ISVGAnimatedEnumeration *v);
void __RPC_STUB ISVGPatternElement_putref_patternUnits_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPatternElement_get_patternUnits_Proxy(
    ISVGPatternElement* This,
    ISVGAnimatedEnumeration **p);
void __RPC_STUB ISVGPatternElement_get_patternUnits_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPatternElement_putref_patternContentUnits_Proxy(
    ISVGPatternElement* This,
    ISVGAnimatedEnumeration *v);
void __RPC_STUB ISVGPatternElement_putref_patternContentUnits_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPatternElement_get_patternContentUnits_Proxy(
    ISVGPatternElement* This,
    ISVGAnimatedEnumeration **p);
void __RPC_STUB ISVGPatternElement_get_patternContentUnits_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPatternElement_putref_patternTransform_Proxy(
    ISVGPatternElement* This,
    ISVGAnimatedTransformList *v);
void __RPC_STUB ISVGPatternElement_putref_patternTransform_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPatternElement_get_patternTransform_Proxy(
    ISVGPatternElement* This,
    ISVGAnimatedTransformList **p);
void __RPC_STUB ISVGPatternElement_get_patternTransform_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPatternElement_putref_x_Proxy(
    ISVGPatternElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGPatternElement_putref_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPatternElement_get_x_Proxy(
    ISVGPatternElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGPatternElement_get_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPatternElement_putref_y_Proxy(
    ISVGPatternElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGPatternElement_putref_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPatternElement_get_y_Proxy(
    ISVGPatternElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGPatternElement_get_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPatternElement_putref_width_Proxy(
    ISVGPatternElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGPatternElement_putref_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPatternElement_get_width_Proxy(
    ISVGPatternElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGPatternElement_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPatternElement_putref_height_Proxy(
    ISVGPatternElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGPatternElement_putref_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPatternElement_get_height_Proxy(
    ISVGPatternElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGPatternElement_get_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGPatternElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGPatternElement dispinterface
 */
#ifndef __DispSVGPatternElement_DISPINTERFACE_DEFINED__
#define __DispSVGPatternElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGPatternElement, 0x3059002c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059002c-98b5-11cf-bb82-00aa00bdce0b")
DispSVGPatternElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGPatternElement, 0x3059002c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGPatternElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGPatternElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGPatternElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGPatternElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGPatternElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGPatternElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGPatternElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGPatternElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGPatternElementVtbl;
interface DispSVGPatternElement {
    CONST_VTBL DispSVGPatternElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGPatternElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGPatternElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGPatternElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGPatternElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGPatternElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGPatternElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGPatternElement_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 DispSVGPatternElement_QueryInterface(DispSVGPatternElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGPatternElement_AddRef(DispSVGPatternElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGPatternElement_Release(DispSVGPatternElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGPatternElement_GetTypeInfoCount(DispSVGPatternElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGPatternElement_GetTypeInfo(DispSVGPatternElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGPatternElement_GetIDsOfNames(DispSVGPatternElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGPatternElement_Invoke(DispSVGPatternElement* 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  /* __DispSVGPatternElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGPatternElement coclass
 */

DEFINE_GUID(CLSID_SVGPatternElement, 0x305105d4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105d4-98b5-11cf-bb82-00aa00bdce0b") SVGPatternElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGPatternElement, 0x305105d4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGPatternElement;
typedef enum _svgPathSegType {
    PATHSEG_UNKNOWN = 0,
    PATHSEG_CLOSEPATH = 1,
    PATHSEG_MOVETO_ABS = 2,
    PATHSEG_MOVETO_REL = 3,
    PATHSEG_LINETO_ABS = 4,
    PATHSEG_LINETO_REL = 5,
    PATHSEG_CURVETO_CUBIC_ABS = 6,
    PATHSEG_CURVETO_CUBIC_REL = 7,
    PATHSEG_CURVETO_QUADRATIC_ABS = 8,
    PATHSEG_CURVETO_QUADRATIC_REL = 9,
    PATHSEG_ARC_ABS = 10,
    PATHSEG_ARC_REL = 11,
    PATHSEG_LINETO_HORIZONTAL_ABS = 12,
    PATHSEG_LINETO_HORIZONTAL_REL = 13,
    PATHSEG_LINETO_VERTICAL_ABS = 14,
    PATHSEG_LINETO_VERTICAL_REL = 15,
    PATHSEG_CURVETO_CUBIC_SMOOTH_ABS = 16,
    PATHSEG_CURVETO_CUBIC_SMOOTH_REL = 17,
    PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS = 18,
    PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL = 19,
    svgPathSegType_Max = 0x7fffffff
} svgPathSegType;
/*****************************************************************************
 * ISVGPathSeg interface
 */
#ifndef __ISVGPathSeg_INTERFACE_DEFINED__
#define __ISVGPathSeg_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGPathSeg, 0x305104fc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104fc-98b5-11cf-bb82-00aa00bdce0b")
ISVGPathSeg : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_pathSegType(
        short v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pathSegType(
        short *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pathSegTypeAsLetter(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGPathSeg, 0x305104fc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGPathSegVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGPathSeg* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGPathSeg* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGPathSeg* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGPathSeg* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGPathSeg* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGPathSeg* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGPathSeg* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGPathSeg methods ***/
    HRESULT (STDMETHODCALLTYPE *put_pathSegType)(
        ISVGPathSeg* This,
        short v);

    HRESULT (STDMETHODCALLTYPE *get_pathSegType)(
        ISVGPathSeg* This,
        short *p);

    HRESULT (STDMETHODCALLTYPE *get_pathSegTypeAsLetter)(
        ISVGPathSeg* This,
        BSTR *p);

    END_INTERFACE
} ISVGPathSegVtbl;
interface ISVGPathSeg {
    CONST_VTBL ISVGPathSegVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGPathSeg_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGPathSeg_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGPathSeg_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGPathSeg_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGPathSeg_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGPathSeg_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGPathSeg_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGPathSeg methods ***/
#define ISVGPathSeg_put_pathSegType(This,v) (This)->lpVtbl->put_pathSegType(This,v)
#define ISVGPathSeg_get_pathSegType(This,p) (This)->lpVtbl->get_pathSegType(This,p)
#define ISVGPathSeg_get_pathSegTypeAsLetter(This,p) (This)->lpVtbl->get_pathSegTypeAsLetter(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGPathSeg_QueryInterface(ISVGPathSeg* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGPathSeg_AddRef(ISVGPathSeg* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGPathSeg_Release(ISVGPathSeg* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGPathSeg_GetTypeInfoCount(ISVGPathSeg* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGPathSeg_GetTypeInfo(ISVGPathSeg* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGPathSeg_GetIDsOfNames(ISVGPathSeg* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGPathSeg_Invoke(ISVGPathSeg* 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);
}
/*** ISVGPathSeg methods ***/
static FORCEINLINE HRESULT ISVGPathSeg_put_pathSegType(ISVGPathSeg* This,short v) {
    return This->lpVtbl->put_pathSegType(This,v);
}
static FORCEINLINE HRESULT ISVGPathSeg_get_pathSegType(ISVGPathSeg* This,short *p) {
    return This->lpVtbl->get_pathSegType(This,p);
}
static FORCEINLINE HRESULT ISVGPathSeg_get_pathSegTypeAsLetter(ISVGPathSeg* This,BSTR *p) {
    return This->lpVtbl->get_pathSegTypeAsLetter(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGPathSeg_put_pathSegType_Proxy(
    ISVGPathSeg* This,
    short v);
void __RPC_STUB ISVGPathSeg_put_pathSegType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSeg_get_pathSegType_Proxy(
    ISVGPathSeg* This,
    short *p);
void __RPC_STUB ISVGPathSeg_get_pathSegType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSeg_get_pathSegTypeAsLetter_Proxy(
    ISVGPathSeg* This,
    BSTR *p);
void __RPC_STUB ISVGPathSeg_get_pathSegTypeAsLetter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGPathSeg_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGPathSegArcAbs interface
 */
#ifndef __ISVGPathSegArcAbs_INTERFACE_DEFINED__
#define __ISVGPathSegArcAbs_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGPathSegArcAbs, 0x30510506, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510506-98b5-11cf-bb82-00aa00bdce0b")
ISVGPathSegArcAbs : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_x(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_y(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_r1(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_r1(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_r2(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_r2(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_angle(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_angle(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_largeArcFlag(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_largeArcFlag(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_sweepFlag(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_sweepFlag(
        VARIANT_BOOL *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGPathSegArcAbs, 0x30510506, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGPathSegArcAbsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGPathSegArcAbs* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGPathSegArcAbs* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGPathSegArcAbs* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGPathSegArcAbs* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGPathSegArcAbs* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGPathSegArcAbs* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGPathSegArcAbs* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGPathSegArcAbs methods ***/
    HRESULT (STDMETHODCALLTYPE *put_x)(
        ISVGPathSegArcAbs* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_x)(
        ISVGPathSegArcAbs* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_y)(
        ISVGPathSegArcAbs* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_y)(
        ISVGPathSegArcAbs* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_r1)(
        ISVGPathSegArcAbs* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_r1)(
        ISVGPathSegArcAbs* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_r2)(
        ISVGPathSegArcAbs* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_r2)(
        ISVGPathSegArcAbs* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_angle)(
        ISVGPathSegArcAbs* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_angle)(
        ISVGPathSegArcAbs* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_largeArcFlag)(
        ISVGPathSegArcAbs* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_largeArcFlag)(
        ISVGPathSegArcAbs* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_sweepFlag)(
        ISVGPathSegArcAbs* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_sweepFlag)(
        ISVGPathSegArcAbs* This,
        VARIANT_BOOL *p);

    END_INTERFACE
} ISVGPathSegArcAbsVtbl;
interface ISVGPathSegArcAbs {
    CONST_VTBL ISVGPathSegArcAbsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGPathSegArcAbs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGPathSegArcAbs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGPathSegArcAbs_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGPathSegArcAbs_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGPathSegArcAbs_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGPathSegArcAbs_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGPathSegArcAbs_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGPathSegArcAbs methods ***/
#define ISVGPathSegArcAbs_put_x(This,v) (This)->lpVtbl->put_x(This,v)
#define ISVGPathSegArcAbs_get_x(This,p) (This)->lpVtbl->get_x(This,p)
#define ISVGPathSegArcAbs_put_y(This,v) (This)->lpVtbl->put_y(This,v)
#define ISVGPathSegArcAbs_get_y(This,p) (This)->lpVtbl->get_y(This,p)
#define ISVGPathSegArcAbs_put_r1(This,v) (This)->lpVtbl->put_r1(This,v)
#define ISVGPathSegArcAbs_get_r1(This,p) (This)->lpVtbl->get_r1(This,p)
#define ISVGPathSegArcAbs_put_r2(This,v) (This)->lpVtbl->put_r2(This,v)
#define ISVGPathSegArcAbs_get_r2(This,p) (This)->lpVtbl->get_r2(This,p)
#define ISVGPathSegArcAbs_put_angle(This,v) (This)->lpVtbl->put_angle(This,v)
#define ISVGPathSegArcAbs_get_angle(This,p) (This)->lpVtbl->get_angle(This,p)
#define ISVGPathSegArcAbs_put_largeArcFlag(This,v) (This)->lpVtbl->put_largeArcFlag(This,v)
#define ISVGPathSegArcAbs_get_largeArcFlag(This,p) (This)->lpVtbl->get_largeArcFlag(This,p)
#define ISVGPathSegArcAbs_put_sweepFlag(This,v) (This)->lpVtbl->put_sweepFlag(This,v)
#define ISVGPathSegArcAbs_get_sweepFlag(This,p) (This)->lpVtbl->get_sweepFlag(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGPathSegArcAbs_QueryInterface(ISVGPathSegArcAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGPathSegArcAbs_AddRef(ISVGPathSegArcAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGPathSegArcAbs_Release(ISVGPathSegArcAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGPathSegArcAbs_GetTypeInfoCount(ISVGPathSegArcAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGPathSegArcAbs_GetTypeInfo(ISVGPathSegArcAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGPathSegArcAbs_GetIDsOfNames(ISVGPathSegArcAbs* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGPathSegArcAbs_Invoke(ISVGPathSegArcAbs* 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);
}
/*** ISVGPathSegArcAbs methods ***/
static FORCEINLINE HRESULT ISVGPathSegArcAbs_put_x(ISVGPathSegArcAbs* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegArcAbs_get_x(ISVGPathSegArcAbs* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegArcAbs_put_y(ISVGPathSegArcAbs* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegArcAbs_get_y(ISVGPathSegArcAbs* This,float *p) {
    return This->lpVtbl->get_y(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegArcAbs_put_r1(ISVGPathSegArcAbs* This,float v) {
    return This->lpVtbl->put_r1(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegArcAbs_get_r1(ISVGPathSegArcAbs* This,float *p) {
    return This->lpVtbl->get_r1(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegArcAbs_put_r2(ISVGPathSegArcAbs* This,float v) {
    return This->lpVtbl->put_r2(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegArcAbs_get_r2(ISVGPathSegArcAbs* This,float *p) {
    return This->lpVtbl->get_r2(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegArcAbs_put_angle(ISVGPathSegArcAbs* This,float v) {
    return This->lpVtbl->put_angle(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegArcAbs_get_angle(ISVGPathSegArcAbs* This,float *p) {
    return This->lpVtbl->get_angle(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegArcAbs_put_largeArcFlag(ISVGPathSegArcAbs* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_largeArcFlag(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegArcAbs_get_largeArcFlag(ISVGPathSegArcAbs* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_largeArcFlag(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegArcAbs_put_sweepFlag(ISVGPathSegArcAbs* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_sweepFlag(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegArcAbs_get_sweepFlag(ISVGPathSegArcAbs* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_sweepFlag(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGPathSegArcAbs_put_x_Proxy(
    ISVGPathSegArcAbs* This,
    float v);
void __RPC_STUB ISVGPathSegArcAbs_put_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegArcAbs_get_x_Proxy(
    ISVGPathSegArcAbs* This,
    float *p);
void __RPC_STUB ISVGPathSegArcAbs_get_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegArcAbs_put_y_Proxy(
    ISVGPathSegArcAbs* This,
    float v);
void __RPC_STUB ISVGPathSegArcAbs_put_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegArcAbs_get_y_Proxy(
    ISVGPathSegArcAbs* This,
    float *p);
void __RPC_STUB ISVGPathSegArcAbs_get_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegArcAbs_put_r1_Proxy(
    ISVGPathSegArcAbs* This,
    float v);
void __RPC_STUB ISVGPathSegArcAbs_put_r1_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegArcAbs_get_r1_Proxy(
    ISVGPathSegArcAbs* This,
    float *p);
void __RPC_STUB ISVGPathSegArcAbs_get_r1_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegArcAbs_put_r2_Proxy(
    ISVGPathSegArcAbs* This,
    float v);
void __RPC_STUB ISVGPathSegArcAbs_put_r2_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegArcAbs_get_r2_Proxy(
    ISVGPathSegArcAbs* This,
    float *p);
void __RPC_STUB ISVGPathSegArcAbs_get_r2_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegArcAbs_put_angle_Proxy(
    ISVGPathSegArcAbs* This,
    float v);
void __RPC_STUB ISVGPathSegArcAbs_put_angle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegArcAbs_get_angle_Proxy(
    ISVGPathSegArcAbs* This,
    float *p);
void __RPC_STUB ISVGPathSegArcAbs_get_angle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegArcAbs_put_largeArcFlag_Proxy(
    ISVGPathSegArcAbs* This,
    VARIANT_BOOL v);
void __RPC_STUB ISVGPathSegArcAbs_put_largeArcFlag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegArcAbs_get_largeArcFlag_Proxy(
    ISVGPathSegArcAbs* This,
    VARIANT_BOOL *p);
void __RPC_STUB ISVGPathSegArcAbs_get_largeArcFlag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegArcAbs_put_sweepFlag_Proxy(
    ISVGPathSegArcAbs* This,
    VARIANT_BOOL v);
void __RPC_STUB ISVGPathSegArcAbs_put_sweepFlag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegArcAbs_get_sweepFlag_Proxy(
    ISVGPathSegArcAbs* This,
    VARIANT_BOOL *p);
void __RPC_STUB ISVGPathSegArcAbs_get_sweepFlag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGPathSegArcAbs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGPathSegArcRel interface
 */
#ifndef __ISVGPathSegArcRel_INTERFACE_DEFINED__
#define __ISVGPathSegArcRel_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGPathSegArcRel, 0x30510507, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510507-98b5-11cf-bb82-00aa00bdce0b")
ISVGPathSegArcRel : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_x(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_y(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_r1(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_r1(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_r2(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_r2(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_angle(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_angle(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_largeArcFlag(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_largeArcFlag(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_sweepFlag(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_sweepFlag(
        VARIANT_BOOL *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGPathSegArcRel, 0x30510507, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGPathSegArcRelVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGPathSegArcRel* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGPathSegArcRel* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGPathSegArcRel* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGPathSegArcRel* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGPathSegArcRel* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGPathSegArcRel* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGPathSegArcRel* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGPathSegArcRel methods ***/
    HRESULT (STDMETHODCALLTYPE *put_x)(
        ISVGPathSegArcRel* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_x)(
        ISVGPathSegArcRel* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_y)(
        ISVGPathSegArcRel* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_y)(
        ISVGPathSegArcRel* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_r1)(
        ISVGPathSegArcRel* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_r1)(
        ISVGPathSegArcRel* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_r2)(
        ISVGPathSegArcRel* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_r2)(
        ISVGPathSegArcRel* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_angle)(
        ISVGPathSegArcRel* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_angle)(
        ISVGPathSegArcRel* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_largeArcFlag)(
        ISVGPathSegArcRel* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_largeArcFlag)(
        ISVGPathSegArcRel* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_sweepFlag)(
        ISVGPathSegArcRel* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_sweepFlag)(
        ISVGPathSegArcRel* This,
        VARIANT_BOOL *p);

    END_INTERFACE
} ISVGPathSegArcRelVtbl;
interface ISVGPathSegArcRel {
    CONST_VTBL ISVGPathSegArcRelVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGPathSegArcRel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGPathSegArcRel_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGPathSegArcRel_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGPathSegArcRel_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGPathSegArcRel_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGPathSegArcRel_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGPathSegArcRel_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGPathSegArcRel methods ***/
#define ISVGPathSegArcRel_put_x(This,v) (This)->lpVtbl->put_x(This,v)
#define ISVGPathSegArcRel_get_x(This,p) (This)->lpVtbl->get_x(This,p)
#define ISVGPathSegArcRel_put_y(This,v) (This)->lpVtbl->put_y(This,v)
#define ISVGPathSegArcRel_get_y(This,p) (This)->lpVtbl->get_y(This,p)
#define ISVGPathSegArcRel_put_r1(This,v) (This)->lpVtbl->put_r1(This,v)
#define ISVGPathSegArcRel_get_r1(This,p) (This)->lpVtbl->get_r1(This,p)
#define ISVGPathSegArcRel_put_r2(This,v) (This)->lpVtbl->put_r2(This,v)
#define ISVGPathSegArcRel_get_r2(This,p) (This)->lpVtbl->get_r2(This,p)
#define ISVGPathSegArcRel_put_angle(This,v) (This)->lpVtbl->put_angle(This,v)
#define ISVGPathSegArcRel_get_angle(This,p) (This)->lpVtbl->get_angle(This,p)
#define ISVGPathSegArcRel_put_largeArcFlag(This,v) (This)->lpVtbl->put_largeArcFlag(This,v)
#define ISVGPathSegArcRel_get_largeArcFlag(This,p) (This)->lpVtbl->get_largeArcFlag(This,p)
#define ISVGPathSegArcRel_put_sweepFlag(This,v) (This)->lpVtbl->put_sweepFlag(This,v)
#define ISVGPathSegArcRel_get_sweepFlag(This,p) (This)->lpVtbl->get_sweepFlag(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGPathSegArcRel_QueryInterface(ISVGPathSegArcRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGPathSegArcRel_AddRef(ISVGPathSegArcRel* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGPathSegArcRel_Release(ISVGPathSegArcRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGPathSegArcRel_GetTypeInfoCount(ISVGPathSegArcRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGPathSegArcRel_GetTypeInfo(ISVGPathSegArcRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGPathSegArcRel_GetIDsOfNames(ISVGPathSegArcRel* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGPathSegArcRel_Invoke(ISVGPathSegArcRel* 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);
}
/*** ISVGPathSegArcRel methods ***/
static FORCEINLINE HRESULT ISVGPathSegArcRel_put_x(ISVGPathSegArcRel* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegArcRel_get_x(ISVGPathSegArcRel* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegArcRel_put_y(ISVGPathSegArcRel* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegArcRel_get_y(ISVGPathSegArcRel* This,float *p) {
    return This->lpVtbl->get_y(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegArcRel_put_r1(ISVGPathSegArcRel* This,float v) {
    return This->lpVtbl->put_r1(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegArcRel_get_r1(ISVGPathSegArcRel* This,float *p) {
    return This->lpVtbl->get_r1(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegArcRel_put_r2(ISVGPathSegArcRel* This,float v) {
    return This->lpVtbl->put_r2(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegArcRel_get_r2(ISVGPathSegArcRel* This,float *p) {
    return This->lpVtbl->get_r2(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegArcRel_put_angle(ISVGPathSegArcRel* This,float v) {
    return This->lpVtbl->put_angle(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegArcRel_get_angle(ISVGPathSegArcRel* This,float *p) {
    return This->lpVtbl->get_angle(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegArcRel_put_largeArcFlag(ISVGPathSegArcRel* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_largeArcFlag(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegArcRel_get_largeArcFlag(ISVGPathSegArcRel* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_largeArcFlag(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegArcRel_put_sweepFlag(ISVGPathSegArcRel* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_sweepFlag(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegArcRel_get_sweepFlag(ISVGPathSegArcRel* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_sweepFlag(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGPathSegArcRel_put_x_Proxy(
    ISVGPathSegArcRel* This,
    float v);
void __RPC_STUB ISVGPathSegArcRel_put_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegArcRel_get_x_Proxy(
    ISVGPathSegArcRel* This,
    float *p);
void __RPC_STUB ISVGPathSegArcRel_get_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegArcRel_put_y_Proxy(
    ISVGPathSegArcRel* This,
    float v);
void __RPC_STUB ISVGPathSegArcRel_put_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegArcRel_get_y_Proxy(
    ISVGPathSegArcRel* This,
    float *p);
void __RPC_STUB ISVGPathSegArcRel_get_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegArcRel_put_r1_Proxy(
    ISVGPathSegArcRel* This,
    float v);
void __RPC_STUB ISVGPathSegArcRel_put_r1_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegArcRel_get_r1_Proxy(
    ISVGPathSegArcRel* This,
    float *p);
void __RPC_STUB ISVGPathSegArcRel_get_r1_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegArcRel_put_r2_Proxy(
    ISVGPathSegArcRel* This,
    float v);
void __RPC_STUB ISVGPathSegArcRel_put_r2_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegArcRel_get_r2_Proxy(
    ISVGPathSegArcRel* This,
    float *p);
void __RPC_STUB ISVGPathSegArcRel_get_r2_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegArcRel_put_angle_Proxy(
    ISVGPathSegArcRel* This,
    float v);
void __RPC_STUB ISVGPathSegArcRel_put_angle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegArcRel_get_angle_Proxy(
    ISVGPathSegArcRel* This,
    float *p);
void __RPC_STUB ISVGPathSegArcRel_get_angle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegArcRel_put_largeArcFlag_Proxy(
    ISVGPathSegArcRel* This,
    VARIANT_BOOL v);
void __RPC_STUB ISVGPathSegArcRel_put_largeArcFlag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegArcRel_get_largeArcFlag_Proxy(
    ISVGPathSegArcRel* This,
    VARIANT_BOOL *p);
void __RPC_STUB ISVGPathSegArcRel_get_largeArcFlag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegArcRel_put_sweepFlag_Proxy(
    ISVGPathSegArcRel* This,
    VARIANT_BOOL v);
void __RPC_STUB ISVGPathSegArcRel_put_sweepFlag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegArcRel_get_sweepFlag_Proxy(
    ISVGPathSegArcRel* This,
    VARIANT_BOOL *p);
void __RPC_STUB ISVGPathSegArcRel_get_sweepFlag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGPathSegArcRel_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGPathSegClosePath interface
 */
#ifndef __ISVGPathSegClosePath_INTERFACE_DEFINED__
#define __ISVGPathSegClosePath_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGPathSegClosePath, 0x305104fd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104fd-98b5-11cf-bb82-00aa00bdce0b")
ISVGPathSegClosePath : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGPathSegClosePath, 0x305104fd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGPathSegClosePathVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGPathSegClosePath* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGPathSegClosePath* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGPathSegClosePath* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGPathSegClosePath* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGPathSegClosePath* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGPathSegClosePath* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGPathSegClosePath* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} ISVGPathSegClosePathVtbl;
interface ISVGPathSegClosePath {
    CONST_VTBL ISVGPathSegClosePathVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGPathSegClosePath_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGPathSegClosePath_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGPathSegClosePath_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGPathSegClosePath_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGPathSegClosePath_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGPathSegClosePath_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGPathSegClosePath_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 ISVGPathSegClosePath_QueryInterface(ISVGPathSegClosePath* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGPathSegClosePath_AddRef(ISVGPathSegClosePath* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGPathSegClosePath_Release(ISVGPathSegClosePath* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGPathSegClosePath_GetTypeInfoCount(ISVGPathSegClosePath* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGPathSegClosePath_GetTypeInfo(ISVGPathSegClosePath* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGPathSegClosePath_GetIDsOfNames(ISVGPathSegClosePath* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGPathSegClosePath_Invoke(ISVGPathSegClosePath* 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  /* __ISVGPathSegClosePath_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGPathSegMovetoAbs interface
 */
#ifndef __ISVGPathSegMovetoAbs_INTERFACE_DEFINED__
#define __ISVGPathSegMovetoAbs_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGPathSegMovetoAbs, 0x305104fe, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104fe-98b5-11cf-bb82-00aa00bdce0b")
ISVGPathSegMovetoAbs : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_x(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_y(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y(
        float *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGPathSegMovetoAbs, 0x305104fe, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGPathSegMovetoAbsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGPathSegMovetoAbs* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGPathSegMovetoAbs* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGPathSegMovetoAbs* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGPathSegMovetoAbs* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGPathSegMovetoAbs* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGPathSegMovetoAbs* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGPathSegMovetoAbs* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGPathSegMovetoAbs methods ***/
    HRESULT (STDMETHODCALLTYPE *put_x)(
        ISVGPathSegMovetoAbs* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_x)(
        ISVGPathSegMovetoAbs* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_y)(
        ISVGPathSegMovetoAbs* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_y)(
        ISVGPathSegMovetoAbs* This,
        float *p);

    END_INTERFACE
} ISVGPathSegMovetoAbsVtbl;
interface ISVGPathSegMovetoAbs {
    CONST_VTBL ISVGPathSegMovetoAbsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGPathSegMovetoAbs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGPathSegMovetoAbs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGPathSegMovetoAbs_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGPathSegMovetoAbs_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGPathSegMovetoAbs_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGPathSegMovetoAbs_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGPathSegMovetoAbs_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGPathSegMovetoAbs methods ***/
#define ISVGPathSegMovetoAbs_put_x(This,v) (This)->lpVtbl->put_x(This,v)
#define ISVGPathSegMovetoAbs_get_x(This,p) (This)->lpVtbl->get_x(This,p)
#define ISVGPathSegMovetoAbs_put_y(This,v) (This)->lpVtbl->put_y(This,v)
#define ISVGPathSegMovetoAbs_get_y(This,p) (This)->lpVtbl->get_y(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGPathSegMovetoAbs_QueryInterface(ISVGPathSegMovetoAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGPathSegMovetoAbs_AddRef(ISVGPathSegMovetoAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGPathSegMovetoAbs_Release(ISVGPathSegMovetoAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGPathSegMovetoAbs_GetTypeInfoCount(ISVGPathSegMovetoAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGPathSegMovetoAbs_GetTypeInfo(ISVGPathSegMovetoAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGPathSegMovetoAbs_GetIDsOfNames(ISVGPathSegMovetoAbs* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGPathSegMovetoAbs_Invoke(ISVGPathSegMovetoAbs* 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);
}
/*** ISVGPathSegMovetoAbs methods ***/
static FORCEINLINE HRESULT ISVGPathSegMovetoAbs_put_x(ISVGPathSegMovetoAbs* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegMovetoAbs_get_x(ISVGPathSegMovetoAbs* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegMovetoAbs_put_y(ISVGPathSegMovetoAbs* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegMovetoAbs_get_y(ISVGPathSegMovetoAbs* This,float *p) {
    return This->lpVtbl->get_y(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGPathSegMovetoAbs_put_x_Proxy(
    ISVGPathSegMovetoAbs* This,
    float v);
void __RPC_STUB ISVGPathSegMovetoAbs_put_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegMovetoAbs_get_x_Proxy(
    ISVGPathSegMovetoAbs* This,
    float *p);
void __RPC_STUB ISVGPathSegMovetoAbs_get_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegMovetoAbs_put_y_Proxy(
    ISVGPathSegMovetoAbs* This,
    float v);
void __RPC_STUB ISVGPathSegMovetoAbs_put_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegMovetoAbs_get_y_Proxy(
    ISVGPathSegMovetoAbs* This,
    float *p);
void __RPC_STUB ISVGPathSegMovetoAbs_get_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGPathSegMovetoAbs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGPathSegMovetoRel interface
 */
#ifndef __ISVGPathSegMovetoRel_INTERFACE_DEFINED__
#define __ISVGPathSegMovetoRel_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGPathSegMovetoRel, 0x305104ff, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104ff-98b5-11cf-bb82-00aa00bdce0b")
ISVGPathSegMovetoRel : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_x(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_y(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y(
        float *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGPathSegMovetoRel, 0x305104ff, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGPathSegMovetoRelVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGPathSegMovetoRel* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGPathSegMovetoRel* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGPathSegMovetoRel* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGPathSegMovetoRel* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGPathSegMovetoRel* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGPathSegMovetoRel* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGPathSegMovetoRel* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGPathSegMovetoRel methods ***/
    HRESULT (STDMETHODCALLTYPE *put_x)(
        ISVGPathSegMovetoRel* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_x)(
        ISVGPathSegMovetoRel* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_y)(
        ISVGPathSegMovetoRel* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_y)(
        ISVGPathSegMovetoRel* This,
        float *p);

    END_INTERFACE
} ISVGPathSegMovetoRelVtbl;
interface ISVGPathSegMovetoRel {
    CONST_VTBL ISVGPathSegMovetoRelVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGPathSegMovetoRel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGPathSegMovetoRel_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGPathSegMovetoRel_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGPathSegMovetoRel_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGPathSegMovetoRel_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGPathSegMovetoRel_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGPathSegMovetoRel_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGPathSegMovetoRel methods ***/
#define ISVGPathSegMovetoRel_put_x(This,v) (This)->lpVtbl->put_x(This,v)
#define ISVGPathSegMovetoRel_get_x(This,p) (This)->lpVtbl->get_x(This,p)
#define ISVGPathSegMovetoRel_put_y(This,v) (This)->lpVtbl->put_y(This,v)
#define ISVGPathSegMovetoRel_get_y(This,p) (This)->lpVtbl->get_y(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGPathSegMovetoRel_QueryInterface(ISVGPathSegMovetoRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGPathSegMovetoRel_AddRef(ISVGPathSegMovetoRel* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGPathSegMovetoRel_Release(ISVGPathSegMovetoRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGPathSegMovetoRel_GetTypeInfoCount(ISVGPathSegMovetoRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGPathSegMovetoRel_GetTypeInfo(ISVGPathSegMovetoRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGPathSegMovetoRel_GetIDsOfNames(ISVGPathSegMovetoRel* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGPathSegMovetoRel_Invoke(ISVGPathSegMovetoRel* 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);
}
/*** ISVGPathSegMovetoRel methods ***/
static FORCEINLINE HRESULT ISVGPathSegMovetoRel_put_x(ISVGPathSegMovetoRel* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegMovetoRel_get_x(ISVGPathSegMovetoRel* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegMovetoRel_put_y(ISVGPathSegMovetoRel* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegMovetoRel_get_y(ISVGPathSegMovetoRel* This,float *p) {
    return This->lpVtbl->get_y(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGPathSegMovetoRel_put_x_Proxy(
    ISVGPathSegMovetoRel* This,
    float v);
void __RPC_STUB ISVGPathSegMovetoRel_put_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegMovetoRel_get_x_Proxy(
    ISVGPathSegMovetoRel* This,
    float *p);
void __RPC_STUB ISVGPathSegMovetoRel_get_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegMovetoRel_put_y_Proxy(
    ISVGPathSegMovetoRel* This,
    float v);
void __RPC_STUB ISVGPathSegMovetoRel_put_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegMovetoRel_get_y_Proxy(
    ISVGPathSegMovetoRel* This,
    float *p);
void __RPC_STUB ISVGPathSegMovetoRel_get_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGPathSegMovetoRel_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGPathSegLinetoAbs interface
 */
#ifndef __ISVGPathSegLinetoAbs_INTERFACE_DEFINED__
#define __ISVGPathSegLinetoAbs_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGPathSegLinetoAbs, 0x30510500, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510500-98b5-11cf-bb82-00aa00bdce0b")
ISVGPathSegLinetoAbs : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_x(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_y(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y(
        float *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGPathSegLinetoAbs, 0x30510500, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGPathSegLinetoAbsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGPathSegLinetoAbs* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGPathSegLinetoAbs* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGPathSegLinetoAbs* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGPathSegLinetoAbs* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGPathSegLinetoAbs* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGPathSegLinetoAbs* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGPathSegLinetoAbs* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGPathSegLinetoAbs methods ***/
    HRESULT (STDMETHODCALLTYPE *put_x)(
        ISVGPathSegLinetoAbs* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_x)(
        ISVGPathSegLinetoAbs* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_y)(
        ISVGPathSegLinetoAbs* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_y)(
        ISVGPathSegLinetoAbs* This,
        float *p);

    END_INTERFACE
} ISVGPathSegLinetoAbsVtbl;
interface ISVGPathSegLinetoAbs {
    CONST_VTBL ISVGPathSegLinetoAbsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGPathSegLinetoAbs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGPathSegLinetoAbs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGPathSegLinetoAbs_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGPathSegLinetoAbs_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGPathSegLinetoAbs_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGPathSegLinetoAbs_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGPathSegLinetoAbs_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGPathSegLinetoAbs methods ***/
#define ISVGPathSegLinetoAbs_put_x(This,v) (This)->lpVtbl->put_x(This,v)
#define ISVGPathSegLinetoAbs_get_x(This,p) (This)->lpVtbl->get_x(This,p)
#define ISVGPathSegLinetoAbs_put_y(This,v) (This)->lpVtbl->put_y(This,v)
#define ISVGPathSegLinetoAbs_get_y(This,p) (This)->lpVtbl->get_y(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGPathSegLinetoAbs_QueryInterface(ISVGPathSegLinetoAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGPathSegLinetoAbs_AddRef(ISVGPathSegLinetoAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGPathSegLinetoAbs_Release(ISVGPathSegLinetoAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGPathSegLinetoAbs_GetTypeInfoCount(ISVGPathSegLinetoAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGPathSegLinetoAbs_GetTypeInfo(ISVGPathSegLinetoAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGPathSegLinetoAbs_GetIDsOfNames(ISVGPathSegLinetoAbs* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGPathSegLinetoAbs_Invoke(ISVGPathSegLinetoAbs* 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);
}
/*** ISVGPathSegLinetoAbs methods ***/
static FORCEINLINE HRESULT ISVGPathSegLinetoAbs_put_x(ISVGPathSegLinetoAbs* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegLinetoAbs_get_x(ISVGPathSegLinetoAbs* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegLinetoAbs_put_y(ISVGPathSegLinetoAbs* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegLinetoAbs_get_y(ISVGPathSegLinetoAbs* This,float *p) {
    return This->lpVtbl->get_y(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGPathSegLinetoAbs_put_x_Proxy(
    ISVGPathSegLinetoAbs* This,
    float v);
void __RPC_STUB ISVGPathSegLinetoAbs_put_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegLinetoAbs_get_x_Proxy(
    ISVGPathSegLinetoAbs* This,
    float *p);
void __RPC_STUB ISVGPathSegLinetoAbs_get_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegLinetoAbs_put_y_Proxy(
    ISVGPathSegLinetoAbs* This,
    float v);
void __RPC_STUB ISVGPathSegLinetoAbs_put_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegLinetoAbs_get_y_Proxy(
    ISVGPathSegLinetoAbs* This,
    float *p);
void __RPC_STUB ISVGPathSegLinetoAbs_get_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGPathSegLinetoAbs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGPathSegLinetoRel interface
 */
#ifndef __ISVGPathSegLinetoRel_INTERFACE_DEFINED__
#define __ISVGPathSegLinetoRel_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGPathSegLinetoRel, 0x30510501, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510501-98b5-11cf-bb82-00aa00bdce0b")
ISVGPathSegLinetoRel : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_x(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_y(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y(
        float *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGPathSegLinetoRel, 0x30510501, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGPathSegLinetoRelVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGPathSegLinetoRel* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGPathSegLinetoRel* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGPathSegLinetoRel* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGPathSegLinetoRel* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGPathSegLinetoRel* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGPathSegLinetoRel* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGPathSegLinetoRel* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGPathSegLinetoRel methods ***/
    HRESULT (STDMETHODCALLTYPE *put_x)(
        ISVGPathSegLinetoRel* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_x)(
        ISVGPathSegLinetoRel* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_y)(
        ISVGPathSegLinetoRel* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_y)(
        ISVGPathSegLinetoRel* This,
        float *p);

    END_INTERFACE
} ISVGPathSegLinetoRelVtbl;
interface ISVGPathSegLinetoRel {
    CONST_VTBL ISVGPathSegLinetoRelVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGPathSegLinetoRel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGPathSegLinetoRel_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGPathSegLinetoRel_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGPathSegLinetoRel_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGPathSegLinetoRel_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGPathSegLinetoRel_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGPathSegLinetoRel_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGPathSegLinetoRel methods ***/
#define ISVGPathSegLinetoRel_put_x(This,v) (This)->lpVtbl->put_x(This,v)
#define ISVGPathSegLinetoRel_get_x(This,p) (This)->lpVtbl->get_x(This,p)
#define ISVGPathSegLinetoRel_put_y(This,v) (This)->lpVtbl->put_y(This,v)
#define ISVGPathSegLinetoRel_get_y(This,p) (This)->lpVtbl->get_y(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGPathSegLinetoRel_QueryInterface(ISVGPathSegLinetoRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGPathSegLinetoRel_AddRef(ISVGPathSegLinetoRel* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGPathSegLinetoRel_Release(ISVGPathSegLinetoRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGPathSegLinetoRel_GetTypeInfoCount(ISVGPathSegLinetoRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGPathSegLinetoRel_GetTypeInfo(ISVGPathSegLinetoRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGPathSegLinetoRel_GetIDsOfNames(ISVGPathSegLinetoRel* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGPathSegLinetoRel_Invoke(ISVGPathSegLinetoRel* 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);
}
/*** ISVGPathSegLinetoRel methods ***/
static FORCEINLINE HRESULT ISVGPathSegLinetoRel_put_x(ISVGPathSegLinetoRel* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegLinetoRel_get_x(ISVGPathSegLinetoRel* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegLinetoRel_put_y(ISVGPathSegLinetoRel* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegLinetoRel_get_y(ISVGPathSegLinetoRel* This,float *p) {
    return This->lpVtbl->get_y(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGPathSegLinetoRel_put_x_Proxy(
    ISVGPathSegLinetoRel* This,
    float v);
void __RPC_STUB ISVGPathSegLinetoRel_put_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegLinetoRel_get_x_Proxy(
    ISVGPathSegLinetoRel* This,
    float *p);
void __RPC_STUB ISVGPathSegLinetoRel_get_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegLinetoRel_put_y_Proxy(
    ISVGPathSegLinetoRel* This,
    float v);
void __RPC_STUB ISVGPathSegLinetoRel_put_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegLinetoRel_get_y_Proxy(
    ISVGPathSegLinetoRel* This,
    float *p);
void __RPC_STUB ISVGPathSegLinetoRel_get_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGPathSegLinetoRel_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGPathSegCurvetoCubicAbs interface
 */
#ifndef __ISVGPathSegCurvetoCubicAbs_INTERFACE_DEFINED__
#define __ISVGPathSegCurvetoCubicAbs_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGPathSegCurvetoCubicAbs, 0x30510502, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510502-98b5-11cf-bb82-00aa00bdce0b")
ISVGPathSegCurvetoCubicAbs : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_x(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_y(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_x1(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x1(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_y1(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y1(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_x2(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x2(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_y2(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y2(
        float *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGPathSegCurvetoCubicAbs, 0x30510502, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGPathSegCurvetoCubicAbsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGPathSegCurvetoCubicAbs* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGPathSegCurvetoCubicAbs* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGPathSegCurvetoCubicAbs* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGPathSegCurvetoCubicAbs* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGPathSegCurvetoCubicAbs* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGPathSegCurvetoCubicAbs* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGPathSegCurvetoCubicAbs* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGPathSegCurvetoCubicAbs methods ***/
    HRESULT (STDMETHODCALLTYPE *put_x)(
        ISVGPathSegCurvetoCubicAbs* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_x)(
        ISVGPathSegCurvetoCubicAbs* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_y)(
        ISVGPathSegCurvetoCubicAbs* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_y)(
        ISVGPathSegCurvetoCubicAbs* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_x1)(
        ISVGPathSegCurvetoCubicAbs* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_x1)(
        ISVGPathSegCurvetoCubicAbs* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_y1)(
        ISVGPathSegCurvetoCubicAbs* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_y1)(
        ISVGPathSegCurvetoCubicAbs* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_x2)(
        ISVGPathSegCurvetoCubicAbs* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_x2)(
        ISVGPathSegCurvetoCubicAbs* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_y2)(
        ISVGPathSegCurvetoCubicAbs* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_y2)(
        ISVGPathSegCurvetoCubicAbs* This,
        float *p);

    END_INTERFACE
} ISVGPathSegCurvetoCubicAbsVtbl;
interface ISVGPathSegCurvetoCubicAbs {
    CONST_VTBL ISVGPathSegCurvetoCubicAbsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGPathSegCurvetoCubicAbs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGPathSegCurvetoCubicAbs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGPathSegCurvetoCubicAbs_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGPathSegCurvetoCubicAbs_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGPathSegCurvetoCubicAbs_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGPathSegCurvetoCubicAbs_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGPathSegCurvetoCubicAbs_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGPathSegCurvetoCubicAbs methods ***/
#define ISVGPathSegCurvetoCubicAbs_put_x(This,v) (This)->lpVtbl->put_x(This,v)
#define ISVGPathSegCurvetoCubicAbs_get_x(This,p) (This)->lpVtbl->get_x(This,p)
#define ISVGPathSegCurvetoCubicAbs_put_y(This,v) (This)->lpVtbl->put_y(This,v)
#define ISVGPathSegCurvetoCubicAbs_get_y(This,p) (This)->lpVtbl->get_y(This,p)
#define ISVGPathSegCurvetoCubicAbs_put_x1(This,v) (This)->lpVtbl->put_x1(This,v)
#define ISVGPathSegCurvetoCubicAbs_get_x1(This,p) (This)->lpVtbl->get_x1(This,p)
#define ISVGPathSegCurvetoCubicAbs_put_y1(This,v) (This)->lpVtbl->put_y1(This,v)
#define ISVGPathSegCurvetoCubicAbs_get_y1(This,p) (This)->lpVtbl->get_y1(This,p)
#define ISVGPathSegCurvetoCubicAbs_put_x2(This,v) (This)->lpVtbl->put_x2(This,v)
#define ISVGPathSegCurvetoCubicAbs_get_x2(This,p) (This)->lpVtbl->get_x2(This,p)
#define ISVGPathSegCurvetoCubicAbs_put_y2(This,v) (This)->lpVtbl->put_y2(This,v)
#define ISVGPathSegCurvetoCubicAbs_get_y2(This,p) (This)->lpVtbl->get_y2(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicAbs_QueryInterface(ISVGPathSegCurvetoCubicAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGPathSegCurvetoCubicAbs_AddRef(ISVGPathSegCurvetoCubicAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGPathSegCurvetoCubicAbs_Release(ISVGPathSegCurvetoCubicAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicAbs_GetTypeInfoCount(ISVGPathSegCurvetoCubicAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicAbs_GetTypeInfo(ISVGPathSegCurvetoCubicAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicAbs_GetIDsOfNames(ISVGPathSegCurvetoCubicAbs* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicAbs_Invoke(ISVGPathSegCurvetoCubicAbs* 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);
}
/*** ISVGPathSegCurvetoCubicAbs methods ***/
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicAbs_put_x(ISVGPathSegCurvetoCubicAbs* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicAbs_get_x(ISVGPathSegCurvetoCubicAbs* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicAbs_put_y(ISVGPathSegCurvetoCubicAbs* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicAbs_get_y(ISVGPathSegCurvetoCubicAbs* This,float *p) {
    return This->lpVtbl->get_y(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicAbs_put_x1(ISVGPathSegCurvetoCubicAbs* This,float v) {
    return This->lpVtbl->put_x1(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicAbs_get_x1(ISVGPathSegCurvetoCubicAbs* This,float *p) {
    return This->lpVtbl->get_x1(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicAbs_put_y1(ISVGPathSegCurvetoCubicAbs* This,float v) {
    return This->lpVtbl->put_y1(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicAbs_get_y1(ISVGPathSegCurvetoCubicAbs* This,float *p) {
    return This->lpVtbl->get_y1(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicAbs_put_x2(ISVGPathSegCurvetoCubicAbs* This,float v) {
    return This->lpVtbl->put_x2(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicAbs_get_x2(ISVGPathSegCurvetoCubicAbs* This,float *p) {
    return This->lpVtbl->get_x2(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicAbs_put_y2(ISVGPathSegCurvetoCubicAbs* This,float v) {
    return This->lpVtbl->put_y2(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicAbs_get_y2(ISVGPathSegCurvetoCubicAbs* This,float *p) {
    return This->lpVtbl->get_y2(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicAbs_put_x_Proxy(
    ISVGPathSegCurvetoCubicAbs* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoCubicAbs_put_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicAbs_get_x_Proxy(
    ISVGPathSegCurvetoCubicAbs* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoCubicAbs_get_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicAbs_put_y_Proxy(
    ISVGPathSegCurvetoCubicAbs* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoCubicAbs_put_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicAbs_get_y_Proxy(
    ISVGPathSegCurvetoCubicAbs* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoCubicAbs_get_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicAbs_put_x1_Proxy(
    ISVGPathSegCurvetoCubicAbs* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoCubicAbs_put_x1_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicAbs_get_x1_Proxy(
    ISVGPathSegCurvetoCubicAbs* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoCubicAbs_get_x1_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicAbs_put_y1_Proxy(
    ISVGPathSegCurvetoCubicAbs* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoCubicAbs_put_y1_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicAbs_get_y1_Proxy(
    ISVGPathSegCurvetoCubicAbs* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoCubicAbs_get_y1_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicAbs_put_x2_Proxy(
    ISVGPathSegCurvetoCubicAbs* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoCubicAbs_put_x2_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicAbs_get_x2_Proxy(
    ISVGPathSegCurvetoCubicAbs* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoCubicAbs_get_x2_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicAbs_put_y2_Proxy(
    ISVGPathSegCurvetoCubicAbs* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoCubicAbs_put_y2_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicAbs_get_y2_Proxy(
    ISVGPathSegCurvetoCubicAbs* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoCubicAbs_get_y2_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGPathSegCurvetoCubicAbs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGPathSegCurvetoCubicRel interface
 */
#ifndef __ISVGPathSegCurvetoCubicRel_INTERFACE_DEFINED__
#define __ISVGPathSegCurvetoCubicRel_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGPathSegCurvetoCubicRel, 0x30510503, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510503-98b5-11cf-bb82-00aa00bdce0b")
ISVGPathSegCurvetoCubicRel : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_x(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_y(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_x1(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x1(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_y1(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y1(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_x2(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x2(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_y2(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y2(
        float *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGPathSegCurvetoCubicRel, 0x30510503, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGPathSegCurvetoCubicRelVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGPathSegCurvetoCubicRel* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGPathSegCurvetoCubicRel* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGPathSegCurvetoCubicRel* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGPathSegCurvetoCubicRel* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGPathSegCurvetoCubicRel* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGPathSegCurvetoCubicRel* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGPathSegCurvetoCubicRel* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGPathSegCurvetoCubicRel methods ***/
    HRESULT (STDMETHODCALLTYPE *put_x)(
        ISVGPathSegCurvetoCubicRel* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_x)(
        ISVGPathSegCurvetoCubicRel* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_y)(
        ISVGPathSegCurvetoCubicRel* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_y)(
        ISVGPathSegCurvetoCubicRel* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_x1)(
        ISVGPathSegCurvetoCubicRel* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_x1)(
        ISVGPathSegCurvetoCubicRel* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_y1)(
        ISVGPathSegCurvetoCubicRel* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_y1)(
        ISVGPathSegCurvetoCubicRel* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_x2)(
        ISVGPathSegCurvetoCubicRel* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_x2)(
        ISVGPathSegCurvetoCubicRel* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_y2)(
        ISVGPathSegCurvetoCubicRel* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_y2)(
        ISVGPathSegCurvetoCubicRel* This,
        float *p);

    END_INTERFACE
} ISVGPathSegCurvetoCubicRelVtbl;
interface ISVGPathSegCurvetoCubicRel {
    CONST_VTBL ISVGPathSegCurvetoCubicRelVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGPathSegCurvetoCubicRel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGPathSegCurvetoCubicRel_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGPathSegCurvetoCubicRel_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGPathSegCurvetoCubicRel_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGPathSegCurvetoCubicRel_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGPathSegCurvetoCubicRel_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGPathSegCurvetoCubicRel_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGPathSegCurvetoCubicRel methods ***/
#define ISVGPathSegCurvetoCubicRel_put_x(This,v) (This)->lpVtbl->put_x(This,v)
#define ISVGPathSegCurvetoCubicRel_get_x(This,p) (This)->lpVtbl->get_x(This,p)
#define ISVGPathSegCurvetoCubicRel_put_y(This,v) (This)->lpVtbl->put_y(This,v)
#define ISVGPathSegCurvetoCubicRel_get_y(This,p) (This)->lpVtbl->get_y(This,p)
#define ISVGPathSegCurvetoCubicRel_put_x1(This,v) (This)->lpVtbl->put_x1(This,v)
#define ISVGPathSegCurvetoCubicRel_get_x1(This,p) (This)->lpVtbl->get_x1(This,p)
#define ISVGPathSegCurvetoCubicRel_put_y1(This,v) (This)->lpVtbl->put_y1(This,v)
#define ISVGPathSegCurvetoCubicRel_get_y1(This,p) (This)->lpVtbl->get_y1(This,p)
#define ISVGPathSegCurvetoCubicRel_put_x2(This,v) (This)->lpVtbl->put_x2(This,v)
#define ISVGPathSegCurvetoCubicRel_get_x2(This,p) (This)->lpVtbl->get_x2(This,p)
#define ISVGPathSegCurvetoCubicRel_put_y2(This,v) (This)->lpVtbl->put_y2(This,v)
#define ISVGPathSegCurvetoCubicRel_get_y2(This,p) (This)->lpVtbl->get_y2(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicRel_QueryInterface(ISVGPathSegCurvetoCubicRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGPathSegCurvetoCubicRel_AddRef(ISVGPathSegCurvetoCubicRel* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGPathSegCurvetoCubicRel_Release(ISVGPathSegCurvetoCubicRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicRel_GetTypeInfoCount(ISVGPathSegCurvetoCubicRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicRel_GetTypeInfo(ISVGPathSegCurvetoCubicRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicRel_GetIDsOfNames(ISVGPathSegCurvetoCubicRel* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicRel_Invoke(ISVGPathSegCurvetoCubicRel* 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);
}
/*** ISVGPathSegCurvetoCubicRel methods ***/
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicRel_put_x(ISVGPathSegCurvetoCubicRel* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicRel_get_x(ISVGPathSegCurvetoCubicRel* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicRel_put_y(ISVGPathSegCurvetoCubicRel* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicRel_get_y(ISVGPathSegCurvetoCubicRel* This,float *p) {
    return This->lpVtbl->get_y(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicRel_put_x1(ISVGPathSegCurvetoCubicRel* This,float v) {
    return This->lpVtbl->put_x1(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicRel_get_x1(ISVGPathSegCurvetoCubicRel* This,float *p) {
    return This->lpVtbl->get_x1(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicRel_put_y1(ISVGPathSegCurvetoCubicRel* This,float v) {
    return This->lpVtbl->put_y1(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicRel_get_y1(ISVGPathSegCurvetoCubicRel* This,float *p) {
    return This->lpVtbl->get_y1(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicRel_put_x2(ISVGPathSegCurvetoCubicRel* This,float v) {
    return This->lpVtbl->put_x2(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicRel_get_x2(ISVGPathSegCurvetoCubicRel* This,float *p) {
    return This->lpVtbl->get_x2(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicRel_put_y2(ISVGPathSegCurvetoCubicRel* This,float v) {
    return This->lpVtbl->put_y2(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicRel_get_y2(ISVGPathSegCurvetoCubicRel* This,float *p) {
    return This->lpVtbl->get_y2(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicRel_put_x_Proxy(
    ISVGPathSegCurvetoCubicRel* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoCubicRel_put_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicRel_get_x_Proxy(
    ISVGPathSegCurvetoCubicRel* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoCubicRel_get_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicRel_put_y_Proxy(
    ISVGPathSegCurvetoCubicRel* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoCubicRel_put_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicRel_get_y_Proxy(
    ISVGPathSegCurvetoCubicRel* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoCubicRel_get_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicRel_put_x1_Proxy(
    ISVGPathSegCurvetoCubicRel* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoCubicRel_put_x1_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicRel_get_x1_Proxy(
    ISVGPathSegCurvetoCubicRel* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoCubicRel_get_x1_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicRel_put_y1_Proxy(
    ISVGPathSegCurvetoCubicRel* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoCubicRel_put_y1_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicRel_get_y1_Proxy(
    ISVGPathSegCurvetoCubicRel* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoCubicRel_get_y1_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicRel_put_x2_Proxy(
    ISVGPathSegCurvetoCubicRel* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoCubicRel_put_x2_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicRel_get_x2_Proxy(
    ISVGPathSegCurvetoCubicRel* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoCubicRel_get_x2_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicRel_put_y2_Proxy(
    ISVGPathSegCurvetoCubicRel* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoCubicRel_put_y2_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicRel_get_y2_Proxy(
    ISVGPathSegCurvetoCubicRel* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoCubicRel_get_y2_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGPathSegCurvetoCubicRel_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGPathSegCurvetoCubicSmoothAbs interface
 */
#ifndef __ISVGPathSegCurvetoCubicSmoothAbs_INTERFACE_DEFINED__
#define __ISVGPathSegCurvetoCubicSmoothAbs_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGPathSegCurvetoCubicSmoothAbs, 0x3051050c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051050c-98b5-11cf-bb82-00aa00bdce0b")
ISVGPathSegCurvetoCubicSmoothAbs : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_x(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_y(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_x2(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x2(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_y2(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y2(
        float *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGPathSegCurvetoCubicSmoothAbs, 0x3051050c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGPathSegCurvetoCubicSmoothAbsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGPathSegCurvetoCubicSmoothAbs* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGPathSegCurvetoCubicSmoothAbs* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGPathSegCurvetoCubicSmoothAbs* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGPathSegCurvetoCubicSmoothAbs* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGPathSegCurvetoCubicSmoothAbs* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGPathSegCurvetoCubicSmoothAbs* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGPathSegCurvetoCubicSmoothAbs* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGPathSegCurvetoCubicSmoothAbs methods ***/
    HRESULT (STDMETHODCALLTYPE *put_x)(
        ISVGPathSegCurvetoCubicSmoothAbs* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_x)(
        ISVGPathSegCurvetoCubicSmoothAbs* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_y)(
        ISVGPathSegCurvetoCubicSmoothAbs* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_y)(
        ISVGPathSegCurvetoCubicSmoothAbs* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_x2)(
        ISVGPathSegCurvetoCubicSmoothAbs* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_x2)(
        ISVGPathSegCurvetoCubicSmoothAbs* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_y2)(
        ISVGPathSegCurvetoCubicSmoothAbs* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_y2)(
        ISVGPathSegCurvetoCubicSmoothAbs* This,
        float *p);

    END_INTERFACE
} ISVGPathSegCurvetoCubicSmoothAbsVtbl;
interface ISVGPathSegCurvetoCubicSmoothAbs {
    CONST_VTBL ISVGPathSegCurvetoCubicSmoothAbsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGPathSegCurvetoCubicSmoothAbs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGPathSegCurvetoCubicSmoothAbs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGPathSegCurvetoCubicSmoothAbs_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGPathSegCurvetoCubicSmoothAbs_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGPathSegCurvetoCubicSmoothAbs_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGPathSegCurvetoCubicSmoothAbs_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGPathSegCurvetoCubicSmoothAbs_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGPathSegCurvetoCubicSmoothAbs methods ***/
#define ISVGPathSegCurvetoCubicSmoothAbs_put_x(This,v) (This)->lpVtbl->put_x(This,v)
#define ISVGPathSegCurvetoCubicSmoothAbs_get_x(This,p) (This)->lpVtbl->get_x(This,p)
#define ISVGPathSegCurvetoCubicSmoothAbs_put_y(This,v) (This)->lpVtbl->put_y(This,v)
#define ISVGPathSegCurvetoCubicSmoothAbs_get_y(This,p) (This)->lpVtbl->get_y(This,p)
#define ISVGPathSegCurvetoCubicSmoothAbs_put_x2(This,v) (This)->lpVtbl->put_x2(This,v)
#define ISVGPathSegCurvetoCubicSmoothAbs_get_x2(This,p) (This)->lpVtbl->get_x2(This,p)
#define ISVGPathSegCurvetoCubicSmoothAbs_put_y2(This,v) (This)->lpVtbl->put_y2(This,v)
#define ISVGPathSegCurvetoCubicSmoothAbs_get_y2(This,p) (This)->lpVtbl->get_y2(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicSmoothAbs_QueryInterface(ISVGPathSegCurvetoCubicSmoothAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGPathSegCurvetoCubicSmoothAbs_AddRef(ISVGPathSegCurvetoCubicSmoothAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGPathSegCurvetoCubicSmoothAbs_Release(ISVGPathSegCurvetoCubicSmoothAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicSmoothAbs_GetTypeInfoCount(ISVGPathSegCurvetoCubicSmoothAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicSmoothAbs_GetTypeInfo(ISVGPathSegCurvetoCubicSmoothAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicSmoothAbs_GetIDsOfNames(ISVGPathSegCurvetoCubicSmoothAbs* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicSmoothAbs_Invoke(ISVGPathSegCurvetoCubicSmoothAbs* 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);
}
/*** ISVGPathSegCurvetoCubicSmoothAbs methods ***/
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicSmoothAbs_put_x(ISVGPathSegCurvetoCubicSmoothAbs* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicSmoothAbs_get_x(ISVGPathSegCurvetoCubicSmoothAbs* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicSmoothAbs_put_y(ISVGPathSegCurvetoCubicSmoothAbs* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicSmoothAbs_get_y(ISVGPathSegCurvetoCubicSmoothAbs* This,float *p) {
    return This->lpVtbl->get_y(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicSmoothAbs_put_x2(ISVGPathSegCurvetoCubicSmoothAbs* This,float v) {
    return This->lpVtbl->put_x2(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicSmoothAbs_get_x2(ISVGPathSegCurvetoCubicSmoothAbs* This,float *p) {
    return This->lpVtbl->get_x2(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicSmoothAbs_put_y2(ISVGPathSegCurvetoCubicSmoothAbs* This,float v) {
    return This->lpVtbl->put_y2(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicSmoothAbs_get_y2(ISVGPathSegCurvetoCubicSmoothAbs* This,float *p) {
    return This->lpVtbl->get_y2(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicSmoothAbs_put_x_Proxy(
    ISVGPathSegCurvetoCubicSmoothAbs* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoCubicSmoothAbs_put_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicSmoothAbs_get_x_Proxy(
    ISVGPathSegCurvetoCubicSmoothAbs* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoCubicSmoothAbs_get_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicSmoothAbs_put_y_Proxy(
    ISVGPathSegCurvetoCubicSmoothAbs* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoCubicSmoothAbs_put_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicSmoothAbs_get_y_Proxy(
    ISVGPathSegCurvetoCubicSmoothAbs* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoCubicSmoothAbs_get_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicSmoothAbs_put_x2_Proxy(
    ISVGPathSegCurvetoCubicSmoothAbs* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoCubicSmoothAbs_put_x2_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicSmoothAbs_get_x2_Proxy(
    ISVGPathSegCurvetoCubicSmoothAbs* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoCubicSmoothAbs_get_x2_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicSmoothAbs_put_y2_Proxy(
    ISVGPathSegCurvetoCubicSmoothAbs* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoCubicSmoothAbs_put_y2_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicSmoothAbs_get_y2_Proxy(
    ISVGPathSegCurvetoCubicSmoothAbs* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoCubicSmoothAbs_get_y2_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGPathSegCurvetoCubicSmoothAbs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGPathSegCurvetoCubicSmoothRel interface
 */
#ifndef __ISVGPathSegCurvetoCubicSmoothRel_INTERFACE_DEFINED__
#define __ISVGPathSegCurvetoCubicSmoothRel_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGPathSegCurvetoCubicSmoothRel, 0x3051050d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051050d-98b5-11cf-bb82-00aa00bdce0b")
ISVGPathSegCurvetoCubicSmoothRel : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_x(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_y(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_x2(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x2(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_y2(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y2(
        float *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGPathSegCurvetoCubicSmoothRel, 0x3051050d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGPathSegCurvetoCubicSmoothRelVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGPathSegCurvetoCubicSmoothRel* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGPathSegCurvetoCubicSmoothRel* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGPathSegCurvetoCubicSmoothRel* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGPathSegCurvetoCubicSmoothRel* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGPathSegCurvetoCubicSmoothRel* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGPathSegCurvetoCubicSmoothRel* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGPathSegCurvetoCubicSmoothRel* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGPathSegCurvetoCubicSmoothRel methods ***/
    HRESULT (STDMETHODCALLTYPE *put_x)(
        ISVGPathSegCurvetoCubicSmoothRel* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_x)(
        ISVGPathSegCurvetoCubicSmoothRel* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_y)(
        ISVGPathSegCurvetoCubicSmoothRel* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_y)(
        ISVGPathSegCurvetoCubicSmoothRel* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_x2)(
        ISVGPathSegCurvetoCubicSmoothRel* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_x2)(
        ISVGPathSegCurvetoCubicSmoothRel* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_y2)(
        ISVGPathSegCurvetoCubicSmoothRel* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_y2)(
        ISVGPathSegCurvetoCubicSmoothRel* This,
        float *p);

    END_INTERFACE
} ISVGPathSegCurvetoCubicSmoothRelVtbl;
interface ISVGPathSegCurvetoCubicSmoothRel {
    CONST_VTBL ISVGPathSegCurvetoCubicSmoothRelVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGPathSegCurvetoCubicSmoothRel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGPathSegCurvetoCubicSmoothRel_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGPathSegCurvetoCubicSmoothRel_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGPathSegCurvetoCubicSmoothRel_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGPathSegCurvetoCubicSmoothRel_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGPathSegCurvetoCubicSmoothRel_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGPathSegCurvetoCubicSmoothRel_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGPathSegCurvetoCubicSmoothRel methods ***/
#define ISVGPathSegCurvetoCubicSmoothRel_put_x(This,v) (This)->lpVtbl->put_x(This,v)
#define ISVGPathSegCurvetoCubicSmoothRel_get_x(This,p) (This)->lpVtbl->get_x(This,p)
#define ISVGPathSegCurvetoCubicSmoothRel_put_y(This,v) (This)->lpVtbl->put_y(This,v)
#define ISVGPathSegCurvetoCubicSmoothRel_get_y(This,p) (This)->lpVtbl->get_y(This,p)
#define ISVGPathSegCurvetoCubicSmoothRel_put_x2(This,v) (This)->lpVtbl->put_x2(This,v)
#define ISVGPathSegCurvetoCubicSmoothRel_get_x2(This,p) (This)->lpVtbl->get_x2(This,p)
#define ISVGPathSegCurvetoCubicSmoothRel_put_y2(This,v) (This)->lpVtbl->put_y2(This,v)
#define ISVGPathSegCurvetoCubicSmoothRel_get_y2(This,p) (This)->lpVtbl->get_y2(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicSmoothRel_QueryInterface(ISVGPathSegCurvetoCubicSmoothRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGPathSegCurvetoCubicSmoothRel_AddRef(ISVGPathSegCurvetoCubicSmoothRel* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGPathSegCurvetoCubicSmoothRel_Release(ISVGPathSegCurvetoCubicSmoothRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicSmoothRel_GetTypeInfoCount(ISVGPathSegCurvetoCubicSmoothRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicSmoothRel_GetTypeInfo(ISVGPathSegCurvetoCubicSmoothRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicSmoothRel_GetIDsOfNames(ISVGPathSegCurvetoCubicSmoothRel* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicSmoothRel_Invoke(ISVGPathSegCurvetoCubicSmoothRel* 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);
}
/*** ISVGPathSegCurvetoCubicSmoothRel methods ***/
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicSmoothRel_put_x(ISVGPathSegCurvetoCubicSmoothRel* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicSmoothRel_get_x(ISVGPathSegCurvetoCubicSmoothRel* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicSmoothRel_put_y(ISVGPathSegCurvetoCubicSmoothRel* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicSmoothRel_get_y(ISVGPathSegCurvetoCubicSmoothRel* This,float *p) {
    return This->lpVtbl->get_y(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicSmoothRel_put_x2(ISVGPathSegCurvetoCubicSmoothRel* This,float v) {
    return This->lpVtbl->put_x2(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicSmoothRel_get_x2(ISVGPathSegCurvetoCubicSmoothRel* This,float *p) {
    return This->lpVtbl->get_x2(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicSmoothRel_put_y2(ISVGPathSegCurvetoCubicSmoothRel* This,float v) {
    return This->lpVtbl->put_y2(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoCubicSmoothRel_get_y2(ISVGPathSegCurvetoCubicSmoothRel* This,float *p) {
    return This->lpVtbl->get_y2(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicSmoothRel_put_x_Proxy(
    ISVGPathSegCurvetoCubicSmoothRel* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoCubicSmoothRel_put_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicSmoothRel_get_x_Proxy(
    ISVGPathSegCurvetoCubicSmoothRel* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoCubicSmoothRel_get_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicSmoothRel_put_y_Proxy(
    ISVGPathSegCurvetoCubicSmoothRel* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoCubicSmoothRel_put_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicSmoothRel_get_y_Proxy(
    ISVGPathSegCurvetoCubicSmoothRel* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoCubicSmoothRel_get_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicSmoothRel_put_x2_Proxy(
    ISVGPathSegCurvetoCubicSmoothRel* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoCubicSmoothRel_put_x2_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicSmoothRel_get_x2_Proxy(
    ISVGPathSegCurvetoCubicSmoothRel* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoCubicSmoothRel_get_x2_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicSmoothRel_put_y2_Proxy(
    ISVGPathSegCurvetoCubicSmoothRel* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoCubicSmoothRel_put_y2_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoCubicSmoothRel_get_y2_Proxy(
    ISVGPathSegCurvetoCubicSmoothRel* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoCubicSmoothRel_get_y2_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGPathSegCurvetoCubicSmoothRel_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGPathSegCurvetoQuadraticAbs interface
 */
#ifndef __ISVGPathSegCurvetoQuadraticAbs_INTERFACE_DEFINED__
#define __ISVGPathSegCurvetoQuadraticAbs_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGPathSegCurvetoQuadraticAbs, 0x30510504, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510504-98b5-11cf-bb82-00aa00bdce0b")
ISVGPathSegCurvetoQuadraticAbs : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_x(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_y(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_x1(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x1(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_y1(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y1(
        float *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGPathSegCurvetoQuadraticAbs, 0x30510504, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGPathSegCurvetoQuadraticAbsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGPathSegCurvetoQuadraticAbs* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGPathSegCurvetoQuadraticAbs* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGPathSegCurvetoQuadraticAbs* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGPathSegCurvetoQuadraticAbs* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGPathSegCurvetoQuadraticAbs* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGPathSegCurvetoQuadraticAbs* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGPathSegCurvetoQuadraticAbs* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGPathSegCurvetoQuadraticAbs methods ***/
    HRESULT (STDMETHODCALLTYPE *put_x)(
        ISVGPathSegCurvetoQuadraticAbs* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_x)(
        ISVGPathSegCurvetoQuadraticAbs* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_y)(
        ISVGPathSegCurvetoQuadraticAbs* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_y)(
        ISVGPathSegCurvetoQuadraticAbs* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_x1)(
        ISVGPathSegCurvetoQuadraticAbs* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_x1)(
        ISVGPathSegCurvetoQuadraticAbs* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_y1)(
        ISVGPathSegCurvetoQuadraticAbs* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_y1)(
        ISVGPathSegCurvetoQuadraticAbs* This,
        float *p);

    END_INTERFACE
} ISVGPathSegCurvetoQuadraticAbsVtbl;
interface ISVGPathSegCurvetoQuadraticAbs {
    CONST_VTBL ISVGPathSegCurvetoQuadraticAbsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGPathSegCurvetoQuadraticAbs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGPathSegCurvetoQuadraticAbs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGPathSegCurvetoQuadraticAbs_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGPathSegCurvetoQuadraticAbs_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGPathSegCurvetoQuadraticAbs_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGPathSegCurvetoQuadraticAbs_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGPathSegCurvetoQuadraticAbs_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGPathSegCurvetoQuadraticAbs methods ***/
#define ISVGPathSegCurvetoQuadraticAbs_put_x(This,v) (This)->lpVtbl->put_x(This,v)
#define ISVGPathSegCurvetoQuadraticAbs_get_x(This,p) (This)->lpVtbl->get_x(This,p)
#define ISVGPathSegCurvetoQuadraticAbs_put_y(This,v) (This)->lpVtbl->put_y(This,v)
#define ISVGPathSegCurvetoQuadraticAbs_get_y(This,p) (This)->lpVtbl->get_y(This,p)
#define ISVGPathSegCurvetoQuadraticAbs_put_x1(This,v) (This)->lpVtbl->put_x1(This,v)
#define ISVGPathSegCurvetoQuadraticAbs_get_x1(This,p) (This)->lpVtbl->get_x1(This,p)
#define ISVGPathSegCurvetoQuadraticAbs_put_y1(This,v) (This)->lpVtbl->put_y1(This,v)
#define ISVGPathSegCurvetoQuadraticAbs_get_y1(This,p) (This)->lpVtbl->get_y1(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticAbs_QueryInterface(ISVGPathSegCurvetoQuadraticAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGPathSegCurvetoQuadraticAbs_AddRef(ISVGPathSegCurvetoQuadraticAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGPathSegCurvetoQuadraticAbs_Release(ISVGPathSegCurvetoQuadraticAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticAbs_GetTypeInfoCount(ISVGPathSegCurvetoQuadraticAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticAbs_GetTypeInfo(ISVGPathSegCurvetoQuadraticAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticAbs_GetIDsOfNames(ISVGPathSegCurvetoQuadraticAbs* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticAbs_Invoke(ISVGPathSegCurvetoQuadraticAbs* 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);
}
/*** ISVGPathSegCurvetoQuadraticAbs methods ***/
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticAbs_put_x(ISVGPathSegCurvetoQuadraticAbs* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticAbs_get_x(ISVGPathSegCurvetoQuadraticAbs* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticAbs_put_y(ISVGPathSegCurvetoQuadraticAbs* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticAbs_get_y(ISVGPathSegCurvetoQuadraticAbs* This,float *p) {
    return This->lpVtbl->get_y(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticAbs_put_x1(ISVGPathSegCurvetoQuadraticAbs* This,float v) {
    return This->lpVtbl->put_x1(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticAbs_get_x1(ISVGPathSegCurvetoQuadraticAbs* This,float *p) {
    return This->lpVtbl->get_x1(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticAbs_put_y1(ISVGPathSegCurvetoQuadraticAbs* This,float v) {
    return This->lpVtbl->put_y1(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticAbs_get_y1(ISVGPathSegCurvetoQuadraticAbs* This,float *p) {
    return This->lpVtbl->get_y1(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoQuadraticAbs_put_x_Proxy(
    ISVGPathSegCurvetoQuadraticAbs* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoQuadraticAbs_put_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoQuadraticAbs_get_x_Proxy(
    ISVGPathSegCurvetoQuadraticAbs* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoQuadraticAbs_get_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoQuadraticAbs_put_y_Proxy(
    ISVGPathSegCurvetoQuadraticAbs* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoQuadraticAbs_put_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoQuadraticAbs_get_y_Proxy(
    ISVGPathSegCurvetoQuadraticAbs* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoQuadraticAbs_get_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoQuadraticAbs_put_x1_Proxy(
    ISVGPathSegCurvetoQuadraticAbs* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoQuadraticAbs_put_x1_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoQuadraticAbs_get_x1_Proxy(
    ISVGPathSegCurvetoQuadraticAbs* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoQuadraticAbs_get_x1_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoQuadraticAbs_put_y1_Proxy(
    ISVGPathSegCurvetoQuadraticAbs* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoQuadraticAbs_put_y1_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoQuadraticAbs_get_y1_Proxy(
    ISVGPathSegCurvetoQuadraticAbs* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoQuadraticAbs_get_y1_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGPathSegCurvetoQuadraticAbs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGPathSegCurvetoQuadraticRel interface
 */
#ifndef __ISVGPathSegCurvetoQuadraticRel_INTERFACE_DEFINED__
#define __ISVGPathSegCurvetoQuadraticRel_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGPathSegCurvetoQuadraticRel, 0x30510505, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510505-98b5-11cf-bb82-00aa00bdce0b")
ISVGPathSegCurvetoQuadraticRel : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_x(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_y(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_x1(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x1(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_y1(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y1(
        float *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGPathSegCurvetoQuadraticRel, 0x30510505, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGPathSegCurvetoQuadraticRelVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGPathSegCurvetoQuadraticRel* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGPathSegCurvetoQuadraticRel* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGPathSegCurvetoQuadraticRel* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGPathSegCurvetoQuadraticRel* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGPathSegCurvetoQuadraticRel* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGPathSegCurvetoQuadraticRel* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGPathSegCurvetoQuadraticRel* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGPathSegCurvetoQuadraticRel methods ***/
    HRESULT (STDMETHODCALLTYPE *put_x)(
        ISVGPathSegCurvetoQuadraticRel* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_x)(
        ISVGPathSegCurvetoQuadraticRel* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_y)(
        ISVGPathSegCurvetoQuadraticRel* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_y)(
        ISVGPathSegCurvetoQuadraticRel* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_x1)(
        ISVGPathSegCurvetoQuadraticRel* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_x1)(
        ISVGPathSegCurvetoQuadraticRel* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_y1)(
        ISVGPathSegCurvetoQuadraticRel* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_y1)(
        ISVGPathSegCurvetoQuadraticRel* This,
        float *p);

    END_INTERFACE
} ISVGPathSegCurvetoQuadraticRelVtbl;
interface ISVGPathSegCurvetoQuadraticRel {
    CONST_VTBL ISVGPathSegCurvetoQuadraticRelVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGPathSegCurvetoQuadraticRel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGPathSegCurvetoQuadraticRel_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGPathSegCurvetoQuadraticRel_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGPathSegCurvetoQuadraticRel_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGPathSegCurvetoQuadraticRel_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGPathSegCurvetoQuadraticRel_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGPathSegCurvetoQuadraticRel_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGPathSegCurvetoQuadraticRel methods ***/
#define ISVGPathSegCurvetoQuadraticRel_put_x(This,v) (This)->lpVtbl->put_x(This,v)
#define ISVGPathSegCurvetoQuadraticRel_get_x(This,p) (This)->lpVtbl->get_x(This,p)
#define ISVGPathSegCurvetoQuadraticRel_put_y(This,v) (This)->lpVtbl->put_y(This,v)
#define ISVGPathSegCurvetoQuadraticRel_get_y(This,p) (This)->lpVtbl->get_y(This,p)
#define ISVGPathSegCurvetoQuadraticRel_put_x1(This,v) (This)->lpVtbl->put_x1(This,v)
#define ISVGPathSegCurvetoQuadraticRel_get_x1(This,p) (This)->lpVtbl->get_x1(This,p)
#define ISVGPathSegCurvetoQuadraticRel_put_y1(This,v) (This)->lpVtbl->put_y1(This,v)
#define ISVGPathSegCurvetoQuadraticRel_get_y1(This,p) (This)->lpVtbl->get_y1(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticRel_QueryInterface(ISVGPathSegCurvetoQuadraticRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGPathSegCurvetoQuadraticRel_AddRef(ISVGPathSegCurvetoQuadraticRel* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGPathSegCurvetoQuadraticRel_Release(ISVGPathSegCurvetoQuadraticRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticRel_GetTypeInfoCount(ISVGPathSegCurvetoQuadraticRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticRel_GetTypeInfo(ISVGPathSegCurvetoQuadraticRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticRel_GetIDsOfNames(ISVGPathSegCurvetoQuadraticRel* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticRel_Invoke(ISVGPathSegCurvetoQuadraticRel* 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);
}
/*** ISVGPathSegCurvetoQuadraticRel methods ***/
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticRel_put_x(ISVGPathSegCurvetoQuadraticRel* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticRel_get_x(ISVGPathSegCurvetoQuadraticRel* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticRel_put_y(ISVGPathSegCurvetoQuadraticRel* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticRel_get_y(ISVGPathSegCurvetoQuadraticRel* This,float *p) {
    return This->lpVtbl->get_y(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticRel_put_x1(ISVGPathSegCurvetoQuadraticRel* This,float v) {
    return This->lpVtbl->put_x1(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticRel_get_x1(ISVGPathSegCurvetoQuadraticRel* This,float *p) {
    return This->lpVtbl->get_x1(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticRel_put_y1(ISVGPathSegCurvetoQuadraticRel* This,float v) {
    return This->lpVtbl->put_y1(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticRel_get_y1(ISVGPathSegCurvetoQuadraticRel* This,float *p) {
    return This->lpVtbl->get_y1(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoQuadraticRel_put_x_Proxy(
    ISVGPathSegCurvetoQuadraticRel* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoQuadraticRel_put_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoQuadraticRel_get_x_Proxy(
    ISVGPathSegCurvetoQuadraticRel* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoQuadraticRel_get_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoQuadraticRel_put_y_Proxy(
    ISVGPathSegCurvetoQuadraticRel* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoQuadraticRel_put_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoQuadraticRel_get_y_Proxy(
    ISVGPathSegCurvetoQuadraticRel* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoQuadraticRel_get_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoQuadraticRel_put_x1_Proxy(
    ISVGPathSegCurvetoQuadraticRel* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoQuadraticRel_put_x1_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoQuadraticRel_get_x1_Proxy(
    ISVGPathSegCurvetoQuadraticRel* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoQuadraticRel_get_x1_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoQuadraticRel_put_y1_Proxy(
    ISVGPathSegCurvetoQuadraticRel* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoQuadraticRel_put_y1_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoQuadraticRel_get_y1_Proxy(
    ISVGPathSegCurvetoQuadraticRel* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoQuadraticRel_get_y1_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGPathSegCurvetoQuadraticRel_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGPathSegCurvetoQuadraticSmoothAbs interface
 */
#ifndef __ISVGPathSegCurvetoQuadraticSmoothAbs_INTERFACE_DEFINED__
#define __ISVGPathSegCurvetoQuadraticSmoothAbs_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGPathSegCurvetoQuadraticSmoothAbs, 0x3051050e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051050e-98b5-11cf-bb82-00aa00bdce0b")
ISVGPathSegCurvetoQuadraticSmoothAbs : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_x(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_y(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y(
        float *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGPathSegCurvetoQuadraticSmoothAbs, 0x3051050e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGPathSegCurvetoQuadraticSmoothAbsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGPathSegCurvetoQuadraticSmoothAbs* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGPathSegCurvetoQuadraticSmoothAbs* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGPathSegCurvetoQuadraticSmoothAbs* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGPathSegCurvetoQuadraticSmoothAbs* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGPathSegCurvetoQuadraticSmoothAbs* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGPathSegCurvetoQuadraticSmoothAbs* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGPathSegCurvetoQuadraticSmoothAbs* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGPathSegCurvetoQuadraticSmoothAbs methods ***/
    HRESULT (STDMETHODCALLTYPE *put_x)(
        ISVGPathSegCurvetoQuadraticSmoothAbs* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_x)(
        ISVGPathSegCurvetoQuadraticSmoothAbs* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_y)(
        ISVGPathSegCurvetoQuadraticSmoothAbs* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_y)(
        ISVGPathSegCurvetoQuadraticSmoothAbs* This,
        float *p);

    END_INTERFACE
} ISVGPathSegCurvetoQuadraticSmoothAbsVtbl;
interface ISVGPathSegCurvetoQuadraticSmoothAbs {
    CONST_VTBL ISVGPathSegCurvetoQuadraticSmoothAbsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGPathSegCurvetoQuadraticSmoothAbs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGPathSegCurvetoQuadraticSmoothAbs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGPathSegCurvetoQuadraticSmoothAbs_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGPathSegCurvetoQuadraticSmoothAbs_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGPathSegCurvetoQuadraticSmoothAbs_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGPathSegCurvetoQuadraticSmoothAbs_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGPathSegCurvetoQuadraticSmoothAbs_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGPathSegCurvetoQuadraticSmoothAbs methods ***/
#define ISVGPathSegCurvetoQuadraticSmoothAbs_put_x(This,v) (This)->lpVtbl->put_x(This,v)
#define ISVGPathSegCurvetoQuadraticSmoothAbs_get_x(This,p) (This)->lpVtbl->get_x(This,p)
#define ISVGPathSegCurvetoQuadraticSmoothAbs_put_y(This,v) (This)->lpVtbl->put_y(This,v)
#define ISVGPathSegCurvetoQuadraticSmoothAbs_get_y(This,p) (This)->lpVtbl->get_y(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticSmoothAbs_QueryInterface(ISVGPathSegCurvetoQuadraticSmoothAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGPathSegCurvetoQuadraticSmoothAbs_AddRef(ISVGPathSegCurvetoQuadraticSmoothAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGPathSegCurvetoQuadraticSmoothAbs_Release(ISVGPathSegCurvetoQuadraticSmoothAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticSmoothAbs_GetTypeInfoCount(ISVGPathSegCurvetoQuadraticSmoothAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticSmoothAbs_GetTypeInfo(ISVGPathSegCurvetoQuadraticSmoothAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticSmoothAbs_GetIDsOfNames(ISVGPathSegCurvetoQuadraticSmoothAbs* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticSmoothAbs_Invoke(ISVGPathSegCurvetoQuadraticSmoothAbs* 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);
}
/*** ISVGPathSegCurvetoQuadraticSmoothAbs methods ***/
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticSmoothAbs_put_x(ISVGPathSegCurvetoQuadraticSmoothAbs* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticSmoothAbs_get_x(ISVGPathSegCurvetoQuadraticSmoothAbs* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticSmoothAbs_put_y(ISVGPathSegCurvetoQuadraticSmoothAbs* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticSmoothAbs_get_y(ISVGPathSegCurvetoQuadraticSmoothAbs* This,float *p) {
    return This->lpVtbl->get_y(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoQuadraticSmoothAbs_put_x_Proxy(
    ISVGPathSegCurvetoQuadraticSmoothAbs* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoQuadraticSmoothAbs_put_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoQuadraticSmoothAbs_get_x_Proxy(
    ISVGPathSegCurvetoQuadraticSmoothAbs* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoQuadraticSmoothAbs_get_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoQuadraticSmoothAbs_put_y_Proxy(
    ISVGPathSegCurvetoQuadraticSmoothAbs* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoQuadraticSmoothAbs_put_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoQuadraticSmoothAbs_get_y_Proxy(
    ISVGPathSegCurvetoQuadraticSmoothAbs* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoQuadraticSmoothAbs_get_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGPathSegCurvetoQuadraticSmoothAbs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGPathSegCurvetoQuadraticSmoothRel interface
 */
#ifndef __ISVGPathSegCurvetoQuadraticSmoothRel_INTERFACE_DEFINED__
#define __ISVGPathSegCurvetoQuadraticSmoothRel_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGPathSegCurvetoQuadraticSmoothRel, 0x3051050f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051050f-98b5-11cf-bb82-00aa00bdce0b")
ISVGPathSegCurvetoQuadraticSmoothRel : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_x(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_y(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y(
        float *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGPathSegCurvetoQuadraticSmoothRel, 0x3051050f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGPathSegCurvetoQuadraticSmoothRelVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGPathSegCurvetoQuadraticSmoothRel* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGPathSegCurvetoQuadraticSmoothRel* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGPathSegCurvetoQuadraticSmoothRel* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGPathSegCurvetoQuadraticSmoothRel* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGPathSegCurvetoQuadraticSmoothRel* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGPathSegCurvetoQuadraticSmoothRel* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGPathSegCurvetoQuadraticSmoothRel* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGPathSegCurvetoQuadraticSmoothRel methods ***/
    HRESULT (STDMETHODCALLTYPE *put_x)(
        ISVGPathSegCurvetoQuadraticSmoothRel* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_x)(
        ISVGPathSegCurvetoQuadraticSmoothRel* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_y)(
        ISVGPathSegCurvetoQuadraticSmoothRel* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_y)(
        ISVGPathSegCurvetoQuadraticSmoothRel* This,
        float *p);

    END_INTERFACE
} ISVGPathSegCurvetoQuadraticSmoothRelVtbl;
interface ISVGPathSegCurvetoQuadraticSmoothRel {
    CONST_VTBL ISVGPathSegCurvetoQuadraticSmoothRelVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGPathSegCurvetoQuadraticSmoothRel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGPathSegCurvetoQuadraticSmoothRel_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGPathSegCurvetoQuadraticSmoothRel_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGPathSegCurvetoQuadraticSmoothRel_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGPathSegCurvetoQuadraticSmoothRel_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGPathSegCurvetoQuadraticSmoothRel_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGPathSegCurvetoQuadraticSmoothRel_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGPathSegCurvetoQuadraticSmoothRel methods ***/
#define ISVGPathSegCurvetoQuadraticSmoothRel_put_x(This,v) (This)->lpVtbl->put_x(This,v)
#define ISVGPathSegCurvetoQuadraticSmoothRel_get_x(This,p) (This)->lpVtbl->get_x(This,p)
#define ISVGPathSegCurvetoQuadraticSmoothRel_put_y(This,v) (This)->lpVtbl->put_y(This,v)
#define ISVGPathSegCurvetoQuadraticSmoothRel_get_y(This,p) (This)->lpVtbl->get_y(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticSmoothRel_QueryInterface(ISVGPathSegCurvetoQuadraticSmoothRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGPathSegCurvetoQuadraticSmoothRel_AddRef(ISVGPathSegCurvetoQuadraticSmoothRel* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGPathSegCurvetoQuadraticSmoothRel_Release(ISVGPathSegCurvetoQuadraticSmoothRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticSmoothRel_GetTypeInfoCount(ISVGPathSegCurvetoQuadraticSmoothRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticSmoothRel_GetTypeInfo(ISVGPathSegCurvetoQuadraticSmoothRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticSmoothRel_GetIDsOfNames(ISVGPathSegCurvetoQuadraticSmoothRel* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticSmoothRel_Invoke(ISVGPathSegCurvetoQuadraticSmoothRel* 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);
}
/*** ISVGPathSegCurvetoQuadraticSmoothRel methods ***/
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticSmoothRel_put_x(ISVGPathSegCurvetoQuadraticSmoothRel* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticSmoothRel_get_x(ISVGPathSegCurvetoQuadraticSmoothRel* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticSmoothRel_put_y(ISVGPathSegCurvetoQuadraticSmoothRel* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegCurvetoQuadraticSmoothRel_get_y(ISVGPathSegCurvetoQuadraticSmoothRel* This,float *p) {
    return This->lpVtbl->get_y(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoQuadraticSmoothRel_put_x_Proxy(
    ISVGPathSegCurvetoQuadraticSmoothRel* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoQuadraticSmoothRel_put_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoQuadraticSmoothRel_get_x_Proxy(
    ISVGPathSegCurvetoQuadraticSmoothRel* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoQuadraticSmoothRel_get_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoQuadraticSmoothRel_put_y_Proxy(
    ISVGPathSegCurvetoQuadraticSmoothRel* This,
    float v);
void __RPC_STUB ISVGPathSegCurvetoQuadraticSmoothRel_put_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegCurvetoQuadraticSmoothRel_get_y_Proxy(
    ISVGPathSegCurvetoQuadraticSmoothRel* This,
    float *p);
void __RPC_STUB ISVGPathSegCurvetoQuadraticSmoothRel_get_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGPathSegCurvetoQuadraticSmoothRel_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGPathSegLinetoHorizontalAbs interface
 */
#ifndef __ISVGPathSegLinetoHorizontalAbs_INTERFACE_DEFINED__
#define __ISVGPathSegLinetoHorizontalAbs_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGPathSegLinetoHorizontalAbs, 0x30510508, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510508-98b5-11cf-bb82-00aa00bdce0b")
ISVGPathSegLinetoHorizontalAbs : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_x(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x(
        float *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGPathSegLinetoHorizontalAbs, 0x30510508, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGPathSegLinetoHorizontalAbsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGPathSegLinetoHorizontalAbs* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGPathSegLinetoHorizontalAbs* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGPathSegLinetoHorizontalAbs* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGPathSegLinetoHorizontalAbs* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGPathSegLinetoHorizontalAbs* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGPathSegLinetoHorizontalAbs* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGPathSegLinetoHorizontalAbs* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGPathSegLinetoHorizontalAbs methods ***/
    HRESULT (STDMETHODCALLTYPE *put_x)(
        ISVGPathSegLinetoHorizontalAbs* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_x)(
        ISVGPathSegLinetoHorizontalAbs* This,
        float *p);

    END_INTERFACE
} ISVGPathSegLinetoHorizontalAbsVtbl;
interface ISVGPathSegLinetoHorizontalAbs {
    CONST_VTBL ISVGPathSegLinetoHorizontalAbsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGPathSegLinetoHorizontalAbs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGPathSegLinetoHorizontalAbs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGPathSegLinetoHorizontalAbs_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGPathSegLinetoHorizontalAbs_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGPathSegLinetoHorizontalAbs_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGPathSegLinetoHorizontalAbs_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGPathSegLinetoHorizontalAbs_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGPathSegLinetoHorizontalAbs methods ***/
#define ISVGPathSegLinetoHorizontalAbs_put_x(This,v) (This)->lpVtbl->put_x(This,v)
#define ISVGPathSegLinetoHorizontalAbs_get_x(This,p) (This)->lpVtbl->get_x(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGPathSegLinetoHorizontalAbs_QueryInterface(ISVGPathSegLinetoHorizontalAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGPathSegLinetoHorizontalAbs_AddRef(ISVGPathSegLinetoHorizontalAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGPathSegLinetoHorizontalAbs_Release(ISVGPathSegLinetoHorizontalAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGPathSegLinetoHorizontalAbs_GetTypeInfoCount(ISVGPathSegLinetoHorizontalAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGPathSegLinetoHorizontalAbs_GetTypeInfo(ISVGPathSegLinetoHorizontalAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGPathSegLinetoHorizontalAbs_GetIDsOfNames(ISVGPathSegLinetoHorizontalAbs* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGPathSegLinetoHorizontalAbs_Invoke(ISVGPathSegLinetoHorizontalAbs* 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);
}
/*** ISVGPathSegLinetoHorizontalAbs methods ***/
static FORCEINLINE HRESULT ISVGPathSegLinetoHorizontalAbs_put_x(ISVGPathSegLinetoHorizontalAbs* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegLinetoHorizontalAbs_get_x(ISVGPathSegLinetoHorizontalAbs* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGPathSegLinetoHorizontalAbs_put_x_Proxy(
    ISVGPathSegLinetoHorizontalAbs* This,
    float v);
void __RPC_STUB ISVGPathSegLinetoHorizontalAbs_put_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegLinetoHorizontalAbs_get_x_Proxy(
    ISVGPathSegLinetoHorizontalAbs* This,
    float *p);
void __RPC_STUB ISVGPathSegLinetoHorizontalAbs_get_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGPathSegLinetoHorizontalAbs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGPathSegLinetoHorizontalRel interface
 */
#ifndef __ISVGPathSegLinetoHorizontalRel_INTERFACE_DEFINED__
#define __ISVGPathSegLinetoHorizontalRel_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGPathSegLinetoHorizontalRel, 0x30510509, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510509-98b5-11cf-bb82-00aa00bdce0b")
ISVGPathSegLinetoHorizontalRel : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_x(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x(
        float *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGPathSegLinetoHorizontalRel, 0x30510509, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGPathSegLinetoHorizontalRelVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGPathSegLinetoHorizontalRel* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGPathSegLinetoHorizontalRel* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGPathSegLinetoHorizontalRel* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGPathSegLinetoHorizontalRel* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGPathSegLinetoHorizontalRel* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGPathSegLinetoHorizontalRel* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGPathSegLinetoHorizontalRel* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGPathSegLinetoHorizontalRel methods ***/
    HRESULT (STDMETHODCALLTYPE *put_x)(
        ISVGPathSegLinetoHorizontalRel* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_x)(
        ISVGPathSegLinetoHorizontalRel* This,
        float *p);

    END_INTERFACE
} ISVGPathSegLinetoHorizontalRelVtbl;
interface ISVGPathSegLinetoHorizontalRel {
    CONST_VTBL ISVGPathSegLinetoHorizontalRelVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGPathSegLinetoHorizontalRel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGPathSegLinetoHorizontalRel_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGPathSegLinetoHorizontalRel_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGPathSegLinetoHorizontalRel_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGPathSegLinetoHorizontalRel_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGPathSegLinetoHorizontalRel_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGPathSegLinetoHorizontalRel_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGPathSegLinetoHorizontalRel methods ***/
#define ISVGPathSegLinetoHorizontalRel_put_x(This,v) (This)->lpVtbl->put_x(This,v)
#define ISVGPathSegLinetoHorizontalRel_get_x(This,p) (This)->lpVtbl->get_x(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGPathSegLinetoHorizontalRel_QueryInterface(ISVGPathSegLinetoHorizontalRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGPathSegLinetoHorizontalRel_AddRef(ISVGPathSegLinetoHorizontalRel* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGPathSegLinetoHorizontalRel_Release(ISVGPathSegLinetoHorizontalRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGPathSegLinetoHorizontalRel_GetTypeInfoCount(ISVGPathSegLinetoHorizontalRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGPathSegLinetoHorizontalRel_GetTypeInfo(ISVGPathSegLinetoHorizontalRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGPathSegLinetoHorizontalRel_GetIDsOfNames(ISVGPathSegLinetoHorizontalRel* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGPathSegLinetoHorizontalRel_Invoke(ISVGPathSegLinetoHorizontalRel* 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);
}
/*** ISVGPathSegLinetoHorizontalRel methods ***/
static FORCEINLINE HRESULT ISVGPathSegLinetoHorizontalRel_put_x(ISVGPathSegLinetoHorizontalRel* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegLinetoHorizontalRel_get_x(ISVGPathSegLinetoHorizontalRel* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGPathSegLinetoHorizontalRel_put_x_Proxy(
    ISVGPathSegLinetoHorizontalRel* This,
    float v);
void __RPC_STUB ISVGPathSegLinetoHorizontalRel_put_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegLinetoHorizontalRel_get_x_Proxy(
    ISVGPathSegLinetoHorizontalRel* This,
    float *p);
void __RPC_STUB ISVGPathSegLinetoHorizontalRel_get_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGPathSegLinetoHorizontalRel_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGPathSegLinetoVerticalAbs interface
 */
#ifndef __ISVGPathSegLinetoVerticalAbs_INTERFACE_DEFINED__
#define __ISVGPathSegLinetoVerticalAbs_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGPathSegLinetoVerticalAbs, 0x3051050a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051050a-98b5-11cf-bb82-00aa00bdce0b")
ISVGPathSegLinetoVerticalAbs : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_y(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y(
        float *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGPathSegLinetoVerticalAbs, 0x3051050a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGPathSegLinetoVerticalAbsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGPathSegLinetoVerticalAbs* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGPathSegLinetoVerticalAbs* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGPathSegLinetoVerticalAbs* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGPathSegLinetoVerticalAbs* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGPathSegLinetoVerticalAbs* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGPathSegLinetoVerticalAbs* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGPathSegLinetoVerticalAbs* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGPathSegLinetoVerticalAbs methods ***/
    HRESULT (STDMETHODCALLTYPE *put_y)(
        ISVGPathSegLinetoVerticalAbs* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_y)(
        ISVGPathSegLinetoVerticalAbs* This,
        float *p);

    END_INTERFACE
} ISVGPathSegLinetoVerticalAbsVtbl;
interface ISVGPathSegLinetoVerticalAbs {
    CONST_VTBL ISVGPathSegLinetoVerticalAbsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGPathSegLinetoVerticalAbs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGPathSegLinetoVerticalAbs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGPathSegLinetoVerticalAbs_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGPathSegLinetoVerticalAbs_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGPathSegLinetoVerticalAbs_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGPathSegLinetoVerticalAbs_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGPathSegLinetoVerticalAbs_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGPathSegLinetoVerticalAbs methods ***/
#define ISVGPathSegLinetoVerticalAbs_put_y(This,v) (This)->lpVtbl->put_y(This,v)
#define ISVGPathSegLinetoVerticalAbs_get_y(This,p) (This)->lpVtbl->get_y(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGPathSegLinetoVerticalAbs_QueryInterface(ISVGPathSegLinetoVerticalAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGPathSegLinetoVerticalAbs_AddRef(ISVGPathSegLinetoVerticalAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGPathSegLinetoVerticalAbs_Release(ISVGPathSegLinetoVerticalAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGPathSegLinetoVerticalAbs_GetTypeInfoCount(ISVGPathSegLinetoVerticalAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGPathSegLinetoVerticalAbs_GetTypeInfo(ISVGPathSegLinetoVerticalAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGPathSegLinetoVerticalAbs_GetIDsOfNames(ISVGPathSegLinetoVerticalAbs* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGPathSegLinetoVerticalAbs_Invoke(ISVGPathSegLinetoVerticalAbs* 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);
}
/*** ISVGPathSegLinetoVerticalAbs methods ***/
static FORCEINLINE HRESULT ISVGPathSegLinetoVerticalAbs_put_y(ISVGPathSegLinetoVerticalAbs* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegLinetoVerticalAbs_get_y(ISVGPathSegLinetoVerticalAbs* This,float *p) {
    return This->lpVtbl->get_y(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGPathSegLinetoVerticalAbs_put_y_Proxy(
    ISVGPathSegLinetoVerticalAbs* This,
    float v);
void __RPC_STUB ISVGPathSegLinetoVerticalAbs_put_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegLinetoVerticalAbs_get_y_Proxy(
    ISVGPathSegLinetoVerticalAbs* This,
    float *p);
void __RPC_STUB ISVGPathSegLinetoVerticalAbs_get_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGPathSegLinetoVerticalAbs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGPathSegLinetoVerticalRel interface
 */
#ifndef __ISVGPathSegLinetoVerticalRel_INTERFACE_DEFINED__
#define __ISVGPathSegLinetoVerticalRel_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGPathSegLinetoVerticalRel, 0x3051050b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051050b-98b5-11cf-bb82-00aa00bdce0b")
ISVGPathSegLinetoVerticalRel : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_y(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y(
        float *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGPathSegLinetoVerticalRel, 0x3051050b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGPathSegLinetoVerticalRelVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGPathSegLinetoVerticalRel* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGPathSegLinetoVerticalRel* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGPathSegLinetoVerticalRel* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGPathSegLinetoVerticalRel* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGPathSegLinetoVerticalRel* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGPathSegLinetoVerticalRel* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGPathSegLinetoVerticalRel* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGPathSegLinetoVerticalRel methods ***/
    HRESULT (STDMETHODCALLTYPE *put_y)(
        ISVGPathSegLinetoVerticalRel* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_y)(
        ISVGPathSegLinetoVerticalRel* This,
        float *p);

    END_INTERFACE
} ISVGPathSegLinetoVerticalRelVtbl;
interface ISVGPathSegLinetoVerticalRel {
    CONST_VTBL ISVGPathSegLinetoVerticalRelVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGPathSegLinetoVerticalRel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGPathSegLinetoVerticalRel_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGPathSegLinetoVerticalRel_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGPathSegLinetoVerticalRel_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGPathSegLinetoVerticalRel_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGPathSegLinetoVerticalRel_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGPathSegLinetoVerticalRel_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGPathSegLinetoVerticalRel methods ***/
#define ISVGPathSegLinetoVerticalRel_put_y(This,v) (This)->lpVtbl->put_y(This,v)
#define ISVGPathSegLinetoVerticalRel_get_y(This,p) (This)->lpVtbl->get_y(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGPathSegLinetoVerticalRel_QueryInterface(ISVGPathSegLinetoVerticalRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGPathSegLinetoVerticalRel_AddRef(ISVGPathSegLinetoVerticalRel* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGPathSegLinetoVerticalRel_Release(ISVGPathSegLinetoVerticalRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGPathSegLinetoVerticalRel_GetTypeInfoCount(ISVGPathSegLinetoVerticalRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGPathSegLinetoVerticalRel_GetTypeInfo(ISVGPathSegLinetoVerticalRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGPathSegLinetoVerticalRel_GetIDsOfNames(ISVGPathSegLinetoVerticalRel* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGPathSegLinetoVerticalRel_Invoke(ISVGPathSegLinetoVerticalRel* 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);
}
/*** ISVGPathSegLinetoVerticalRel methods ***/
static FORCEINLINE HRESULT ISVGPathSegLinetoVerticalRel_put_y(ISVGPathSegLinetoVerticalRel* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegLinetoVerticalRel_get_y(ISVGPathSegLinetoVerticalRel* This,float *p) {
    return This->lpVtbl->get_y(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGPathSegLinetoVerticalRel_put_y_Proxy(
    ISVGPathSegLinetoVerticalRel* This,
    float v);
void __RPC_STUB ISVGPathSegLinetoVerticalRel_put_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegLinetoVerticalRel_get_y_Proxy(
    ISVGPathSegLinetoVerticalRel* This,
    float *p);
void __RPC_STUB ISVGPathSegLinetoVerticalRel_get_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGPathSegLinetoVerticalRel_INTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGPathSeg coclass
 */

DEFINE_GUID(CLSID_SVGPathSeg, 0x305105b3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105b3-98b5-11cf-bb82-00aa00bdce0b") SVGPathSeg;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGPathSeg, 0x305105b3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGPathSeg;
/*****************************************************************************
 * DispSVGPathSegArcAbs dispinterface
 */
#ifndef __DispSVGPathSegArcAbs_DISPINTERFACE_DEFINED__
#define __DispSVGPathSegArcAbs_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGPathSegArcAbs, 0x30590013, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590013-98b5-11cf-bb82-00aa00bdce0b")
DispSVGPathSegArcAbs : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGPathSegArcAbs, 0x30590013, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGPathSegArcAbsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGPathSegArcAbs* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGPathSegArcAbs* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGPathSegArcAbs* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGPathSegArcAbs* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGPathSegArcAbs* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGPathSegArcAbs* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGPathSegArcAbs* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGPathSegArcAbsVtbl;
interface DispSVGPathSegArcAbs {
    CONST_VTBL DispSVGPathSegArcAbsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGPathSegArcAbs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGPathSegArcAbs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGPathSegArcAbs_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGPathSegArcAbs_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGPathSegArcAbs_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGPathSegArcAbs_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGPathSegArcAbs_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 DispSVGPathSegArcAbs_QueryInterface(DispSVGPathSegArcAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGPathSegArcAbs_AddRef(DispSVGPathSegArcAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGPathSegArcAbs_Release(DispSVGPathSegArcAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGPathSegArcAbs_GetTypeInfoCount(DispSVGPathSegArcAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGPathSegArcAbs_GetTypeInfo(DispSVGPathSegArcAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGPathSegArcAbs_GetIDsOfNames(DispSVGPathSegArcAbs* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGPathSegArcAbs_Invoke(DispSVGPathSegArcAbs* 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  /* __DispSVGPathSegArcAbs_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGPathSegArcAbs coclass
 */

DEFINE_GUID(CLSID_SVGPathSegArcAbs, 0x305105bb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105bb-98b5-11cf-bb82-00aa00bdce0b") SVGPathSegArcAbs;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGPathSegArcAbs, 0x305105bb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGPathSegArcAbs;
/*****************************************************************************
 * DispSVGPathSegArcRel dispinterface
 */
#ifndef __DispSVGPathSegArcRel_DISPINTERFACE_DEFINED__
#define __DispSVGPathSegArcRel_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGPathSegArcRel, 0x30590014, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590014-98b5-11cf-bb82-00aa00bdce0b")
DispSVGPathSegArcRel : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGPathSegArcRel, 0x30590014, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGPathSegArcRelVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGPathSegArcRel* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGPathSegArcRel* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGPathSegArcRel* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGPathSegArcRel* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGPathSegArcRel* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGPathSegArcRel* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGPathSegArcRel* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGPathSegArcRelVtbl;
interface DispSVGPathSegArcRel {
    CONST_VTBL DispSVGPathSegArcRelVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGPathSegArcRel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGPathSegArcRel_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGPathSegArcRel_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGPathSegArcRel_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGPathSegArcRel_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGPathSegArcRel_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGPathSegArcRel_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 DispSVGPathSegArcRel_QueryInterface(DispSVGPathSegArcRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGPathSegArcRel_AddRef(DispSVGPathSegArcRel* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGPathSegArcRel_Release(DispSVGPathSegArcRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGPathSegArcRel_GetTypeInfoCount(DispSVGPathSegArcRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGPathSegArcRel_GetTypeInfo(DispSVGPathSegArcRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGPathSegArcRel_GetIDsOfNames(DispSVGPathSegArcRel* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGPathSegArcRel_Invoke(DispSVGPathSegArcRel* 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  /* __DispSVGPathSegArcRel_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGPathSegArcRel coclass
 */

DEFINE_GUID(CLSID_SVGPathSegArcRel, 0x305105bc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105bc-98b5-11cf-bb82-00aa00bdce0b") SVGPathSegArcRel;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGPathSegArcRel, 0x305105bc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGPathSegArcRel;
/*****************************************************************************
 * DispSVGPathSegClosePath dispinterface
 */
#ifndef __DispSVGPathSegClosePath_DISPINTERFACE_DEFINED__
#define __DispSVGPathSegClosePath_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGPathSegClosePath, 0x30590015, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590015-98b5-11cf-bb82-00aa00bdce0b")
DispSVGPathSegClosePath : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGPathSegClosePath, 0x30590015, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGPathSegClosePathVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGPathSegClosePath* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGPathSegClosePath* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGPathSegClosePath* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGPathSegClosePath* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGPathSegClosePath* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGPathSegClosePath* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGPathSegClosePath* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGPathSegClosePathVtbl;
interface DispSVGPathSegClosePath {
    CONST_VTBL DispSVGPathSegClosePathVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGPathSegClosePath_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGPathSegClosePath_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGPathSegClosePath_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGPathSegClosePath_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGPathSegClosePath_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGPathSegClosePath_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGPathSegClosePath_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 DispSVGPathSegClosePath_QueryInterface(DispSVGPathSegClosePath* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGPathSegClosePath_AddRef(DispSVGPathSegClosePath* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGPathSegClosePath_Release(DispSVGPathSegClosePath* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGPathSegClosePath_GetTypeInfoCount(DispSVGPathSegClosePath* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGPathSegClosePath_GetTypeInfo(DispSVGPathSegClosePath* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGPathSegClosePath_GetIDsOfNames(DispSVGPathSegClosePath* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGPathSegClosePath_Invoke(DispSVGPathSegClosePath* 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  /* __DispSVGPathSegClosePath_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGPathSegClosePath coclass
 */

DEFINE_GUID(CLSID_SVGPathSegClosePath, 0x305105bd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105bd-98b5-11cf-bb82-00aa00bdce0b") SVGPathSegClosePath;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGPathSegClosePath, 0x305105bd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGPathSegClosePath;
/*****************************************************************************
 * DispSVGPathSegMovetoAbs dispinterface
 */
#ifndef __DispSVGPathSegMovetoAbs_DISPINTERFACE_DEFINED__
#define __DispSVGPathSegMovetoAbs_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGPathSegMovetoAbs, 0x30590024, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590024-98b5-11cf-bb82-00aa00bdce0b")
DispSVGPathSegMovetoAbs : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGPathSegMovetoAbs, 0x30590024, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGPathSegMovetoAbsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGPathSegMovetoAbs* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGPathSegMovetoAbs* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGPathSegMovetoAbs* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGPathSegMovetoAbs* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGPathSegMovetoAbs* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGPathSegMovetoAbs* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGPathSegMovetoAbs* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGPathSegMovetoAbsVtbl;
interface DispSVGPathSegMovetoAbs {
    CONST_VTBL DispSVGPathSegMovetoAbsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGPathSegMovetoAbs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGPathSegMovetoAbs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGPathSegMovetoAbs_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGPathSegMovetoAbs_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGPathSegMovetoAbs_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGPathSegMovetoAbs_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGPathSegMovetoAbs_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 DispSVGPathSegMovetoAbs_QueryInterface(DispSVGPathSegMovetoAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGPathSegMovetoAbs_AddRef(DispSVGPathSegMovetoAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGPathSegMovetoAbs_Release(DispSVGPathSegMovetoAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGPathSegMovetoAbs_GetTypeInfoCount(DispSVGPathSegMovetoAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGPathSegMovetoAbs_GetTypeInfo(DispSVGPathSegMovetoAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGPathSegMovetoAbs_GetIDsOfNames(DispSVGPathSegMovetoAbs* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGPathSegMovetoAbs_Invoke(DispSVGPathSegMovetoAbs* 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  /* __DispSVGPathSegMovetoAbs_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGPathSegMovetoAbs coclass
 */

DEFINE_GUID(CLSID_SVGPathSegMovetoAbs, 0x305105cc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105cc-98b5-11cf-bb82-00aa00bdce0b") SVGPathSegMovetoAbs;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGPathSegMovetoAbs, 0x305105cc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGPathSegMovetoAbs;
/*****************************************************************************
 * DispSVGPathSegMovetoRel dispinterface
 */
#ifndef __DispSVGPathSegMovetoRel_DISPINTERFACE_DEFINED__
#define __DispSVGPathSegMovetoRel_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGPathSegMovetoRel, 0x30590025, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590025-98b5-11cf-bb82-00aa00bdce0b")
DispSVGPathSegMovetoRel : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGPathSegMovetoRel, 0x30590025, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGPathSegMovetoRelVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGPathSegMovetoRel* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGPathSegMovetoRel* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGPathSegMovetoRel* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGPathSegMovetoRel* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGPathSegMovetoRel* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGPathSegMovetoRel* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGPathSegMovetoRel* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGPathSegMovetoRelVtbl;
interface DispSVGPathSegMovetoRel {
    CONST_VTBL DispSVGPathSegMovetoRelVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGPathSegMovetoRel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGPathSegMovetoRel_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGPathSegMovetoRel_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGPathSegMovetoRel_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGPathSegMovetoRel_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGPathSegMovetoRel_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGPathSegMovetoRel_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 DispSVGPathSegMovetoRel_QueryInterface(DispSVGPathSegMovetoRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGPathSegMovetoRel_AddRef(DispSVGPathSegMovetoRel* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGPathSegMovetoRel_Release(DispSVGPathSegMovetoRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGPathSegMovetoRel_GetTypeInfoCount(DispSVGPathSegMovetoRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGPathSegMovetoRel_GetTypeInfo(DispSVGPathSegMovetoRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGPathSegMovetoRel_GetIDsOfNames(DispSVGPathSegMovetoRel* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGPathSegMovetoRel_Invoke(DispSVGPathSegMovetoRel* 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  /* __DispSVGPathSegMovetoRel_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGPathSegMovetoRel coclass
 */

DEFINE_GUID(CLSID_SVGPathSegMovetoRel, 0x305105cd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105cd-98b5-11cf-bb82-00aa00bdce0b") SVGPathSegMovetoRel;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGPathSegMovetoRel, 0x305105cd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGPathSegMovetoRel;
/*****************************************************************************
 * DispSVGPathSegLinetoAbs dispinterface
 */
#ifndef __DispSVGPathSegLinetoAbs_DISPINTERFACE_DEFINED__
#define __DispSVGPathSegLinetoAbs_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGPathSegLinetoAbs, 0x3059001e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059001e-98b5-11cf-bb82-00aa00bdce0b")
DispSVGPathSegLinetoAbs : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGPathSegLinetoAbs, 0x3059001e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGPathSegLinetoAbsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGPathSegLinetoAbs* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGPathSegLinetoAbs* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGPathSegLinetoAbs* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGPathSegLinetoAbs* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGPathSegLinetoAbs* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGPathSegLinetoAbs* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGPathSegLinetoAbs* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGPathSegLinetoAbsVtbl;
interface DispSVGPathSegLinetoAbs {
    CONST_VTBL DispSVGPathSegLinetoAbsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGPathSegLinetoAbs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGPathSegLinetoAbs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGPathSegLinetoAbs_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGPathSegLinetoAbs_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGPathSegLinetoAbs_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGPathSegLinetoAbs_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGPathSegLinetoAbs_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 DispSVGPathSegLinetoAbs_QueryInterface(DispSVGPathSegLinetoAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGPathSegLinetoAbs_AddRef(DispSVGPathSegLinetoAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGPathSegLinetoAbs_Release(DispSVGPathSegLinetoAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGPathSegLinetoAbs_GetTypeInfoCount(DispSVGPathSegLinetoAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGPathSegLinetoAbs_GetTypeInfo(DispSVGPathSegLinetoAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGPathSegLinetoAbs_GetIDsOfNames(DispSVGPathSegLinetoAbs* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGPathSegLinetoAbs_Invoke(DispSVGPathSegLinetoAbs* 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  /* __DispSVGPathSegLinetoAbs_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGPathSegLinetoAbs coclass
 */

DEFINE_GUID(CLSID_SVGPathSegLinetoAbs, 0x305105c6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105c6-98b5-11cf-bb82-00aa00bdce0b") SVGPathSegLinetoAbs;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGPathSegLinetoAbs, 0x305105c6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGPathSegLinetoAbs;
/*****************************************************************************
 * DispSVGPathSegLinetoRel dispinterface
 */
#ifndef __DispSVGPathSegLinetoRel_DISPINTERFACE_DEFINED__
#define __DispSVGPathSegLinetoRel_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGPathSegLinetoRel, 0x30590021, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590021-98b5-11cf-bb82-00aa00bdce0b")
DispSVGPathSegLinetoRel : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGPathSegLinetoRel, 0x30590021, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGPathSegLinetoRelVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGPathSegLinetoRel* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGPathSegLinetoRel* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGPathSegLinetoRel* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGPathSegLinetoRel* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGPathSegLinetoRel* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGPathSegLinetoRel* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGPathSegLinetoRel* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGPathSegLinetoRelVtbl;
interface DispSVGPathSegLinetoRel {
    CONST_VTBL DispSVGPathSegLinetoRelVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGPathSegLinetoRel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGPathSegLinetoRel_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGPathSegLinetoRel_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGPathSegLinetoRel_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGPathSegLinetoRel_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGPathSegLinetoRel_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGPathSegLinetoRel_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 DispSVGPathSegLinetoRel_QueryInterface(DispSVGPathSegLinetoRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGPathSegLinetoRel_AddRef(DispSVGPathSegLinetoRel* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGPathSegLinetoRel_Release(DispSVGPathSegLinetoRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGPathSegLinetoRel_GetTypeInfoCount(DispSVGPathSegLinetoRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGPathSegLinetoRel_GetTypeInfo(DispSVGPathSegLinetoRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGPathSegLinetoRel_GetIDsOfNames(DispSVGPathSegLinetoRel* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGPathSegLinetoRel_Invoke(DispSVGPathSegLinetoRel* 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  /* __DispSVGPathSegLinetoRel_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGPathSegLinetoRel coclass
 */

DEFINE_GUID(CLSID_SVGPathSegLinetoRel, 0x305105c9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105c9-98b5-11cf-bb82-00aa00bdce0b") SVGPathSegLinetoRel;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGPathSegLinetoRel, 0x305105c9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGPathSegLinetoRel;
/*****************************************************************************
 * DispSVGPathSegCurvetoCubicAbs dispinterface
 */
#ifndef __DispSVGPathSegCurvetoCubicAbs_DISPINTERFACE_DEFINED__
#define __DispSVGPathSegCurvetoCubicAbs_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGPathSegCurvetoCubicAbs, 0x30590016, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590016-98b5-11cf-bb82-00aa00bdce0b")
DispSVGPathSegCurvetoCubicAbs : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGPathSegCurvetoCubicAbs, 0x30590016, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGPathSegCurvetoCubicAbsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGPathSegCurvetoCubicAbs* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGPathSegCurvetoCubicAbs* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGPathSegCurvetoCubicAbs* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGPathSegCurvetoCubicAbs* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGPathSegCurvetoCubicAbs* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGPathSegCurvetoCubicAbs* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGPathSegCurvetoCubicAbs* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGPathSegCurvetoCubicAbsVtbl;
interface DispSVGPathSegCurvetoCubicAbs {
    CONST_VTBL DispSVGPathSegCurvetoCubicAbsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGPathSegCurvetoCubicAbs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGPathSegCurvetoCubicAbs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGPathSegCurvetoCubicAbs_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGPathSegCurvetoCubicAbs_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGPathSegCurvetoCubicAbs_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGPathSegCurvetoCubicAbs_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGPathSegCurvetoCubicAbs_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 DispSVGPathSegCurvetoCubicAbs_QueryInterface(DispSVGPathSegCurvetoCubicAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGPathSegCurvetoCubicAbs_AddRef(DispSVGPathSegCurvetoCubicAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGPathSegCurvetoCubicAbs_Release(DispSVGPathSegCurvetoCubicAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGPathSegCurvetoCubicAbs_GetTypeInfoCount(DispSVGPathSegCurvetoCubicAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGPathSegCurvetoCubicAbs_GetTypeInfo(DispSVGPathSegCurvetoCubicAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGPathSegCurvetoCubicAbs_GetIDsOfNames(DispSVGPathSegCurvetoCubicAbs* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGPathSegCurvetoCubicAbs_Invoke(DispSVGPathSegCurvetoCubicAbs* 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  /* __DispSVGPathSegCurvetoCubicAbs_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGPathSegCurvetoCubicAbs coclass
 */

DEFINE_GUID(CLSID_SVGPathSegCurvetoCubicAbs, 0x305105be, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105be-98b5-11cf-bb82-00aa00bdce0b") SVGPathSegCurvetoCubicAbs;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGPathSegCurvetoCubicAbs, 0x305105be, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGPathSegCurvetoCubicAbs;
/*****************************************************************************
 * DispSVGPathSegCurvetoCubicRel dispinterface
 */
#ifndef __DispSVGPathSegCurvetoCubicRel_DISPINTERFACE_DEFINED__
#define __DispSVGPathSegCurvetoCubicRel_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGPathSegCurvetoCubicRel, 0x30590017, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590017-98b5-11cf-bb82-00aa00bdce0b")
DispSVGPathSegCurvetoCubicRel : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGPathSegCurvetoCubicRel, 0x30590017, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGPathSegCurvetoCubicRelVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGPathSegCurvetoCubicRel* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGPathSegCurvetoCubicRel* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGPathSegCurvetoCubicRel* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGPathSegCurvetoCubicRel* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGPathSegCurvetoCubicRel* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGPathSegCurvetoCubicRel* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGPathSegCurvetoCubicRel* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGPathSegCurvetoCubicRelVtbl;
interface DispSVGPathSegCurvetoCubicRel {
    CONST_VTBL DispSVGPathSegCurvetoCubicRelVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGPathSegCurvetoCubicRel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGPathSegCurvetoCubicRel_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGPathSegCurvetoCubicRel_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGPathSegCurvetoCubicRel_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGPathSegCurvetoCubicRel_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGPathSegCurvetoCubicRel_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGPathSegCurvetoCubicRel_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 DispSVGPathSegCurvetoCubicRel_QueryInterface(DispSVGPathSegCurvetoCubicRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGPathSegCurvetoCubicRel_AddRef(DispSVGPathSegCurvetoCubicRel* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGPathSegCurvetoCubicRel_Release(DispSVGPathSegCurvetoCubicRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGPathSegCurvetoCubicRel_GetTypeInfoCount(DispSVGPathSegCurvetoCubicRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGPathSegCurvetoCubicRel_GetTypeInfo(DispSVGPathSegCurvetoCubicRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGPathSegCurvetoCubicRel_GetIDsOfNames(DispSVGPathSegCurvetoCubicRel* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGPathSegCurvetoCubicRel_Invoke(DispSVGPathSegCurvetoCubicRel* 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  /* __DispSVGPathSegCurvetoCubicRel_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGPathSegCurvetoCubicRel coclass
 */

DEFINE_GUID(CLSID_SVGPathSegCurvetoCubicRel, 0x305105bf, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105bf-98b5-11cf-bb82-00aa00bdce0b") SVGPathSegCurvetoCubicRel;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGPathSegCurvetoCubicRel, 0x305105bf, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGPathSegCurvetoCubicRel;
/*****************************************************************************
 * DispSVGPathSegCurvetoCubicSmoothAbs dispinterface
 */
#ifndef __DispSVGPathSegCurvetoCubicSmoothAbs_DISPINTERFACE_DEFINED__
#define __DispSVGPathSegCurvetoCubicSmoothAbs_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGPathSegCurvetoCubicSmoothAbs, 0x30590018, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590018-98b5-11cf-bb82-00aa00bdce0b")
DispSVGPathSegCurvetoCubicSmoothAbs : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGPathSegCurvetoCubicSmoothAbs, 0x30590018, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGPathSegCurvetoCubicSmoothAbsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGPathSegCurvetoCubicSmoothAbs* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGPathSegCurvetoCubicSmoothAbs* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGPathSegCurvetoCubicSmoothAbs* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGPathSegCurvetoCubicSmoothAbs* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGPathSegCurvetoCubicSmoothAbs* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGPathSegCurvetoCubicSmoothAbs* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGPathSegCurvetoCubicSmoothAbs* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGPathSegCurvetoCubicSmoothAbsVtbl;
interface DispSVGPathSegCurvetoCubicSmoothAbs {
    CONST_VTBL DispSVGPathSegCurvetoCubicSmoothAbsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGPathSegCurvetoCubicSmoothAbs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGPathSegCurvetoCubicSmoothAbs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGPathSegCurvetoCubicSmoothAbs_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGPathSegCurvetoCubicSmoothAbs_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGPathSegCurvetoCubicSmoothAbs_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGPathSegCurvetoCubicSmoothAbs_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGPathSegCurvetoCubicSmoothAbs_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 DispSVGPathSegCurvetoCubicSmoothAbs_QueryInterface(DispSVGPathSegCurvetoCubicSmoothAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGPathSegCurvetoCubicSmoothAbs_AddRef(DispSVGPathSegCurvetoCubicSmoothAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGPathSegCurvetoCubicSmoothAbs_Release(DispSVGPathSegCurvetoCubicSmoothAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGPathSegCurvetoCubicSmoothAbs_GetTypeInfoCount(DispSVGPathSegCurvetoCubicSmoothAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGPathSegCurvetoCubicSmoothAbs_GetTypeInfo(DispSVGPathSegCurvetoCubicSmoothAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGPathSegCurvetoCubicSmoothAbs_GetIDsOfNames(DispSVGPathSegCurvetoCubicSmoothAbs* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGPathSegCurvetoCubicSmoothAbs_Invoke(DispSVGPathSegCurvetoCubicSmoothAbs* 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  /* __DispSVGPathSegCurvetoCubicSmoothAbs_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGPathSegCurvetoCubicSmoothAbs coclass
 */

DEFINE_GUID(CLSID_SVGPathSegCurvetoCubicSmoothAbs, 0x305105c0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105c0-98b5-11cf-bb82-00aa00bdce0b") SVGPathSegCurvetoCubicSmoothAbs;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGPathSegCurvetoCubicSmoothAbs, 0x305105c0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGPathSegCurvetoCubicSmoothAbs;
/*****************************************************************************
 * DispSVGPathSegCurvetoCubicSmoothRel dispinterface
 */
#ifndef __DispSVGPathSegCurvetoCubicSmoothRel_DISPINTERFACE_DEFINED__
#define __DispSVGPathSegCurvetoCubicSmoothRel_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGPathSegCurvetoCubicSmoothRel, 0x30590019, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590019-98b5-11cf-bb82-00aa00bdce0b")
DispSVGPathSegCurvetoCubicSmoothRel : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGPathSegCurvetoCubicSmoothRel, 0x30590019, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGPathSegCurvetoCubicSmoothRelVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGPathSegCurvetoCubicSmoothRel* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGPathSegCurvetoCubicSmoothRel* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGPathSegCurvetoCubicSmoothRel* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGPathSegCurvetoCubicSmoothRel* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGPathSegCurvetoCubicSmoothRel* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGPathSegCurvetoCubicSmoothRel* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGPathSegCurvetoCubicSmoothRel* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGPathSegCurvetoCubicSmoothRelVtbl;
interface DispSVGPathSegCurvetoCubicSmoothRel {
    CONST_VTBL DispSVGPathSegCurvetoCubicSmoothRelVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGPathSegCurvetoCubicSmoothRel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGPathSegCurvetoCubicSmoothRel_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGPathSegCurvetoCubicSmoothRel_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGPathSegCurvetoCubicSmoothRel_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGPathSegCurvetoCubicSmoothRel_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGPathSegCurvetoCubicSmoothRel_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGPathSegCurvetoCubicSmoothRel_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 DispSVGPathSegCurvetoCubicSmoothRel_QueryInterface(DispSVGPathSegCurvetoCubicSmoothRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGPathSegCurvetoCubicSmoothRel_AddRef(DispSVGPathSegCurvetoCubicSmoothRel* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGPathSegCurvetoCubicSmoothRel_Release(DispSVGPathSegCurvetoCubicSmoothRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGPathSegCurvetoCubicSmoothRel_GetTypeInfoCount(DispSVGPathSegCurvetoCubicSmoothRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGPathSegCurvetoCubicSmoothRel_GetTypeInfo(DispSVGPathSegCurvetoCubicSmoothRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGPathSegCurvetoCubicSmoothRel_GetIDsOfNames(DispSVGPathSegCurvetoCubicSmoothRel* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGPathSegCurvetoCubicSmoothRel_Invoke(DispSVGPathSegCurvetoCubicSmoothRel* 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  /* __DispSVGPathSegCurvetoCubicSmoothRel_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGPathSegCurvetoCubicSmoothRel coclass
 */

DEFINE_GUID(CLSID_SVGPathSegCurvetoCubicSmoothRel, 0x305105c1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105c1-98b5-11cf-bb82-00aa00bdce0b") SVGPathSegCurvetoCubicSmoothRel;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGPathSegCurvetoCubicSmoothRel, 0x305105c1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGPathSegCurvetoCubicSmoothRel;
/*****************************************************************************
 * DispSVGPathSegCurvetoQuadraticAbs dispinterface
 */
#ifndef __DispSVGPathSegCurvetoQuadraticAbs_DISPINTERFACE_DEFINED__
#define __DispSVGPathSegCurvetoQuadraticAbs_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGPathSegCurvetoQuadraticAbs, 0x3059001a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059001a-98b5-11cf-bb82-00aa00bdce0b")
DispSVGPathSegCurvetoQuadraticAbs : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGPathSegCurvetoQuadraticAbs, 0x3059001a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGPathSegCurvetoQuadraticAbsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGPathSegCurvetoQuadraticAbs* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGPathSegCurvetoQuadraticAbs* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGPathSegCurvetoQuadraticAbs* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGPathSegCurvetoQuadraticAbs* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGPathSegCurvetoQuadraticAbs* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGPathSegCurvetoQuadraticAbs* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGPathSegCurvetoQuadraticAbs* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGPathSegCurvetoQuadraticAbsVtbl;
interface DispSVGPathSegCurvetoQuadraticAbs {
    CONST_VTBL DispSVGPathSegCurvetoQuadraticAbsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGPathSegCurvetoQuadraticAbs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGPathSegCurvetoQuadraticAbs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGPathSegCurvetoQuadraticAbs_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGPathSegCurvetoQuadraticAbs_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGPathSegCurvetoQuadraticAbs_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGPathSegCurvetoQuadraticAbs_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGPathSegCurvetoQuadraticAbs_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 DispSVGPathSegCurvetoQuadraticAbs_QueryInterface(DispSVGPathSegCurvetoQuadraticAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGPathSegCurvetoQuadraticAbs_AddRef(DispSVGPathSegCurvetoQuadraticAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGPathSegCurvetoQuadraticAbs_Release(DispSVGPathSegCurvetoQuadraticAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGPathSegCurvetoQuadraticAbs_GetTypeInfoCount(DispSVGPathSegCurvetoQuadraticAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGPathSegCurvetoQuadraticAbs_GetTypeInfo(DispSVGPathSegCurvetoQuadraticAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGPathSegCurvetoQuadraticAbs_GetIDsOfNames(DispSVGPathSegCurvetoQuadraticAbs* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGPathSegCurvetoQuadraticAbs_Invoke(DispSVGPathSegCurvetoQuadraticAbs* 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  /* __DispSVGPathSegCurvetoQuadraticAbs_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGPathSegCurvetoQuadraticAbs coclass
 */

DEFINE_GUID(CLSID_SVGPathSegCurvetoQuadraticAbs, 0x305105c2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105c2-98b5-11cf-bb82-00aa00bdce0b") SVGPathSegCurvetoQuadraticAbs;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGPathSegCurvetoQuadraticAbs, 0x305105c2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGPathSegCurvetoQuadraticAbs;
/*****************************************************************************
 * DispSVGPathSegCurvetoQuadraticRel dispinterface
 */
#ifndef __DispSVGPathSegCurvetoQuadraticRel_DISPINTERFACE_DEFINED__
#define __DispSVGPathSegCurvetoQuadraticRel_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGPathSegCurvetoQuadraticRel, 0x3059001b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059001b-98b5-11cf-bb82-00aa00bdce0b")
DispSVGPathSegCurvetoQuadraticRel : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGPathSegCurvetoQuadraticRel, 0x3059001b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGPathSegCurvetoQuadraticRelVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGPathSegCurvetoQuadraticRel* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGPathSegCurvetoQuadraticRel* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGPathSegCurvetoQuadraticRel* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGPathSegCurvetoQuadraticRel* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGPathSegCurvetoQuadraticRel* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGPathSegCurvetoQuadraticRel* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGPathSegCurvetoQuadraticRel* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGPathSegCurvetoQuadraticRelVtbl;
interface DispSVGPathSegCurvetoQuadraticRel {
    CONST_VTBL DispSVGPathSegCurvetoQuadraticRelVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGPathSegCurvetoQuadraticRel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGPathSegCurvetoQuadraticRel_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGPathSegCurvetoQuadraticRel_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGPathSegCurvetoQuadraticRel_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGPathSegCurvetoQuadraticRel_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGPathSegCurvetoQuadraticRel_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGPathSegCurvetoQuadraticRel_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 DispSVGPathSegCurvetoQuadraticRel_QueryInterface(DispSVGPathSegCurvetoQuadraticRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGPathSegCurvetoQuadraticRel_AddRef(DispSVGPathSegCurvetoQuadraticRel* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGPathSegCurvetoQuadraticRel_Release(DispSVGPathSegCurvetoQuadraticRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGPathSegCurvetoQuadraticRel_GetTypeInfoCount(DispSVGPathSegCurvetoQuadraticRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGPathSegCurvetoQuadraticRel_GetTypeInfo(DispSVGPathSegCurvetoQuadraticRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGPathSegCurvetoQuadraticRel_GetIDsOfNames(DispSVGPathSegCurvetoQuadraticRel* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGPathSegCurvetoQuadraticRel_Invoke(DispSVGPathSegCurvetoQuadraticRel* 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  /* __DispSVGPathSegCurvetoQuadraticRel_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGPathSegCurvetoQuadraticRel coclass
 */

DEFINE_GUID(CLSID_SVGPathSegCurvetoQuadraticRel, 0x305105c3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105c3-98b5-11cf-bb82-00aa00bdce0b") SVGPathSegCurvetoQuadraticRel;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGPathSegCurvetoQuadraticRel, 0x305105c3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGPathSegCurvetoQuadraticRel;
/*****************************************************************************
 * DispSVGPathSegCurvetoQuadraticSmoothAbs dispinterface
 */
#ifndef __DispSVGPathSegCurvetoQuadraticSmoothAbs_DISPINTERFACE_DEFINED__
#define __DispSVGPathSegCurvetoQuadraticSmoothAbs_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGPathSegCurvetoQuadraticSmoothAbs, 0x3059001c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059001c-98b5-11cf-bb82-00aa00bdce0b")
DispSVGPathSegCurvetoQuadraticSmoothAbs : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGPathSegCurvetoQuadraticSmoothAbs, 0x3059001c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGPathSegCurvetoQuadraticSmoothAbsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGPathSegCurvetoQuadraticSmoothAbs* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGPathSegCurvetoQuadraticSmoothAbs* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGPathSegCurvetoQuadraticSmoothAbs* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGPathSegCurvetoQuadraticSmoothAbs* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGPathSegCurvetoQuadraticSmoothAbs* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGPathSegCurvetoQuadraticSmoothAbs* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGPathSegCurvetoQuadraticSmoothAbs* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGPathSegCurvetoQuadraticSmoothAbsVtbl;
interface DispSVGPathSegCurvetoQuadraticSmoothAbs {
    CONST_VTBL DispSVGPathSegCurvetoQuadraticSmoothAbsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGPathSegCurvetoQuadraticSmoothAbs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGPathSegCurvetoQuadraticSmoothAbs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGPathSegCurvetoQuadraticSmoothAbs_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGPathSegCurvetoQuadraticSmoothAbs_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGPathSegCurvetoQuadraticSmoothAbs_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGPathSegCurvetoQuadraticSmoothAbs_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGPathSegCurvetoQuadraticSmoothAbs_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 DispSVGPathSegCurvetoQuadraticSmoothAbs_QueryInterface(DispSVGPathSegCurvetoQuadraticSmoothAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGPathSegCurvetoQuadraticSmoothAbs_AddRef(DispSVGPathSegCurvetoQuadraticSmoothAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGPathSegCurvetoQuadraticSmoothAbs_Release(DispSVGPathSegCurvetoQuadraticSmoothAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGPathSegCurvetoQuadraticSmoothAbs_GetTypeInfoCount(DispSVGPathSegCurvetoQuadraticSmoothAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGPathSegCurvetoQuadraticSmoothAbs_GetTypeInfo(DispSVGPathSegCurvetoQuadraticSmoothAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGPathSegCurvetoQuadraticSmoothAbs_GetIDsOfNames(DispSVGPathSegCurvetoQuadraticSmoothAbs* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGPathSegCurvetoQuadraticSmoothAbs_Invoke(DispSVGPathSegCurvetoQuadraticSmoothAbs* 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  /* __DispSVGPathSegCurvetoQuadraticSmoothAbs_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGPathSegCurvetoQuadraticSmoothAbs coclass
 */

DEFINE_GUID(CLSID_SVGPathSegCurvetoQuadraticSmoothAbs, 0x305105c4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105c4-98b5-11cf-bb82-00aa00bdce0b") SVGPathSegCurvetoQuadraticSmoothAbs;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGPathSegCurvetoQuadraticSmoothAbs, 0x305105c4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGPathSegCurvetoQuadraticSmoothAbs;
/*****************************************************************************
 * DispSVGPathSegCurvetoQuadraticSmoothRel dispinterface
 */
#ifndef __DispSVGPathSegCurvetoQuadraticSmoothRel_DISPINTERFACE_DEFINED__
#define __DispSVGPathSegCurvetoQuadraticSmoothRel_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGPathSegCurvetoQuadraticSmoothRel, 0x3059001d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059001d-98b5-11cf-bb82-00aa00bdce0b")
DispSVGPathSegCurvetoQuadraticSmoothRel : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGPathSegCurvetoQuadraticSmoothRel, 0x3059001d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGPathSegCurvetoQuadraticSmoothRelVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGPathSegCurvetoQuadraticSmoothRel* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGPathSegCurvetoQuadraticSmoothRel* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGPathSegCurvetoQuadraticSmoothRel* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGPathSegCurvetoQuadraticSmoothRel* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGPathSegCurvetoQuadraticSmoothRel* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGPathSegCurvetoQuadraticSmoothRel* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGPathSegCurvetoQuadraticSmoothRel* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGPathSegCurvetoQuadraticSmoothRelVtbl;
interface DispSVGPathSegCurvetoQuadraticSmoothRel {
    CONST_VTBL DispSVGPathSegCurvetoQuadraticSmoothRelVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGPathSegCurvetoQuadraticSmoothRel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGPathSegCurvetoQuadraticSmoothRel_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGPathSegCurvetoQuadraticSmoothRel_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGPathSegCurvetoQuadraticSmoothRel_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGPathSegCurvetoQuadraticSmoothRel_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGPathSegCurvetoQuadraticSmoothRel_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGPathSegCurvetoQuadraticSmoothRel_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 DispSVGPathSegCurvetoQuadraticSmoothRel_QueryInterface(DispSVGPathSegCurvetoQuadraticSmoothRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGPathSegCurvetoQuadraticSmoothRel_AddRef(DispSVGPathSegCurvetoQuadraticSmoothRel* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGPathSegCurvetoQuadraticSmoothRel_Release(DispSVGPathSegCurvetoQuadraticSmoothRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGPathSegCurvetoQuadraticSmoothRel_GetTypeInfoCount(DispSVGPathSegCurvetoQuadraticSmoothRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGPathSegCurvetoQuadraticSmoothRel_GetTypeInfo(DispSVGPathSegCurvetoQuadraticSmoothRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGPathSegCurvetoQuadraticSmoothRel_GetIDsOfNames(DispSVGPathSegCurvetoQuadraticSmoothRel* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGPathSegCurvetoQuadraticSmoothRel_Invoke(DispSVGPathSegCurvetoQuadraticSmoothRel* 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  /* __DispSVGPathSegCurvetoQuadraticSmoothRel_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGPathSegCurvetoQuadraticSmoothRel coclass
 */

DEFINE_GUID(CLSID_SVGPathSegCurvetoQuadraticSmoothRel, 0x305105c5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105c5-98b5-11cf-bb82-00aa00bdce0b") SVGPathSegCurvetoQuadraticSmoothRel;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGPathSegCurvetoQuadraticSmoothRel, 0x305105c5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGPathSegCurvetoQuadraticSmoothRel;
/*****************************************************************************
 * DispSVGPathSegLinetoHorizontalAbs dispinterface
 */
#ifndef __DispSVGPathSegLinetoHorizontalAbs_DISPINTERFACE_DEFINED__
#define __DispSVGPathSegLinetoHorizontalAbs_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGPathSegLinetoHorizontalAbs, 0x3059001f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059001f-98b5-11cf-bb82-00aa00bdce0b")
DispSVGPathSegLinetoHorizontalAbs : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGPathSegLinetoHorizontalAbs, 0x3059001f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGPathSegLinetoHorizontalAbsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGPathSegLinetoHorizontalAbs* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGPathSegLinetoHorizontalAbs* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGPathSegLinetoHorizontalAbs* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGPathSegLinetoHorizontalAbs* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGPathSegLinetoHorizontalAbs* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGPathSegLinetoHorizontalAbs* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGPathSegLinetoHorizontalAbs* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGPathSegLinetoHorizontalAbsVtbl;
interface DispSVGPathSegLinetoHorizontalAbs {
    CONST_VTBL DispSVGPathSegLinetoHorizontalAbsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGPathSegLinetoHorizontalAbs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGPathSegLinetoHorizontalAbs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGPathSegLinetoHorizontalAbs_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGPathSegLinetoHorizontalAbs_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGPathSegLinetoHorizontalAbs_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGPathSegLinetoHorizontalAbs_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGPathSegLinetoHorizontalAbs_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 DispSVGPathSegLinetoHorizontalAbs_QueryInterface(DispSVGPathSegLinetoHorizontalAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGPathSegLinetoHorizontalAbs_AddRef(DispSVGPathSegLinetoHorizontalAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGPathSegLinetoHorizontalAbs_Release(DispSVGPathSegLinetoHorizontalAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGPathSegLinetoHorizontalAbs_GetTypeInfoCount(DispSVGPathSegLinetoHorizontalAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGPathSegLinetoHorizontalAbs_GetTypeInfo(DispSVGPathSegLinetoHorizontalAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGPathSegLinetoHorizontalAbs_GetIDsOfNames(DispSVGPathSegLinetoHorizontalAbs* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGPathSegLinetoHorizontalAbs_Invoke(DispSVGPathSegLinetoHorizontalAbs* 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  /* __DispSVGPathSegLinetoHorizontalAbs_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGPathSegLinetoHorizontalAbs coclass
 */

DEFINE_GUID(CLSID_SVGPathSegLinetoHorizontalAbs, 0x305105c7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105c7-98b5-11cf-bb82-00aa00bdce0b") SVGPathSegLinetoHorizontalAbs;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGPathSegLinetoHorizontalAbs, 0x305105c7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGPathSegLinetoHorizontalAbs;
/*****************************************************************************
 * DispSVGPathSegLinetoHorizontalRel dispinterface
 */
#ifndef __DispSVGPathSegLinetoHorizontalRel_DISPINTERFACE_DEFINED__
#define __DispSVGPathSegLinetoHorizontalRel_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGPathSegLinetoHorizontalRel, 0x30590020, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590020-98b5-11cf-bb82-00aa00bdce0b")
DispSVGPathSegLinetoHorizontalRel : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGPathSegLinetoHorizontalRel, 0x30590020, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGPathSegLinetoHorizontalRelVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGPathSegLinetoHorizontalRel* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGPathSegLinetoHorizontalRel* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGPathSegLinetoHorizontalRel* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGPathSegLinetoHorizontalRel* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGPathSegLinetoHorizontalRel* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGPathSegLinetoHorizontalRel* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGPathSegLinetoHorizontalRel* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGPathSegLinetoHorizontalRelVtbl;
interface DispSVGPathSegLinetoHorizontalRel {
    CONST_VTBL DispSVGPathSegLinetoHorizontalRelVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGPathSegLinetoHorizontalRel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGPathSegLinetoHorizontalRel_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGPathSegLinetoHorizontalRel_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGPathSegLinetoHorizontalRel_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGPathSegLinetoHorizontalRel_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGPathSegLinetoHorizontalRel_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGPathSegLinetoHorizontalRel_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 DispSVGPathSegLinetoHorizontalRel_QueryInterface(DispSVGPathSegLinetoHorizontalRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGPathSegLinetoHorizontalRel_AddRef(DispSVGPathSegLinetoHorizontalRel* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGPathSegLinetoHorizontalRel_Release(DispSVGPathSegLinetoHorizontalRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGPathSegLinetoHorizontalRel_GetTypeInfoCount(DispSVGPathSegLinetoHorizontalRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGPathSegLinetoHorizontalRel_GetTypeInfo(DispSVGPathSegLinetoHorizontalRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGPathSegLinetoHorizontalRel_GetIDsOfNames(DispSVGPathSegLinetoHorizontalRel* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGPathSegLinetoHorizontalRel_Invoke(DispSVGPathSegLinetoHorizontalRel* 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  /* __DispSVGPathSegLinetoHorizontalRel_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGPathSegLinetoHorizontalRel coclass
 */

DEFINE_GUID(CLSID_SVGPathSegLinetoHorizontalRel, 0x305105c8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105c8-98b5-11cf-bb82-00aa00bdce0b") SVGPathSegLinetoHorizontalRel;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGPathSegLinetoHorizontalRel, 0x305105c8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGPathSegLinetoHorizontalRel;
/*****************************************************************************
 * DispSVGPathSegLinetoVerticalAbs dispinterface
 */
#ifndef __DispSVGPathSegLinetoVerticalAbs_DISPINTERFACE_DEFINED__
#define __DispSVGPathSegLinetoVerticalAbs_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGPathSegLinetoVerticalAbs, 0x30590022, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590022-98b5-11cf-bb82-00aa00bdce0b")
DispSVGPathSegLinetoVerticalAbs : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGPathSegLinetoVerticalAbs, 0x30590022, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGPathSegLinetoVerticalAbsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGPathSegLinetoVerticalAbs* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGPathSegLinetoVerticalAbs* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGPathSegLinetoVerticalAbs* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGPathSegLinetoVerticalAbs* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGPathSegLinetoVerticalAbs* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGPathSegLinetoVerticalAbs* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGPathSegLinetoVerticalAbs* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGPathSegLinetoVerticalAbsVtbl;
interface DispSVGPathSegLinetoVerticalAbs {
    CONST_VTBL DispSVGPathSegLinetoVerticalAbsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGPathSegLinetoVerticalAbs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGPathSegLinetoVerticalAbs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGPathSegLinetoVerticalAbs_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGPathSegLinetoVerticalAbs_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGPathSegLinetoVerticalAbs_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGPathSegLinetoVerticalAbs_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGPathSegLinetoVerticalAbs_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 DispSVGPathSegLinetoVerticalAbs_QueryInterface(DispSVGPathSegLinetoVerticalAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGPathSegLinetoVerticalAbs_AddRef(DispSVGPathSegLinetoVerticalAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGPathSegLinetoVerticalAbs_Release(DispSVGPathSegLinetoVerticalAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGPathSegLinetoVerticalAbs_GetTypeInfoCount(DispSVGPathSegLinetoVerticalAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGPathSegLinetoVerticalAbs_GetTypeInfo(DispSVGPathSegLinetoVerticalAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGPathSegLinetoVerticalAbs_GetIDsOfNames(DispSVGPathSegLinetoVerticalAbs* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGPathSegLinetoVerticalAbs_Invoke(DispSVGPathSegLinetoVerticalAbs* 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  /* __DispSVGPathSegLinetoVerticalAbs_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGPathSegLinetoVerticalAbs coclass
 */

DEFINE_GUID(CLSID_SVGPathSegLinetoVerticalAbs, 0x305105ca, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105ca-98b5-11cf-bb82-00aa00bdce0b") SVGPathSegLinetoVerticalAbs;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGPathSegLinetoVerticalAbs, 0x305105ca, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGPathSegLinetoVerticalAbs;
/*****************************************************************************
 * DispSVGPathSegLinetoVerticalRel dispinterface
 */
#ifndef __DispSVGPathSegLinetoVerticalRel_DISPINTERFACE_DEFINED__
#define __DispSVGPathSegLinetoVerticalRel_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGPathSegLinetoVerticalRel, 0x30590023, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590023-98b5-11cf-bb82-00aa00bdce0b")
DispSVGPathSegLinetoVerticalRel : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGPathSegLinetoVerticalRel, 0x30590023, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGPathSegLinetoVerticalRelVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGPathSegLinetoVerticalRel* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGPathSegLinetoVerticalRel* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGPathSegLinetoVerticalRel* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGPathSegLinetoVerticalRel* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGPathSegLinetoVerticalRel* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGPathSegLinetoVerticalRel* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGPathSegLinetoVerticalRel* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGPathSegLinetoVerticalRelVtbl;
interface DispSVGPathSegLinetoVerticalRel {
    CONST_VTBL DispSVGPathSegLinetoVerticalRelVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGPathSegLinetoVerticalRel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGPathSegLinetoVerticalRel_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGPathSegLinetoVerticalRel_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGPathSegLinetoVerticalRel_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGPathSegLinetoVerticalRel_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGPathSegLinetoVerticalRel_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGPathSegLinetoVerticalRel_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 DispSVGPathSegLinetoVerticalRel_QueryInterface(DispSVGPathSegLinetoVerticalRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGPathSegLinetoVerticalRel_AddRef(DispSVGPathSegLinetoVerticalRel* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGPathSegLinetoVerticalRel_Release(DispSVGPathSegLinetoVerticalRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGPathSegLinetoVerticalRel_GetTypeInfoCount(DispSVGPathSegLinetoVerticalRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGPathSegLinetoVerticalRel_GetTypeInfo(DispSVGPathSegLinetoVerticalRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGPathSegLinetoVerticalRel_GetIDsOfNames(DispSVGPathSegLinetoVerticalRel* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGPathSegLinetoVerticalRel_Invoke(DispSVGPathSegLinetoVerticalRel* 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  /* __DispSVGPathSegLinetoVerticalRel_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGPathSegLinetoVerticalRel coclass
 */

DEFINE_GUID(CLSID_SVGPathSegLinetoVerticalRel, 0x305105cb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105cb-98b5-11cf-bb82-00aa00bdce0b") SVGPathSegLinetoVerticalRel;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGPathSegLinetoVerticalRel, 0x305105cb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGPathSegLinetoVerticalRel;
#ifndef __ISVGPathSeg_FWD_DEFINED__
#define __ISVGPathSeg_FWD_DEFINED__
typedef interface ISVGPathSeg ISVGPathSeg;
#endif

/*****************************************************************************
 * ISVGPathSegList interface
 */
#ifndef __ISVGPathSegList_INTERFACE_DEFINED__
#define __ISVGPathSegList_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGPathSegList, 0x30510510, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510510-98b5-11cf-bb82-00aa00bdce0b")
ISVGPathSegList : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_numberOfItems(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_numberOfItems(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE clear(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE initialize(
        ISVGPathSeg *newItem,
        ISVGPathSeg **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE getItem(
        LONG index,
        ISVGPathSeg **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE insertItemBefore(
        ISVGPathSeg *newItem,
        LONG index,
        ISVGPathSeg **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE replaceItem(
        ISVGPathSeg *newItem,
        LONG index,
        ISVGPathSeg **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeItem(
        LONG index,
        ISVGPathSeg **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE appendItem(
        ISVGPathSeg *newItem,
        ISVGPathSeg **ppResult) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGPathSegList, 0x30510510, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGPathSegListVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGPathSegList* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGPathSegList* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGPathSegList* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGPathSegList* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGPathSegList* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGPathSegList* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGPathSegList* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGPathSegList methods ***/
    HRESULT (STDMETHODCALLTYPE *put_numberOfItems)(
        ISVGPathSegList* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_numberOfItems)(
        ISVGPathSegList* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *clear)(
        ISVGPathSegList* This);

    HRESULT (STDMETHODCALLTYPE *initialize)(
        ISVGPathSegList* This,
        ISVGPathSeg *newItem,
        ISVGPathSeg **ppResult);

    HRESULT (STDMETHODCALLTYPE *getItem)(
        ISVGPathSegList* This,
        LONG index,
        ISVGPathSeg **ppResult);

    HRESULT (STDMETHODCALLTYPE *insertItemBefore)(
        ISVGPathSegList* This,
        ISVGPathSeg *newItem,
        LONG index,
        ISVGPathSeg **ppResult);

    HRESULT (STDMETHODCALLTYPE *replaceItem)(
        ISVGPathSegList* This,
        ISVGPathSeg *newItem,
        LONG index,
        ISVGPathSeg **ppResult);

    HRESULT (STDMETHODCALLTYPE *removeItem)(
        ISVGPathSegList* This,
        LONG index,
        ISVGPathSeg **ppResult);

    HRESULT (STDMETHODCALLTYPE *appendItem)(
        ISVGPathSegList* This,
        ISVGPathSeg *newItem,
        ISVGPathSeg **ppResult);

    END_INTERFACE
} ISVGPathSegListVtbl;
interface ISVGPathSegList {
    CONST_VTBL ISVGPathSegListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGPathSegList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGPathSegList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGPathSegList_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGPathSegList_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGPathSegList_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGPathSegList_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGPathSegList_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGPathSegList methods ***/
#define ISVGPathSegList_put_numberOfItems(This,v) (This)->lpVtbl->put_numberOfItems(This,v)
#define ISVGPathSegList_get_numberOfItems(This,p) (This)->lpVtbl->get_numberOfItems(This,p)
#define ISVGPathSegList_clear(This) (This)->lpVtbl->clear(This)
#define ISVGPathSegList_initialize(This,newItem,ppResult) (This)->lpVtbl->initialize(This,newItem,ppResult)
#define ISVGPathSegList_getItem(This,index,ppResult) (This)->lpVtbl->getItem(This,index,ppResult)
#define ISVGPathSegList_insertItemBefore(This,newItem,index,ppResult) (This)->lpVtbl->insertItemBefore(This,newItem,index,ppResult)
#define ISVGPathSegList_replaceItem(This,newItem,index,ppResult) (This)->lpVtbl->replaceItem(This,newItem,index,ppResult)
#define ISVGPathSegList_removeItem(This,index,ppResult) (This)->lpVtbl->removeItem(This,index,ppResult)
#define ISVGPathSegList_appendItem(This,newItem,ppResult) (This)->lpVtbl->appendItem(This,newItem,ppResult)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGPathSegList_QueryInterface(ISVGPathSegList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGPathSegList_AddRef(ISVGPathSegList* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGPathSegList_Release(ISVGPathSegList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGPathSegList_GetTypeInfoCount(ISVGPathSegList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGPathSegList_GetTypeInfo(ISVGPathSegList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGPathSegList_GetIDsOfNames(ISVGPathSegList* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGPathSegList_Invoke(ISVGPathSegList* 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);
}
/*** ISVGPathSegList methods ***/
static FORCEINLINE HRESULT ISVGPathSegList_put_numberOfItems(ISVGPathSegList* This,LONG v) {
    return This->lpVtbl->put_numberOfItems(This,v);
}
static FORCEINLINE HRESULT ISVGPathSegList_get_numberOfItems(ISVGPathSegList* This,LONG *p) {
    return This->lpVtbl->get_numberOfItems(This,p);
}
static FORCEINLINE HRESULT ISVGPathSegList_clear(ISVGPathSegList* This) {
    return This->lpVtbl->clear(This);
}
static FORCEINLINE HRESULT ISVGPathSegList_initialize(ISVGPathSegList* This,ISVGPathSeg *newItem,ISVGPathSeg **ppResult) {
    return This->lpVtbl->initialize(This,newItem,ppResult);
}
static FORCEINLINE HRESULT ISVGPathSegList_getItem(ISVGPathSegList* This,LONG index,ISVGPathSeg **ppResult) {
    return This->lpVtbl->getItem(This,index,ppResult);
}
static FORCEINLINE HRESULT ISVGPathSegList_insertItemBefore(ISVGPathSegList* This,ISVGPathSeg *newItem,LONG index,ISVGPathSeg **ppResult) {
    return This->lpVtbl->insertItemBefore(This,newItem,index,ppResult);
}
static FORCEINLINE HRESULT ISVGPathSegList_replaceItem(ISVGPathSegList* This,ISVGPathSeg *newItem,LONG index,ISVGPathSeg **ppResult) {
    return This->lpVtbl->replaceItem(This,newItem,index,ppResult);
}
static FORCEINLINE HRESULT ISVGPathSegList_removeItem(ISVGPathSegList* This,LONG index,ISVGPathSeg **ppResult) {
    return This->lpVtbl->removeItem(This,index,ppResult);
}
static FORCEINLINE HRESULT ISVGPathSegList_appendItem(ISVGPathSegList* This,ISVGPathSeg *newItem,ISVGPathSeg **ppResult) {
    return This->lpVtbl->appendItem(This,newItem,ppResult);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGPathSegList_put_numberOfItems_Proxy(
    ISVGPathSegList* This,
    LONG v);
void __RPC_STUB ISVGPathSegList_put_numberOfItems_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegList_get_numberOfItems_Proxy(
    ISVGPathSegList* This,
    LONG *p);
void __RPC_STUB ISVGPathSegList_get_numberOfItems_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegList_clear_Proxy(
    ISVGPathSegList* This);
void __RPC_STUB ISVGPathSegList_clear_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegList_initialize_Proxy(
    ISVGPathSegList* This,
    ISVGPathSeg *newItem,
    ISVGPathSeg **ppResult);
void __RPC_STUB ISVGPathSegList_initialize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegList_getItem_Proxy(
    ISVGPathSegList* This,
    LONG index,
    ISVGPathSeg **ppResult);
void __RPC_STUB ISVGPathSegList_getItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegList_insertItemBefore_Proxy(
    ISVGPathSegList* This,
    ISVGPathSeg *newItem,
    LONG index,
    ISVGPathSeg **ppResult);
void __RPC_STUB ISVGPathSegList_insertItemBefore_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegList_replaceItem_Proxy(
    ISVGPathSegList* This,
    ISVGPathSeg *newItem,
    LONG index,
    ISVGPathSeg **ppResult);
void __RPC_STUB ISVGPathSegList_replaceItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegList_removeItem_Proxy(
    ISVGPathSegList* This,
    LONG index,
    ISVGPathSeg **ppResult);
void __RPC_STUB ISVGPathSegList_removeItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathSegList_appendItem_Proxy(
    ISVGPathSegList* This,
    ISVGPathSeg *newItem,
    ISVGPathSeg **ppResult);
void __RPC_STUB ISVGPathSegList_appendItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGPathSegList_INTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGPathSegList coclass
 */

DEFINE_GUID(CLSID_SVGPathSegList, 0x305105b4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105b4-98b5-11cf-bb82-00aa00bdce0b") SVGPathSegList;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGPathSegList, 0x305105b4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGPathSegList;
#ifndef __ISVGMatrix_FWD_DEFINED__
#define __ISVGMatrix_FWD_DEFINED__
typedef interface ISVGMatrix ISVGMatrix;
#endif

/*****************************************************************************
 * ISVGPoint interface
 */
#ifndef __ISVGPoint_INTERFACE_DEFINED__
#define __ISVGPoint_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGPoint, 0x305104f4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104f4-98b5-11cf-bb82-00aa00bdce0b")
ISVGPoint : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_x(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_y(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE matrixTransform(
        ISVGMatrix *pMatrix,
        ISVGPoint **ppResult) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGPoint, 0x305104f4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGPointVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGPoint* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGPoint* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGPoint* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGPoint* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGPoint* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGPoint* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGPoint* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGPoint methods ***/
    HRESULT (STDMETHODCALLTYPE *put_x)(
        ISVGPoint* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_x)(
        ISVGPoint* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_y)(
        ISVGPoint* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_y)(
        ISVGPoint* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *matrixTransform)(
        ISVGPoint* This,
        ISVGMatrix *pMatrix,
        ISVGPoint **ppResult);

    END_INTERFACE
} ISVGPointVtbl;
interface ISVGPoint {
    CONST_VTBL ISVGPointVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGPoint_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGPoint_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGPoint_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGPoint_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGPoint_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGPoint_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGPoint_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGPoint methods ***/
#define ISVGPoint_put_x(This,v) (This)->lpVtbl->put_x(This,v)
#define ISVGPoint_get_x(This,p) (This)->lpVtbl->get_x(This,p)
#define ISVGPoint_put_y(This,v) (This)->lpVtbl->put_y(This,v)
#define ISVGPoint_get_y(This,p) (This)->lpVtbl->get_y(This,p)
#define ISVGPoint_matrixTransform(This,pMatrix,ppResult) (This)->lpVtbl->matrixTransform(This,pMatrix,ppResult)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGPoint_QueryInterface(ISVGPoint* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGPoint_AddRef(ISVGPoint* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGPoint_Release(ISVGPoint* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGPoint_GetTypeInfoCount(ISVGPoint* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGPoint_GetTypeInfo(ISVGPoint* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGPoint_GetIDsOfNames(ISVGPoint* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGPoint_Invoke(ISVGPoint* 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);
}
/*** ISVGPoint methods ***/
static FORCEINLINE HRESULT ISVGPoint_put_x(ISVGPoint* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static FORCEINLINE HRESULT ISVGPoint_get_x(ISVGPoint* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static FORCEINLINE HRESULT ISVGPoint_put_y(ISVGPoint* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static FORCEINLINE HRESULT ISVGPoint_get_y(ISVGPoint* This,float *p) {
    return This->lpVtbl->get_y(This,p);
}
static FORCEINLINE HRESULT ISVGPoint_matrixTransform(ISVGPoint* This,ISVGMatrix *pMatrix,ISVGPoint **ppResult) {
    return This->lpVtbl->matrixTransform(This,pMatrix,ppResult);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGPoint_put_x_Proxy(
    ISVGPoint* This,
    float v);
void __RPC_STUB ISVGPoint_put_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPoint_get_x_Proxy(
    ISVGPoint* This,
    float *p);
void __RPC_STUB ISVGPoint_get_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPoint_put_y_Proxy(
    ISVGPoint* This,
    float v);
void __RPC_STUB ISVGPoint_put_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPoint_get_y_Proxy(
    ISVGPoint* This,
    float *p);
void __RPC_STUB ISVGPoint_get_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPoint_matrixTransform_Proxy(
    ISVGPoint* This,
    ISVGMatrix *pMatrix,
    ISVGPoint **ppResult);
void __RPC_STUB ISVGPoint_matrixTransform_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGPoint_INTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGPoint coclass
 */

DEFINE_GUID(CLSID_SVGPoint, 0x305105ba, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105ba-98b5-11cf-bb82-00aa00bdce0b") SVGPoint;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGPoint, 0x305105ba, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGPoint;
#ifndef __ISVGPoint_FWD_DEFINED__
#define __ISVGPoint_FWD_DEFINED__
typedef interface ISVGPoint ISVGPoint;
#endif

/*****************************************************************************
 * ISVGPointList interface
 */
#ifndef __ISVGPointList_INTERFACE_DEFINED__
#define __ISVGPointList_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGPointList, 0x305104f5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104f5-98b5-11cf-bb82-00aa00bdce0b")
ISVGPointList : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_numberOfItems(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_numberOfItems(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE clear(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE initialize(
        ISVGPoint *pNewItem,
        ISVGPoint **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE getItem(
        LONG index,
        ISVGPoint **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE insertItemBefore(
        ISVGPoint *pNewItem,
        LONG index,
        ISVGPoint **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE replaceItem(
        ISVGPoint *pNewItem,
        LONG index,
        ISVGPoint **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeItem(
        LONG index,
        ISVGPoint **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE appendItem(
        ISVGPoint *pNewItem,
        ISVGPoint **ppResult) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGPointList, 0x305104f5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGPointListVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGPointList* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGPointList* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGPointList* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGPointList* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGPointList* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGPointList* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGPointList* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGPointList methods ***/
    HRESULT (STDMETHODCALLTYPE *put_numberOfItems)(
        ISVGPointList* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_numberOfItems)(
        ISVGPointList* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *clear)(
        ISVGPointList* This);

    HRESULT (STDMETHODCALLTYPE *initialize)(
        ISVGPointList* This,
        ISVGPoint *pNewItem,
        ISVGPoint **ppResult);

    HRESULT (STDMETHODCALLTYPE *getItem)(
        ISVGPointList* This,
        LONG index,
        ISVGPoint **ppResult);

    HRESULT (STDMETHODCALLTYPE *insertItemBefore)(
        ISVGPointList* This,
        ISVGPoint *pNewItem,
        LONG index,
        ISVGPoint **ppResult);

    HRESULT (STDMETHODCALLTYPE *replaceItem)(
        ISVGPointList* This,
        ISVGPoint *pNewItem,
        LONG index,
        ISVGPoint **ppResult);

    HRESULT (STDMETHODCALLTYPE *removeItem)(
        ISVGPointList* This,
        LONG index,
        ISVGPoint **ppResult);

    HRESULT (STDMETHODCALLTYPE *appendItem)(
        ISVGPointList* This,
        ISVGPoint *pNewItem,
        ISVGPoint **ppResult);

    END_INTERFACE
} ISVGPointListVtbl;
interface ISVGPointList {
    CONST_VTBL ISVGPointListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGPointList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGPointList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGPointList_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGPointList_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGPointList_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGPointList_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGPointList_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGPointList methods ***/
#define ISVGPointList_put_numberOfItems(This,v) (This)->lpVtbl->put_numberOfItems(This,v)
#define ISVGPointList_get_numberOfItems(This,p) (This)->lpVtbl->get_numberOfItems(This,p)
#define ISVGPointList_clear(This) (This)->lpVtbl->clear(This)
#define ISVGPointList_initialize(This,pNewItem,ppResult) (This)->lpVtbl->initialize(This,pNewItem,ppResult)
#define ISVGPointList_getItem(This,index,ppResult) (This)->lpVtbl->getItem(This,index,ppResult)
#define ISVGPointList_insertItemBefore(This,pNewItem,index,ppResult) (This)->lpVtbl->insertItemBefore(This,pNewItem,index,ppResult)
#define ISVGPointList_replaceItem(This,pNewItem,index,ppResult) (This)->lpVtbl->replaceItem(This,pNewItem,index,ppResult)
#define ISVGPointList_removeItem(This,index,ppResult) (This)->lpVtbl->removeItem(This,index,ppResult)
#define ISVGPointList_appendItem(This,pNewItem,ppResult) (This)->lpVtbl->appendItem(This,pNewItem,ppResult)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGPointList_QueryInterface(ISVGPointList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGPointList_AddRef(ISVGPointList* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGPointList_Release(ISVGPointList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGPointList_GetTypeInfoCount(ISVGPointList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGPointList_GetTypeInfo(ISVGPointList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGPointList_GetIDsOfNames(ISVGPointList* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGPointList_Invoke(ISVGPointList* 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);
}
/*** ISVGPointList methods ***/
static FORCEINLINE HRESULT ISVGPointList_put_numberOfItems(ISVGPointList* This,LONG v) {
    return This->lpVtbl->put_numberOfItems(This,v);
}
static FORCEINLINE HRESULT ISVGPointList_get_numberOfItems(ISVGPointList* This,LONG *p) {
    return This->lpVtbl->get_numberOfItems(This,p);
}
static FORCEINLINE HRESULT ISVGPointList_clear(ISVGPointList* This) {
    return This->lpVtbl->clear(This);
}
static FORCEINLINE HRESULT ISVGPointList_initialize(ISVGPointList* This,ISVGPoint *pNewItem,ISVGPoint **ppResult) {
    return This->lpVtbl->initialize(This,pNewItem,ppResult);
}
static FORCEINLINE HRESULT ISVGPointList_getItem(ISVGPointList* This,LONG index,ISVGPoint **ppResult) {
    return This->lpVtbl->getItem(This,index,ppResult);
}
static FORCEINLINE HRESULT ISVGPointList_insertItemBefore(ISVGPointList* This,ISVGPoint *pNewItem,LONG index,ISVGPoint **ppResult) {
    return This->lpVtbl->insertItemBefore(This,pNewItem,index,ppResult);
}
static FORCEINLINE HRESULT ISVGPointList_replaceItem(ISVGPointList* This,ISVGPoint *pNewItem,LONG index,ISVGPoint **ppResult) {
    return This->lpVtbl->replaceItem(This,pNewItem,index,ppResult);
}
static FORCEINLINE HRESULT ISVGPointList_removeItem(ISVGPointList* This,LONG index,ISVGPoint **ppResult) {
    return This->lpVtbl->removeItem(This,index,ppResult);
}
static FORCEINLINE HRESULT ISVGPointList_appendItem(ISVGPointList* This,ISVGPoint *pNewItem,ISVGPoint **ppResult) {
    return This->lpVtbl->appendItem(This,pNewItem,ppResult);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGPointList_put_numberOfItems_Proxy(
    ISVGPointList* This,
    LONG v);
void __RPC_STUB ISVGPointList_put_numberOfItems_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPointList_get_numberOfItems_Proxy(
    ISVGPointList* This,
    LONG *p);
void __RPC_STUB ISVGPointList_get_numberOfItems_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPointList_clear_Proxy(
    ISVGPointList* This);
void __RPC_STUB ISVGPointList_clear_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPointList_initialize_Proxy(
    ISVGPointList* This,
    ISVGPoint *pNewItem,
    ISVGPoint **ppResult);
void __RPC_STUB ISVGPointList_initialize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPointList_getItem_Proxy(
    ISVGPointList* This,
    LONG index,
    ISVGPoint **ppResult);
void __RPC_STUB ISVGPointList_getItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPointList_insertItemBefore_Proxy(
    ISVGPointList* This,
    ISVGPoint *pNewItem,
    LONG index,
    ISVGPoint **ppResult);
void __RPC_STUB ISVGPointList_insertItemBefore_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPointList_replaceItem_Proxy(
    ISVGPointList* This,
    ISVGPoint *pNewItem,
    LONG index,
    ISVGPoint **ppResult);
void __RPC_STUB ISVGPointList_replaceItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPointList_removeItem_Proxy(
    ISVGPointList* This,
    LONG index,
    ISVGPoint **ppResult);
void __RPC_STUB ISVGPointList_removeItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPointList_appendItem_Proxy(
    ISVGPointList* This,
    ISVGPoint *pNewItem,
    ISVGPoint **ppResult);
void __RPC_STUB ISVGPointList_appendItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGPointList_INTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGPointList coclass
 */

DEFINE_GUID(CLSID_SVGPointList, 0x305105b9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105b9-98b5-11cf-bb82-00aa00bdce0b") SVGPointList;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGPointList, 0x305105b9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGPointList;
/*****************************************************************************
 * ISVGRect interface
 */
#ifndef __ISVGRect_INTERFACE_DEFINED__
#define __ISVGRect_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGRect, 0x305104d7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104d7-98b5-11cf-bb82-00aa00bdce0b")
ISVGRect : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_x(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_y(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_width(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_width(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_height(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_height(
        float *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGRect, 0x305104d7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGRectVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGRect* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGRect* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGRect* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGRect* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGRect* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGRect* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGRect* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGRect methods ***/
    HRESULT (STDMETHODCALLTYPE *put_x)(
        ISVGRect* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_x)(
        ISVGRect* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_y)(
        ISVGRect* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_y)(
        ISVGRect* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_width)(
        ISVGRect* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_width)(
        ISVGRect* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_height)(
        ISVGRect* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_height)(
        ISVGRect* This,
        float *p);

    END_INTERFACE
} ISVGRectVtbl;
interface ISVGRect {
    CONST_VTBL ISVGRectVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGRect_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGRect_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGRect_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGRect_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGRect_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGRect_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGRect_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGRect methods ***/
#define ISVGRect_put_x(This,v) (This)->lpVtbl->put_x(This,v)
#define ISVGRect_get_x(This,p) (This)->lpVtbl->get_x(This,p)
#define ISVGRect_put_y(This,v) (This)->lpVtbl->put_y(This,v)
#define ISVGRect_get_y(This,p) (This)->lpVtbl->get_y(This,p)
#define ISVGRect_put_width(This,v) (This)->lpVtbl->put_width(This,v)
#define ISVGRect_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#define ISVGRect_put_height(This,v) (This)->lpVtbl->put_height(This,v)
#define ISVGRect_get_height(This,p) (This)->lpVtbl->get_height(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGRect_QueryInterface(ISVGRect* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGRect_AddRef(ISVGRect* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGRect_Release(ISVGRect* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGRect_GetTypeInfoCount(ISVGRect* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGRect_GetTypeInfo(ISVGRect* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGRect_GetIDsOfNames(ISVGRect* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGRect_Invoke(ISVGRect* 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);
}
/*** ISVGRect methods ***/
static FORCEINLINE HRESULT ISVGRect_put_x(ISVGRect* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static FORCEINLINE HRESULT ISVGRect_get_x(ISVGRect* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static FORCEINLINE HRESULT ISVGRect_put_y(ISVGRect* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static FORCEINLINE HRESULT ISVGRect_get_y(ISVGRect* This,float *p) {
    return This->lpVtbl->get_y(This,p);
}
static FORCEINLINE HRESULT ISVGRect_put_width(ISVGRect* This,float v) {
    return This->lpVtbl->put_width(This,v);
}
static FORCEINLINE HRESULT ISVGRect_get_width(ISVGRect* This,float *p) {
    return This->lpVtbl->get_width(This,p);
}
static FORCEINLINE HRESULT ISVGRect_put_height(ISVGRect* This,float v) {
    return This->lpVtbl->put_height(This,v);
}
static FORCEINLINE HRESULT ISVGRect_get_height(ISVGRect* This,float *p) {
    return This->lpVtbl->get_height(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGRect_put_x_Proxy(
    ISVGRect* This,
    float v);
void __RPC_STUB ISVGRect_put_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGRect_get_x_Proxy(
    ISVGRect* This,
    float *p);
void __RPC_STUB ISVGRect_get_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGRect_put_y_Proxy(
    ISVGRect* This,
    float v);
void __RPC_STUB ISVGRect_put_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGRect_get_y_Proxy(
    ISVGRect* This,
    float *p);
void __RPC_STUB ISVGRect_get_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGRect_put_width_Proxy(
    ISVGRect* This,
    float v);
void __RPC_STUB ISVGRect_put_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGRect_get_width_Proxy(
    ISVGRect* This,
    float *p);
void __RPC_STUB ISVGRect_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGRect_put_height_Proxy(
    ISVGRect* This,
    float v);
void __RPC_STUB ISVGRect_put_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGRect_get_height_Proxy(
    ISVGRect* This,
    float *p);
void __RPC_STUB ISVGRect_get_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGRect_INTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGRect coclass
 */

DEFINE_GUID(CLSID_SVGRect, 0x30510583, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510583-98b5-11cf-bb82-00aa00bdce0b") SVGRect;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGRect, 0x30510583, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGRect;
/*****************************************************************************
 * ISVGStringList interface
 */
#ifndef __ISVGStringList_INTERFACE_DEFINED__
#define __ISVGStringList_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGStringList, 0x305104c8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104c8-98b5-11cf-bb82-00aa00bdce0b")
ISVGStringList : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_numberOfItems(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_numberOfItems(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE clear(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE initialize(
        BSTR newItem,
        BSTR *ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE getItem(
        LONG index,
        BSTR *ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE insertItemBefore(
        BSTR newItem,
        LONG index,
        BSTR *ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE replaceItem(
        BSTR newItem,
        LONG index,
        BSTR *ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeItem(
        LONG index,
        BSTR *ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE appendItem(
        BSTR newItem,
        BSTR *ppResult) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGStringList, 0x305104c8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGStringListVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGStringList* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGStringList* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGStringList* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGStringList* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGStringList* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGStringList* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGStringList* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGStringList methods ***/
    HRESULT (STDMETHODCALLTYPE *put_numberOfItems)(
        ISVGStringList* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_numberOfItems)(
        ISVGStringList* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *clear)(
        ISVGStringList* This);

    HRESULT (STDMETHODCALLTYPE *initialize)(
        ISVGStringList* This,
        BSTR newItem,
        BSTR *ppResult);

    HRESULT (STDMETHODCALLTYPE *getItem)(
        ISVGStringList* This,
        LONG index,
        BSTR *ppResult);

    HRESULT (STDMETHODCALLTYPE *insertItemBefore)(
        ISVGStringList* This,
        BSTR newItem,
        LONG index,
        BSTR *ppResult);

    HRESULT (STDMETHODCALLTYPE *replaceItem)(
        ISVGStringList* This,
        BSTR newItem,
        LONG index,
        BSTR *ppResult);

    HRESULT (STDMETHODCALLTYPE *removeItem)(
        ISVGStringList* This,
        LONG index,
        BSTR *ppResult);

    HRESULT (STDMETHODCALLTYPE *appendItem)(
        ISVGStringList* This,
        BSTR newItem,
        BSTR *ppResult);

    END_INTERFACE
} ISVGStringListVtbl;
interface ISVGStringList {
    CONST_VTBL ISVGStringListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGStringList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGStringList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGStringList_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGStringList_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGStringList_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGStringList_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGStringList_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGStringList methods ***/
#define ISVGStringList_put_numberOfItems(This,v) (This)->lpVtbl->put_numberOfItems(This,v)
#define ISVGStringList_get_numberOfItems(This,p) (This)->lpVtbl->get_numberOfItems(This,p)
#define ISVGStringList_clear(This) (This)->lpVtbl->clear(This)
#define ISVGStringList_initialize(This,newItem,ppResult) (This)->lpVtbl->initialize(This,newItem,ppResult)
#define ISVGStringList_getItem(This,index,ppResult) (This)->lpVtbl->getItem(This,index,ppResult)
#define ISVGStringList_insertItemBefore(This,newItem,index,ppResult) (This)->lpVtbl->insertItemBefore(This,newItem,index,ppResult)
#define ISVGStringList_replaceItem(This,newItem,index,ppResult) (This)->lpVtbl->replaceItem(This,newItem,index,ppResult)
#define ISVGStringList_removeItem(This,index,ppResult) (This)->lpVtbl->removeItem(This,index,ppResult)
#define ISVGStringList_appendItem(This,newItem,ppResult) (This)->lpVtbl->appendItem(This,newItem,ppResult)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGStringList_QueryInterface(ISVGStringList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGStringList_AddRef(ISVGStringList* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGStringList_Release(ISVGStringList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGStringList_GetTypeInfoCount(ISVGStringList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGStringList_GetTypeInfo(ISVGStringList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGStringList_GetIDsOfNames(ISVGStringList* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGStringList_Invoke(ISVGStringList* 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);
}
/*** ISVGStringList methods ***/
static FORCEINLINE HRESULT ISVGStringList_put_numberOfItems(ISVGStringList* This,LONG v) {
    return This->lpVtbl->put_numberOfItems(This,v);
}
static FORCEINLINE HRESULT ISVGStringList_get_numberOfItems(ISVGStringList* This,LONG *p) {
    return This->lpVtbl->get_numberOfItems(This,p);
}
static FORCEINLINE HRESULT ISVGStringList_clear(ISVGStringList* This) {
    return This->lpVtbl->clear(This);
}
static FORCEINLINE HRESULT ISVGStringList_initialize(ISVGStringList* This,BSTR newItem,BSTR *ppResult) {
    return This->lpVtbl->initialize(This,newItem,ppResult);
}
static FORCEINLINE HRESULT ISVGStringList_getItem(ISVGStringList* This,LONG index,BSTR *ppResult) {
    return This->lpVtbl->getItem(This,index,ppResult);
}
static FORCEINLINE HRESULT ISVGStringList_insertItemBefore(ISVGStringList* This,BSTR newItem,LONG index,BSTR *ppResult) {
    return This->lpVtbl->insertItemBefore(This,newItem,index,ppResult);
}
static FORCEINLINE HRESULT ISVGStringList_replaceItem(ISVGStringList* This,BSTR newItem,LONG index,BSTR *ppResult) {
    return This->lpVtbl->replaceItem(This,newItem,index,ppResult);
}
static FORCEINLINE HRESULT ISVGStringList_removeItem(ISVGStringList* This,LONG index,BSTR *ppResult) {
    return This->lpVtbl->removeItem(This,index,ppResult);
}
static FORCEINLINE HRESULT ISVGStringList_appendItem(ISVGStringList* This,BSTR newItem,BSTR *ppResult) {
    return This->lpVtbl->appendItem(This,newItem,ppResult);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGStringList_put_numberOfItems_Proxy(
    ISVGStringList* This,
    LONG v);
void __RPC_STUB ISVGStringList_put_numberOfItems_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGStringList_get_numberOfItems_Proxy(
    ISVGStringList* This,
    LONG *p);
void __RPC_STUB ISVGStringList_get_numberOfItems_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGStringList_clear_Proxy(
    ISVGStringList* This);
void __RPC_STUB ISVGStringList_clear_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGStringList_initialize_Proxy(
    ISVGStringList* This,
    BSTR newItem,
    BSTR *ppResult);
void __RPC_STUB ISVGStringList_initialize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGStringList_getItem_Proxy(
    ISVGStringList* This,
    LONG index,
    BSTR *ppResult);
void __RPC_STUB ISVGStringList_getItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGStringList_insertItemBefore_Proxy(
    ISVGStringList* This,
    BSTR newItem,
    LONG index,
    BSTR *ppResult);
void __RPC_STUB ISVGStringList_insertItemBefore_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGStringList_replaceItem_Proxy(
    ISVGStringList* This,
    BSTR newItem,
    LONG index,
    BSTR *ppResult);
void __RPC_STUB ISVGStringList_replaceItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGStringList_removeItem_Proxy(
    ISVGStringList* This,
    LONG index,
    BSTR *ppResult);
void __RPC_STUB ISVGStringList_removeItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGStringList_appendItem_Proxy(
    ISVGStringList* This,
    BSTR newItem,
    BSTR *ppResult);
void __RPC_STUB ISVGStringList_appendItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGStringList_INTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGStringList coclass
 */

DEFINE_GUID(CLSID_SVGStringList, 0x3051058d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3051058d-98b5-11cf-bb82-00aa00bdce0b") SVGStringList;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGStringList, 0x3051058d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGStringList;
/*****************************************************************************
 * ISVGViewSpec interface
 */
#ifndef __ISVGViewSpec_INTERFACE_DEFINED__
#define __ISVGViewSpec_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGViewSpec, 0x305104e2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104e2-98b5-11cf-bb82-00aa00bdce0b")
ISVGViewSpec : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGViewSpec, 0x305104e2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGViewSpecVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGViewSpec* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGViewSpec* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGViewSpec* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGViewSpec* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGViewSpec* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGViewSpec* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGViewSpec* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} ISVGViewSpecVtbl;
interface ISVGViewSpec {
    CONST_VTBL ISVGViewSpecVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGViewSpec_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGViewSpec_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGViewSpec_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGViewSpec_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGViewSpec_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGViewSpec_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGViewSpec_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 ISVGViewSpec_QueryInterface(ISVGViewSpec* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGViewSpec_AddRef(ISVGViewSpec* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGViewSpec_Release(ISVGViewSpec* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGViewSpec_GetTypeInfoCount(ISVGViewSpec* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGViewSpec_GetTypeInfo(ISVGViewSpec* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGViewSpec_GetIDsOfNames(ISVGViewSpec* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGViewSpec_Invoke(ISVGViewSpec* 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  /* __ISVGViewSpec_INTERFACE_DEFINED__ */

typedef enum _svgTransformType {
    SVG_TRANSFORM_UNKNOWN = 0,
    SVG_TRANSFORM_MATRIX = 1,
    SVG_TRANSFORM_TRANSLATE = 2,
    SVG_TRANSFORM_SCALE = 3,
    SVG_TRANSFORM_ROTATE = 4,
    SVG_TRANSFORM_SKEWX = 5,
    SVG_TRANSFORM_SKEWY = 6,
    svgTransformType_Max = 0x7fffffff
} svgTransformType;
#ifndef __ISVGMatrix_FWD_DEFINED__
#define __ISVGMatrix_FWD_DEFINED__
typedef interface ISVGMatrix ISVGMatrix;
#endif

/*****************************************************************************
 * ISVGTransform interface
 */
#ifndef __ISVGTransform_INTERFACE_DEFINED__
#define __ISVGTransform_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGTransform, 0x305104f7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104f7-98b5-11cf-bb82-00aa00bdce0b")
ISVGTransform : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_type(
        short v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_type(
        short *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_matrix(
        ISVGMatrix *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_matrix(
        ISVGMatrix **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_angle(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_angle(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE setMatrix(
        ISVGMatrix *matrix) = 0;

    virtual HRESULT STDMETHODCALLTYPE setTranslate(
        float tx,
        float ty) = 0;

    virtual HRESULT STDMETHODCALLTYPE setScale(
        float sx,
        float sy) = 0;

    virtual HRESULT STDMETHODCALLTYPE setRotate(
        float angle,
        float cx,
        float cy) = 0;

    virtual HRESULT STDMETHODCALLTYPE setSkewX(
        float angle) = 0;

    virtual HRESULT STDMETHODCALLTYPE setSkewY(
        float angle) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGTransform, 0x305104f7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGTransformVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGTransform* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGTransform* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGTransform* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGTransform* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGTransform* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGTransform* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGTransform* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGTransform methods ***/
    HRESULT (STDMETHODCALLTYPE *put_type)(
        ISVGTransform* This,
        short v);

    HRESULT (STDMETHODCALLTYPE *get_type)(
        ISVGTransform* This,
        short *p);

    HRESULT (STDMETHODCALLTYPE *putref_matrix)(
        ISVGTransform* This,
        ISVGMatrix *v);

    HRESULT (STDMETHODCALLTYPE *get_matrix)(
        ISVGTransform* This,
        ISVGMatrix **p);

    HRESULT (STDMETHODCALLTYPE *put_angle)(
        ISVGTransform* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_angle)(
        ISVGTransform* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *setMatrix)(
        ISVGTransform* This,
        ISVGMatrix *matrix);

    HRESULT (STDMETHODCALLTYPE *setTranslate)(
        ISVGTransform* This,
        float tx,
        float ty);

    HRESULT (STDMETHODCALLTYPE *setScale)(
        ISVGTransform* This,
        float sx,
        float sy);

    HRESULT (STDMETHODCALLTYPE *setRotate)(
        ISVGTransform* This,
        float angle,
        float cx,
        float cy);

    HRESULT (STDMETHODCALLTYPE *setSkewX)(
        ISVGTransform* This,
        float angle);

    HRESULT (STDMETHODCALLTYPE *setSkewY)(
        ISVGTransform* This,
        float angle);

    END_INTERFACE
} ISVGTransformVtbl;
interface ISVGTransform {
    CONST_VTBL ISVGTransformVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGTransform_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGTransform_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGTransform_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGTransform_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGTransform_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGTransform_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGTransform_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGTransform methods ***/
#define ISVGTransform_put_type(This,v) (This)->lpVtbl->put_type(This,v)
#define ISVGTransform_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#define ISVGTransform_putref_matrix(This,v) (This)->lpVtbl->putref_matrix(This,v)
#define ISVGTransform_get_matrix(This,p) (This)->lpVtbl->get_matrix(This,p)
#define ISVGTransform_put_angle(This,v) (This)->lpVtbl->put_angle(This,v)
#define ISVGTransform_get_angle(This,p) (This)->lpVtbl->get_angle(This,p)
#define ISVGTransform_setMatrix(This,matrix) (This)->lpVtbl->setMatrix(This,matrix)
#define ISVGTransform_setTranslate(This,tx,ty) (This)->lpVtbl->setTranslate(This,tx,ty)
#define ISVGTransform_setScale(This,sx,sy) (This)->lpVtbl->setScale(This,sx,sy)
#define ISVGTransform_setRotate(This,angle,cx,cy) (This)->lpVtbl->setRotate(This,angle,cx,cy)
#define ISVGTransform_setSkewX(This,angle) (This)->lpVtbl->setSkewX(This,angle)
#define ISVGTransform_setSkewY(This,angle) (This)->lpVtbl->setSkewY(This,angle)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGTransform_QueryInterface(ISVGTransform* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGTransform_AddRef(ISVGTransform* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGTransform_Release(ISVGTransform* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGTransform_GetTypeInfoCount(ISVGTransform* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGTransform_GetTypeInfo(ISVGTransform* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGTransform_GetIDsOfNames(ISVGTransform* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGTransform_Invoke(ISVGTransform* 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);
}
/*** ISVGTransform methods ***/
static FORCEINLINE HRESULT ISVGTransform_put_type(ISVGTransform* This,short v) {
    return This->lpVtbl->put_type(This,v);
}
static FORCEINLINE HRESULT ISVGTransform_get_type(ISVGTransform* This,short *p) {
    return This->lpVtbl->get_type(This,p);
}
static FORCEINLINE HRESULT ISVGTransform_putref_matrix(ISVGTransform* This,ISVGMatrix *v) {
    return This->lpVtbl->putref_matrix(This,v);
}
static FORCEINLINE HRESULT ISVGTransform_get_matrix(ISVGTransform* This,ISVGMatrix **p) {
    return This->lpVtbl->get_matrix(This,p);
}
static FORCEINLINE HRESULT ISVGTransform_put_angle(ISVGTransform* This,float v) {
    return This->lpVtbl->put_angle(This,v);
}
static FORCEINLINE HRESULT ISVGTransform_get_angle(ISVGTransform* This,float *p) {
    return This->lpVtbl->get_angle(This,p);
}
static FORCEINLINE HRESULT ISVGTransform_setMatrix(ISVGTransform* This,ISVGMatrix *matrix) {
    return This->lpVtbl->setMatrix(This,matrix);
}
static FORCEINLINE HRESULT ISVGTransform_setTranslate(ISVGTransform* This,float tx,float ty) {
    return This->lpVtbl->setTranslate(This,tx,ty);
}
static FORCEINLINE HRESULT ISVGTransform_setScale(ISVGTransform* This,float sx,float sy) {
    return This->lpVtbl->setScale(This,sx,sy);
}
static FORCEINLINE HRESULT ISVGTransform_setRotate(ISVGTransform* This,float angle,float cx,float cy) {
    return This->lpVtbl->setRotate(This,angle,cx,cy);
}
static FORCEINLINE HRESULT ISVGTransform_setSkewX(ISVGTransform* This,float angle) {
    return This->lpVtbl->setSkewX(This,angle);
}
static FORCEINLINE HRESULT ISVGTransform_setSkewY(ISVGTransform* This,float angle) {
    return This->lpVtbl->setSkewY(This,angle);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGTransform_put_type_Proxy(
    ISVGTransform* This,
    short v);
void __RPC_STUB ISVGTransform_put_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTransform_get_type_Proxy(
    ISVGTransform* This,
    short *p);
void __RPC_STUB ISVGTransform_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTransform_putref_matrix_Proxy(
    ISVGTransform* This,
    ISVGMatrix *v);
void __RPC_STUB ISVGTransform_putref_matrix_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTransform_get_matrix_Proxy(
    ISVGTransform* This,
    ISVGMatrix **p);
void __RPC_STUB ISVGTransform_get_matrix_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTransform_put_angle_Proxy(
    ISVGTransform* This,
    float v);
void __RPC_STUB ISVGTransform_put_angle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTransform_get_angle_Proxy(
    ISVGTransform* This,
    float *p);
void __RPC_STUB ISVGTransform_get_angle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTransform_setMatrix_Proxy(
    ISVGTransform* This,
    ISVGMatrix *matrix);
void __RPC_STUB ISVGTransform_setMatrix_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTransform_setTranslate_Proxy(
    ISVGTransform* This,
    float tx,
    float ty);
void __RPC_STUB ISVGTransform_setTranslate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTransform_setScale_Proxy(
    ISVGTransform* This,
    float sx,
    float sy);
void __RPC_STUB ISVGTransform_setScale_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTransform_setRotate_Proxy(
    ISVGTransform* This,
    float angle,
    float cx,
    float cy);
void __RPC_STUB ISVGTransform_setRotate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTransform_setSkewX_Proxy(
    ISVGTransform* This,
    float angle);
void __RPC_STUB ISVGTransform_setSkewX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTransform_setSkewY_Proxy(
    ISVGTransform* This,
    float angle);
void __RPC_STUB ISVGTransform_setSkewY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGTransform_INTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGTransform coclass
 */

DEFINE_GUID(CLSID_SVGTransform, 0x305105af, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105af-98b5-11cf-bb82-00aa00bdce0b") SVGTransform;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGTransform, 0x305105af, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGTransform;
#ifndef __IHTMLElement_FWD_DEFINED__
#define __IHTMLElement_FWD_DEFINED__
typedef interface IHTMLElement IHTMLElement;
#endif

/*****************************************************************************
 * ISVGSVGElement interface
 */
#ifndef __ISVGSVGElement_INTERFACE_DEFINED__
#define __ISVGSVGElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGSVGElement, 0x305104e7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104e7-98b5-11cf-bb82-00aa00bdce0b")
ISVGSVGElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_x(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_y(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_width(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_width(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_height(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_height(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_contentScriptType(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_contentScriptType(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_contentStyleType(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_contentStyleType(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_viewport(
        ISVGRect *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_viewport(
        ISVGRect **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_pixelUnitToMillimeterX(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pixelUnitToMillimeterX(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_pixelUnitToMillimeterY(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pixelUnitToMillimeterY(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_screenPixelToMillimeterX(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_screenPixelToMillimeterX(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_screenPixelToMillimeterY(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_screenPixelToMillimeterY(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_useCurrentView(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_useCurrentView(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_currentView(
        ISVGViewSpec *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_currentView(
        ISVGViewSpec **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_currentScale(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_currentScale(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_currentTranslate(
        ISVGPoint *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_currentTranslate(
        ISVGPoint **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE suspendRedraw(
        ULONG maxWaitMilliseconds,
        ULONG *pResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE unsuspendRedraw(
        ULONG suspendHandeID) = 0;

    virtual HRESULT STDMETHODCALLTYPE unsuspendRedrawAll(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE forceRedraw(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE pauseAnimations(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE unpauseAnimations(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE animationsPaused(
        VARIANT_BOOL *pResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE getCurrentTime(
        float *pResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE setCurrentTime(
        float seconds) = 0;

    virtual HRESULT STDMETHODCALLTYPE getIntersectionList(
        ISVGRect *rect,
        ISVGElement *referenceElement,
        VARIANT *pResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE getEnclosureList(
        ISVGRect *rect,
        ISVGElement *referenceElement,
        VARIANT *pResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE checkIntersection(
        ISVGElement *element,
        ISVGRect *rect,
        VARIANT_BOOL *pResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE checkEnclosure(
        ISVGElement *element,
        ISVGRect *rect,
        VARIANT_BOOL *pResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE deselectAll(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE createSVGNumber(
        ISVGNumber **pResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE createSVGLength(
        ISVGLength **pResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE createSVGAngle(
        ISVGAngle **pResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE createSVGPoint(
        ISVGPoint **pResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE createSVGMatrix(
        ISVGMatrix **pResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE createSVGRect(
        ISVGRect **pResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE createSVGTransform(
        ISVGTransform **pResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE createSVGTransformFromMatrix(
        ISVGMatrix *matrix,
        ISVGTransform **pResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE getElementById(
        BSTR elementId,
        IHTMLElement **pResult) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGSVGElement, 0x305104e7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGSVGElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGSVGElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGSVGElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGSVGElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGSVGElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGSVGElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGSVGElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGSVGElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGSVGElement methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_x)(
        ISVGSVGElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_x)(
        ISVGSVGElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_y)(
        ISVGSVGElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_y)(
        ISVGSVGElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_width)(
        ISVGSVGElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_width)(
        ISVGSVGElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_height)(
        ISVGSVGElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_height)(
        ISVGSVGElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *put_contentScriptType)(
        ISVGSVGElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_contentScriptType)(
        ISVGSVGElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_contentStyleType)(
        ISVGSVGElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_contentStyleType)(
        ISVGSVGElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *putref_viewport)(
        ISVGSVGElement* This,
        ISVGRect *v);

    HRESULT (STDMETHODCALLTYPE *get_viewport)(
        ISVGSVGElement* This,
        ISVGRect **p);

    HRESULT (STDMETHODCALLTYPE *put_pixelUnitToMillimeterX)(
        ISVGSVGElement* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_pixelUnitToMillimeterX)(
        ISVGSVGElement* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_pixelUnitToMillimeterY)(
        ISVGSVGElement* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_pixelUnitToMillimeterY)(
        ISVGSVGElement* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_screenPixelToMillimeterX)(
        ISVGSVGElement* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_screenPixelToMillimeterX)(
        ISVGSVGElement* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_screenPixelToMillimeterY)(
        ISVGSVGElement* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_screenPixelToMillimeterY)(
        ISVGSVGElement* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_useCurrentView)(
        ISVGSVGElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_useCurrentView)(
        ISVGSVGElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *putref_currentView)(
        ISVGSVGElement* This,
        ISVGViewSpec *v);

    HRESULT (STDMETHODCALLTYPE *get_currentView)(
        ISVGSVGElement* This,
        ISVGViewSpec **p);

    HRESULT (STDMETHODCALLTYPE *put_currentScale)(
        ISVGSVGElement* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_currentScale)(
        ISVGSVGElement* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *putref_currentTranslate)(
        ISVGSVGElement* This,
        ISVGPoint *v);

    HRESULT (STDMETHODCALLTYPE *get_currentTranslate)(
        ISVGSVGElement* This,
        ISVGPoint **p);

    HRESULT (STDMETHODCALLTYPE *suspendRedraw)(
        ISVGSVGElement* This,
        ULONG maxWaitMilliseconds,
        ULONG *pResult);

    HRESULT (STDMETHODCALLTYPE *unsuspendRedraw)(
        ISVGSVGElement* This,
        ULONG suspendHandeID);

    HRESULT (STDMETHODCALLTYPE *unsuspendRedrawAll)(
        ISVGSVGElement* This);

    HRESULT (STDMETHODCALLTYPE *forceRedraw)(
        ISVGSVGElement* This);

    HRESULT (STDMETHODCALLTYPE *pauseAnimations)(
        ISVGSVGElement* This);

    HRESULT (STDMETHODCALLTYPE *unpauseAnimations)(
        ISVGSVGElement* This);

    HRESULT (STDMETHODCALLTYPE *animationsPaused)(
        ISVGSVGElement* This,
        VARIANT_BOOL *pResult);

    HRESULT (STDMETHODCALLTYPE *getCurrentTime)(
        ISVGSVGElement* This,
        float *pResult);

    HRESULT (STDMETHODCALLTYPE *setCurrentTime)(
        ISVGSVGElement* This,
        float seconds);

    HRESULT (STDMETHODCALLTYPE *getIntersectionList)(
        ISVGSVGElement* This,
        ISVGRect *rect,
        ISVGElement *referenceElement,
        VARIANT *pResult);

    HRESULT (STDMETHODCALLTYPE *getEnclosureList)(
        ISVGSVGElement* This,
        ISVGRect *rect,
        ISVGElement *referenceElement,
        VARIANT *pResult);

    HRESULT (STDMETHODCALLTYPE *checkIntersection)(
        ISVGSVGElement* This,
        ISVGElement *element,
        ISVGRect *rect,
        VARIANT_BOOL *pResult);

    HRESULT (STDMETHODCALLTYPE *checkEnclosure)(
        ISVGSVGElement* This,
        ISVGElement *element,
        ISVGRect *rect,
        VARIANT_BOOL *pResult);

    HRESULT (STDMETHODCALLTYPE *deselectAll)(
        ISVGSVGElement* This);

    HRESULT (STDMETHODCALLTYPE *createSVGNumber)(
        ISVGSVGElement* This,
        ISVGNumber **pResult);

    HRESULT (STDMETHODCALLTYPE *createSVGLength)(
        ISVGSVGElement* This,
        ISVGLength **pResult);

    HRESULT (STDMETHODCALLTYPE *createSVGAngle)(
        ISVGSVGElement* This,
        ISVGAngle **pResult);

    HRESULT (STDMETHODCALLTYPE *createSVGPoint)(
        ISVGSVGElement* This,
        ISVGPoint **pResult);

    HRESULT (STDMETHODCALLTYPE *createSVGMatrix)(
        ISVGSVGElement* This,
        ISVGMatrix **pResult);

    HRESULT (STDMETHODCALLTYPE *createSVGRect)(
        ISVGSVGElement* This,
        ISVGRect **pResult);

    HRESULT (STDMETHODCALLTYPE *createSVGTransform)(
        ISVGSVGElement* This,
        ISVGTransform **pResult);

    HRESULT (STDMETHODCALLTYPE *createSVGTransformFromMatrix)(
        ISVGSVGElement* This,
        ISVGMatrix *matrix,
        ISVGTransform **pResult);

    HRESULT (STDMETHODCALLTYPE *getElementById)(
        ISVGSVGElement* This,
        BSTR elementId,
        IHTMLElement **pResult);

    END_INTERFACE
} ISVGSVGElementVtbl;
interface ISVGSVGElement {
    CONST_VTBL ISVGSVGElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGSVGElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGSVGElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGSVGElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGSVGElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGSVGElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGSVGElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGSVGElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGSVGElement methods ***/
#define ISVGSVGElement_putref_x(This,v) (This)->lpVtbl->putref_x(This,v)
#define ISVGSVGElement_get_x(This,p) (This)->lpVtbl->get_x(This,p)
#define ISVGSVGElement_putref_y(This,v) (This)->lpVtbl->putref_y(This,v)
#define ISVGSVGElement_get_y(This,p) (This)->lpVtbl->get_y(This,p)
#define ISVGSVGElement_putref_width(This,v) (This)->lpVtbl->putref_width(This,v)
#define ISVGSVGElement_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#define ISVGSVGElement_putref_height(This,v) (This)->lpVtbl->putref_height(This,v)
#define ISVGSVGElement_get_height(This,p) (This)->lpVtbl->get_height(This,p)
#define ISVGSVGElement_put_contentScriptType(This,v) (This)->lpVtbl->put_contentScriptType(This,v)
#define ISVGSVGElement_get_contentScriptType(This,p) (This)->lpVtbl->get_contentScriptType(This,p)
#define ISVGSVGElement_put_contentStyleType(This,v) (This)->lpVtbl->put_contentStyleType(This,v)
#define ISVGSVGElement_get_contentStyleType(This,p) (This)->lpVtbl->get_contentStyleType(This,p)
#define ISVGSVGElement_putref_viewport(This,v) (This)->lpVtbl->putref_viewport(This,v)
#define ISVGSVGElement_get_viewport(This,p) (This)->lpVtbl->get_viewport(This,p)
#define ISVGSVGElement_put_pixelUnitToMillimeterX(This,v) (This)->lpVtbl->put_pixelUnitToMillimeterX(This,v)
#define ISVGSVGElement_get_pixelUnitToMillimeterX(This,p) (This)->lpVtbl->get_pixelUnitToMillimeterX(This,p)
#define ISVGSVGElement_put_pixelUnitToMillimeterY(This,v) (This)->lpVtbl->put_pixelUnitToMillimeterY(This,v)
#define ISVGSVGElement_get_pixelUnitToMillimeterY(This,p) (This)->lpVtbl->get_pixelUnitToMillimeterY(This,p)
#define ISVGSVGElement_put_screenPixelToMillimeterX(This,v) (This)->lpVtbl->put_screenPixelToMillimeterX(This,v)
#define ISVGSVGElement_get_screenPixelToMillimeterX(This,p) (This)->lpVtbl->get_screenPixelToMillimeterX(This,p)
#define ISVGSVGElement_put_screenPixelToMillimeterY(This,v) (This)->lpVtbl->put_screenPixelToMillimeterY(This,v)
#define ISVGSVGElement_get_screenPixelToMillimeterY(This,p) (This)->lpVtbl->get_screenPixelToMillimeterY(This,p)
#define ISVGSVGElement_put_useCurrentView(This,v) (This)->lpVtbl->put_useCurrentView(This,v)
#define ISVGSVGElement_get_useCurrentView(This,p) (This)->lpVtbl->get_useCurrentView(This,p)
#define ISVGSVGElement_putref_currentView(This,v) (This)->lpVtbl->putref_currentView(This,v)
#define ISVGSVGElement_get_currentView(This,p) (This)->lpVtbl->get_currentView(This,p)
#define ISVGSVGElement_put_currentScale(This,v) (This)->lpVtbl->put_currentScale(This,v)
#define ISVGSVGElement_get_currentScale(This,p) (This)->lpVtbl->get_currentScale(This,p)
#define ISVGSVGElement_putref_currentTranslate(This,v) (This)->lpVtbl->putref_currentTranslate(This,v)
#define ISVGSVGElement_get_currentTranslate(This,p) (This)->lpVtbl->get_currentTranslate(This,p)
#define ISVGSVGElement_suspendRedraw(This,maxWaitMilliseconds,pResult) (This)->lpVtbl->suspendRedraw(This,maxWaitMilliseconds,pResult)
#define ISVGSVGElement_unsuspendRedraw(This,suspendHandeID) (This)->lpVtbl->unsuspendRedraw(This,suspendHandeID)
#define ISVGSVGElement_unsuspendRedrawAll(This) (This)->lpVtbl->unsuspendRedrawAll(This)
#define ISVGSVGElement_forceRedraw(This) (This)->lpVtbl->forceRedraw(This)
#define ISVGSVGElement_pauseAnimations(This) (This)->lpVtbl->pauseAnimations(This)
#define ISVGSVGElement_unpauseAnimations(This) (This)->lpVtbl->unpauseAnimations(This)
#define ISVGSVGElement_animationsPaused(This,pResult) (This)->lpVtbl->animationsPaused(This,pResult)
#define ISVGSVGElement_getCurrentTime(This,pResult) (This)->lpVtbl->getCurrentTime(This,pResult)
#define ISVGSVGElement_setCurrentTime(This,seconds) (This)->lpVtbl->setCurrentTime(This,seconds)
#define ISVGSVGElement_getIntersectionList(This,rect,referenceElement,pResult) (This)->lpVtbl->getIntersectionList(This,rect,referenceElement,pResult)
#define ISVGSVGElement_getEnclosureList(This,rect,referenceElement,pResult) (This)->lpVtbl->getEnclosureList(This,rect,referenceElement,pResult)
#define ISVGSVGElement_checkIntersection(This,element,rect,pResult) (This)->lpVtbl->checkIntersection(This,element,rect,pResult)
#define ISVGSVGElement_checkEnclosure(This,element,rect,pResult) (This)->lpVtbl->checkEnclosure(This,element,rect,pResult)
#define ISVGSVGElement_deselectAll(This) (This)->lpVtbl->deselectAll(This)
#define ISVGSVGElement_createSVGNumber(This,pResult) (This)->lpVtbl->createSVGNumber(This,pResult)
#define ISVGSVGElement_createSVGLength(This,pResult) (This)->lpVtbl->createSVGLength(This,pResult)
#define ISVGSVGElement_createSVGAngle(This,pResult) (This)->lpVtbl->createSVGAngle(This,pResult)
#define ISVGSVGElement_createSVGPoint(This,pResult) (This)->lpVtbl->createSVGPoint(This,pResult)
#define ISVGSVGElement_createSVGMatrix(This,pResult) (This)->lpVtbl->createSVGMatrix(This,pResult)
#define ISVGSVGElement_createSVGRect(This,pResult) (This)->lpVtbl->createSVGRect(This,pResult)
#define ISVGSVGElement_createSVGTransform(This,pResult) (This)->lpVtbl->createSVGTransform(This,pResult)
#define ISVGSVGElement_createSVGTransformFromMatrix(This,matrix,pResult) (This)->lpVtbl->createSVGTransformFromMatrix(This,matrix,pResult)
#define ISVGSVGElement_getElementById(This,elementId,pResult) (This)->lpVtbl->getElementById(This,elementId,pResult)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGSVGElement_QueryInterface(ISVGSVGElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGSVGElement_AddRef(ISVGSVGElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGSVGElement_Release(ISVGSVGElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGSVGElement_GetTypeInfoCount(ISVGSVGElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGSVGElement_GetTypeInfo(ISVGSVGElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGSVGElement_GetIDsOfNames(ISVGSVGElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGSVGElement_Invoke(ISVGSVGElement* 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);
}
/*** ISVGSVGElement methods ***/
static FORCEINLINE HRESULT ISVGSVGElement_putref_x(ISVGSVGElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_x(This,v);
}
static FORCEINLINE HRESULT ISVGSVGElement_get_x(ISVGSVGElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_x(This,p);
}
static FORCEINLINE HRESULT ISVGSVGElement_putref_y(ISVGSVGElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_y(This,v);
}
static FORCEINLINE HRESULT ISVGSVGElement_get_y(ISVGSVGElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_y(This,p);
}
static FORCEINLINE HRESULT ISVGSVGElement_putref_width(ISVGSVGElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_width(This,v);
}
static FORCEINLINE HRESULT ISVGSVGElement_get_width(ISVGSVGElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_width(This,p);
}
static FORCEINLINE HRESULT ISVGSVGElement_putref_height(ISVGSVGElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_height(This,v);
}
static FORCEINLINE HRESULT ISVGSVGElement_get_height(ISVGSVGElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_height(This,p);
}
static FORCEINLINE HRESULT ISVGSVGElement_put_contentScriptType(ISVGSVGElement* This,BSTR v) {
    return This->lpVtbl->put_contentScriptType(This,v);
}
static FORCEINLINE HRESULT ISVGSVGElement_get_contentScriptType(ISVGSVGElement* This,BSTR *p) {
    return This->lpVtbl->get_contentScriptType(This,p);
}
static FORCEINLINE HRESULT ISVGSVGElement_put_contentStyleType(ISVGSVGElement* This,BSTR v) {
    return This->lpVtbl->put_contentStyleType(This,v);
}
static FORCEINLINE HRESULT ISVGSVGElement_get_contentStyleType(ISVGSVGElement* This,BSTR *p) {
    return This->lpVtbl->get_contentStyleType(This,p);
}
static FORCEINLINE HRESULT ISVGSVGElement_putref_viewport(ISVGSVGElement* This,ISVGRect *v) {
    return This->lpVtbl->putref_viewport(This,v);
}
static FORCEINLINE HRESULT ISVGSVGElement_get_viewport(ISVGSVGElement* This,ISVGRect **p) {
    return This->lpVtbl->get_viewport(This,p);
}
static FORCEINLINE HRESULT ISVGSVGElement_put_pixelUnitToMillimeterX(ISVGSVGElement* This,float v) {
    return This->lpVtbl->put_pixelUnitToMillimeterX(This,v);
}
static FORCEINLINE HRESULT ISVGSVGElement_get_pixelUnitToMillimeterX(ISVGSVGElement* This,float *p) {
    return This->lpVtbl->get_pixelUnitToMillimeterX(This,p);
}
static FORCEINLINE HRESULT ISVGSVGElement_put_pixelUnitToMillimeterY(ISVGSVGElement* This,float v) {
    return This->lpVtbl->put_pixelUnitToMillimeterY(This,v);
}
static FORCEINLINE HRESULT ISVGSVGElement_get_pixelUnitToMillimeterY(ISVGSVGElement* This,float *p) {
    return This->lpVtbl->get_pixelUnitToMillimeterY(This,p);
}
static FORCEINLINE HRESULT ISVGSVGElement_put_screenPixelToMillimeterX(ISVGSVGElement* This,float v) {
    return This->lpVtbl->put_screenPixelToMillimeterX(This,v);
}
static FORCEINLINE HRESULT ISVGSVGElement_get_screenPixelToMillimeterX(ISVGSVGElement* This,float *p) {
    return This->lpVtbl->get_screenPixelToMillimeterX(This,p);
}
static FORCEINLINE HRESULT ISVGSVGElement_put_screenPixelToMillimeterY(ISVGSVGElement* This,float v) {
    return This->lpVtbl->put_screenPixelToMillimeterY(This,v);
}
static FORCEINLINE HRESULT ISVGSVGElement_get_screenPixelToMillimeterY(ISVGSVGElement* This,float *p) {
    return This->lpVtbl->get_screenPixelToMillimeterY(This,p);
}
static FORCEINLINE HRESULT ISVGSVGElement_put_useCurrentView(ISVGSVGElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_useCurrentView(This,v);
}
static FORCEINLINE HRESULT ISVGSVGElement_get_useCurrentView(ISVGSVGElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_useCurrentView(This,p);
}
static FORCEINLINE HRESULT ISVGSVGElement_putref_currentView(ISVGSVGElement* This,ISVGViewSpec *v) {
    return This->lpVtbl->putref_currentView(This,v);
}
static FORCEINLINE HRESULT ISVGSVGElement_get_currentView(ISVGSVGElement* This,ISVGViewSpec **p) {
    return This->lpVtbl->get_currentView(This,p);
}
static FORCEINLINE HRESULT ISVGSVGElement_put_currentScale(ISVGSVGElement* This,float v) {
    return This->lpVtbl->put_currentScale(This,v);
}
static FORCEINLINE HRESULT ISVGSVGElement_get_currentScale(ISVGSVGElement* This,float *p) {
    return This->lpVtbl->get_currentScale(This,p);
}
static FORCEINLINE HRESULT ISVGSVGElement_putref_currentTranslate(ISVGSVGElement* This,ISVGPoint *v) {
    return This->lpVtbl->putref_currentTranslate(This,v);
}
static FORCEINLINE HRESULT ISVGSVGElement_get_currentTranslate(ISVGSVGElement* This,ISVGPoint **p) {
    return This->lpVtbl->get_currentTranslate(This,p);
}
static FORCEINLINE HRESULT ISVGSVGElement_suspendRedraw(ISVGSVGElement* This,ULONG maxWaitMilliseconds,ULONG *pResult) {
    return This->lpVtbl->suspendRedraw(This,maxWaitMilliseconds,pResult);
}
static FORCEINLINE HRESULT ISVGSVGElement_unsuspendRedraw(ISVGSVGElement* This,ULONG suspendHandeID) {
    return This->lpVtbl->unsuspendRedraw(This,suspendHandeID);
}
static FORCEINLINE HRESULT ISVGSVGElement_unsuspendRedrawAll(ISVGSVGElement* This) {
    return This->lpVtbl->unsuspendRedrawAll(This);
}
static FORCEINLINE HRESULT ISVGSVGElement_forceRedraw(ISVGSVGElement* This) {
    return This->lpVtbl->forceRedraw(This);
}
static FORCEINLINE HRESULT ISVGSVGElement_pauseAnimations(ISVGSVGElement* This) {
    return This->lpVtbl->pauseAnimations(This);
}
static FORCEINLINE HRESULT ISVGSVGElement_unpauseAnimations(ISVGSVGElement* This) {
    return This->lpVtbl->unpauseAnimations(This);
}
static FORCEINLINE HRESULT ISVGSVGElement_animationsPaused(ISVGSVGElement* This,VARIANT_BOOL *pResult) {
    return This->lpVtbl->animationsPaused(This,pResult);
}
static FORCEINLINE HRESULT ISVGSVGElement_getCurrentTime(ISVGSVGElement* This,float *pResult) {
    return This->lpVtbl->getCurrentTime(This,pResult);
}
static FORCEINLINE HRESULT ISVGSVGElement_setCurrentTime(ISVGSVGElement* This,float seconds) {
    return This->lpVtbl->setCurrentTime(This,seconds);
}
static FORCEINLINE HRESULT ISVGSVGElement_getIntersectionList(ISVGSVGElement* This,ISVGRect *rect,ISVGElement *referenceElement,VARIANT *pResult) {
    return This->lpVtbl->getIntersectionList(This,rect,referenceElement,pResult);
}
static FORCEINLINE HRESULT ISVGSVGElement_getEnclosureList(ISVGSVGElement* This,ISVGRect *rect,ISVGElement *referenceElement,VARIANT *pResult) {
    return This->lpVtbl->getEnclosureList(This,rect,referenceElement,pResult);
}
static FORCEINLINE HRESULT ISVGSVGElement_checkIntersection(ISVGSVGElement* This,ISVGElement *element,ISVGRect *rect,VARIANT_BOOL *pResult) {
    return This->lpVtbl->checkIntersection(This,element,rect,pResult);
}
static FORCEINLINE HRESULT ISVGSVGElement_checkEnclosure(ISVGSVGElement* This,ISVGElement *element,ISVGRect *rect,VARIANT_BOOL *pResult) {
    return This->lpVtbl->checkEnclosure(This,element,rect,pResult);
}
static FORCEINLINE HRESULT ISVGSVGElement_deselectAll(ISVGSVGElement* This) {
    return This->lpVtbl->deselectAll(This);
}
static FORCEINLINE HRESULT ISVGSVGElement_createSVGNumber(ISVGSVGElement* This,ISVGNumber **pResult) {
    return This->lpVtbl->createSVGNumber(This,pResult);
}
static FORCEINLINE HRESULT ISVGSVGElement_createSVGLength(ISVGSVGElement* This,ISVGLength **pResult) {
    return This->lpVtbl->createSVGLength(This,pResult);
}
static FORCEINLINE HRESULT ISVGSVGElement_createSVGAngle(ISVGSVGElement* This,ISVGAngle **pResult) {
    return This->lpVtbl->createSVGAngle(This,pResult);
}
static FORCEINLINE HRESULT ISVGSVGElement_createSVGPoint(ISVGSVGElement* This,ISVGPoint **pResult) {
    return This->lpVtbl->createSVGPoint(This,pResult);
}
static FORCEINLINE HRESULT ISVGSVGElement_createSVGMatrix(ISVGSVGElement* This,ISVGMatrix **pResult) {
    return This->lpVtbl->createSVGMatrix(This,pResult);
}
static FORCEINLINE HRESULT ISVGSVGElement_createSVGRect(ISVGSVGElement* This,ISVGRect **pResult) {
    return This->lpVtbl->createSVGRect(This,pResult);
}
static FORCEINLINE HRESULT ISVGSVGElement_createSVGTransform(ISVGSVGElement* This,ISVGTransform **pResult) {
    return This->lpVtbl->createSVGTransform(This,pResult);
}
static FORCEINLINE HRESULT ISVGSVGElement_createSVGTransformFromMatrix(ISVGSVGElement* This,ISVGMatrix *matrix,ISVGTransform **pResult) {
    return This->lpVtbl->createSVGTransformFromMatrix(This,matrix,pResult);
}
static FORCEINLINE HRESULT ISVGSVGElement_getElementById(ISVGSVGElement* This,BSTR elementId,IHTMLElement **pResult) {
    return This->lpVtbl->getElementById(This,elementId,pResult);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGSVGElement_putref_x_Proxy(
    ISVGSVGElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGSVGElement_putref_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_get_x_Proxy(
    ISVGSVGElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGSVGElement_get_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_putref_y_Proxy(
    ISVGSVGElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGSVGElement_putref_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_get_y_Proxy(
    ISVGSVGElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGSVGElement_get_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_putref_width_Proxy(
    ISVGSVGElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGSVGElement_putref_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_get_width_Proxy(
    ISVGSVGElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGSVGElement_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_putref_height_Proxy(
    ISVGSVGElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGSVGElement_putref_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_get_height_Proxy(
    ISVGSVGElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGSVGElement_get_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_put_contentScriptType_Proxy(
    ISVGSVGElement* This,
    BSTR v);
void __RPC_STUB ISVGSVGElement_put_contentScriptType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_get_contentScriptType_Proxy(
    ISVGSVGElement* This,
    BSTR *p);
void __RPC_STUB ISVGSVGElement_get_contentScriptType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_put_contentStyleType_Proxy(
    ISVGSVGElement* This,
    BSTR v);
void __RPC_STUB ISVGSVGElement_put_contentStyleType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_get_contentStyleType_Proxy(
    ISVGSVGElement* This,
    BSTR *p);
void __RPC_STUB ISVGSVGElement_get_contentStyleType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_putref_viewport_Proxy(
    ISVGSVGElement* This,
    ISVGRect *v);
void __RPC_STUB ISVGSVGElement_putref_viewport_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_get_viewport_Proxy(
    ISVGSVGElement* This,
    ISVGRect **p);
void __RPC_STUB ISVGSVGElement_get_viewport_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_put_pixelUnitToMillimeterX_Proxy(
    ISVGSVGElement* This,
    float v);
void __RPC_STUB ISVGSVGElement_put_pixelUnitToMillimeterX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_get_pixelUnitToMillimeterX_Proxy(
    ISVGSVGElement* This,
    float *p);
void __RPC_STUB ISVGSVGElement_get_pixelUnitToMillimeterX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_put_pixelUnitToMillimeterY_Proxy(
    ISVGSVGElement* This,
    float v);
void __RPC_STUB ISVGSVGElement_put_pixelUnitToMillimeterY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_get_pixelUnitToMillimeterY_Proxy(
    ISVGSVGElement* This,
    float *p);
void __RPC_STUB ISVGSVGElement_get_pixelUnitToMillimeterY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_put_screenPixelToMillimeterX_Proxy(
    ISVGSVGElement* This,
    float v);
void __RPC_STUB ISVGSVGElement_put_screenPixelToMillimeterX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_get_screenPixelToMillimeterX_Proxy(
    ISVGSVGElement* This,
    float *p);
void __RPC_STUB ISVGSVGElement_get_screenPixelToMillimeterX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_put_screenPixelToMillimeterY_Proxy(
    ISVGSVGElement* This,
    float v);
void __RPC_STUB ISVGSVGElement_put_screenPixelToMillimeterY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_get_screenPixelToMillimeterY_Proxy(
    ISVGSVGElement* This,
    float *p);
void __RPC_STUB ISVGSVGElement_get_screenPixelToMillimeterY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_put_useCurrentView_Proxy(
    ISVGSVGElement* This,
    VARIANT_BOOL v);
void __RPC_STUB ISVGSVGElement_put_useCurrentView_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_get_useCurrentView_Proxy(
    ISVGSVGElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB ISVGSVGElement_get_useCurrentView_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_putref_currentView_Proxy(
    ISVGSVGElement* This,
    ISVGViewSpec *v);
void __RPC_STUB ISVGSVGElement_putref_currentView_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_get_currentView_Proxy(
    ISVGSVGElement* This,
    ISVGViewSpec **p);
void __RPC_STUB ISVGSVGElement_get_currentView_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_put_currentScale_Proxy(
    ISVGSVGElement* This,
    float v);
void __RPC_STUB ISVGSVGElement_put_currentScale_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_get_currentScale_Proxy(
    ISVGSVGElement* This,
    float *p);
void __RPC_STUB ISVGSVGElement_get_currentScale_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_putref_currentTranslate_Proxy(
    ISVGSVGElement* This,
    ISVGPoint *v);
void __RPC_STUB ISVGSVGElement_putref_currentTranslate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_get_currentTranslate_Proxy(
    ISVGSVGElement* This,
    ISVGPoint **p);
void __RPC_STUB ISVGSVGElement_get_currentTranslate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_suspendRedraw_Proxy(
    ISVGSVGElement* This,
    ULONG maxWaitMilliseconds,
    ULONG *pResult);
void __RPC_STUB ISVGSVGElement_suspendRedraw_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_unsuspendRedraw_Proxy(
    ISVGSVGElement* This,
    ULONG suspendHandeID);
void __RPC_STUB ISVGSVGElement_unsuspendRedraw_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_unsuspendRedrawAll_Proxy(
    ISVGSVGElement* This);
void __RPC_STUB ISVGSVGElement_unsuspendRedrawAll_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_forceRedraw_Proxy(
    ISVGSVGElement* This);
void __RPC_STUB ISVGSVGElement_forceRedraw_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_pauseAnimations_Proxy(
    ISVGSVGElement* This);
void __RPC_STUB ISVGSVGElement_pauseAnimations_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_unpauseAnimations_Proxy(
    ISVGSVGElement* This);
void __RPC_STUB ISVGSVGElement_unpauseAnimations_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_animationsPaused_Proxy(
    ISVGSVGElement* This,
    VARIANT_BOOL *pResult);
void __RPC_STUB ISVGSVGElement_animationsPaused_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_getCurrentTime_Proxy(
    ISVGSVGElement* This,
    float *pResult);
void __RPC_STUB ISVGSVGElement_getCurrentTime_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_setCurrentTime_Proxy(
    ISVGSVGElement* This,
    float seconds);
void __RPC_STUB ISVGSVGElement_setCurrentTime_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_getIntersectionList_Proxy(
    ISVGSVGElement* This,
    ISVGRect *rect,
    ISVGElement *referenceElement,
    VARIANT *pResult);
void __RPC_STUB ISVGSVGElement_getIntersectionList_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_getEnclosureList_Proxy(
    ISVGSVGElement* This,
    ISVGRect *rect,
    ISVGElement *referenceElement,
    VARIANT *pResult);
void __RPC_STUB ISVGSVGElement_getEnclosureList_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_checkIntersection_Proxy(
    ISVGSVGElement* This,
    ISVGElement *element,
    ISVGRect *rect,
    VARIANT_BOOL *pResult);
void __RPC_STUB ISVGSVGElement_checkIntersection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_checkEnclosure_Proxy(
    ISVGSVGElement* This,
    ISVGElement *element,
    ISVGRect *rect,
    VARIANT_BOOL *pResult);
void __RPC_STUB ISVGSVGElement_checkEnclosure_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_deselectAll_Proxy(
    ISVGSVGElement* This);
void __RPC_STUB ISVGSVGElement_deselectAll_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_createSVGNumber_Proxy(
    ISVGSVGElement* This,
    ISVGNumber **pResult);
void __RPC_STUB ISVGSVGElement_createSVGNumber_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_createSVGLength_Proxy(
    ISVGSVGElement* This,
    ISVGLength **pResult);
void __RPC_STUB ISVGSVGElement_createSVGLength_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_createSVGAngle_Proxy(
    ISVGSVGElement* This,
    ISVGAngle **pResult);
void __RPC_STUB ISVGSVGElement_createSVGAngle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_createSVGPoint_Proxy(
    ISVGSVGElement* This,
    ISVGPoint **pResult);
void __RPC_STUB ISVGSVGElement_createSVGPoint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_createSVGMatrix_Proxy(
    ISVGSVGElement* This,
    ISVGMatrix **pResult);
void __RPC_STUB ISVGSVGElement_createSVGMatrix_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_createSVGRect_Proxy(
    ISVGSVGElement* This,
    ISVGRect **pResult);
void __RPC_STUB ISVGSVGElement_createSVGRect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_createSVGTransform_Proxy(
    ISVGSVGElement* This,
    ISVGTransform **pResult);
void __RPC_STUB ISVGSVGElement_createSVGTransform_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_createSVGTransformFromMatrix_Proxy(
    ISVGSVGElement* This,
    ISVGMatrix *matrix,
    ISVGTransform **pResult);
void __RPC_STUB ISVGSVGElement_createSVGTransformFromMatrix_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGSVGElement_getElementById_Proxy(
    ISVGSVGElement* This,
    BSTR elementId,
    IHTMLElement **pResult);
void __RPC_STUB ISVGSVGElement_getElementById_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGSVGElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGSVGElement dispinterface
 */
#ifndef __DispSVGSVGElement_DISPINTERFACE_DEFINED__
#define __DispSVGSVGElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGSVGElement, 0x30590001, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590001-98b5-11cf-bb82-00aa00bdce0b")
DispSVGSVGElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGSVGElement, 0x30590001, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGSVGElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGSVGElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGSVGElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGSVGElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGSVGElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGSVGElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGSVGElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGSVGElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGSVGElementVtbl;
interface DispSVGSVGElement {
    CONST_VTBL DispSVGSVGElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGSVGElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGSVGElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGSVGElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGSVGElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGSVGElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGSVGElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGSVGElement_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 DispSVGSVGElement_QueryInterface(DispSVGSVGElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGSVGElement_AddRef(DispSVGSVGElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGSVGElement_Release(DispSVGSVGElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGSVGElement_GetTypeInfoCount(DispSVGSVGElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGSVGElement_GetTypeInfo(DispSVGSVGElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGSVGElement_GetIDsOfNames(DispSVGSVGElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGSVGElement_Invoke(DispSVGSVGElement* 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  /* __DispSVGSVGElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGSVGElement coclass
 */

DEFINE_GUID(CLSID_SVGSVGElement, 0x30510574, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510574-98b5-11cf-bb82-00aa00bdce0b") SVGSVGElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGSVGElement, 0x30510574, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGSVGElement;
#ifndef __ISVGElementInstance_FWD_DEFINED__
#define __ISVGElementInstance_FWD_DEFINED__
typedef interface ISVGElementInstance ISVGElementInstance;
#endif

/*****************************************************************************
 * ISVGUseElement interface
 */
#ifndef __ISVGUseElement_INTERFACE_DEFINED__
#define __ISVGUseElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGUseElement, 0x305104ed, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104ed-98b5-11cf-bb82-00aa00bdce0b")
ISVGUseElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_x(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_y(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_width(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_width(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_height(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_height(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_instanceRoot(
        ISVGElementInstance *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_instanceRoot(
        ISVGElementInstance **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_animatedInstanceRoot(
        ISVGElementInstance *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_animatedInstanceRoot(
        ISVGElementInstance **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGUseElement, 0x305104ed, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGUseElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGUseElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGUseElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGUseElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGUseElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGUseElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGUseElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGUseElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGUseElement methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_x)(
        ISVGUseElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_x)(
        ISVGUseElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_y)(
        ISVGUseElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_y)(
        ISVGUseElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_width)(
        ISVGUseElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_width)(
        ISVGUseElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_height)(
        ISVGUseElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_height)(
        ISVGUseElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_instanceRoot)(
        ISVGUseElement* This,
        ISVGElementInstance *v);

    HRESULT (STDMETHODCALLTYPE *get_instanceRoot)(
        ISVGUseElement* This,
        ISVGElementInstance **p);

    HRESULT (STDMETHODCALLTYPE *putref_animatedInstanceRoot)(
        ISVGUseElement* This,
        ISVGElementInstance *v);

    HRESULT (STDMETHODCALLTYPE *get_animatedInstanceRoot)(
        ISVGUseElement* This,
        ISVGElementInstance **p);

    END_INTERFACE
} ISVGUseElementVtbl;
interface ISVGUseElement {
    CONST_VTBL ISVGUseElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGUseElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGUseElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGUseElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGUseElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGUseElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGUseElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGUseElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGUseElement methods ***/
#define ISVGUseElement_putref_x(This,v) (This)->lpVtbl->putref_x(This,v)
#define ISVGUseElement_get_x(This,p) (This)->lpVtbl->get_x(This,p)
#define ISVGUseElement_putref_y(This,v) (This)->lpVtbl->putref_y(This,v)
#define ISVGUseElement_get_y(This,p) (This)->lpVtbl->get_y(This,p)
#define ISVGUseElement_putref_width(This,v) (This)->lpVtbl->putref_width(This,v)
#define ISVGUseElement_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#define ISVGUseElement_putref_height(This,v) (This)->lpVtbl->putref_height(This,v)
#define ISVGUseElement_get_height(This,p) (This)->lpVtbl->get_height(This,p)
#define ISVGUseElement_putref_instanceRoot(This,v) (This)->lpVtbl->putref_instanceRoot(This,v)
#define ISVGUseElement_get_instanceRoot(This,p) (This)->lpVtbl->get_instanceRoot(This,p)
#define ISVGUseElement_putref_animatedInstanceRoot(This,v) (This)->lpVtbl->putref_animatedInstanceRoot(This,v)
#define ISVGUseElement_get_animatedInstanceRoot(This,p) (This)->lpVtbl->get_animatedInstanceRoot(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGUseElement_QueryInterface(ISVGUseElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGUseElement_AddRef(ISVGUseElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGUseElement_Release(ISVGUseElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGUseElement_GetTypeInfoCount(ISVGUseElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGUseElement_GetTypeInfo(ISVGUseElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGUseElement_GetIDsOfNames(ISVGUseElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGUseElement_Invoke(ISVGUseElement* 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);
}
/*** ISVGUseElement methods ***/
static FORCEINLINE HRESULT ISVGUseElement_putref_x(ISVGUseElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_x(This,v);
}
static FORCEINLINE HRESULT ISVGUseElement_get_x(ISVGUseElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_x(This,p);
}
static FORCEINLINE HRESULT ISVGUseElement_putref_y(ISVGUseElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_y(This,v);
}
static FORCEINLINE HRESULT ISVGUseElement_get_y(ISVGUseElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_y(This,p);
}
static FORCEINLINE HRESULT ISVGUseElement_putref_width(ISVGUseElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_width(This,v);
}
static FORCEINLINE HRESULT ISVGUseElement_get_width(ISVGUseElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_width(This,p);
}
static FORCEINLINE HRESULT ISVGUseElement_putref_height(ISVGUseElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_height(This,v);
}
static FORCEINLINE HRESULT ISVGUseElement_get_height(ISVGUseElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_height(This,p);
}
static FORCEINLINE HRESULT ISVGUseElement_putref_instanceRoot(ISVGUseElement* This,ISVGElementInstance *v) {
    return This->lpVtbl->putref_instanceRoot(This,v);
}
static FORCEINLINE HRESULT ISVGUseElement_get_instanceRoot(ISVGUseElement* This,ISVGElementInstance **p) {
    return This->lpVtbl->get_instanceRoot(This,p);
}
static FORCEINLINE HRESULT ISVGUseElement_putref_animatedInstanceRoot(ISVGUseElement* This,ISVGElementInstance *v) {
    return This->lpVtbl->putref_animatedInstanceRoot(This,v);
}
static FORCEINLINE HRESULT ISVGUseElement_get_animatedInstanceRoot(ISVGUseElement* This,ISVGElementInstance **p) {
    return This->lpVtbl->get_animatedInstanceRoot(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGUseElement_putref_x_Proxy(
    ISVGUseElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGUseElement_putref_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGUseElement_get_x_Proxy(
    ISVGUseElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGUseElement_get_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGUseElement_putref_y_Proxy(
    ISVGUseElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGUseElement_putref_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGUseElement_get_y_Proxy(
    ISVGUseElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGUseElement_get_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGUseElement_putref_width_Proxy(
    ISVGUseElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGUseElement_putref_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGUseElement_get_width_Proxy(
    ISVGUseElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGUseElement_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGUseElement_putref_height_Proxy(
    ISVGUseElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGUseElement_putref_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGUseElement_get_height_Proxy(
    ISVGUseElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGUseElement_get_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGUseElement_putref_instanceRoot_Proxy(
    ISVGUseElement* This,
    ISVGElementInstance *v);
void __RPC_STUB ISVGUseElement_putref_instanceRoot_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGUseElement_get_instanceRoot_Proxy(
    ISVGUseElement* This,
    ISVGElementInstance **p);
void __RPC_STUB ISVGUseElement_get_instanceRoot_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGUseElement_putref_animatedInstanceRoot_Proxy(
    ISVGUseElement* This,
    ISVGElementInstance *v);
void __RPC_STUB ISVGUseElement_putref_animatedInstanceRoot_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGUseElement_get_animatedInstanceRoot_Proxy(
    ISVGUseElement* This,
    ISVGElementInstance **p);
void __RPC_STUB ISVGUseElement_get_animatedInstanceRoot_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGUseElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGUseElement dispinterface
 */
#ifndef __DispSVGUseElement_DISPINTERFACE_DEFINED__
#define __DispSVGUseElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGUseElement, 0x30590010, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590010-98b5-11cf-bb82-00aa00bdce0b")
DispSVGUseElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGUseElement, 0x30590010, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGUseElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGUseElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGUseElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGUseElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGUseElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGUseElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGUseElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGUseElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGUseElementVtbl;
interface DispSVGUseElement {
    CONST_VTBL DispSVGUseElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGUseElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGUseElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGUseElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGUseElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGUseElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGUseElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGUseElement_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 DispSVGUseElement_QueryInterface(DispSVGUseElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGUseElement_AddRef(DispSVGUseElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGUseElement_Release(DispSVGUseElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGUseElement_GetTypeInfoCount(DispSVGUseElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGUseElement_GetTypeInfo(DispSVGUseElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGUseElement_GetIDsOfNames(DispSVGUseElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGUseElement_Invoke(DispSVGUseElement* 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  /* __DispSVGUseElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGUseElement coclass
 */

DEFINE_GUID(CLSID_SVGUseElement, 0x30510590, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510590-98b5-11cf-bb82-00aa00bdce0b") SVGUseElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGUseElement, 0x30510590, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGUseElement;
#ifndef __IHTMLStyleSheetRulesAppliedCollection_FWD_DEFINED__
#define __IHTMLStyleSheetRulesAppliedCollection_FWD_DEFINED__
typedef interface IHTMLStyleSheetRulesAppliedCollection IHTMLStyleSheetRulesAppliedCollection;
#endif

#ifndef __IRulesApplied_FWD_DEFINED__
#define __IRulesApplied_FWD_DEFINED__
typedef interface IRulesApplied IRulesApplied;
#endif

#ifndef __IRulesAppliedCollection_FWD_DEFINED__
#define __IRulesAppliedCollection_FWD_DEFINED__
typedef interface IRulesAppliedCollection IRulesAppliedCollection;
#endif

/*****************************************************************************
 * IHTMLStyleSheetRulesAppliedCollection interface
 */
#ifndef __IHTMLStyleSheetRulesAppliedCollection_INTERFACE_DEFINED__
#define __IHTMLStyleSheetRulesAppliedCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLStyleSheetRulesAppliedCollection, 0x305104c0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104c0-98b5-11cf-bb82-00aa00bdce0b")
IHTMLStyleSheetRulesAppliedCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE item(
        LONG index,
        IHTMLStyleSheetRule **ppHTMLStyleSheetRule) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE propertyAppliedBy(
        BSTR name,
        IHTMLStyleSheetRule **ppRule) = 0;

    virtual HRESULT STDMETHODCALLTYPE propertyAppliedTrace(
        BSTR name,
        LONG index,
        IHTMLStyleSheetRule **ppRule) = 0;

    virtual HRESULT STDMETHODCALLTYPE propertyAppliedTraceLength(
        BSTR name,
        LONG *pLength) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLStyleSheetRulesAppliedCollection, 0x305104c0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLStyleSheetRulesAppliedCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLStyleSheetRulesAppliedCollection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLStyleSheetRulesAppliedCollection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLStyleSheetRulesAppliedCollection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLStyleSheetRulesAppliedCollection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLStyleSheetRulesAppliedCollection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLStyleSheetRulesAppliedCollection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLStyleSheetRulesAppliedCollection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLStyleSheetRulesAppliedCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLStyleSheetRulesAppliedCollection* This,
        LONG index,
        IHTMLStyleSheetRule **ppHTMLStyleSheetRule);

    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLStyleSheetRulesAppliedCollection* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *propertyAppliedBy)(
        IHTMLStyleSheetRulesAppliedCollection* This,
        BSTR name,
        IHTMLStyleSheetRule **ppRule);

    HRESULT (STDMETHODCALLTYPE *propertyAppliedTrace)(
        IHTMLStyleSheetRulesAppliedCollection* This,
        BSTR name,
        LONG index,
        IHTMLStyleSheetRule **ppRule);

    HRESULT (STDMETHODCALLTYPE *propertyAppliedTraceLength)(
        IHTMLStyleSheetRulesAppliedCollection* This,
        BSTR name,
        LONG *pLength);

    END_INTERFACE
} IHTMLStyleSheetRulesAppliedCollectionVtbl;
interface IHTMLStyleSheetRulesAppliedCollection {
    CONST_VTBL IHTMLStyleSheetRulesAppliedCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLStyleSheetRulesAppliedCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLStyleSheetRulesAppliedCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLStyleSheetRulesAppliedCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLStyleSheetRulesAppliedCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLStyleSheetRulesAppliedCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLStyleSheetRulesAppliedCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLStyleSheetRulesAppliedCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLStyleSheetRulesAppliedCollection methods ***/
#define IHTMLStyleSheetRulesAppliedCollection_item(This,index,ppHTMLStyleSheetRule) (This)->lpVtbl->item(This,index,ppHTMLStyleSheetRule)
#define IHTMLStyleSheetRulesAppliedCollection_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLStyleSheetRulesAppliedCollection_propertyAppliedBy(This,name,ppRule) (This)->lpVtbl->propertyAppliedBy(This,name,ppRule)
#define IHTMLStyleSheetRulesAppliedCollection_propertyAppliedTrace(This,name,index,ppRule) (This)->lpVtbl->propertyAppliedTrace(This,name,index,ppRule)
#define IHTMLStyleSheetRulesAppliedCollection_propertyAppliedTraceLength(This,name,pLength) (This)->lpVtbl->propertyAppliedTraceLength(This,name,pLength)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetRulesAppliedCollection_QueryInterface(IHTMLStyleSheetRulesAppliedCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLStyleSheetRulesAppliedCollection_AddRef(IHTMLStyleSheetRulesAppliedCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLStyleSheetRulesAppliedCollection_Release(IHTMLStyleSheetRulesAppliedCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetRulesAppliedCollection_GetTypeInfoCount(IHTMLStyleSheetRulesAppliedCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLStyleSheetRulesAppliedCollection_GetTypeInfo(IHTMLStyleSheetRulesAppliedCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLStyleSheetRulesAppliedCollection_GetIDsOfNames(IHTMLStyleSheetRulesAppliedCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLStyleSheetRulesAppliedCollection_Invoke(IHTMLStyleSheetRulesAppliedCollection* 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);
}
/*** IHTMLStyleSheetRulesAppliedCollection methods ***/
static FORCEINLINE HRESULT IHTMLStyleSheetRulesAppliedCollection_item(IHTMLStyleSheetRulesAppliedCollection* This,LONG index,IHTMLStyleSheetRule **ppHTMLStyleSheetRule) {
    return This->lpVtbl->item(This,index,ppHTMLStyleSheetRule);
}
static FORCEINLINE HRESULT IHTMLStyleSheetRulesAppliedCollection_get_length(IHTMLStyleSheetRulesAppliedCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IHTMLStyleSheetRulesAppliedCollection_propertyAppliedBy(IHTMLStyleSheetRulesAppliedCollection* This,BSTR name,IHTMLStyleSheetRule **ppRule) {
    return This->lpVtbl->propertyAppliedBy(This,name,ppRule);
}
static FORCEINLINE HRESULT IHTMLStyleSheetRulesAppliedCollection_propertyAppliedTrace(IHTMLStyleSheetRulesAppliedCollection* This,BSTR name,LONG index,IHTMLStyleSheetRule **ppRule) {
    return This->lpVtbl->propertyAppliedTrace(This,name,index,ppRule);
}
static FORCEINLINE HRESULT IHTMLStyleSheetRulesAppliedCollection_propertyAppliedTraceLength(IHTMLStyleSheetRulesAppliedCollection* This,BSTR name,LONG *pLength) {
    return This->lpVtbl->propertyAppliedTraceLength(This,name,pLength);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLStyleSheetRulesAppliedCollection_item_Proxy(
    IHTMLStyleSheetRulesAppliedCollection* This,
    LONG index,
    IHTMLStyleSheetRule **ppHTMLStyleSheetRule);
void __RPC_STUB IHTMLStyleSheetRulesAppliedCollection_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheetRulesAppliedCollection_get_length_Proxy(
    IHTMLStyleSheetRulesAppliedCollection* This,
    LONG *p);
void __RPC_STUB IHTMLStyleSheetRulesAppliedCollection_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheetRulesAppliedCollection_propertyAppliedBy_Proxy(
    IHTMLStyleSheetRulesAppliedCollection* This,
    BSTR name,
    IHTMLStyleSheetRule **ppRule);
void __RPC_STUB IHTMLStyleSheetRulesAppliedCollection_propertyAppliedBy_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheetRulesAppliedCollection_propertyAppliedTrace_Proxy(
    IHTMLStyleSheetRulesAppliedCollection* This,
    BSTR name,
    LONG index,
    IHTMLStyleSheetRule **ppRule);
void __RPC_STUB IHTMLStyleSheetRulesAppliedCollection_propertyAppliedTrace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLStyleSheetRulesAppliedCollection_propertyAppliedTraceLength_Proxy(
    IHTMLStyleSheetRulesAppliedCollection* This,
    BSTR name,
    LONG *pLength);
void __RPC_STUB IHTMLStyleSheetRulesAppliedCollection_propertyAppliedTraceLength_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLStyleSheetRulesAppliedCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRulesApplied interface
 */
#ifndef __IRulesApplied_INTERFACE_DEFINED__
#define __IRulesApplied_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRulesApplied, 0x305104bf, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104bf-98b5-11cf-bb82-00aa00bdce0b")
IRulesApplied : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_element(
        IHTMLElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_inlineStyles(
        IHTMLStyle **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_appliedRules(
        IHTMLStyleSheetRulesAppliedCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE propertyIsInline(
        BSTR name,
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE propertyIsInheritable(
        BSTR name,
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE hasInheritableProperty(
        VARIANT_BOOL *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRulesApplied, 0x305104bf, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IRulesAppliedVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IRulesApplied* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IRulesApplied* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IRulesApplied* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IRulesApplied* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IRulesApplied* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IRulesApplied* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IRulesApplied* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IRulesApplied methods ***/
    HRESULT (STDMETHODCALLTYPE *get_element)(
        IRulesApplied* This,
        IHTMLElement **p);

    HRESULT (STDMETHODCALLTYPE *get_inlineStyles)(
        IRulesApplied* This,
        IHTMLStyle **p);

    HRESULT (STDMETHODCALLTYPE *get_appliedRules)(
        IRulesApplied* This,
        IHTMLStyleSheetRulesAppliedCollection **p);

    HRESULT (STDMETHODCALLTYPE *propertyIsInline)(
        IRulesApplied* This,
        BSTR name,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *propertyIsInheritable)(
        IRulesApplied* This,
        BSTR name,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *hasInheritableProperty)(
        IRulesApplied* This,
        VARIANT_BOOL *p);

    END_INTERFACE
} IRulesAppliedVtbl;
interface IRulesApplied {
    CONST_VTBL IRulesAppliedVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRulesApplied_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRulesApplied_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRulesApplied_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IRulesApplied_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IRulesApplied_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IRulesApplied_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IRulesApplied_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IRulesApplied methods ***/
#define IRulesApplied_get_element(This,p) (This)->lpVtbl->get_element(This,p)
#define IRulesApplied_get_inlineStyles(This,p) (This)->lpVtbl->get_inlineStyles(This,p)
#define IRulesApplied_get_appliedRules(This,p) (This)->lpVtbl->get_appliedRules(This,p)
#define IRulesApplied_propertyIsInline(This,name,p) (This)->lpVtbl->propertyIsInline(This,name,p)
#define IRulesApplied_propertyIsInheritable(This,name,p) (This)->lpVtbl->propertyIsInheritable(This,name,p)
#define IRulesApplied_hasInheritableProperty(This,p) (This)->lpVtbl->hasInheritableProperty(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRulesApplied_QueryInterface(IRulesApplied* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRulesApplied_AddRef(IRulesApplied* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRulesApplied_Release(IRulesApplied* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IRulesApplied_GetTypeInfoCount(IRulesApplied* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IRulesApplied_GetTypeInfo(IRulesApplied* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IRulesApplied_GetIDsOfNames(IRulesApplied* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IRulesApplied_Invoke(IRulesApplied* 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);
}
/*** IRulesApplied methods ***/
static FORCEINLINE HRESULT IRulesApplied_get_element(IRulesApplied* This,IHTMLElement **p) {
    return This->lpVtbl->get_element(This,p);
}
static FORCEINLINE HRESULT IRulesApplied_get_inlineStyles(IRulesApplied* This,IHTMLStyle **p) {
    return This->lpVtbl->get_inlineStyles(This,p);
}
static FORCEINLINE HRESULT IRulesApplied_get_appliedRules(IRulesApplied* This,IHTMLStyleSheetRulesAppliedCollection **p) {
    return This->lpVtbl->get_appliedRules(This,p);
}
static FORCEINLINE HRESULT IRulesApplied_propertyIsInline(IRulesApplied* This,BSTR name,VARIANT_BOOL *p) {
    return This->lpVtbl->propertyIsInline(This,name,p);
}
static FORCEINLINE HRESULT IRulesApplied_propertyIsInheritable(IRulesApplied* This,BSTR name,VARIANT_BOOL *p) {
    return This->lpVtbl->propertyIsInheritable(This,name,p);
}
static FORCEINLINE HRESULT IRulesApplied_hasInheritableProperty(IRulesApplied* This,VARIANT_BOOL *p) {
    return This->lpVtbl->hasInheritableProperty(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IRulesApplied_get_element_Proxy(
    IRulesApplied* This,
    IHTMLElement **p);
void __RPC_STUB IRulesApplied_get_element_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRulesApplied_get_inlineStyles_Proxy(
    IRulesApplied* This,
    IHTMLStyle **p);
void __RPC_STUB IRulesApplied_get_inlineStyles_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRulesApplied_get_appliedRules_Proxy(
    IRulesApplied* This,
    IHTMLStyleSheetRulesAppliedCollection **p);
void __RPC_STUB IRulesApplied_get_appliedRules_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRulesApplied_propertyIsInline_Proxy(
    IRulesApplied* This,
    BSTR name,
    VARIANT_BOOL *p);
void __RPC_STUB IRulesApplied_propertyIsInline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRulesApplied_propertyIsInheritable_Proxy(
    IRulesApplied* This,
    BSTR name,
    VARIANT_BOOL *p);
void __RPC_STUB IRulesApplied_propertyIsInheritable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRulesApplied_hasInheritableProperty_Proxy(
    IRulesApplied* This,
    VARIANT_BOOL *p);
void __RPC_STUB IRulesApplied_hasInheritableProperty_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IRulesApplied_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRulesAppliedCollection interface
 */
#ifndef __IRulesAppliedCollection_INTERFACE_DEFINED__
#define __IRulesAppliedCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRulesAppliedCollection, 0x305104be, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104be-98b5-11cf-bb82-00aa00bdce0b")
IRulesAppliedCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE item(
        LONG index,
        IRulesApplied **ppRulesApplied) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_element(
        IHTMLElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE propertyInheritedFrom(
        BSTR name,
        IRulesApplied **ppRulesApplied) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_propertyCount(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE property(
        LONG index,
        BSTR *pbstrProperty) = 0;

    virtual HRESULT STDMETHODCALLTYPE propertyInheritedTrace(
        BSTR name,
        LONG index,
        IRulesApplied **ppRulesApplied) = 0;

    virtual HRESULT STDMETHODCALLTYPE propertyInheritedTraceLength(
        BSTR name,
        LONG *pLength) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRulesAppliedCollection, 0x305104be, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IRulesAppliedCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IRulesAppliedCollection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IRulesAppliedCollection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IRulesAppliedCollection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IRulesAppliedCollection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IRulesAppliedCollection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IRulesAppliedCollection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IRulesAppliedCollection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IRulesAppliedCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *item)(
        IRulesAppliedCollection* This,
        LONG index,
        IRulesApplied **ppRulesApplied);

    HRESULT (STDMETHODCALLTYPE *get_length)(
        IRulesAppliedCollection* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_element)(
        IRulesAppliedCollection* This,
        IHTMLElement **p);

    HRESULT (STDMETHODCALLTYPE *propertyInheritedFrom)(
        IRulesAppliedCollection* This,
        BSTR name,
        IRulesApplied **ppRulesApplied);

    HRESULT (STDMETHODCALLTYPE *get_propertyCount)(
        IRulesAppliedCollection* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *property)(
        IRulesAppliedCollection* This,
        LONG index,
        BSTR *pbstrProperty);

    HRESULT (STDMETHODCALLTYPE *propertyInheritedTrace)(
        IRulesAppliedCollection* This,
        BSTR name,
        LONG index,
        IRulesApplied **ppRulesApplied);

    HRESULT (STDMETHODCALLTYPE *propertyInheritedTraceLength)(
        IRulesAppliedCollection* This,
        BSTR name,
        LONG *pLength);

    END_INTERFACE
} IRulesAppliedCollectionVtbl;
interface IRulesAppliedCollection {
    CONST_VTBL IRulesAppliedCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRulesAppliedCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRulesAppliedCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRulesAppliedCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IRulesAppliedCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IRulesAppliedCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IRulesAppliedCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IRulesAppliedCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IRulesAppliedCollection methods ***/
#define IRulesAppliedCollection_item(This,index,ppRulesApplied) (This)->lpVtbl->item(This,index,ppRulesApplied)
#define IRulesAppliedCollection_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IRulesAppliedCollection_get_element(This,p) (This)->lpVtbl->get_element(This,p)
#define IRulesAppliedCollection_propertyInheritedFrom(This,name,ppRulesApplied) (This)->lpVtbl->propertyInheritedFrom(This,name,ppRulesApplied)
#define IRulesAppliedCollection_get_propertyCount(This,p) (This)->lpVtbl->get_propertyCount(This,p)
#define IRulesAppliedCollection_property(This,index,pbstrProperty) (This)->lpVtbl->property(This,index,pbstrProperty)
#define IRulesAppliedCollection_propertyInheritedTrace(This,name,index,ppRulesApplied) (This)->lpVtbl->propertyInheritedTrace(This,name,index,ppRulesApplied)
#define IRulesAppliedCollection_propertyInheritedTraceLength(This,name,pLength) (This)->lpVtbl->propertyInheritedTraceLength(This,name,pLength)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRulesAppliedCollection_QueryInterface(IRulesAppliedCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRulesAppliedCollection_AddRef(IRulesAppliedCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRulesAppliedCollection_Release(IRulesAppliedCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IRulesAppliedCollection_GetTypeInfoCount(IRulesAppliedCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IRulesAppliedCollection_GetTypeInfo(IRulesAppliedCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IRulesAppliedCollection_GetIDsOfNames(IRulesAppliedCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IRulesAppliedCollection_Invoke(IRulesAppliedCollection* 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);
}
/*** IRulesAppliedCollection methods ***/
static FORCEINLINE HRESULT IRulesAppliedCollection_item(IRulesAppliedCollection* This,LONG index,IRulesApplied **ppRulesApplied) {
    return This->lpVtbl->item(This,index,ppRulesApplied);
}
static FORCEINLINE HRESULT IRulesAppliedCollection_get_length(IRulesAppliedCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IRulesAppliedCollection_get_element(IRulesAppliedCollection* This,IHTMLElement **p) {
    return This->lpVtbl->get_element(This,p);
}
static FORCEINLINE HRESULT IRulesAppliedCollection_propertyInheritedFrom(IRulesAppliedCollection* This,BSTR name,IRulesApplied **ppRulesApplied) {
    return This->lpVtbl->propertyInheritedFrom(This,name,ppRulesApplied);
}
static FORCEINLINE HRESULT IRulesAppliedCollection_get_propertyCount(IRulesAppliedCollection* This,LONG *p) {
    return This->lpVtbl->get_propertyCount(This,p);
}
static FORCEINLINE HRESULT IRulesAppliedCollection_property(IRulesAppliedCollection* This,LONG index,BSTR *pbstrProperty) {
    return This->lpVtbl->property(This,index,pbstrProperty);
}
static FORCEINLINE HRESULT IRulesAppliedCollection_propertyInheritedTrace(IRulesAppliedCollection* This,BSTR name,LONG index,IRulesApplied **ppRulesApplied) {
    return This->lpVtbl->propertyInheritedTrace(This,name,index,ppRulesApplied);
}
static FORCEINLINE HRESULT IRulesAppliedCollection_propertyInheritedTraceLength(IRulesAppliedCollection* This,BSTR name,LONG *pLength) {
    return This->lpVtbl->propertyInheritedTraceLength(This,name,pLength);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IRulesAppliedCollection_item_Proxy(
    IRulesAppliedCollection* This,
    LONG index,
    IRulesApplied **ppRulesApplied);
void __RPC_STUB IRulesAppliedCollection_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRulesAppliedCollection_get_length_Proxy(
    IRulesAppliedCollection* This,
    LONG *p);
void __RPC_STUB IRulesAppliedCollection_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRulesAppliedCollection_get_element_Proxy(
    IRulesAppliedCollection* This,
    IHTMLElement **p);
void __RPC_STUB IRulesAppliedCollection_get_element_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRulesAppliedCollection_propertyInheritedFrom_Proxy(
    IRulesAppliedCollection* This,
    BSTR name,
    IRulesApplied **ppRulesApplied);
void __RPC_STUB IRulesAppliedCollection_propertyInheritedFrom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRulesAppliedCollection_get_propertyCount_Proxy(
    IRulesAppliedCollection* This,
    LONG *p);
void __RPC_STUB IRulesAppliedCollection_get_propertyCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRulesAppliedCollection_property_Proxy(
    IRulesAppliedCollection* This,
    LONG index,
    BSTR *pbstrProperty);
void __RPC_STUB IRulesAppliedCollection_property_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRulesAppliedCollection_propertyInheritedTrace_Proxy(
    IRulesAppliedCollection* This,
    BSTR name,
    LONG index,
    IRulesApplied **ppRulesApplied);
void __RPC_STUB IRulesAppliedCollection_propertyInheritedTrace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRulesAppliedCollection_propertyInheritedTraceLength_Proxy(
    IRulesAppliedCollection* This,
    BSTR name,
    LONG *pLength);
void __RPC_STUB IRulesAppliedCollection_propertyInheritedTraceLength_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IRulesAppliedCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLStyleSheetRulesAppliedCollection dispinterface
 */
#ifndef __DispHTMLStyleSheetRulesAppliedCollection_DISPINTERFACE_DEFINED__
#define __DispHTMLStyleSheetRulesAppliedCollection_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLStyleSheetRulesAppliedCollection, 0x3050f5a6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f5a6-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLStyleSheetRulesAppliedCollection : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLStyleSheetRulesAppliedCollection, 0x3050f5a6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLStyleSheetRulesAppliedCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLStyleSheetRulesAppliedCollection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLStyleSheetRulesAppliedCollection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLStyleSheetRulesAppliedCollection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLStyleSheetRulesAppliedCollection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLStyleSheetRulesAppliedCollection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLStyleSheetRulesAppliedCollection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLStyleSheetRulesAppliedCollection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLStyleSheetRulesAppliedCollectionVtbl;
interface DispHTMLStyleSheetRulesAppliedCollection {
    CONST_VTBL DispHTMLStyleSheetRulesAppliedCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLStyleSheetRulesAppliedCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLStyleSheetRulesAppliedCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLStyleSheetRulesAppliedCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLStyleSheetRulesAppliedCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLStyleSheetRulesAppliedCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLStyleSheetRulesAppliedCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLStyleSheetRulesAppliedCollection_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 DispHTMLStyleSheetRulesAppliedCollection_QueryInterface(DispHTMLStyleSheetRulesAppliedCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLStyleSheetRulesAppliedCollection_AddRef(DispHTMLStyleSheetRulesAppliedCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLStyleSheetRulesAppliedCollection_Release(DispHTMLStyleSheetRulesAppliedCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLStyleSheetRulesAppliedCollection_GetTypeInfoCount(DispHTMLStyleSheetRulesAppliedCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLStyleSheetRulesAppliedCollection_GetTypeInfo(DispHTMLStyleSheetRulesAppliedCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLStyleSheetRulesAppliedCollection_GetIDsOfNames(DispHTMLStyleSheetRulesAppliedCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLStyleSheetRulesAppliedCollection_Invoke(DispHTMLStyleSheetRulesAppliedCollection* 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  /* __DispHTMLStyleSheetRulesAppliedCollection_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLStyleSheetRulesAppliedCollection coclass
 */

DEFINE_GUID(CLSID_HTMLStyleSheetRulesAppliedCollection, 0xeb36f845, 0x2395, 0x4719, 0xb8,0x5c, 0xd0,0xd8,0x0e,0x18,0x4b,0xd9);

#ifdef __cplusplus
class DECLSPEC_UUID("eb36f845-2395-4719-b85c-d0d80e184bd9") HTMLStyleSheetRulesAppliedCollection;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLStyleSheetRulesAppliedCollection, 0xeb36f845, 0x2395, 0x4719, 0xb8,0x5c, 0xd0,0xd8,0x0e,0x18,0x4b,0xd9)
#endif
#endif

EXTERN_C const GUID CLSID_CHTMLStyleSheetRulesAppliedCollection;
/*****************************************************************************
 * DispRulesApplied dispinterface
 */
#ifndef __DispRulesApplied_DISPINTERFACE_DEFINED__
#define __DispRulesApplied_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispRulesApplied, 0x3050f5a5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f5a5-98b5-11cf-bb82-00aa00bdce0b")
DispRulesApplied : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispRulesApplied, 0x3050f5a5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispRulesAppliedVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispRulesApplied* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispRulesApplied* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispRulesApplied* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispRulesApplied* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispRulesApplied* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispRulesApplied* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispRulesApplied* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispRulesAppliedVtbl;
interface DispRulesApplied {
    CONST_VTBL DispRulesAppliedVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispRulesApplied_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispRulesApplied_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispRulesApplied_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispRulesApplied_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispRulesApplied_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispRulesApplied_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispRulesApplied_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 DispRulesApplied_QueryInterface(DispRulesApplied* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispRulesApplied_AddRef(DispRulesApplied* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispRulesApplied_Release(DispRulesApplied* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispRulesApplied_GetTypeInfoCount(DispRulesApplied* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispRulesApplied_GetTypeInfo(DispRulesApplied* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispRulesApplied_GetIDsOfNames(DispRulesApplied* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispRulesApplied_Invoke(DispRulesApplied* 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  /* __DispRulesApplied_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * RulesApplied coclass
 */

DEFINE_GUID(CLSID_RulesApplied, 0x7c803920, 0x7a53, 0x4d26, 0x98,0xac, 0xfd,0xd2,0x3e,0x6b,0x9e,0x01);

#ifdef __cplusplus
class DECLSPEC_UUID("7c803920-7a53-4d26-98ac-fdd23e6b9e01") RulesApplied;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(RulesApplied, 0x7c803920, 0x7a53, 0x4d26, 0x98,0xac, 0xfd,0xd2,0x3e,0x6b,0x9e,0x01)
#endif
#endif

EXTERN_C const GUID CLSID_CRulesApplied;
/*****************************************************************************
 * DispRulesAppliedCollection dispinterface
 */
#ifndef __DispRulesAppliedCollection_DISPINTERFACE_DEFINED__
#define __DispRulesAppliedCollection_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispRulesAppliedCollection, 0x3050f5a4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f5a4-98b5-11cf-bb82-00aa00bdce0b")
DispRulesAppliedCollection : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispRulesAppliedCollection, 0x3050f5a4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispRulesAppliedCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispRulesAppliedCollection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispRulesAppliedCollection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispRulesAppliedCollection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispRulesAppliedCollection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispRulesAppliedCollection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispRulesAppliedCollection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispRulesAppliedCollection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispRulesAppliedCollectionVtbl;
interface DispRulesAppliedCollection {
    CONST_VTBL DispRulesAppliedCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispRulesAppliedCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispRulesAppliedCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispRulesAppliedCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispRulesAppliedCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispRulesAppliedCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispRulesAppliedCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispRulesAppliedCollection_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 DispRulesAppliedCollection_QueryInterface(DispRulesAppliedCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispRulesAppliedCollection_AddRef(DispRulesAppliedCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispRulesAppliedCollection_Release(DispRulesAppliedCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispRulesAppliedCollection_GetTypeInfoCount(DispRulesAppliedCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispRulesAppliedCollection_GetTypeInfo(DispRulesAppliedCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispRulesAppliedCollection_GetIDsOfNames(DispRulesAppliedCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispRulesAppliedCollection_Invoke(DispRulesAppliedCollection* 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  /* __DispRulesAppliedCollection_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * RulesAppliedCollection coclass
 */

DEFINE_GUID(CLSID_RulesAppliedCollection, 0x671926ee, 0xc3cf, 0x40af, 0xbe,0x8f, 0x1c,0xba,0xee,0x64,0x86,0xe8);

#ifdef __cplusplus
class DECLSPEC_UUID("671926ee-c3cf-40af-be8f-1cbaee6486e8") RulesAppliedCollection;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(RulesAppliedCollection, 0x671926ee, 0xc3cf, 0x40af, 0xbe,0x8f, 0x1c,0xba,0xee,0x64,0x86,0xe8)
#endif
#endif

EXTERN_C const GUID CLSID_CRulesAppliedCollection;
/*****************************************************************************
 * DispHTMLW3CComputedStyle dispinterface
 */
#ifndef __DispHTMLW3CComputedStyle_DISPINTERFACE_DEFINED__
#define __DispHTMLW3CComputedStyle_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLW3CComputedStyle, 0x30590070, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590070-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLW3CComputedStyle : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLW3CComputedStyle, 0x30590070, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLW3CComputedStyleVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLW3CComputedStyle* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLW3CComputedStyle* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLW3CComputedStyle* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLW3CComputedStyle* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLW3CComputedStyle* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLW3CComputedStyle* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLW3CComputedStyle* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLW3CComputedStyleVtbl;
interface DispHTMLW3CComputedStyle {
    CONST_VTBL DispHTMLW3CComputedStyleVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLW3CComputedStyle_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLW3CComputedStyle_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLW3CComputedStyle_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLW3CComputedStyle_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLW3CComputedStyle_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLW3CComputedStyle_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLW3CComputedStyle_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 DispHTMLW3CComputedStyle_QueryInterface(DispHTMLW3CComputedStyle* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLW3CComputedStyle_AddRef(DispHTMLW3CComputedStyle* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLW3CComputedStyle_Release(DispHTMLW3CComputedStyle* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLW3CComputedStyle_GetTypeInfoCount(DispHTMLW3CComputedStyle* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLW3CComputedStyle_GetTypeInfo(DispHTMLW3CComputedStyle* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLW3CComputedStyle_GetIDsOfNames(DispHTMLW3CComputedStyle* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLW3CComputedStyle_Invoke(DispHTMLW3CComputedStyle* 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  /* __DispHTMLW3CComputedStyle_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLW3CComputedStyle coclass
 */

DEFINE_GUID(CLSID_HTMLW3CComputedStyle, 0x305106c8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305106c8-98b5-11cf-bb82-00aa00bdce0b") HTMLW3CComputedStyle;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLW3CComputedStyle, 0x305106c8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CW3CComputedStyle;
#ifndef __ISVGTransform_FWD_DEFINED__
#define __ISVGTransform_FWD_DEFINED__
typedef interface ISVGTransform ISVGTransform;
#endif

#ifndef __ISVGMatrix_FWD_DEFINED__
#define __ISVGMatrix_FWD_DEFINED__
typedef interface ISVGMatrix ISVGMatrix;
#endif

/*****************************************************************************
 * ISVGTransformList interface
 */
#ifndef __ISVGTransformList_INTERFACE_DEFINED__
#define __ISVGTransformList_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGTransformList, 0x305104f8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104f8-98b5-11cf-bb82-00aa00bdce0b")
ISVGTransformList : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_numberOfItems(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_numberOfItems(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE clear(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE initialize(
        ISVGTransform *newItem,
        ISVGTransform **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE getItem(
        LONG index,
        ISVGTransform **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE insertItemBefore(
        ISVGTransform *newItem,
        LONG index,
        ISVGTransform **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE replaceItem(
        ISVGTransform *newItem,
        LONG index,
        ISVGTransform **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeItem(
        LONG index,
        ISVGTransform **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE appendItem(
        ISVGTransform *newItem,
        ISVGTransform **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE createSVGTransformFromMatrix(
        ISVGMatrix *newItem,
        ISVGTransform **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE consolidate(
        ISVGTransform **ppResult) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGTransformList, 0x305104f8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGTransformListVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGTransformList* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGTransformList* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGTransformList* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGTransformList* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGTransformList* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGTransformList* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGTransformList* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGTransformList methods ***/
    HRESULT (STDMETHODCALLTYPE *put_numberOfItems)(
        ISVGTransformList* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_numberOfItems)(
        ISVGTransformList* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *clear)(
        ISVGTransformList* This);

    HRESULT (STDMETHODCALLTYPE *initialize)(
        ISVGTransformList* This,
        ISVGTransform *newItem,
        ISVGTransform **ppResult);

    HRESULT (STDMETHODCALLTYPE *getItem)(
        ISVGTransformList* This,
        LONG index,
        ISVGTransform **ppResult);

    HRESULT (STDMETHODCALLTYPE *insertItemBefore)(
        ISVGTransformList* This,
        ISVGTransform *newItem,
        LONG index,
        ISVGTransform **ppResult);

    HRESULT (STDMETHODCALLTYPE *replaceItem)(
        ISVGTransformList* This,
        ISVGTransform *newItem,
        LONG index,
        ISVGTransform **ppResult);

    HRESULT (STDMETHODCALLTYPE *removeItem)(
        ISVGTransformList* This,
        LONG index,
        ISVGTransform **ppResult);

    HRESULT (STDMETHODCALLTYPE *appendItem)(
        ISVGTransformList* This,
        ISVGTransform *newItem,
        ISVGTransform **ppResult);

    HRESULT (STDMETHODCALLTYPE *createSVGTransformFromMatrix)(
        ISVGTransformList* This,
        ISVGMatrix *newItem,
        ISVGTransform **ppResult);

    HRESULT (STDMETHODCALLTYPE *consolidate)(
        ISVGTransformList* This,
        ISVGTransform **ppResult);

    END_INTERFACE
} ISVGTransformListVtbl;
interface ISVGTransformList {
    CONST_VTBL ISVGTransformListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGTransformList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGTransformList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGTransformList_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGTransformList_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGTransformList_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGTransformList_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGTransformList_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGTransformList methods ***/
#define ISVGTransformList_put_numberOfItems(This,v) (This)->lpVtbl->put_numberOfItems(This,v)
#define ISVGTransformList_get_numberOfItems(This,p) (This)->lpVtbl->get_numberOfItems(This,p)
#define ISVGTransformList_clear(This) (This)->lpVtbl->clear(This)
#define ISVGTransformList_initialize(This,newItem,ppResult) (This)->lpVtbl->initialize(This,newItem,ppResult)
#define ISVGTransformList_getItem(This,index,ppResult) (This)->lpVtbl->getItem(This,index,ppResult)
#define ISVGTransformList_insertItemBefore(This,newItem,index,ppResult) (This)->lpVtbl->insertItemBefore(This,newItem,index,ppResult)
#define ISVGTransformList_replaceItem(This,newItem,index,ppResult) (This)->lpVtbl->replaceItem(This,newItem,index,ppResult)
#define ISVGTransformList_removeItem(This,index,ppResult) (This)->lpVtbl->removeItem(This,index,ppResult)
#define ISVGTransformList_appendItem(This,newItem,ppResult) (This)->lpVtbl->appendItem(This,newItem,ppResult)
#define ISVGTransformList_createSVGTransformFromMatrix(This,newItem,ppResult) (This)->lpVtbl->createSVGTransformFromMatrix(This,newItem,ppResult)
#define ISVGTransformList_consolidate(This,ppResult) (This)->lpVtbl->consolidate(This,ppResult)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGTransformList_QueryInterface(ISVGTransformList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGTransformList_AddRef(ISVGTransformList* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGTransformList_Release(ISVGTransformList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGTransformList_GetTypeInfoCount(ISVGTransformList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGTransformList_GetTypeInfo(ISVGTransformList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGTransformList_GetIDsOfNames(ISVGTransformList* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGTransformList_Invoke(ISVGTransformList* 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);
}
/*** ISVGTransformList methods ***/
static FORCEINLINE HRESULT ISVGTransformList_put_numberOfItems(ISVGTransformList* This,LONG v) {
    return This->lpVtbl->put_numberOfItems(This,v);
}
static FORCEINLINE HRESULT ISVGTransformList_get_numberOfItems(ISVGTransformList* This,LONG *p) {
    return This->lpVtbl->get_numberOfItems(This,p);
}
static FORCEINLINE HRESULT ISVGTransformList_clear(ISVGTransformList* This) {
    return This->lpVtbl->clear(This);
}
static FORCEINLINE HRESULT ISVGTransformList_initialize(ISVGTransformList* This,ISVGTransform *newItem,ISVGTransform **ppResult) {
    return This->lpVtbl->initialize(This,newItem,ppResult);
}
static FORCEINLINE HRESULT ISVGTransformList_getItem(ISVGTransformList* This,LONG index,ISVGTransform **ppResult) {
    return This->lpVtbl->getItem(This,index,ppResult);
}
static FORCEINLINE HRESULT ISVGTransformList_insertItemBefore(ISVGTransformList* This,ISVGTransform *newItem,LONG index,ISVGTransform **ppResult) {
    return This->lpVtbl->insertItemBefore(This,newItem,index,ppResult);
}
static FORCEINLINE HRESULT ISVGTransformList_replaceItem(ISVGTransformList* This,ISVGTransform *newItem,LONG index,ISVGTransform **ppResult) {
    return This->lpVtbl->replaceItem(This,newItem,index,ppResult);
}
static FORCEINLINE HRESULT ISVGTransformList_removeItem(ISVGTransformList* This,LONG index,ISVGTransform **ppResult) {
    return This->lpVtbl->removeItem(This,index,ppResult);
}
static FORCEINLINE HRESULT ISVGTransformList_appendItem(ISVGTransformList* This,ISVGTransform *newItem,ISVGTransform **ppResult) {
    return This->lpVtbl->appendItem(This,newItem,ppResult);
}
static FORCEINLINE HRESULT ISVGTransformList_createSVGTransformFromMatrix(ISVGTransformList* This,ISVGMatrix *newItem,ISVGTransform **ppResult) {
    return This->lpVtbl->createSVGTransformFromMatrix(This,newItem,ppResult);
}
static FORCEINLINE HRESULT ISVGTransformList_consolidate(ISVGTransformList* This,ISVGTransform **ppResult) {
    return This->lpVtbl->consolidate(This,ppResult);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGTransformList_put_numberOfItems_Proxy(
    ISVGTransformList* This,
    LONG v);
void __RPC_STUB ISVGTransformList_put_numberOfItems_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTransformList_get_numberOfItems_Proxy(
    ISVGTransformList* This,
    LONG *p);
void __RPC_STUB ISVGTransformList_get_numberOfItems_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTransformList_clear_Proxy(
    ISVGTransformList* This);
void __RPC_STUB ISVGTransformList_clear_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTransformList_initialize_Proxy(
    ISVGTransformList* This,
    ISVGTransform *newItem,
    ISVGTransform **ppResult);
void __RPC_STUB ISVGTransformList_initialize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTransformList_getItem_Proxy(
    ISVGTransformList* This,
    LONG index,
    ISVGTransform **ppResult);
void __RPC_STUB ISVGTransformList_getItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTransformList_insertItemBefore_Proxy(
    ISVGTransformList* This,
    ISVGTransform *newItem,
    LONG index,
    ISVGTransform **ppResult);
void __RPC_STUB ISVGTransformList_insertItemBefore_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTransformList_replaceItem_Proxy(
    ISVGTransformList* This,
    ISVGTransform *newItem,
    LONG index,
    ISVGTransform **ppResult);
void __RPC_STUB ISVGTransformList_replaceItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTransformList_removeItem_Proxy(
    ISVGTransformList* This,
    LONG index,
    ISVGTransform **ppResult);
void __RPC_STUB ISVGTransformList_removeItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTransformList_appendItem_Proxy(
    ISVGTransformList* This,
    ISVGTransform *newItem,
    ISVGTransform **ppResult);
void __RPC_STUB ISVGTransformList_appendItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTransformList_createSVGTransformFromMatrix_Proxy(
    ISVGTransformList* This,
    ISVGMatrix *newItem,
    ISVGTransform **ppResult);
void __RPC_STUB ISVGTransformList_createSVGTransformFromMatrix_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTransformList_consolidate_Proxy(
    ISVGTransformList* This,
    ISVGTransform **ppResult);
void __RPC_STUB ISVGTransformList_consolidate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGTransformList_INTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGTransformList coclass
 */

DEFINE_GUID(CLSID_SVGTransformList, 0x305105b0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105b0-98b5-11cf-bb82-00aa00bdce0b") SVGTransformList;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGTransformList, 0x305105b0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGTransformList;
#ifndef __ISVGPointList_FWD_DEFINED__
#define __ISVGPointList_FWD_DEFINED__
typedef interface ISVGPointList ISVGPointList;
#endif

/*****************************************************************************
 * ISVGAnimatedPoints interface
 */
#ifndef __ISVGAnimatedPoints_INTERFACE_DEFINED__
#define __ISVGAnimatedPoints_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGAnimatedPoints, 0x30510517, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510517-98b5-11cf-bb82-00aa00bdce0b")
ISVGAnimatedPoints : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_points(
        ISVGPointList *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_points(
        ISVGPointList **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_animatedPoints(
        ISVGPointList *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_animatedPoints(
        ISVGPointList **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGAnimatedPoints, 0x30510517, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGAnimatedPointsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGAnimatedPoints* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGAnimatedPoints* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGAnimatedPoints* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGAnimatedPoints* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGAnimatedPoints* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGAnimatedPoints* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGAnimatedPoints* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGAnimatedPoints methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_points)(
        ISVGAnimatedPoints* This,
        ISVGPointList *v);

    HRESULT (STDMETHODCALLTYPE *get_points)(
        ISVGAnimatedPoints* This,
        ISVGPointList **p);

    HRESULT (STDMETHODCALLTYPE *putref_animatedPoints)(
        ISVGAnimatedPoints* This,
        ISVGPointList *v);

    HRESULT (STDMETHODCALLTYPE *get_animatedPoints)(
        ISVGAnimatedPoints* This,
        ISVGPointList **p);

    END_INTERFACE
} ISVGAnimatedPointsVtbl;
interface ISVGAnimatedPoints {
    CONST_VTBL ISVGAnimatedPointsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGAnimatedPoints_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGAnimatedPoints_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGAnimatedPoints_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGAnimatedPoints_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGAnimatedPoints_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGAnimatedPoints_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGAnimatedPoints_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGAnimatedPoints methods ***/
#define ISVGAnimatedPoints_putref_points(This,v) (This)->lpVtbl->putref_points(This,v)
#define ISVGAnimatedPoints_get_points(This,p) (This)->lpVtbl->get_points(This,p)
#define ISVGAnimatedPoints_putref_animatedPoints(This,v) (This)->lpVtbl->putref_animatedPoints(This,v)
#define ISVGAnimatedPoints_get_animatedPoints(This,p) (This)->lpVtbl->get_animatedPoints(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGAnimatedPoints_QueryInterface(ISVGAnimatedPoints* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGAnimatedPoints_AddRef(ISVGAnimatedPoints* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGAnimatedPoints_Release(ISVGAnimatedPoints* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGAnimatedPoints_GetTypeInfoCount(ISVGAnimatedPoints* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGAnimatedPoints_GetTypeInfo(ISVGAnimatedPoints* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGAnimatedPoints_GetIDsOfNames(ISVGAnimatedPoints* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGAnimatedPoints_Invoke(ISVGAnimatedPoints* 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);
}
/*** ISVGAnimatedPoints methods ***/
static FORCEINLINE HRESULT ISVGAnimatedPoints_putref_points(ISVGAnimatedPoints* This,ISVGPointList *v) {
    return This->lpVtbl->putref_points(This,v);
}
static FORCEINLINE HRESULT ISVGAnimatedPoints_get_points(ISVGAnimatedPoints* This,ISVGPointList **p) {
    return This->lpVtbl->get_points(This,p);
}
static FORCEINLINE HRESULT ISVGAnimatedPoints_putref_animatedPoints(ISVGAnimatedPoints* This,ISVGPointList *v) {
    return This->lpVtbl->putref_animatedPoints(This,v);
}
static FORCEINLINE HRESULT ISVGAnimatedPoints_get_animatedPoints(ISVGAnimatedPoints* This,ISVGPointList **p) {
    return This->lpVtbl->get_animatedPoints(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGAnimatedPoints_putref_points_Proxy(
    ISVGAnimatedPoints* This,
    ISVGPointList *v);
void __RPC_STUB ISVGAnimatedPoints_putref_points_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedPoints_get_points_Proxy(
    ISVGAnimatedPoints* This,
    ISVGPointList **p);
void __RPC_STUB ISVGAnimatedPoints_get_points_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedPoints_putref_animatedPoints_Proxy(
    ISVGAnimatedPoints* This,
    ISVGPointList *v);
void __RPC_STUB ISVGAnimatedPoints_putref_animatedPoints_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedPoints_get_animatedPoints_Proxy(
    ISVGAnimatedPoints* This,
    ISVGPointList **p);
void __RPC_STUB ISVGAnimatedPoints_get_animatedPoints_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGAnimatedPoints_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGCircleElement interface
 */
#ifndef __ISVGCircleElement_INTERFACE_DEFINED__
#define __ISVGCircleElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGCircleElement, 0x30510514, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510514-98b5-11cf-bb82-00aa00bdce0b")
ISVGCircleElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_cx(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cx(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_cy(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cy(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_r(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_r(
        ISVGAnimatedLength **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGCircleElement, 0x30510514, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGCircleElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGCircleElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGCircleElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGCircleElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGCircleElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGCircleElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGCircleElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGCircleElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGCircleElement methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_cx)(
        ISVGCircleElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_cx)(
        ISVGCircleElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_cy)(
        ISVGCircleElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_cy)(
        ISVGCircleElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_r)(
        ISVGCircleElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_r)(
        ISVGCircleElement* This,
        ISVGAnimatedLength **p);

    END_INTERFACE
} ISVGCircleElementVtbl;
interface ISVGCircleElement {
    CONST_VTBL ISVGCircleElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGCircleElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGCircleElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGCircleElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGCircleElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGCircleElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGCircleElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGCircleElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGCircleElement methods ***/
#define ISVGCircleElement_putref_cx(This,v) (This)->lpVtbl->putref_cx(This,v)
#define ISVGCircleElement_get_cx(This,p) (This)->lpVtbl->get_cx(This,p)
#define ISVGCircleElement_putref_cy(This,v) (This)->lpVtbl->putref_cy(This,v)
#define ISVGCircleElement_get_cy(This,p) (This)->lpVtbl->get_cy(This,p)
#define ISVGCircleElement_putref_r(This,v) (This)->lpVtbl->putref_r(This,v)
#define ISVGCircleElement_get_r(This,p) (This)->lpVtbl->get_r(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGCircleElement_QueryInterface(ISVGCircleElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGCircleElement_AddRef(ISVGCircleElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGCircleElement_Release(ISVGCircleElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGCircleElement_GetTypeInfoCount(ISVGCircleElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGCircleElement_GetTypeInfo(ISVGCircleElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGCircleElement_GetIDsOfNames(ISVGCircleElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGCircleElement_Invoke(ISVGCircleElement* 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);
}
/*** ISVGCircleElement methods ***/
static FORCEINLINE HRESULT ISVGCircleElement_putref_cx(ISVGCircleElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_cx(This,v);
}
static FORCEINLINE HRESULT ISVGCircleElement_get_cx(ISVGCircleElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_cx(This,p);
}
static FORCEINLINE HRESULT ISVGCircleElement_putref_cy(ISVGCircleElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_cy(This,v);
}
static FORCEINLINE HRESULT ISVGCircleElement_get_cy(ISVGCircleElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_cy(This,p);
}
static FORCEINLINE HRESULT ISVGCircleElement_putref_r(ISVGCircleElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_r(This,v);
}
static FORCEINLINE HRESULT ISVGCircleElement_get_r(ISVGCircleElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_r(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGCircleElement_putref_cx_Proxy(
    ISVGCircleElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGCircleElement_putref_cx_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGCircleElement_get_cx_Proxy(
    ISVGCircleElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGCircleElement_get_cx_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGCircleElement_putref_cy_Proxy(
    ISVGCircleElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGCircleElement_putref_cy_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGCircleElement_get_cy_Proxy(
    ISVGCircleElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGCircleElement_get_cy_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGCircleElement_putref_r_Proxy(
    ISVGCircleElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGCircleElement_putref_r_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGCircleElement_get_r_Proxy(
    ISVGCircleElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGCircleElement_get_r_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGCircleElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGEllipseElement interface
 */
#ifndef __ISVGEllipseElement_INTERFACE_DEFINED__
#define __ISVGEllipseElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGEllipseElement, 0x30510515, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510515-98b5-11cf-bb82-00aa00bdce0b")
ISVGEllipseElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_cx(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cx(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_cy(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cy(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_rx(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_rx(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_ry(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ry(
        ISVGAnimatedLength **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGEllipseElement, 0x30510515, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGEllipseElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGEllipseElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGEllipseElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGEllipseElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGEllipseElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGEllipseElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGEllipseElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGEllipseElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGEllipseElement methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_cx)(
        ISVGEllipseElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_cx)(
        ISVGEllipseElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_cy)(
        ISVGEllipseElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_cy)(
        ISVGEllipseElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_rx)(
        ISVGEllipseElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_rx)(
        ISVGEllipseElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_ry)(
        ISVGEllipseElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_ry)(
        ISVGEllipseElement* This,
        ISVGAnimatedLength **p);

    END_INTERFACE
} ISVGEllipseElementVtbl;
interface ISVGEllipseElement {
    CONST_VTBL ISVGEllipseElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGEllipseElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGEllipseElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGEllipseElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGEllipseElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGEllipseElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGEllipseElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGEllipseElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGEllipseElement methods ***/
#define ISVGEllipseElement_putref_cx(This,v) (This)->lpVtbl->putref_cx(This,v)
#define ISVGEllipseElement_get_cx(This,p) (This)->lpVtbl->get_cx(This,p)
#define ISVGEllipseElement_putref_cy(This,v) (This)->lpVtbl->putref_cy(This,v)
#define ISVGEllipseElement_get_cy(This,p) (This)->lpVtbl->get_cy(This,p)
#define ISVGEllipseElement_putref_rx(This,v) (This)->lpVtbl->putref_rx(This,v)
#define ISVGEllipseElement_get_rx(This,p) (This)->lpVtbl->get_rx(This,p)
#define ISVGEllipseElement_putref_ry(This,v) (This)->lpVtbl->putref_ry(This,v)
#define ISVGEllipseElement_get_ry(This,p) (This)->lpVtbl->get_ry(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGEllipseElement_QueryInterface(ISVGEllipseElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGEllipseElement_AddRef(ISVGEllipseElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGEllipseElement_Release(ISVGEllipseElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGEllipseElement_GetTypeInfoCount(ISVGEllipseElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGEllipseElement_GetTypeInfo(ISVGEllipseElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGEllipseElement_GetIDsOfNames(ISVGEllipseElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGEllipseElement_Invoke(ISVGEllipseElement* 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);
}
/*** ISVGEllipseElement methods ***/
static FORCEINLINE HRESULT ISVGEllipseElement_putref_cx(ISVGEllipseElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_cx(This,v);
}
static FORCEINLINE HRESULT ISVGEllipseElement_get_cx(ISVGEllipseElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_cx(This,p);
}
static FORCEINLINE HRESULT ISVGEllipseElement_putref_cy(ISVGEllipseElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_cy(This,v);
}
static FORCEINLINE HRESULT ISVGEllipseElement_get_cy(ISVGEllipseElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_cy(This,p);
}
static FORCEINLINE HRESULT ISVGEllipseElement_putref_rx(ISVGEllipseElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_rx(This,v);
}
static FORCEINLINE HRESULT ISVGEllipseElement_get_rx(ISVGEllipseElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_rx(This,p);
}
static FORCEINLINE HRESULT ISVGEllipseElement_putref_ry(ISVGEllipseElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_ry(This,v);
}
static FORCEINLINE HRESULT ISVGEllipseElement_get_ry(ISVGEllipseElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_ry(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGEllipseElement_putref_cx_Proxy(
    ISVGEllipseElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGEllipseElement_putref_cx_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGEllipseElement_get_cx_Proxy(
    ISVGEllipseElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGEllipseElement_get_cx_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGEllipseElement_putref_cy_Proxy(
    ISVGEllipseElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGEllipseElement_putref_cy_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGEllipseElement_get_cy_Proxy(
    ISVGEllipseElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGEllipseElement_get_cy_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGEllipseElement_putref_rx_Proxy(
    ISVGEllipseElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGEllipseElement_putref_rx_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGEllipseElement_get_rx_Proxy(
    ISVGEllipseElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGEllipseElement_get_rx_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGEllipseElement_putref_ry_Proxy(
    ISVGEllipseElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGEllipseElement_putref_ry_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGEllipseElement_get_ry_Proxy(
    ISVGEllipseElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGEllipseElement_get_ry_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGEllipseElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGLineElement interface
 */
#ifndef __ISVGLineElement_INTERFACE_DEFINED__
#define __ISVGLineElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGLineElement, 0x30510516, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510516-98b5-11cf-bb82-00aa00bdce0b")
ISVGLineElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_x1(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x1(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_y1(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y1(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_x2(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x2(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_y2(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y2(
        ISVGAnimatedLength **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGLineElement, 0x30510516, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGLineElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGLineElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGLineElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGLineElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGLineElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGLineElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGLineElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGLineElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGLineElement methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_x1)(
        ISVGLineElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_x1)(
        ISVGLineElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_y1)(
        ISVGLineElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_y1)(
        ISVGLineElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_x2)(
        ISVGLineElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_x2)(
        ISVGLineElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_y2)(
        ISVGLineElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_y2)(
        ISVGLineElement* This,
        ISVGAnimatedLength **p);

    END_INTERFACE
} ISVGLineElementVtbl;
interface ISVGLineElement {
    CONST_VTBL ISVGLineElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGLineElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGLineElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGLineElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGLineElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGLineElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGLineElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGLineElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGLineElement methods ***/
#define ISVGLineElement_putref_x1(This,v) (This)->lpVtbl->putref_x1(This,v)
#define ISVGLineElement_get_x1(This,p) (This)->lpVtbl->get_x1(This,p)
#define ISVGLineElement_putref_y1(This,v) (This)->lpVtbl->putref_y1(This,v)
#define ISVGLineElement_get_y1(This,p) (This)->lpVtbl->get_y1(This,p)
#define ISVGLineElement_putref_x2(This,v) (This)->lpVtbl->putref_x2(This,v)
#define ISVGLineElement_get_x2(This,p) (This)->lpVtbl->get_x2(This,p)
#define ISVGLineElement_putref_y2(This,v) (This)->lpVtbl->putref_y2(This,v)
#define ISVGLineElement_get_y2(This,p) (This)->lpVtbl->get_y2(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGLineElement_QueryInterface(ISVGLineElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGLineElement_AddRef(ISVGLineElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGLineElement_Release(ISVGLineElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGLineElement_GetTypeInfoCount(ISVGLineElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGLineElement_GetTypeInfo(ISVGLineElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGLineElement_GetIDsOfNames(ISVGLineElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGLineElement_Invoke(ISVGLineElement* 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);
}
/*** ISVGLineElement methods ***/
static FORCEINLINE HRESULT ISVGLineElement_putref_x1(ISVGLineElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_x1(This,v);
}
static FORCEINLINE HRESULT ISVGLineElement_get_x1(ISVGLineElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_x1(This,p);
}
static FORCEINLINE HRESULT ISVGLineElement_putref_y1(ISVGLineElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_y1(This,v);
}
static FORCEINLINE HRESULT ISVGLineElement_get_y1(ISVGLineElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_y1(This,p);
}
static FORCEINLINE HRESULT ISVGLineElement_putref_x2(ISVGLineElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_x2(This,v);
}
static FORCEINLINE HRESULT ISVGLineElement_get_x2(ISVGLineElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_x2(This,p);
}
static FORCEINLINE HRESULT ISVGLineElement_putref_y2(ISVGLineElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_y2(This,v);
}
static FORCEINLINE HRESULT ISVGLineElement_get_y2(ISVGLineElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_y2(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGLineElement_putref_x1_Proxy(
    ISVGLineElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGLineElement_putref_x1_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLineElement_get_x1_Proxy(
    ISVGLineElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGLineElement_get_x1_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLineElement_putref_y1_Proxy(
    ISVGLineElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGLineElement_putref_y1_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLineElement_get_y1_Proxy(
    ISVGLineElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGLineElement_get_y1_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLineElement_putref_x2_Proxy(
    ISVGLineElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGLineElement_putref_x2_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLineElement_get_x2_Proxy(
    ISVGLineElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGLineElement_get_x2_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLineElement_putref_y2_Proxy(
    ISVGLineElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGLineElement_putref_y2_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLineElement_get_y2_Proxy(
    ISVGLineElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGLineElement_get_y2_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGLineElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGRectElement interface
 */
#ifndef __ISVGRectElement_INTERFACE_DEFINED__
#define __ISVGRectElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGRectElement, 0x30510513, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510513-98b5-11cf-bb82-00aa00bdce0b")
ISVGRectElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_x(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_y(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_width(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_width(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_height(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_height(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_rx(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_rx(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_ry(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ry(
        ISVGAnimatedLength **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGRectElement, 0x30510513, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGRectElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGRectElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGRectElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGRectElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGRectElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGRectElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGRectElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGRectElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGRectElement methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_x)(
        ISVGRectElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_x)(
        ISVGRectElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_y)(
        ISVGRectElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_y)(
        ISVGRectElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_width)(
        ISVGRectElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_width)(
        ISVGRectElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_height)(
        ISVGRectElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_height)(
        ISVGRectElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_rx)(
        ISVGRectElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_rx)(
        ISVGRectElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_ry)(
        ISVGRectElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_ry)(
        ISVGRectElement* This,
        ISVGAnimatedLength **p);

    END_INTERFACE
} ISVGRectElementVtbl;
interface ISVGRectElement {
    CONST_VTBL ISVGRectElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGRectElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGRectElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGRectElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGRectElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGRectElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGRectElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGRectElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGRectElement methods ***/
#define ISVGRectElement_putref_x(This,v) (This)->lpVtbl->putref_x(This,v)
#define ISVGRectElement_get_x(This,p) (This)->lpVtbl->get_x(This,p)
#define ISVGRectElement_putref_y(This,v) (This)->lpVtbl->putref_y(This,v)
#define ISVGRectElement_get_y(This,p) (This)->lpVtbl->get_y(This,p)
#define ISVGRectElement_putref_width(This,v) (This)->lpVtbl->putref_width(This,v)
#define ISVGRectElement_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#define ISVGRectElement_putref_height(This,v) (This)->lpVtbl->putref_height(This,v)
#define ISVGRectElement_get_height(This,p) (This)->lpVtbl->get_height(This,p)
#define ISVGRectElement_putref_rx(This,v) (This)->lpVtbl->putref_rx(This,v)
#define ISVGRectElement_get_rx(This,p) (This)->lpVtbl->get_rx(This,p)
#define ISVGRectElement_putref_ry(This,v) (This)->lpVtbl->putref_ry(This,v)
#define ISVGRectElement_get_ry(This,p) (This)->lpVtbl->get_ry(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGRectElement_QueryInterface(ISVGRectElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGRectElement_AddRef(ISVGRectElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGRectElement_Release(ISVGRectElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGRectElement_GetTypeInfoCount(ISVGRectElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGRectElement_GetTypeInfo(ISVGRectElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGRectElement_GetIDsOfNames(ISVGRectElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGRectElement_Invoke(ISVGRectElement* 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);
}
/*** ISVGRectElement methods ***/
static FORCEINLINE HRESULT ISVGRectElement_putref_x(ISVGRectElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_x(This,v);
}
static FORCEINLINE HRESULT ISVGRectElement_get_x(ISVGRectElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_x(This,p);
}
static FORCEINLINE HRESULT ISVGRectElement_putref_y(ISVGRectElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_y(This,v);
}
static FORCEINLINE HRESULT ISVGRectElement_get_y(ISVGRectElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_y(This,p);
}
static FORCEINLINE HRESULT ISVGRectElement_putref_width(ISVGRectElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_width(This,v);
}
static FORCEINLINE HRESULT ISVGRectElement_get_width(ISVGRectElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_width(This,p);
}
static FORCEINLINE HRESULT ISVGRectElement_putref_height(ISVGRectElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_height(This,v);
}
static FORCEINLINE HRESULT ISVGRectElement_get_height(ISVGRectElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_height(This,p);
}
static FORCEINLINE HRESULT ISVGRectElement_putref_rx(ISVGRectElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_rx(This,v);
}
static FORCEINLINE HRESULT ISVGRectElement_get_rx(ISVGRectElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_rx(This,p);
}
static FORCEINLINE HRESULT ISVGRectElement_putref_ry(ISVGRectElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_ry(This,v);
}
static FORCEINLINE HRESULT ISVGRectElement_get_ry(ISVGRectElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_ry(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGRectElement_putref_x_Proxy(
    ISVGRectElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGRectElement_putref_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGRectElement_get_x_Proxy(
    ISVGRectElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGRectElement_get_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGRectElement_putref_y_Proxy(
    ISVGRectElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGRectElement_putref_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGRectElement_get_y_Proxy(
    ISVGRectElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGRectElement_get_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGRectElement_putref_width_Proxy(
    ISVGRectElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGRectElement_putref_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGRectElement_get_width_Proxy(
    ISVGRectElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGRectElement_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGRectElement_putref_height_Proxy(
    ISVGRectElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGRectElement_putref_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGRectElement_get_height_Proxy(
    ISVGRectElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGRectElement_get_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGRectElement_putref_rx_Proxy(
    ISVGRectElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGRectElement_putref_rx_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGRectElement_get_rx_Proxy(
    ISVGRectElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGRectElement_get_rx_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGRectElement_putref_ry_Proxy(
    ISVGRectElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGRectElement_putref_ry_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGRectElement_get_ry_Proxy(
    ISVGRectElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGRectElement_get_ry_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGRectElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGPolygonElement interface
 */
#ifndef __ISVGPolygonElement_INTERFACE_DEFINED__
#define __ISVGPolygonElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGPolygonElement, 0x30510519, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510519-98b5-11cf-bb82-00aa00bdce0b")
ISVGPolygonElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGPolygonElement, 0x30510519, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGPolygonElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGPolygonElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGPolygonElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGPolygonElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGPolygonElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGPolygonElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGPolygonElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGPolygonElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} ISVGPolygonElementVtbl;
interface ISVGPolygonElement {
    CONST_VTBL ISVGPolygonElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGPolygonElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGPolygonElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGPolygonElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGPolygonElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGPolygonElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGPolygonElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGPolygonElement_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 ISVGPolygonElement_QueryInterface(ISVGPolygonElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGPolygonElement_AddRef(ISVGPolygonElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGPolygonElement_Release(ISVGPolygonElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGPolygonElement_GetTypeInfoCount(ISVGPolygonElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGPolygonElement_GetTypeInfo(ISVGPolygonElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGPolygonElement_GetIDsOfNames(ISVGPolygonElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGPolygonElement_Invoke(ISVGPolygonElement* 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  /* __ISVGPolygonElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGPolylineElement interface
 */
#ifndef __ISVGPolylineElement_INTERFACE_DEFINED__
#define __ISVGPolylineElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGPolylineElement, 0x30510518, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510518-98b5-11cf-bb82-00aa00bdce0b")
ISVGPolylineElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGPolylineElement, 0x30510518, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGPolylineElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGPolylineElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGPolylineElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGPolylineElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGPolylineElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGPolylineElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGPolylineElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGPolylineElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} ISVGPolylineElementVtbl;
interface ISVGPolylineElement {
    CONST_VTBL ISVGPolylineElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGPolylineElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGPolylineElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGPolylineElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGPolylineElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGPolylineElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGPolylineElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGPolylineElement_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 ISVGPolylineElement_QueryInterface(ISVGPolylineElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGPolylineElement_AddRef(ISVGPolylineElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGPolylineElement_Release(ISVGPolylineElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGPolylineElement_GetTypeInfoCount(ISVGPolylineElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGPolylineElement_GetTypeInfo(ISVGPolylineElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGPolylineElement_GetIDsOfNames(ISVGPolylineElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGPolylineElement_Invoke(ISVGPolylineElement* 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  /* __ISVGPolylineElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGCircleElement dispinterface
 */
#ifndef __DispSVGCircleElement_DISPINTERFACE_DEFINED__
#define __DispSVGCircleElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGCircleElement, 0x3059000a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059000a-98b5-11cf-bb82-00aa00bdce0b")
DispSVGCircleElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGCircleElement, 0x3059000a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGCircleElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGCircleElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGCircleElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGCircleElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGCircleElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGCircleElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGCircleElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGCircleElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGCircleElementVtbl;
interface DispSVGCircleElement {
    CONST_VTBL DispSVGCircleElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGCircleElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGCircleElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGCircleElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGCircleElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGCircleElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGCircleElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGCircleElement_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 DispSVGCircleElement_QueryInterface(DispSVGCircleElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGCircleElement_AddRef(DispSVGCircleElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGCircleElement_Release(DispSVGCircleElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGCircleElement_GetTypeInfoCount(DispSVGCircleElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGCircleElement_GetTypeInfo(DispSVGCircleElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGCircleElement_GetIDsOfNames(DispSVGCircleElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGCircleElement_Invoke(DispSVGCircleElement* 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  /* __DispSVGCircleElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGCircleElement coclass
 */

DEFINE_GUID(CLSID_SVGCircleElement, 0x30510578, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510578-98b5-11cf-bb82-00aa00bdce0b") SVGCircleElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGCircleElement, 0x30510578, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGCircleElement;
/*****************************************************************************
 * DispSVGEllipseElement dispinterface
 */
#ifndef __DispSVGEllipseElement_DISPINTERFACE_DEFINED__
#define __DispSVGEllipseElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGEllipseElement, 0x3059000b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059000b-98b5-11cf-bb82-00aa00bdce0b")
DispSVGEllipseElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGEllipseElement, 0x3059000b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGEllipseElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGEllipseElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGEllipseElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGEllipseElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGEllipseElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGEllipseElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGEllipseElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGEllipseElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGEllipseElementVtbl;
interface DispSVGEllipseElement {
    CONST_VTBL DispSVGEllipseElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGEllipseElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGEllipseElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGEllipseElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGEllipseElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGEllipseElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGEllipseElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGEllipseElement_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 DispSVGEllipseElement_QueryInterface(DispSVGEllipseElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGEllipseElement_AddRef(DispSVGEllipseElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGEllipseElement_Release(DispSVGEllipseElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGEllipseElement_GetTypeInfoCount(DispSVGEllipseElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGEllipseElement_GetTypeInfo(DispSVGEllipseElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGEllipseElement_GetIDsOfNames(DispSVGEllipseElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGEllipseElement_Invoke(DispSVGEllipseElement* 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  /* __DispSVGEllipseElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGEllipseElement coclass
 */

DEFINE_GUID(CLSID_SVGEllipseElement, 0x30510579, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510579-98b5-11cf-bb82-00aa00bdce0b") SVGEllipseElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGEllipseElement, 0x30510579, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGEllipseElement;
/*****************************************************************************
 * DispSVGLineElement dispinterface
 */
#ifndef __DispSVGLineElement_DISPINTERFACE_DEFINED__
#define __DispSVGLineElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGLineElement, 0x3059000c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059000c-98b5-11cf-bb82-00aa00bdce0b")
DispSVGLineElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGLineElement, 0x3059000c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGLineElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGLineElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGLineElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGLineElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGLineElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGLineElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGLineElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGLineElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGLineElementVtbl;
interface DispSVGLineElement {
    CONST_VTBL DispSVGLineElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGLineElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGLineElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGLineElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGLineElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGLineElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGLineElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGLineElement_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 DispSVGLineElement_QueryInterface(DispSVGLineElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGLineElement_AddRef(DispSVGLineElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGLineElement_Release(DispSVGLineElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGLineElement_GetTypeInfoCount(DispSVGLineElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGLineElement_GetTypeInfo(DispSVGLineElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGLineElement_GetIDsOfNames(DispSVGLineElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGLineElement_Invoke(DispSVGLineElement* 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  /* __DispSVGLineElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGLineElement coclass
 */

DEFINE_GUID(CLSID_SVGLineElement, 0x3051057a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3051057a-98b5-11cf-bb82-00aa00bdce0b") SVGLineElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGLineElement, 0x3051057a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGLineElement;
/*****************************************************************************
 * DispSVGRectElement dispinterface
 */
#ifndef __DispSVGRectElement_DISPINTERFACE_DEFINED__
#define __DispSVGRectElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGRectElement, 0x30590009, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590009-98b5-11cf-bb82-00aa00bdce0b")
DispSVGRectElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGRectElement, 0x30590009, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGRectElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGRectElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGRectElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGRectElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGRectElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGRectElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGRectElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGRectElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGRectElementVtbl;
interface DispSVGRectElement {
    CONST_VTBL DispSVGRectElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGRectElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGRectElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGRectElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGRectElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGRectElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGRectElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGRectElement_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 DispSVGRectElement_QueryInterface(DispSVGRectElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGRectElement_AddRef(DispSVGRectElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGRectElement_Release(DispSVGRectElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGRectElement_GetTypeInfoCount(DispSVGRectElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGRectElement_GetTypeInfo(DispSVGRectElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGRectElement_GetIDsOfNames(DispSVGRectElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGRectElement_Invoke(DispSVGRectElement* 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  /* __DispSVGRectElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGRectElement coclass
 */

DEFINE_GUID(CLSID_SVGRectElement, 0x30510577, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510577-98b5-11cf-bb82-00aa00bdce0b") SVGRectElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGRectElement, 0x30510577, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGRectElement;
/*****************************************************************************
 * DispSVGPolygonElement dispinterface
 */
#ifndef __DispSVGPolygonElement_DISPINTERFACE_DEFINED__
#define __DispSVGPolygonElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGPolygonElement, 0x3059000d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059000d-98b5-11cf-bb82-00aa00bdce0b")
DispSVGPolygonElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGPolygonElement, 0x3059000d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGPolygonElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGPolygonElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGPolygonElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGPolygonElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGPolygonElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGPolygonElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGPolygonElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGPolygonElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGPolygonElementVtbl;
interface DispSVGPolygonElement {
    CONST_VTBL DispSVGPolygonElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGPolygonElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGPolygonElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGPolygonElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGPolygonElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGPolygonElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGPolygonElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGPolygonElement_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 DispSVGPolygonElement_QueryInterface(DispSVGPolygonElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGPolygonElement_AddRef(DispSVGPolygonElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGPolygonElement_Release(DispSVGPolygonElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGPolygonElement_GetTypeInfoCount(DispSVGPolygonElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGPolygonElement_GetTypeInfo(DispSVGPolygonElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGPolygonElement_GetIDsOfNames(DispSVGPolygonElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGPolygonElement_Invoke(DispSVGPolygonElement* 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  /* __DispSVGPolygonElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGPolygonElement coclass
 */

DEFINE_GUID(CLSID_SVGPolygonElement, 0x3051057b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3051057b-98b5-11cf-bb82-00aa00bdce0b") SVGPolygonElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGPolygonElement, 0x3051057b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGPolygonElement;
/*****************************************************************************
 * DispSVGPolylineElement dispinterface
 */
#ifndef __DispSVGPolylineElement_DISPINTERFACE_DEFINED__
#define __DispSVGPolylineElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGPolylineElement, 0x3059000e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059000e-98b5-11cf-bb82-00aa00bdce0b")
DispSVGPolylineElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGPolylineElement, 0x3059000e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGPolylineElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGPolylineElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGPolylineElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGPolylineElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGPolylineElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGPolylineElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGPolylineElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGPolylineElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGPolylineElementVtbl;
interface DispSVGPolylineElement {
    CONST_VTBL DispSVGPolylineElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGPolylineElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGPolylineElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGPolylineElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGPolylineElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGPolylineElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGPolylineElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGPolylineElement_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 DispSVGPolylineElement_QueryInterface(DispSVGPolylineElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGPolylineElement_AddRef(DispSVGPolylineElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGPolylineElement_Release(DispSVGPolylineElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGPolylineElement_GetTypeInfoCount(DispSVGPolylineElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGPolylineElement_GetTypeInfo(DispSVGPolylineElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGPolylineElement_GetIDsOfNames(DispSVGPolylineElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGPolylineElement_Invoke(DispSVGPolylineElement* 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  /* __DispSVGPolylineElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGPolylineElement coclass
 */

DEFINE_GUID(CLSID_SVGPolylineElement, 0x3051057c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3051057c-98b5-11cf-bb82-00aa00bdce0b") SVGPolylineElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGPolylineElement, 0x3051057c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGPolylineElement;
/*****************************************************************************
 * ISVGGElement interface
 */
#ifndef __ISVGGElement_INTERFACE_DEFINED__
#define __ISVGGElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGGElement, 0x305104e8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104e8-98b5-11cf-bb82-00aa00bdce0b")
ISVGGElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGGElement, 0x305104e8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGGElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGGElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGGElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGGElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGGElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGGElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGGElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGGElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} ISVGGElementVtbl;
interface ISVGGElement {
    CONST_VTBL ISVGGElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGGElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGGElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGGElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGGElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGGElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGGElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGGElement_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 ISVGGElement_QueryInterface(ISVGGElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGGElement_AddRef(ISVGGElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGGElement_Release(ISVGGElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGGElement_GetTypeInfoCount(ISVGGElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGGElement_GetTypeInfo(ISVGGElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGGElement_GetIDsOfNames(ISVGGElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGGElement_Invoke(ISVGGElement* 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  /* __ISVGGElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGGElement dispinterface
 */
#ifndef __DispSVGGElement_DISPINTERFACE_DEFINED__
#define __DispSVGGElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGGElement, 0x30590002, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590002-98b5-11cf-bb82-00aa00bdce0b")
DispSVGGElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGGElement, 0x30590002, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGGElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGGElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGGElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGGElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGGElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGGElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGGElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGGElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGGElementVtbl;
interface DispSVGGElement {
    CONST_VTBL DispSVGGElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGGElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGGElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGGElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGGElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGGElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGGElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGGElement_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 DispSVGGElement_QueryInterface(DispSVGGElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGGElement_AddRef(DispSVGGElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGGElement_Release(DispSVGGElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGGElement_GetTypeInfoCount(DispSVGGElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGGElement_GetTypeInfo(DispSVGGElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGGElement_GetIDsOfNames(DispSVGGElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGGElement_Invoke(DispSVGGElement* 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  /* __DispSVGGElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGGElement coclass
 */

DEFINE_GUID(CLSID_SVGGElement, 0x3051056f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3051056f-98b5-11cf-bb82-00aa00bdce0b") SVGGElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGGElement, 0x3051056f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGGElement;
/*****************************************************************************
 * ISVGSymbolElement interface
 */
#ifndef __ISVGSymbolElement_INTERFACE_DEFINED__
#define __ISVGSymbolElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGSymbolElement, 0x305104ec, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104ec-98b5-11cf-bb82-00aa00bdce0b")
ISVGSymbolElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGSymbolElement, 0x305104ec, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGSymbolElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGSymbolElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGSymbolElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGSymbolElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGSymbolElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGSymbolElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGSymbolElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGSymbolElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} ISVGSymbolElementVtbl;
interface ISVGSymbolElement {
    CONST_VTBL ISVGSymbolElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGSymbolElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGSymbolElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGSymbolElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGSymbolElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGSymbolElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGSymbolElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGSymbolElement_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 ISVGSymbolElement_QueryInterface(ISVGSymbolElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGSymbolElement_AddRef(ISVGSymbolElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGSymbolElement_Release(ISVGSymbolElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGSymbolElement_GetTypeInfoCount(ISVGSymbolElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGSymbolElement_GetTypeInfo(ISVGSymbolElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGSymbolElement_GetIDsOfNames(ISVGSymbolElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGSymbolElement_Invoke(ISVGSymbolElement* 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  /* __ISVGSymbolElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGSymbolElement dispinterface
 */
#ifndef __DispSVGSymbolElement_DISPINTERFACE_DEFINED__
#define __DispSVGSymbolElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGSymbolElement, 0x30590004, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590004-98b5-11cf-bb82-00aa00bdce0b")
DispSVGSymbolElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGSymbolElement, 0x30590004, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGSymbolElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGSymbolElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGSymbolElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGSymbolElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGSymbolElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGSymbolElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGSymbolElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGSymbolElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGSymbolElementVtbl;
interface DispSVGSymbolElement {
    CONST_VTBL DispSVGSymbolElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGSymbolElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGSymbolElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGSymbolElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGSymbolElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGSymbolElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGSymbolElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGSymbolElement_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 DispSVGSymbolElement_QueryInterface(DispSVGSymbolElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGSymbolElement_AddRef(DispSVGSymbolElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGSymbolElement_Release(DispSVGSymbolElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGSymbolElement_GetTypeInfoCount(DispSVGSymbolElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGSymbolElement_GetTypeInfo(DispSVGSymbolElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGSymbolElement_GetIDsOfNames(DispSVGSymbolElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGSymbolElement_Invoke(DispSVGSymbolElement* 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  /* __DispSVGSymbolElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGSymbolElement coclass
 */

DEFINE_GUID(CLSID_SVGSymbolElement, 0x30510571, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510571-98b5-11cf-bb82-00aa00bdce0b") SVGSymbolElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGSymbolElement, 0x30510571, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGSymbolElement;
/*****************************************************************************
 * ISVGDefsElement interface
 */
#ifndef __ISVGDefsElement_INTERFACE_DEFINED__
#define __ISVGDefsElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGDefsElement, 0x305104e9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104e9-98b5-11cf-bb82-00aa00bdce0b")
ISVGDefsElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGDefsElement, 0x305104e9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGDefsElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGDefsElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGDefsElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGDefsElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGDefsElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGDefsElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGDefsElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGDefsElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} ISVGDefsElementVtbl;
interface ISVGDefsElement {
    CONST_VTBL ISVGDefsElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGDefsElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGDefsElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGDefsElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGDefsElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGDefsElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGDefsElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGDefsElement_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 ISVGDefsElement_QueryInterface(ISVGDefsElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGDefsElement_AddRef(ISVGDefsElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGDefsElement_Release(ISVGDefsElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGDefsElement_GetTypeInfoCount(ISVGDefsElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGDefsElement_GetTypeInfo(ISVGDefsElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGDefsElement_GetIDsOfNames(ISVGDefsElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGDefsElement_Invoke(ISVGDefsElement* 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  /* __ISVGDefsElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGDefsElement dispinterface
 */
#ifndef __DispSVGDefsElement_DISPINTERFACE_DEFINED__
#define __DispSVGDefsElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGDefsElement, 0x30590003, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590003-98b5-11cf-bb82-00aa00bdce0b")
DispSVGDefsElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGDefsElement, 0x30590003, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGDefsElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGDefsElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGDefsElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGDefsElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGDefsElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGDefsElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGDefsElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGDefsElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGDefsElementVtbl;
interface DispSVGDefsElement {
    CONST_VTBL DispSVGDefsElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGDefsElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGDefsElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGDefsElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGDefsElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGDefsElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGDefsElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGDefsElement_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 DispSVGDefsElement_QueryInterface(DispSVGDefsElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGDefsElement_AddRef(DispSVGDefsElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGDefsElement_Release(DispSVGDefsElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGDefsElement_GetTypeInfoCount(DispSVGDefsElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGDefsElement_GetTypeInfo(DispSVGDefsElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGDefsElement_GetIDsOfNames(DispSVGDefsElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGDefsElement_Invoke(DispSVGDefsElement* 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  /* __DispSVGDefsElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGDefsElement coclass
 */

DEFINE_GUID(CLSID_SVGDefsElement, 0x30510570, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510570-98b5-11cf-bb82-00aa00bdce0b") SVGDefsElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGDefsElement, 0x30510570, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGDefsElement;
/*****************************************************************************
 * ISVGAnimatedPathData interface
 */
#ifndef __ISVGAnimatedPathData_INTERFACE_DEFINED__
#define __ISVGAnimatedPathData_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGAnimatedPathData, 0x30510511, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510511-98b5-11cf-bb82-00aa00bdce0b")
ISVGAnimatedPathData : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_pathSegList(
        ISVGPathSegList *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pathSegList(
        ISVGPathSegList **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_normalizedPathSegList(
        ISVGPathSegList *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_normalizedPathSegList(
        ISVGPathSegList **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_animatedPathSegList(
        ISVGPathSegList *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_animatedPathSegList(
        ISVGPathSegList **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_animatedNormalizedPathSegList(
        ISVGPathSegList *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_animatedNormalizedPathSegList(
        ISVGPathSegList **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGAnimatedPathData, 0x30510511, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGAnimatedPathDataVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGAnimatedPathData* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGAnimatedPathData* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGAnimatedPathData* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGAnimatedPathData* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGAnimatedPathData* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGAnimatedPathData* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGAnimatedPathData* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGAnimatedPathData methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_pathSegList)(
        ISVGAnimatedPathData* This,
        ISVGPathSegList *v);

    HRESULT (STDMETHODCALLTYPE *get_pathSegList)(
        ISVGAnimatedPathData* This,
        ISVGPathSegList **p);

    HRESULT (STDMETHODCALLTYPE *putref_normalizedPathSegList)(
        ISVGAnimatedPathData* This,
        ISVGPathSegList *v);

    HRESULT (STDMETHODCALLTYPE *get_normalizedPathSegList)(
        ISVGAnimatedPathData* This,
        ISVGPathSegList **p);

    HRESULT (STDMETHODCALLTYPE *putref_animatedPathSegList)(
        ISVGAnimatedPathData* This,
        ISVGPathSegList *v);

    HRESULT (STDMETHODCALLTYPE *get_animatedPathSegList)(
        ISVGAnimatedPathData* This,
        ISVGPathSegList **p);

    HRESULT (STDMETHODCALLTYPE *putref_animatedNormalizedPathSegList)(
        ISVGAnimatedPathData* This,
        ISVGPathSegList *v);

    HRESULT (STDMETHODCALLTYPE *get_animatedNormalizedPathSegList)(
        ISVGAnimatedPathData* This,
        ISVGPathSegList **p);

    END_INTERFACE
} ISVGAnimatedPathDataVtbl;
interface ISVGAnimatedPathData {
    CONST_VTBL ISVGAnimatedPathDataVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGAnimatedPathData_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGAnimatedPathData_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGAnimatedPathData_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGAnimatedPathData_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGAnimatedPathData_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGAnimatedPathData_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGAnimatedPathData_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGAnimatedPathData methods ***/
#define ISVGAnimatedPathData_putref_pathSegList(This,v) (This)->lpVtbl->putref_pathSegList(This,v)
#define ISVGAnimatedPathData_get_pathSegList(This,p) (This)->lpVtbl->get_pathSegList(This,p)
#define ISVGAnimatedPathData_putref_normalizedPathSegList(This,v) (This)->lpVtbl->putref_normalizedPathSegList(This,v)
#define ISVGAnimatedPathData_get_normalizedPathSegList(This,p) (This)->lpVtbl->get_normalizedPathSegList(This,p)
#define ISVGAnimatedPathData_putref_animatedPathSegList(This,v) (This)->lpVtbl->putref_animatedPathSegList(This,v)
#define ISVGAnimatedPathData_get_animatedPathSegList(This,p) (This)->lpVtbl->get_animatedPathSegList(This,p)
#define ISVGAnimatedPathData_putref_animatedNormalizedPathSegList(This,v) (This)->lpVtbl->putref_animatedNormalizedPathSegList(This,v)
#define ISVGAnimatedPathData_get_animatedNormalizedPathSegList(This,p) (This)->lpVtbl->get_animatedNormalizedPathSegList(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGAnimatedPathData_QueryInterface(ISVGAnimatedPathData* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGAnimatedPathData_AddRef(ISVGAnimatedPathData* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGAnimatedPathData_Release(ISVGAnimatedPathData* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGAnimatedPathData_GetTypeInfoCount(ISVGAnimatedPathData* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGAnimatedPathData_GetTypeInfo(ISVGAnimatedPathData* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGAnimatedPathData_GetIDsOfNames(ISVGAnimatedPathData* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGAnimatedPathData_Invoke(ISVGAnimatedPathData* 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);
}
/*** ISVGAnimatedPathData methods ***/
static FORCEINLINE HRESULT ISVGAnimatedPathData_putref_pathSegList(ISVGAnimatedPathData* This,ISVGPathSegList *v) {
    return This->lpVtbl->putref_pathSegList(This,v);
}
static FORCEINLINE HRESULT ISVGAnimatedPathData_get_pathSegList(ISVGAnimatedPathData* This,ISVGPathSegList **p) {
    return This->lpVtbl->get_pathSegList(This,p);
}
static FORCEINLINE HRESULT ISVGAnimatedPathData_putref_normalizedPathSegList(ISVGAnimatedPathData* This,ISVGPathSegList *v) {
    return This->lpVtbl->putref_normalizedPathSegList(This,v);
}
static FORCEINLINE HRESULT ISVGAnimatedPathData_get_normalizedPathSegList(ISVGAnimatedPathData* This,ISVGPathSegList **p) {
    return This->lpVtbl->get_normalizedPathSegList(This,p);
}
static FORCEINLINE HRESULT ISVGAnimatedPathData_putref_animatedPathSegList(ISVGAnimatedPathData* This,ISVGPathSegList *v) {
    return This->lpVtbl->putref_animatedPathSegList(This,v);
}
static FORCEINLINE HRESULT ISVGAnimatedPathData_get_animatedPathSegList(ISVGAnimatedPathData* This,ISVGPathSegList **p) {
    return This->lpVtbl->get_animatedPathSegList(This,p);
}
static FORCEINLINE HRESULT ISVGAnimatedPathData_putref_animatedNormalizedPathSegList(ISVGAnimatedPathData* This,ISVGPathSegList *v) {
    return This->lpVtbl->putref_animatedNormalizedPathSegList(This,v);
}
static FORCEINLINE HRESULT ISVGAnimatedPathData_get_animatedNormalizedPathSegList(ISVGAnimatedPathData* This,ISVGPathSegList **p) {
    return This->lpVtbl->get_animatedNormalizedPathSegList(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGAnimatedPathData_putref_pathSegList_Proxy(
    ISVGAnimatedPathData* This,
    ISVGPathSegList *v);
void __RPC_STUB ISVGAnimatedPathData_putref_pathSegList_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedPathData_get_pathSegList_Proxy(
    ISVGAnimatedPathData* This,
    ISVGPathSegList **p);
void __RPC_STUB ISVGAnimatedPathData_get_pathSegList_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedPathData_putref_normalizedPathSegList_Proxy(
    ISVGAnimatedPathData* This,
    ISVGPathSegList *v);
void __RPC_STUB ISVGAnimatedPathData_putref_normalizedPathSegList_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedPathData_get_normalizedPathSegList_Proxy(
    ISVGAnimatedPathData* This,
    ISVGPathSegList **p);
void __RPC_STUB ISVGAnimatedPathData_get_normalizedPathSegList_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedPathData_putref_animatedPathSegList_Proxy(
    ISVGAnimatedPathData* This,
    ISVGPathSegList *v);
void __RPC_STUB ISVGAnimatedPathData_putref_animatedPathSegList_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedPathData_get_animatedPathSegList_Proxy(
    ISVGAnimatedPathData* This,
    ISVGPathSegList **p);
void __RPC_STUB ISVGAnimatedPathData_get_animatedPathSegList_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedPathData_putref_animatedNormalizedPathSegList_Proxy(
    ISVGAnimatedPathData* This,
    ISVGPathSegList *v);
void __RPC_STUB ISVGAnimatedPathData_putref_animatedNormalizedPathSegList_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedPathData_get_animatedNormalizedPathSegList_Proxy(
    ISVGAnimatedPathData* This,
    ISVGPathSegList **p);
void __RPC_STUB ISVGAnimatedPathData_get_animatedNormalizedPathSegList_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGAnimatedPathData_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGPathElement interface
 */
#ifndef __ISVGPathElement_INTERFACE_DEFINED__
#define __ISVGPathElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGPathElement, 0x30510512, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510512-98b5-11cf-bb82-00aa00bdce0b")
ISVGPathElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_pathLength(
        ISVGAnimatedNumber *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pathLength(
        ISVGAnimatedNumber **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE getTotalLength(
        float *pfltResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE getPointAtLength(
        float fltdistance,
        ISVGPoint **ppPointResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE getPathSegAtLength(
        float fltdistance,
        LONG *plResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE createSVGPathSegClosePath(
        ISVGPathSegClosePath **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE createSVGPathSegMovetoAbs(
        float x,
        float y,
        ISVGPathSegMovetoAbs **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE createSVGPathSegMovetoRel(
        float x,
        float y,
        ISVGPathSegMovetoRel **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE createSVGPathSegLinetoAbs(
        float x,
        float y,
        ISVGPathSegLinetoAbs **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE createSVGPathSegLinetoRel(
        float x,
        float y,
        ISVGPathSegLinetoRel **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE createSVGPathSegCurvetoCubicAbs(
        float x,
        float y,
        float x1,
        float y1,
        float x2,
        float y2,
        ISVGPathSegCurvetoCubicAbs **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE createSVGPathSegCurvetoCubicRel(
        float x,
        float y,
        float x1,
        float y1,
        float x2,
        float y2,
        ISVGPathSegCurvetoCubicRel **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE createSVGPathSegCurvetoQuadraticAbs(
        float x,
        float y,
        float x1,
        float y1,
        ISVGPathSegCurvetoQuadraticAbs **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE createSVGPathSegCurvetoQuadraticRel(
        float x,
        float y,
        float x1,
        float y1,
        ISVGPathSegCurvetoQuadraticRel **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE createSVGPathSegArcAbs(
        float x,
        float y,
        float r1,
        float r2,
        float angle,
        VARIANT_BOOL largeArcFlag,
        VARIANT_BOOL sweepFlag,
        ISVGPathSegArcAbs **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE createSVGPathSegArcRel(
        float x,
        float y,
        float r1,
        float r2,
        float angle,
        VARIANT_BOOL largeArcFlag,
        VARIANT_BOOL sweepFlag,
        ISVGPathSegArcRel **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE createSVGPathSegLinetoHorizontalAbs(
        float x,
        ISVGPathSegLinetoHorizontalAbs **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE createSVGPathSegLinetoHorizontalRel(
        float x,
        ISVGPathSegLinetoHorizontalRel **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE createSVGPathSegLinetoVerticalAbs(
        float y,
        ISVGPathSegLinetoVerticalAbs **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE createSVGPathSegLinetoVerticalRel(
        float y,
        ISVGPathSegLinetoVerticalRel **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE createSVGPathSegCurvetoCubicSmoothAbs(
        float x,
        float y,
        float x2,
        float y2,
        ISVGPathSegCurvetoCubicSmoothAbs **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE createSVGPathSegCurvetoCubicSmoothRel(
        float x,
        float y,
        float x2,
        float y2,
        ISVGPathSegCurvetoCubicSmoothRel **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE createSVGPathSegCurvetoQuadraticSmoothAbs(
        float x,
        float y,
        ISVGPathSegCurvetoQuadraticSmoothAbs **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE createSVGPathSegCurvetoQuadraticSmoothRel(
        float x,
        float y,
        ISVGPathSegCurvetoQuadraticSmoothRel **ppResult) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGPathElement, 0x30510512, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGPathElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGPathElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGPathElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGPathElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGPathElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGPathElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGPathElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGPathElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGPathElement methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_pathLength)(
        ISVGPathElement* This,
        ISVGAnimatedNumber *v);

    HRESULT (STDMETHODCALLTYPE *get_pathLength)(
        ISVGPathElement* This,
        ISVGAnimatedNumber **p);

    HRESULT (STDMETHODCALLTYPE *getTotalLength)(
        ISVGPathElement* This,
        float *pfltResult);

    HRESULT (STDMETHODCALLTYPE *getPointAtLength)(
        ISVGPathElement* This,
        float fltdistance,
        ISVGPoint **ppPointResult);

    HRESULT (STDMETHODCALLTYPE *getPathSegAtLength)(
        ISVGPathElement* This,
        float fltdistance,
        LONG *plResult);

    HRESULT (STDMETHODCALLTYPE *createSVGPathSegClosePath)(
        ISVGPathElement* This,
        ISVGPathSegClosePath **ppResult);

    HRESULT (STDMETHODCALLTYPE *createSVGPathSegMovetoAbs)(
        ISVGPathElement* This,
        float x,
        float y,
        ISVGPathSegMovetoAbs **ppResult);

    HRESULT (STDMETHODCALLTYPE *createSVGPathSegMovetoRel)(
        ISVGPathElement* This,
        float x,
        float y,
        ISVGPathSegMovetoRel **ppResult);

    HRESULT (STDMETHODCALLTYPE *createSVGPathSegLinetoAbs)(
        ISVGPathElement* This,
        float x,
        float y,
        ISVGPathSegLinetoAbs **ppResult);

    HRESULT (STDMETHODCALLTYPE *createSVGPathSegLinetoRel)(
        ISVGPathElement* This,
        float x,
        float y,
        ISVGPathSegLinetoRel **ppResult);

    HRESULT (STDMETHODCALLTYPE *createSVGPathSegCurvetoCubicAbs)(
        ISVGPathElement* This,
        float x,
        float y,
        float x1,
        float y1,
        float x2,
        float y2,
        ISVGPathSegCurvetoCubicAbs **ppResult);

    HRESULT (STDMETHODCALLTYPE *createSVGPathSegCurvetoCubicRel)(
        ISVGPathElement* This,
        float x,
        float y,
        float x1,
        float y1,
        float x2,
        float y2,
        ISVGPathSegCurvetoCubicRel **ppResult);

    HRESULT (STDMETHODCALLTYPE *createSVGPathSegCurvetoQuadraticAbs)(
        ISVGPathElement* This,
        float x,
        float y,
        float x1,
        float y1,
        ISVGPathSegCurvetoQuadraticAbs **ppResult);

    HRESULT (STDMETHODCALLTYPE *createSVGPathSegCurvetoQuadraticRel)(
        ISVGPathElement* This,
        float x,
        float y,
        float x1,
        float y1,
        ISVGPathSegCurvetoQuadraticRel **ppResult);

    HRESULT (STDMETHODCALLTYPE *createSVGPathSegArcAbs)(
        ISVGPathElement* This,
        float x,
        float y,
        float r1,
        float r2,
        float angle,
        VARIANT_BOOL largeArcFlag,
        VARIANT_BOOL sweepFlag,
        ISVGPathSegArcAbs **ppResult);

    HRESULT (STDMETHODCALLTYPE *createSVGPathSegArcRel)(
        ISVGPathElement* This,
        float x,
        float y,
        float r1,
        float r2,
        float angle,
        VARIANT_BOOL largeArcFlag,
        VARIANT_BOOL sweepFlag,
        ISVGPathSegArcRel **ppResult);

    HRESULT (STDMETHODCALLTYPE *createSVGPathSegLinetoHorizontalAbs)(
        ISVGPathElement* This,
        float x,
        ISVGPathSegLinetoHorizontalAbs **ppResult);

    HRESULT (STDMETHODCALLTYPE *createSVGPathSegLinetoHorizontalRel)(
        ISVGPathElement* This,
        float x,
        ISVGPathSegLinetoHorizontalRel **ppResult);

    HRESULT (STDMETHODCALLTYPE *createSVGPathSegLinetoVerticalAbs)(
        ISVGPathElement* This,
        float y,
        ISVGPathSegLinetoVerticalAbs **ppResult);

    HRESULT (STDMETHODCALLTYPE *createSVGPathSegLinetoVerticalRel)(
        ISVGPathElement* This,
        float y,
        ISVGPathSegLinetoVerticalRel **ppResult);

    HRESULT (STDMETHODCALLTYPE *createSVGPathSegCurvetoCubicSmoothAbs)(
        ISVGPathElement* This,
        float x,
        float y,
        float x2,
        float y2,
        ISVGPathSegCurvetoCubicSmoothAbs **ppResult);

    HRESULT (STDMETHODCALLTYPE *createSVGPathSegCurvetoCubicSmoothRel)(
        ISVGPathElement* This,
        float x,
        float y,
        float x2,
        float y2,
        ISVGPathSegCurvetoCubicSmoothRel **ppResult);

    HRESULT (STDMETHODCALLTYPE *createSVGPathSegCurvetoQuadraticSmoothAbs)(
        ISVGPathElement* This,
        float x,
        float y,
        ISVGPathSegCurvetoQuadraticSmoothAbs **ppResult);

    HRESULT (STDMETHODCALLTYPE *createSVGPathSegCurvetoQuadraticSmoothRel)(
        ISVGPathElement* This,
        float x,
        float y,
        ISVGPathSegCurvetoQuadraticSmoothRel **ppResult);

    END_INTERFACE
} ISVGPathElementVtbl;
interface ISVGPathElement {
    CONST_VTBL ISVGPathElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGPathElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGPathElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGPathElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGPathElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGPathElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGPathElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGPathElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGPathElement methods ***/
#define ISVGPathElement_putref_pathLength(This,v) (This)->lpVtbl->putref_pathLength(This,v)
#define ISVGPathElement_get_pathLength(This,p) (This)->lpVtbl->get_pathLength(This,p)
#define ISVGPathElement_getTotalLength(This,pfltResult) (This)->lpVtbl->getTotalLength(This,pfltResult)
#define ISVGPathElement_getPointAtLength(This,fltdistance,ppPointResult) (This)->lpVtbl->getPointAtLength(This,fltdistance,ppPointResult)
#define ISVGPathElement_getPathSegAtLength(This,fltdistance,plResult) (This)->lpVtbl->getPathSegAtLength(This,fltdistance,plResult)
#define ISVGPathElement_createSVGPathSegClosePath(This,ppResult) (This)->lpVtbl->createSVGPathSegClosePath(This,ppResult)
#define ISVGPathElement_createSVGPathSegMovetoAbs(This,x,y,ppResult) (This)->lpVtbl->createSVGPathSegMovetoAbs(This,x,y,ppResult)
#define ISVGPathElement_createSVGPathSegMovetoRel(This,x,y,ppResult) (This)->lpVtbl->createSVGPathSegMovetoRel(This,x,y,ppResult)
#define ISVGPathElement_createSVGPathSegLinetoAbs(This,x,y,ppResult) (This)->lpVtbl->createSVGPathSegLinetoAbs(This,x,y,ppResult)
#define ISVGPathElement_createSVGPathSegLinetoRel(This,x,y,ppResult) (This)->lpVtbl->createSVGPathSegLinetoRel(This,x,y,ppResult)
#define ISVGPathElement_createSVGPathSegCurvetoCubicAbs(This,x,y,x1,y1,x2,y2,ppResult) (This)->lpVtbl->createSVGPathSegCurvetoCubicAbs(This,x,y,x1,y1,x2,y2,ppResult)
#define ISVGPathElement_createSVGPathSegCurvetoCubicRel(This,x,y,x1,y1,x2,y2,ppResult) (This)->lpVtbl->createSVGPathSegCurvetoCubicRel(This,x,y,x1,y1,x2,y2,ppResult)
#define ISVGPathElement_createSVGPathSegCurvetoQuadraticAbs(This,x,y,x1,y1,ppResult) (This)->lpVtbl->createSVGPathSegCurvetoQuadraticAbs(This,x,y,x1,y1,ppResult)
#define ISVGPathElement_createSVGPathSegCurvetoQuadraticRel(This,x,y,x1,y1,ppResult) (This)->lpVtbl->createSVGPathSegCurvetoQuadraticRel(This,x,y,x1,y1,ppResult)
#define ISVGPathElement_createSVGPathSegArcAbs(This,x,y,r1,r2,angle,largeArcFlag,sweepFlag,ppResult) (This)->lpVtbl->createSVGPathSegArcAbs(This,x,y,r1,r2,angle,largeArcFlag,sweepFlag,ppResult)
#define ISVGPathElement_createSVGPathSegArcRel(This,x,y,r1,r2,angle,largeArcFlag,sweepFlag,ppResult) (This)->lpVtbl->createSVGPathSegArcRel(This,x,y,r1,r2,angle,largeArcFlag,sweepFlag,ppResult)
#define ISVGPathElement_createSVGPathSegLinetoHorizontalAbs(This,x,ppResult) (This)->lpVtbl->createSVGPathSegLinetoHorizontalAbs(This,x,ppResult)
#define ISVGPathElement_createSVGPathSegLinetoHorizontalRel(This,x,ppResult) (This)->lpVtbl->createSVGPathSegLinetoHorizontalRel(This,x,ppResult)
#define ISVGPathElement_createSVGPathSegLinetoVerticalAbs(This,y,ppResult) (This)->lpVtbl->createSVGPathSegLinetoVerticalAbs(This,y,ppResult)
#define ISVGPathElement_createSVGPathSegLinetoVerticalRel(This,y,ppResult) (This)->lpVtbl->createSVGPathSegLinetoVerticalRel(This,y,ppResult)
#define ISVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs(This,x,y,x2,y2,ppResult) (This)->lpVtbl->createSVGPathSegCurvetoCubicSmoothAbs(This,x,y,x2,y2,ppResult)
#define ISVGPathElement_createSVGPathSegCurvetoCubicSmoothRel(This,x,y,x2,y2,ppResult) (This)->lpVtbl->createSVGPathSegCurvetoCubicSmoothRel(This,x,y,x2,y2,ppResult)
#define ISVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs(This,x,y,ppResult) (This)->lpVtbl->createSVGPathSegCurvetoQuadraticSmoothAbs(This,x,y,ppResult)
#define ISVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel(This,x,y,ppResult) (This)->lpVtbl->createSVGPathSegCurvetoQuadraticSmoothRel(This,x,y,ppResult)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGPathElement_QueryInterface(ISVGPathElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGPathElement_AddRef(ISVGPathElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGPathElement_Release(ISVGPathElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGPathElement_GetTypeInfoCount(ISVGPathElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGPathElement_GetTypeInfo(ISVGPathElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGPathElement_GetIDsOfNames(ISVGPathElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGPathElement_Invoke(ISVGPathElement* 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);
}
/*** ISVGPathElement methods ***/
static FORCEINLINE HRESULT ISVGPathElement_putref_pathLength(ISVGPathElement* This,ISVGAnimatedNumber *v) {
    return This->lpVtbl->putref_pathLength(This,v);
}
static FORCEINLINE HRESULT ISVGPathElement_get_pathLength(ISVGPathElement* This,ISVGAnimatedNumber **p) {
    return This->lpVtbl->get_pathLength(This,p);
}
static FORCEINLINE HRESULT ISVGPathElement_getTotalLength(ISVGPathElement* This,float *pfltResult) {
    return This->lpVtbl->getTotalLength(This,pfltResult);
}
static FORCEINLINE HRESULT ISVGPathElement_getPointAtLength(ISVGPathElement* This,float fltdistance,ISVGPoint **ppPointResult) {
    return This->lpVtbl->getPointAtLength(This,fltdistance,ppPointResult);
}
static FORCEINLINE HRESULT ISVGPathElement_getPathSegAtLength(ISVGPathElement* This,float fltdistance,LONG *plResult) {
    return This->lpVtbl->getPathSegAtLength(This,fltdistance,plResult);
}
static FORCEINLINE HRESULT ISVGPathElement_createSVGPathSegClosePath(ISVGPathElement* This,ISVGPathSegClosePath **ppResult) {
    return This->lpVtbl->createSVGPathSegClosePath(This,ppResult);
}
static FORCEINLINE HRESULT ISVGPathElement_createSVGPathSegMovetoAbs(ISVGPathElement* This,float x,float y,ISVGPathSegMovetoAbs **ppResult) {
    return This->lpVtbl->createSVGPathSegMovetoAbs(This,x,y,ppResult);
}
static FORCEINLINE HRESULT ISVGPathElement_createSVGPathSegMovetoRel(ISVGPathElement* This,float x,float y,ISVGPathSegMovetoRel **ppResult) {
    return This->lpVtbl->createSVGPathSegMovetoRel(This,x,y,ppResult);
}
static FORCEINLINE HRESULT ISVGPathElement_createSVGPathSegLinetoAbs(ISVGPathElement* This,float x,float y,ISVGPathSegLinetoAbs **ppResult) {
    return This->lpVtbl->createSVGPathSegLinetoAbs(This,x,y,ppResult);
}
static FORCEINLINE HRESULT ISVGPathElement_createSVGPathSegLinetoRel(ISVGPathElement* This,float x,float y,ISVGPathSegLinetoRel **ppResult) {
    return This->lpVtbl->createSVGPathSegLinetoRel(This,x,y,ppResult);
}
static FORCEINLINE HRESULT ISVGPathElement_createSVGPathSegCurvetoCubicAbs(ISVGPathElement* This,float x,float y,float x1,float y1,float x2,float y2,ISVGPathSegCurvetoCubicAbs **ppResult) {
    return This->lpVtbl->createSVGPathSegCurvetoCubicAbs(This,x,y,x1,y1,x2,y2,ppResult);
}
static FORCEINLINE HRESULT ISVGPathElement_createSVGPathSegCurvetoCubicRel(ISVGPathElement* This,float x,float y,float x1,float y1,float x2,float y2,ISVGPathSegCurvetoCubicRel **ppResult) {
    return This->lpVtbl->createSVGPathSegCurvetoCubicRel(This,x,y,x1,y1,x2,y2,ppResult);
}
static FORCEINLINE HRESULT ISVGPathElement_createSVGPathSegCurvetoQuadraticAbs(ISVGPathElement* This,float x,float y,float x1,float y1,ISVGPathSegCurvetoQuadraticAbs **ppResult) {
    return This->lpVtbl->createSVGPathSegCurvetoQuadraticAbs(This,x,y,x1,y1,ppResult);
}
static FORCEINLINE HRESULT ISVGPathElement_createSVGPathSegCurvetoQuadraticRel(ISVGPathElement* This,float x,float y,float x1,float y1,ISVGPathSegCurvetoQuadraticRel **ppResult) {
    return This->lpVtbl->createSVGPathSegCurvetoQuadraticRel(This,x,y,x1,y1,ppResult);
}
static FORCEINLINE HRESULT ISVGPathElement_createSVGPathSegArcAbs(ISVGPathElement* This,float x,float y,float r1,float r2,float angle,VARIANT_BOOL largeArcFlag,VARIANT_BOOL sweepFlag,ISVGPathSegArcAbs **ppResult) {
    return This->lpVtbl->createSVGPathSegArcAbs(This,x,y,r1,r2,angle,largeArcFlag,sweepFlag,ppResult);
}
static FORCEINLINE HRESULT ISVGPathElement_createSVGPathSegArcRel(ISVGPathElement* This,float x,float y,float r1,float r2,float angle,VARIANT_BOOL largeArcFlag,VARIANT_BOOL sweepFlag,ISVGPathSegArcRel **ppResult) {
    return This->lpVtbl->createSVGPathSegArcRel(This,x,y,r1,r2,angle,largeArcFlag,sweepFlag,ppResult);
}
static FORCEINLINE HRESULT ISVGPathElement_createSVGPathSegLinetoHorizontalAbs(ISVGPathElement* This,float x,ISVGPathSegLinetoHorizontalAbs **ppResult) {
    return This->lpVtbl->createSVGPathSegLinetoHorizontalAbs(This,x,ppResult);
}
static FORCEINLINE HRESULT ISVGPathElement_createSVGPathSegLinetoHorizontalRel(ISVGPathElement* This,float x,ISVGPathSegLinetoHorizontalRel **ppResult) {
    return This->lpVtbl->createSVGPathSegLinetoHorizontalRel(This,x,ppResult);
}
static FORCEINLINE HRESULT ISVGPathElement_createSVGPathSegLinetoVerticalAbs(ISVGPathElement* This,float y,ISVGPathSegLinetoVerticalAbs **ppResult) {
    return This->lpVtbl->createSVGPathSegLinetoVerticalAbs(This,y,ppResult);
}
static FORCEINLINE HRESULT ISVGPathElement_createSVGPathSegLinetoVerticalRel(ISVGPathElement* This,float y,ISVGPathSegLinetoVerticalRel **ppResult) {
    return This->lpVtbl->createSVGPathSegLinetoVerticalRel(This,y,ppResult);
}
static FORCEINLINE HRESULT ISVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs(ISVGPathElement* This,float x,float y,float x2,float y2,ISVGPathSegCurvetoCubicSmoothAbs **ppResult) {
    return This->lpVtbl->createSVGPathSegCurvetoCubicSmoothAbs(This,x,y,x2,y2,ppResult);
}
static FORCEINLINE HRESULT ISVGPathElement_createSVGPathSegCurvetoCubicSmoothRel(ISVGPathElement* This,float x,float y,float x2,float y2,ISVGPathSegCurvetoCubicSmoothRel **ppResult) {
    return This->lpVtbl->createSVGPathSegCurvetoCubicSmoothRel(This,x,y,x2,y2,ppResult);
}
static FORCEINLINE HRESULT ISVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs(ISVGPathElement* This,float x,float y,ISVGPathSegCurvetoQuadraticSmoothAbs **ppResult) {
    return This->lpVtbl->createSVGPathSegCurvetoQuadraticSmoothAbs(This,x,y,ppResult);
}
static FORCEINLINE HRESULT ISVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel(ISVGPathElement* This,float x,float y,ISVGPathSegCurvetoQuadraticSmoothRel **ppResult) {
    return This->lpVtbl->createSVGPathSegCurvetoQuadraticSmoothRel(This,x,y,ppResult);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGPathElement_putref_pathLength_Proxy(
    ISVGPathElement* This,
    ISVGAnimatedNumber *v);
void __RPC_STUB ISVGPathElement_putref_pathLength_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathElement_get_pathLength_Proxy(
    ISVGPathElement* This,
    ISVGAnimatedNumber **p);
void __RPC_STUB ISVGPathElement_get_pathLength_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathElement_getTotalLength_Proxy(
    ISVGPathElement* This,
    float *pfltResult);
void __RPC_STUB ISVGPathElement_getTotalLength_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathElement_getPointAtLength_Proxy(
    ISVGPathElement* This,
    float fltdistance,
    ISVGPoint **ppPointResult);
void __RPC_STUB ISVGPathElement_getPointAtLength_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathElement_getPathSegAtLength_Proxy(
    ISVGPathElement* This,
    float fltdistance,
    LONG *plResult);
void __RPC_STUB ISVGPathElement_getPathSegAtLength_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathElement_createSVGPathSegClosePath_Proxy(
    ISVGPathElement* This,
    ISVGPathSegClosePath **ppResult);
void __RPC_STUB ISVGPathElement_createSVGPathSegClosePath_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathElement_createSVGPathSegMovetoAbs_Proxy(
    ISVGPathElement* This,
    float x,
    float y,
    ISVGPathSegMovetoAbs **ppResult);
void __RPC_STUB ISVGPathElement_createSVGPathSegMovetoAbs_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathElement_createSVGPathSegMovetoRel_Proxy(
    ISVGPathElement* This,
    float x,
    float y,
    ISVGPathSegMovetoRel **ppResult);
void __RPC_STUB ISVGPathElement_createSVGPathSegMovetoRel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathElement_createSVGPathSegLinetoAbs_Proxy(
    ISVGPathElement* This,
    float x,
    float y,
    ISVGPathSegLinetoAbs **ppResult);
void __RPC_STUB ISVGPathElement_createSVGPathSegLinetoAbs_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathElement_createSVGPathSegLinetoRel_Proxy(
    ISVGPathElement* This,
    float x,
    float y,
    ISVGPathSegLinetoRel **ppResult);
void __RPC_STUB ISVGPathElement_createSVGPathSegLinetoRel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathElement_createSVGPathSegCurvetoCubicAbs_Proxy(
    ISVGPathElement* This,
    float x,
    float y,
    float x1,
    float y1,
    float x2,
    float y2,
    ISVGPathSegCurvetoCubicAbs **ppResult);
void __RPC_STUB ISVGPathElement_createSVGPathSegCurvetoCubicAbs_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathElement_createSVGPathSegCurvetoCubicRel_Proxy(
    ISVGPathElement* This,
    float x,
    float y,
    float x1,
    float y1,
    float x2,
    float y2,
    ISVGPathSegCurvetoCubicRel **ppResult);
void __RPC_STUB ISVGPathElement_createSVGPathSegCurvetoCubicRel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathElement_createSVGPathSegCurvetoQuadraticAbs_Proxy(
    ISVGPathElement* This,
    float x,
    float y,
    float x1,
    float y1,
    ISVGPathSegCurvetoQuadraticAbs **ppResult);
void __RPC_STUB ISVGPathElement_createSVGPathSegCurvetoQuadraticAbs_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathElement_createSVGPathSegCurvetoQuadraticRel_Proxy(
    ISVGPathElement* This,
    float x,
    float y,
    float x1,
    float y1,
    ISVGPathSegCurvetoQuadraticRel **ppResult);
void __RPC_STUB ISVGPathElement_createSVGPathSegCurvetoQuadraticRel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathElement_createSVGPathSegArcAbs_Proxy(
    ISVGPathElement* This,
    float x,
    float y,
    float r1,
    float r2,
    float angle,
    VARIANT_BOOL largeArcFlag,
    VARIANT_BOOL sweepFlag,
    ISVGPathSegArcAbs **ppResult);
void __RPC_STUB ISVGPathElement_createSVGPathSegArcAbs_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathElement_createSVGPathSegArcRel_Proxy(
    ISVGPathElement* This,
    float x,
    float y,
    float r1,
    float r2,
    float angle,
    VARIANT_BOOL largeArcFlag,
    VARIANT_BOOL sweepFlag,
    ISVGPathSegArcRel **ppResult);
void __RPC_STUB ISVGPathElement_createSVGPathSegArcRel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathElement_createSVGPathSegLinetoHorizontalAbs_Proxy(
    ISVGPathElement* This,
    float x,
    ISVGPathSegLinetoHorizontalAbs **ppResult);
void __RPC_STUB ISVGPathElement_createSVGPathSegLinetoHorizontalAbs_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathElement_createSVGPathSegLinetoHorizontalRel_Proxy(
    ISVGPathElement* This,
    float x,
    ISVGPathSegLinetoHorizontalRel **ppResult);
void __RPC_STUB ISVGPathElement_createSVGPathSegLinetoHorizontalRel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathElement_createSVGPathSegLinetoVerticalAbs_Proxy(
    ISVGPathElement* This,
    float y,
    ISVGPathSegLinetoVerticalAbs **ppResult);
void __RPC_STUB ISVGPathElement_createSVGPathSegLinetoVerticalAbs_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathElement_createSVGPathSegLinetoVerticalRel_Proxy(
    ISVGPathElement* This,
    float y,
    ISVGPathSegLinetoVerticalRel **ppResult);
void __RPC_STUB ISVGPathElement_createSVGPathSegLinetoVerticalRel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs_Proxy(
    ISVGPathElement* This,
    float x,
    float y,
    float x2,
    float y2,
    ISVGPathSegCurvetoCubicSmoothAbs **ppResult);
void __RPC_STUB ISVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathElement_createSVGPathSegCurvetoCubicSmoothRel_Proxy(
    ISVGPathElement* This,
    float x,
    float y,
    float x2,
    float y2,
    ISVGPathSegCurvetoCubicSmoothRel **ppResult);
void __RPC_STUB ISVGPathElement_createSVGPathSegCurvetoCubicSmoothRel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Proxy(
    ISVGPathElement* This,
    float x,
    float y,
    ISVGPathSegCurvetoQuadraticSmoothAbs **ppResult);
void __RPC_STUB ISVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Proxy(
    ISVGPathElement* This,
    float x,
    float y,
    ISVGPathSegCurvetoQuadraticSmoothRel **ppResult);
void __RPC_STUB ISVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGPathElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGPathElement dispinterface
 */
#ifndef __DispSVGPathElement_DISPINTERFACE_DEFINED__
#define __DispSVGPathElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGPathElement, 0x30590011, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590011-98b5-11cf-bb82-00aa00bdce0b")
DispSVGPathElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGPathElement, 0x30590011, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGPathElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGPathElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGPathElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGPathElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGPathElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGPathElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGPathElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGPathElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGPathElementVtbl;
interface DispSVGPathElement {
    CONST_VTBL DispSVGPathElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGPathElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGPathElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGPathElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGPathElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGPathElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGPathElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGPathElement_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 DispSVGPathElement_QueryInterface(DispSVGPathElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGPathElement_AddRef(DispSVGPathElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGPathElement_Release(DispSVGPathElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGPathElement_GetTypeInfoCount(DispSVGPathElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGPathElement_GetTypeInfo(DispSVGPathElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGPathElement_GetIDsOfNames(DispSVGPathElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGPathElement_Invoke(DispSVGPathElement* 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  /* __DispSVGPathElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGPathElement coclass
 */

DEFINE_GUID(CLSID_SVGPathElement, 0x305105b2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105b2-98b5-11cf-bb82-00aa00bdce0b") SVGPathElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGPathElement, 0x305105b2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGPathElement;
typedef enum _svgPreserveAspectRatioAlignType {
    SVG_PRESERVEASPECTRATIO_UNKNOWN = 0,
    SVG_PRESERVEASPECTRATIO_NONE = 1,
    SVG_PRESERVEASPECTRATIO_XMINYMIN = 2,
    SVG_PRESERVEASPECTRATIO_XMIDYMIN = 3,
    SVG_PRESERVEASPECTRATIO_XMAXYMIN = 4,
    SVG_PRESERVEASPECTRATIO_XMINYMID = 5,
    SVG_PRESERVEASPECTRATIO_XMIDYMID = 6,
    SVG_PRESERVEASPECTRATIO_XMAXYMID = 7,
    SVG_PRESERVEASPECTRATIO_XMINYMAX = 8,
    SVG_PRESERVEASPECTRATIO_XMIDYMAX = 9,
    SVG_PRESERVEASPECTRATIO_XMAXYMAX = 10,
    svgPreserveAspectRatioAlignType_Max = 0x7fffffff
} svgPreserveAspectRatioAlignType;
typedef enum _svgPreserveAspectMeetOrSliceType {
    SVG_MEETORSLICE_UNKNOWN = 0,
    SVG_MEETORSLICE_MEET = 1,
    SVG_MEETORSLICE_SLICE = 2,
    svgPreserveAspectMeetOrSliceType_Max = 0x7fffffff
} svgPreserveAspectMeetOrSliceType;
/*****************************************************************************
 * ISVGPreserveAspectRatio interface
 */
#ifndef __ISVGPreserveAspectRatio_INTERFACE_DEFINED__
#define __ISVGPreserveAspectRatio_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGPreserveAspectRatio, 0x305104fa, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104fa-98b5-11cf-bb82-00aa00bdce0b")
ISVGPreserveAspectRatio : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_align(
        short v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_align(
        short *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_meetOrSlice(
        short v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_meetOrSlice(
        short *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGPreserveAspectRatio, 0x305104fa, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGPreserveAspectRatioVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGPreserveAspectRatio* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGPreserveAspectRatio* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGPreserveAspectRatio* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGPreserveAspectRatio* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGPreserveAspectRatio* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGPreserveAspectRatio* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGPreserveAspectRatio* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGPreserveAspectRatio methods ***/
    HRESULT (STDMETHODCALLTYPE *put_align)(
        ISVGPreserveAspectRatio* This,
        short v);

    HRESULT (STDMETHODCALLTYPE *get_align)(
        ISVGPreserveAspectRatio* This,
        short *p);

    HRESULT (STDMETHODCALLTYPE *put_meetOrSlice)(
        ISVGPreserveAspectRatio* This,
        short v);

    HRESULT (STDMETHODCALLTYPE *get_meetOrSlice)(
        ISVGPreserveAspectRatio* This,
        short *p);

    END_INTERFACE
} ISVGPreserveAspectRatioVtbl;
interface ISVGPreserveAspectRatio {
    CONST_VTBL ISVGPreserveAspectRatioVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGPreserveAspectRatio_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGPreserveAspectRatio_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGPreserveAspectRatio_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGPreserveAspectRatio_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGPreserveAspectRatio_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGPreserveAspectRatio_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGPreserveAspectRatio_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGPreserveAspectRatio methods ***/
#define ISVGPreserveAspectRatio_put_align(This,v) (This)->lpVtbl->put_align(This,v)
#define ISVGPreserveAspectRatio_get_align(This,p) (This)->lpVtbl->get_align(This,p)
#define ISVGPreserveAspectRatio_put_meetOrSlice(This,v) (This)->lpVtbl->put_meetOrSlice(This,v)
#define ISVGPreserveAspectRatio_get_meetOrSlice(This,p) (This)->lpVtbl->get_meetOrSlice(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGPreserveAspectRatio_QueryInterface(ISVGPreserveAspectRatio* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGPreserveAspectRatio_AddRef(ISVGPreserveAspectRatio* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGPreserveAspectRatio_Release(ISVGPreserveAspectRatio* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGPreserveAspectRatio_GetTypeInfoCount(ISVGPreserveAspectRatio* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGPreserveAspectRatio_GetTypeInfo(ISVGPreserveAspectRatio* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGPreserveAspectRatio_GetIDsOfNames(ISVGPreserveAspectRatio* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGPreserveAspectRatio_Invoke(ISVGPreserveAspectRatio* 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);
}
/*** ISVGPreserveAspectRatio methods ***/
static FORCEINLINE HRESULT ISVGPreserveAspectRatio_put_align(ISVGPreserveAspectRatio* This,short v) {
    return This->lpVtbl->put_align(This,v);
}
static FORCEINLINE HRESULT ISVGPreserveAspectRatio_get_align(ISVGPreserveAspectRatio* This,short *p) {
    return This->lpVtbl->get_align(This,p);
}
static FORCEINLINE HRESULT ISVGPreserveAspectRatio_put_meetOrSlice(ISVGPreserveAspectRatio* This,short v) {
    return This->lpVtbl->put_meetOrSlice(This,v);
}
static FORCEINLINE HRESULT ISVGPreserveAspectRatio_get_meetOrSlice(ISVGPreserveAspectRatio* This,short *p) {
    return This->lpVtbl->get_meetOrSlice(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGPreserveAspectRatio_put_align_Proxy(
    ISVGPreserveAspectRatio* This,
    short v);
void __RPC_STUB ISVGPreserveAspectRatio_put_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPreserveAspectRatio_get_align_Proxy(
    ISVGPreserveAspectRatio* This,
    short *p);
void __RPC_STUB ISVGPreserveAspectRatio_get_align_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPreserveAspectRatio_put_meetOrSlice_Proxy(
    ISVGPreserveAspectRatio* This,
    short v);
void __RPC_STUB ISVGPreserveAspectRatio_put_meetOrSlice_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGPreserveAspectRatio_get_meetOrSlice_Proxy(
    ISVGPreserveAspectRatio* This,
    short *p);
void __RPC_STUB ISVGPreserveAspectRatio_get_meetOrSlice_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGPreserveAspectRatio_INTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGPreserveAspectRatio coclass
 */

DEFINE_GUID(CLSID_SVGPreserveAspectRatio, 0x305105d0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105d0-98b5-11cf-bb82-00aa00bdce0b") SVGPreserveAspectRatio;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGPreserveAspectRatio, 0x305105d0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGPreserveAspectRatio;
/*****************************************************************************
 * ISVGTextElement interface
 */
#ifndef __ISVGTextElement_INTERFACE_DEFINED__
#define __ISVGTextElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGTextElement, 0x3051051c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051051c-98b5-11cf-bb82-00aa00bdce0b")
ISVGTextElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGTextElement, 0x3051051c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGTextElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGTextElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGTextElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGTextElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGTextElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGTextElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGTextElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGTextElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} ISVGTextElementVtbl;
interface ISVGTextElement {
    CONST_VTBL ISVGTextElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGTextElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGTextElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGTextElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGTextElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGTextElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGTextElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGTextElement_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 ISVGTextElement_QueryInterface(ISVGTextElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGTextElement_AddRef(ISVGTextElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGTextElement_Release(ISVGTextElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGTextElement_GetTypeInfoCount(ISVGTextElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGTextElement_GetTypeInfo(ISVGTextElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGTextElement_GetIDsOfNames(ISVGTextElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGTextElement_Invoke(ISVGTextElement* 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  /* __ISVGTextElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGTextElement dispinterface
 */
#ifndef __DispSVGTextElement_DISPINTERFACE_DEFINED__
#define __DispSVGTextElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGTextElement, 0x30590037, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590037-98b5-11cf-bb82-00aa00bdce0b")
DispSVGTextElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGTextElement, 0x30590037, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGTextElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGTextElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGTextElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGTextElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGTextElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGTextElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGTextElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGTextElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGTextElementVtbl;
interface DispSVGTextElement {
    CONST_VTBL DispSVGTextElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGTextElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGTextElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGTextElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGTextElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGTextElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGTextElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGTextElement_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 DispSVGTextElement_QueryInterface(DispSVGTextElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGTextElement_AddRef(DispSVGTextElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGTextElement_Release(DispSVGTextElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGTextElement_GetTypeInfoCount(DispSVGTextElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGTextElement_GetTypeInfo(DispSVGTextElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGTextElement_GetIDsOfNames(DispSVGTextElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGTextElement_Invoke(DispSVGTextElement* 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  /* __DispSVGTextElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGTextElement coclass
 */

DEFINE_GUID(CLSID_SVGTextElement, 0x305105df, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105df-98b5-11cf-bb82-00aa00bdce0b") SVGTextElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGTextElement, 0x305105df, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGTextElement;
#ifndef __ISVGPreserveAspectRatio_FWD_DEFINED__
#define __ISVGPreserveAspectRatio_FWD_DEFINED__
typedef interface ISVGPreserveAspectRatio ISVGPreserveAspectRatio;
#endif

/*****************************************************************************
 * ISVGAnimatedPreserveAspectRatio interface
 */
#ifndef __ISVGAnimatedPreserveAspectRatio_INTERFACE_DEFINED__
#define __ISVGAnimatedPreserveAspectRatio_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGAnimatedPreserveAspectRatio, 0x305104fb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104fb-98b5-11cf-bb82-00aa00bdce0b")
ISVGAnimatedPreserveAspectRatio : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_baseVal(
        ISVGPreserveAspectRatio *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_baseVal(
        ISVGPreserveAspectRatio **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_animVal(
        ISVGPreserveAspectRatio *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_animVal(
        ISVGPreserveAspectRatio **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGAnimatedPreserveAspectRatio, 0x305104fb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGAnimatedPreserveAspectRatioVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGAnimatedPreserveAspectRatio* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGAnimatedPreserveAspectRatio* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGAnimatedPreserveAspectRatio* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGAnimatedPreserveAspectRatio* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGAnimatedPreserveAspectRatio* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGAnimatedPreserveAspectRatio* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGAnimatedPreserveAspectRatio* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGAnimatedPreserveAspectRatio methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_baseVal)(
        ISVGAnimatedPreserveAspectRatio* This,
        ISVGPreserveAspectRatio *v);

    HRESULT (STDMETHODCALLTYPE *get_baseVal)(
        ISVGAnimatedPreserveAspectRatio* This,
        ISVGPreserveAspectRatio **p);

    HRESULT (STDMETHODCALLTYPE *putref_animVal)(
        ISVGAnimatedPreserveAspectRatio* This,
        ISVGPreserveAspectRatio *v);

    HRESULT (STDMETHODCALLTYPE *get_animVal)(
        ISVGAnimatedPreserveAspectRatio* This,
        ISVGPreserveAspectRatio **p);

    END_INTERFACE
} ISVGAnimatedPreserveAspectRatioVtbl;
interface ISVGAnimatedPreserveAspectRatio {
    CONST_VTBL ISVGAnimatedPreserveAspectRatioVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGAnimatedPreserveAspectRatio_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGAnimatedPreserveAspectRatio_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGAnimatedPreserveAspectRatio_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGAnimatedPreserveAspectRatio_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGAnimatedPreserveAspectRatio_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGAnimatedPreserveAspectRatio_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGAnimatedPreserveAspectRatio_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGAnimatedPreserveAspectRatio methods ***/
#define ISVGAnimatedPreserveAspectRatio_putref_baseVal(This,v) (This)->lpVtbl->putref_baseVal(This,v)
#define ISVGAnimatedPreserveAspectRatio_get_baseVal(This,p) (This)->lpVtbl->get_baseVal(This,p)
#define ISVGAnimatedPreserveAspectRatio_putref_animVal(This,v) (This)->lpVtbl->putref_animVal(This,v)
#define ISVGAnimatedPreserveAspectRatio_get_animVal(This,p) (This)->lpVtbl->get_animVal(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGAnimatedPreserveAspectRatio_QueryInterface(ISVGAnimatedPreserveAspectRatio* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGAnimatedPreserveAspectRatio_AddRef(ISVGAnimatedPreserveAspectRatio* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGAnimatedPreserveAspectRatio_Release(ISVGAnimatedPreserveAspectRatio* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGAnimatedPreserveAspectRatio_GetTypeInfoCount(ISVGAnimatedPreserveAspectRatio* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGAnimatedPreserveAspectRatio_GetTypeInfo(ISVGAnimatedPreserveAspectRatio* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGAnimatedPreserveAspectRatio_GetIDsOfNames(ISVGAnimatedPreserveAspectRatio* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGAnimatedPreserveAspectRatio_Invoke(ISVGAnimatedPreserveAspectRatio* 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);
}
/*** ISVGAnimatedPreserveAspectRatio methods ***/
static FORCEINLINE HRESULT ISVGAnimatedPreserveAspectRatio_putref_baseVal(ISVGAnimatedPreserveAspectRatio* This,ISVGPreserveAspectRatio *v) {
    return This->lpVtbl->putref_baseVal(This,v);
}
static FORCEINLINE HRESULT ISVGAnimatedPreserveAspectRatio_get_baseVal(ISVGAnimatedPreserveAspectRatio* This,ISVGPreserveAspectRatio **p) {
    return This->lpVtbl->get_baseVal(This,p);
}
static FORCEINLINE HRESULT ISVGAnimatedPreserveAspectRatio_putref_animVal(ISVGAnimatedPreserveAspectRatio* This,ISVGPreserveAspectRatio *v) {
    return This->lpVtbl->putref_animVal(This,v);
}
static FORCEINLINE HRESULT ISVGAnimatedPreserveAspectRatio_get_animVal(ISVGAnimatedPreserveAspectRatio* This,ISVGPreserveAspectRatio **p) {
    return This->lpVtbl->get_animVal(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGAnimatedPreserveAspectRatio_putref_baseVal_Proxy(
    ISVGAnimatedPreserveAspectRatio* This,
    ISVGPreserveAspectRatio *v);
void __RPC_STUB ISVGAnimatedPreserveAspectRatio_putref_baseVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedPreserveAspectRatio_get_baseVal_Proxy(
    ISVGAnimatedPreserveAspectRatio* This,
    ISVGPreserveAspectRatio **p);
void __RPC_STUB ISVGAnimatedPreserveAspectRatio_get_baseVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedPreserveAspectRatio_putref_animVal_Proxy(
    ISVGAnimatedPreserveAspectRatio* This,
    ISVGPreserveAspectRatio *v);
void __RPC_STUB ISVGAnimatedPreserveAspectRatio_putref_animVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAnimatedPreserveAspectRatio_get_animVal_Proxy(
    ISVGAnimatedPreserveAspectRatio* This,
    ISVGPreserveAspectRatio **p);
void __RPC_STUB ISVGAnimatedPreserveAspectRatio_get_animVal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGAnimatedPreserveAspectRatio_INTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGAnimatedPreserveAspectRatio coclass
 */

DEFINE_GUID(CLSID_SVGAnimatedPreserveAspectRatio, 0x305105ce, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105ce-98b5-11cf-bb82-00aa00bdce0b") SVGAnimatedPreserveAspectRatio;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGAnimatedPreserveAspectRatio, 0x305105ce, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGAnimatedPreserveAspectRatio;
/*****************************************************************************
 * ISVGImageElement interface
 */
#ifndef __ISVGImageElement_INTERFACE_DEFINED__
#define __ISVGImageElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGImageElement, 0x305104f0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104f0-98b5-11cf-bb82-00aa00bdce0b")
ISVGImageElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_x(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_y(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_width(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_width(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_height(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_height(
        ISVGAnimatedLength **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGImageElement, 0x305104f0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGImageElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGImageElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGImageElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGImageElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGImageElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGImageElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGImageElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGImageElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGImageElement methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_x)(
        ISVGImageElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_x)(
        ISVGImageElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_y)(
        ISVGImageElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_y)(
        ISVGImageElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_width)(
        ISVGImageElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_width)(
        ISVGImageElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_height)(
        ISVGImageElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_height)(
        ISVGImageElement* This,
        ISVGAnimatedLength **p);

    END_INTERFACE
} ISVGImageElementVtbl;
interface ISVGImageElement {
    CONST_VTBL ISVGImageElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGImageElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGImageElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGImageElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGImageElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGImageElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGImageElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGImageElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGImageElement methods ***/
#define ISVGImageElement_putref_x(This,v) (This)->lpVtbl->putref_x(This,v)
#define ISVGImageElement_get_x(This,p) (This)->lpVtbl->get_x(This,p)
#define ISVGImageElement_putref_y(This,v) (This)->lpVtbl->putref_y(This,v)
#define ISVGImageElement_get_y(This,p) (This)->lpVtbl->get_y(This,p)
#define ISVGImageElement_putref_width(This,v) (This)->lpVtbl->putref_width(This,v)
#define ISVGImageElement_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#define ISVGImageElement_putref_height(This,v) (This)->lpVtbl->putref_height(This,v)
#define ISVGImageElement_get_height(This,p) (This)->lpVtbl->get_height(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGImageElement_QueryInterface(ISVGImageElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGImageElement_AddRef(ISVGImageElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGImageElement_Release(ISVGImageElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGImageElement_GetTypeInfoCount(ISVGImageElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGImageElement_GetTypeInfo(ISVGImageElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGImageElement_GetIDsOfNames(ISVGImageElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGImageElement_Invoke(ISVGImageElement* 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);
}
/*** ISVGImageElement methods ***/
static FORCEINLINE HRESULT ISVGImageElement_putref_x(ISVGImageElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_x(This,v);
}
static FORCEINLINE HRESULT ISVGImageElement_get_x(ISVGImageElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_x(This,p);
}
static FORCEINLINE HRESULT ISVGImageElement_putref_y(ISVGImageElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_y(This,v);
}
static FORCEINLINE HRESULT ISVGImageElement_get_y(ISVGImageElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_y(This,p);
}
static FORCEINLINE HRESULT ISVGImageElement_putref_width(ISVGImageElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_width(This,v);
}
static FORCEINLINE HRESULT ISVGImageElement_get_width(ISVGImageElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_width(This,p);
}
static FORCEINLINE HRESULT ISVGImageElement_putref_height(ISVGImageElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_height(This,v);
}
static FORCEINLINE HRESULT ISVGImageElement_get_height(ISVGImageElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_height(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGImageElement_putref_x_Proxy(
    ISVGImageElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGImageElement_putref_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGImageElement_get_x_Proxy(
    ISVGImageElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGImageElement_get_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGImageElement_putref_y_Proxy(
    ISVGImageElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGImageElement_putref_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGImageElement_get_y_Proxy(
    ISVGImageElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGImageElement_get_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGImageElement_putref_width_Proxy(
    ISVGImageElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGImageElement_putref_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGImageElement_get_width_Proxy(
    ISVGImageElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGImageElement_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGImageElement_putref_height_Proxy(
    ISVGImageElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGImageElement_putref_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGImageElement_get_height_Proxy(
    ISVGImageElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGImageElement_get_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGImageElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGImageElement dispinterface
 */
#ifndef __DispSVGImageElement_DISPINTERFACE_DEFINED__
#define __DispSVGImageElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGImageElement, 0x30590027, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590027-98b5-11cf-bb82-00aa00bdce0b")
DispSVGImageElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGImageElement, 0x30590027, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGImageElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGImageElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGImageElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGImageElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGImageElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGImageElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGImageElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGImageElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGImageElementVtbl;
interface DispSVGImageElement {
    CONST_VTBL DispSVGImageElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGImageElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGImageElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGImageElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGImageElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGImageElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGImageElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGImageElement_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 DispSVGImageElement_QueryInterface(DispSVGImageElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGImageElement_AddRef(DispSVGImageElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGImageElement_Release(DispSVGImageElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGImageElement_GetTypeInfoCount(DispSVGImageElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGImageElement_GetTypeInfo(DispSVGImageElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGImageElement_GetIDsOfNames(DispSVGImageElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGImageElement_Invoke(DispSVGImageElement* 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  /* __DispSVGImageElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGImageElement coclass
 */

DEFINE_GUID(CLSID_SVGImageElement, 0x305105cf, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105cf-98b5-11cf-bb82-00aa00bdce0b") SVGImageElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGImageElement, 0x305105cf, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGImageElement;
typedef enum _svgUnitTypes {
    SVG_UNITTYPE_UNKNOWN = 0,
    SVG_UNITTYPE_USERSPACEONUSE = 1,
    SVG_UNITTYPE_OBJECTBOUNDINGBOX = 2,
    svgUnitTypes_Max = 0x7fffffff
} svgUnitTypes;
/*****************************************************************************
 * ISVGStopElement interface
 */
#ifndef __ISVGStopElement_INTERFACE_DEFINED__
#define __ISVGStopElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGStopElement, 0x3051052b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051052b-98b5-11cf-bb82-00aa00bdce0b")
ISVGStopElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_offset(
        ISVGAnimatedNumber *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_offset(
        ISVGAnimatedNumber **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGStopElement, 0x3051052b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGStopElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGStopElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGStopElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGStopElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGStopElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGStopElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGStopElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGStopElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGStopElement methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_offset)(
        ISVGStopElement* This,
        ISVGAnimatedNumber *v);

    HRESULT (STDMETHODCALLTYPE *get_offset)(
        ISVGStopElement* This,
        ISVGAnimatedNumber **p);

    END_INTERFACE
} ISVGStopElementVtbl;
interface ISVGStopElement {
    CONST_VTBL ISVGStopElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGStopElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGStopElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGStopElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGStopElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGStopElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGStopElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGStopElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGStopElement methods ***/
#define ISVGStopElement_putref_offset(This,v) (This)->lpVtbl->putref_offset(This,v)
#define ISVGStopElement_get_offset(This,p) (This)->lpVtbl->get_offset(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGStopElement_QueryInterface(ISVGStopElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGStopElement_AddRef(ISVGStopElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGStopElement_Release(ISVGStopElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGStopElement_GetTypeInfoCount(ISVGStopElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGStopElement_GetTypeInfo(ISVGStopElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGStopElement_GetIDsOfNames(ISVGStopElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGStopElement_Invoke(ISVGStopElement* 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);
}
/*** ISVGStopElement methods ***/
static FORCEINLINE HRESULT ISVGStopElement_putref_offset(ISVGStopElement* This,ISVGAnimatedNumber *v) {
    return This->lpVtbl->putref_offset(This,v);
}
static FORCEINLINE HRESULT ISVGStopElement_get_offset(ISVGStopElement* This,ISVGAnimatedNumber **p) {
    return This->lpVtbl->get_offset(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGStopElement_putref_offset_Proxy(
    ISVGStopElement* This,
    ISVGAnimatedNumber *v);
void __RPC_STUB ISVGStopElement_putref_offset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGStopElement_get_offset_Proxy(
    ISVGStopElement* This,
    ISVGAnimatedNumber **p);
void __RPC_STUB ISVGStopElement_get_offset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGStopElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGStopElement dispinterface
 */
#ifndef __DispSVGStopElement_DISPINTERFACE_DEFINED__
#define __DispSVGStopElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGStopElement, 0x3059002d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059002d-98b5-11cf-bb82-00aa00bdce0b")
DispSVGStopElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGStopElement, 0x3059002d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGStopElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGStopElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGStopElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGStopElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGStopElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGStopElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGStopElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGStopElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGStopElementVtbl;
interface DispSVGStopElement {
    CONST_VTBL DispSVGStopElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGStopElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGStopElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGStopElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGStopElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGStopElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGStopElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGStopElement_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 DispSVGStopElement_QueryInterface(DispSVGStopElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGStopElement_AddRef(DispSVGStopElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGStopElement_Release(DispSVGStopElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGStopElement_GetTypeInfoCount(DispSVGStopElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGStopElement_GetTypeInfo(DispSVGStopElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGStopElement_GetIDsOfNames(DispSVGStopElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGStopElement_Invoke(DispSVGStopElement* 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  /* __DispSVGStopElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGStopElement coclass
 */

DEFINE_GUID(CLSID_SVGStopElement, 0x305105d5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105d5-98b5-11cf-bb82-00aa00bdce0b") SVGStopElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGStopElement, 0x305105d5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGStopElement;
typedef enum _svgSpreadMethod {
    SVG_SPREADMETHOD_UNKNOWN = 0,
    SVG_SPREADMETHOD_PAD = 1,
    SVG_SPREADMETHOD_REFLECT = 2,
    SVG_SPREADMETHOD_REPEAT = 3,
    svgSpreadMethod_Max = 0x7fffffff
} svgSpreadMethod;
/*****************************************************************************
 * ISVGGradientElement interface
 */
#ifndef __ISVGGradientElement_INTERFACE_DEFINED__
#define __ISVGGradientElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGGradientElement, 0x30510528, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510528-98b5-11cf-bb82-00aa00bdce0b")
ISVGGradientElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_gradientUnits(
        ISVGAnimatedEnumeration *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_gradientUnits(
        ISVGAnimatedEnumeration **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_gradientTransform(
        ISVGAnimatedTransformList *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_gradientTransform(
        ISVGAnimatedTransformList **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_spreadMethod(
        ISVGAnimatedEnumeration *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_spreadMethod(
        ISVGAnimatedEnumeration **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGGradientElement, 0x30510528, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGGradientElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGGradientElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGGradientElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGGradientElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGGradientElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGGradientElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGGradientElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGGradientElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGGradientElement methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_gradientUnits)(
        ISVGGradientElement* This,
        ISVGAnimatedEnumeration *v);

    HRESULT (STDMETHODCALLTYPE *get_gradientUnits)(
        ISVGGradientElement* This,
        ISVGAnimatedEnumeration **p);

    HRESULT (STDMETHODCALLTYPE *putref_gradientTransform)(
        ISVGGradientElement* This,
        ISVGAnimatedTransformList *v);

    HRESULT (STDMETHODCALLTYPE *get_gradientTransform)(
        ISVGGradientElement* This,
        ISVGAnimatedTransformList **p);

    HRESULT (STDMETHODCALLTYPE *putref_spreadMethod)(
        ISVGGradientElement* This,
        ISVGAnimatedEnumeration *v);

    HRESULT (STDMETHODCALLTYPE *get_spreadMethod)(
        ISVGGradientElement* This,
        ISVGAnimatedEnumeration **p);

    END_INTERFACE
} ISVGGradientElementVtbl;
interface ISVGGradientElement {
    CONST_VTBL ISVGGradientElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGGradientElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGGradientElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGGradientElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGGradientElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGGradientElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGGradientElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGGradientElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGGradientElement methods ***/
#define ISVGGradientElement_putref_gradientUnits(This,v) (This)->lpVtbl->putref_gradientUnits(This,v)
#define ISVGGradientElement_get_gradientUnits(This,p) (This)->lpVtbl->get_gradientUnits(This,p)
#define ISVGGradientElement_putref_gradientTransform(This,v) (This)->lpVtbl->putref_gradientTransform(This,v)
#define ISVGGradientElement_get_gradientTransform(This,p) (This)->lpVtbl->get_gradientTransform(This,p)
#define ISVGGradientElement_putref_spreadMethod(This,v) (This)->lpVtbl->putref_spreadMethod(This,v)
#define ISVGGradientElement_get_spreadMethod(This,p) (This)->lpVtbl->get_spreadMethod(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGGradientElement_QueryInterface(ISVGGradientElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGGradientElement_AddRef(ISVGGradientElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGGradientElement_Release(ISVGGradientElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGGradientElement_GetTypeInfoCount(ISVGGradientElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGGradientElement_GetTypeInfo(ISVGGradientElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGGradientElement_GetIDsOfNames(ISVGGradientElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGGradientElement_Invoke(ISVGGradientElement* 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);
}
/*** ISVGGradientElement methods ***/
static FORCEINLINE HRESULT ISVGGradientElement_putref_gradientUnits(ISVGGradientElement* This,ISVGAnimatedEnumeration *v) {
    return This->lpVtbl->putref_gradientUnits(This,v);
}
static FORCEINLINE HRESULT ISVGGradientElement_get_gradientUnits(ISVGGradientElement* This,ISVGAnimatedEnumeration **p) {
    return This->lpVtbl->get_gradientUnits(This,p);
}
static FORCEINLINE HRESULT ISVGGradientElement_putref_gradientTransform(ISVGGradientElement* This,ISVGAnimatedTransformList *v) {
    return This->lpVtbl->putref_gradientTransform(This,v);
}
static FORCEINLINE HRESULT ISVGGradientElement_get_gradientTransform(ISVGGradientElement* This,ISVGAnimatedTransformList **p) {
    return This->lpVtbl->get_gradientTransform(This,p);
}
static FORCEINLINE HRESULT ISVGGradientElement_putref_spreadMethod(ISVGGradientElement* This,ISVGAnimatedEnumeration *v) {
    return This->lpVtbl->putref_spreadMethod(This,v);
}
static FORCEINLINE HRESULT ISVGGradientElement_get_spreadMethod(ISVGGradientElement* This,ISVGAnimatedEnumeration **p) {
    return This->lpVtbl->get_spreadMethod(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGGradientElement_putref_gradientUnits_Proxy(
    ISVGGradientElement* This,
    ISVGAnimatedEnumeration *v);
void __RPC_STUB ISVGGradientElement_putref_gradientUnits_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGGradientElement_get_gradientUnits_Proxy(
    ISVGGradientElement* This,
    ISVGAnimatedEnumeration **p);
void __RPC_STUB ISVGGradientElement_get_gradientUnits_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGGradientElement_putref_gradientTransform_Proxy(
    ISVGGradientElement* This,
    ISVGAnimatedTransformList *v);
void __RPC_STUB ISVGGradientElement_putref_gradientTransform_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGGradientElement_get_gradientTransform_Proxy(
    ISVGGradientElement* This,
    ISVGAnimatedTransformList **p);
void __RPC_STUB ISVGGradientElement_get_gradientTransform_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGGradientElement_putref_spreadMethod_Proxy(
    ISVGGradientElement* This,
    ISVGAnimatedEnumeration *v);
void __RPC_STUB ISVGGradientElement_putref_spreadMethod_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGGradientElement_get_spreadMethod_Proxy(
    ISVGGradientElement* This,
    ISVGAnimatedEnumeration **p);
void __RPC_STUB ISVGGradientElement_get_spreadMethod_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGGradientElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGGradientElement dispinterface
 */
#ifndef __DispSVGGradientElement_DISPINTERFACE_DEFINED__
#define __DispSVGGradientElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGGradientElement, 0x3059002e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059002e-98b5-11cf-bb82-00aa00bdce0b")
DispSVGGradientElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGGradientElement, 0x3059002e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGGradientElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGGradientElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGGradientElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGGradientElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGGradientElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGGradientElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGGradientElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGGradientElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGGradientElementVtbl;
interface DispSVGGradientElement {
    CONST_VTBL DispSVGGradientElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGGradientElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGGradientElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGGradientElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGGradientElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGGradientElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGGradientElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGGradientElement_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 DispSVGGradientElement_QueryInterface(DispSVGGradientElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGGradientElement_AddRef(DispSVGGradientElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGGradientElement_Release(DispSVGGradientElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGGradientElement_GetTypeInfoCount(DispSVGGradientElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGGradientElement_GetTypeInfo(DispSVGGradientElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGGradientElement_GetIDsOfNames(DispSVGGradientElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGGradientElement_Invoke(DispSVGGradientElement* 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  /* __DispSVGGradientElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGGradientElement coclass
 */

DEFINE_GUID(CLSID_SVGGradientElement, 0x305105d6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105d6-98b5-11cf-bb82-00aa00bdce0b") SVGGradientElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGGradientElement, 0x305105d6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGGradientElement;
/*****************************************************************************
 * ISVGLinearGradientElement interface
 */
#ifndef __ISVGLinearGradientElement_INTERFACE_DEFINED__
#define __ISVGLinearGradientElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGLinearGradientElement, 0x30510529, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510529-98b5-11cf-bb82-00aa00bdce0b")
ISVGLinearGradientElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_x1(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x1(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_y1(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y1(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_x2(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x2(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_y2(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y2(
        ISVGAnimatedLength **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGLinearGradientElement, 0x30510529, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGLinearGradientElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGLinearGradientElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGLinearGradientElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGLinearGradientElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGLinearGradientElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGLinearGradientElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGLinearGradientElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGLinearGradientElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGLinearGradientElement methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_x1)(
        ISVGLinearGradientElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_x1)(
        ISVGLinearGradientElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_y1)(
        ISVGLinearGradientElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_y1)(
        ISVGLinearGradientElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_x2)(
        ISVGLinearGradientElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_x2)(
        ISVGLinearGradientElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_y2)(
        ISVGLinearGradientElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_y2)(
        ISVGLinearGradientElement* This,
        ISVGAnimatedLength **p);

    END_INTERFACE
} ISVGLinearGradientElementVtbl;
interface ISVGLinearGradientElement {
    CONST_VTBL ISVGLinearGradientElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGLinearGradientElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGLinearGradientElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGLinearGradientElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGLinearGradientElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGLinearGradientElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGLinearGradientElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGLinearGradientElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGLinearGradientElement methods ***/
#define ISVGLinearGradientElement_putref_x1(This,v) (This)->lpVtbl->putref_x1(This,v)
#define ISVGLinearGradientElement_get_x1(This,p) (This)->lpVtbl->get_x1(This,p)
#define ISVGLinearGradientElement_putref_y1(This,v) (This)->lpVtbl->putref_y1(This,v)
#define ISVGLinearGradientElement_get_y1(This,p) (This)->lpVtbl->get_y1(This,p)
#define ISVGLinearGradientElement_putref_x2(This,v) (This)->lpVtbl->putref_x2(This,v)
#define ISVGLinearGradientElement_get_x2(This,p) (This)->lpVtbl->get_x2(This,p)
#define ISVGLinearGradientElement_putref_y2(This,v) (This)->lpVtbl->putref_y2(This,v)
#define ISVGLinearGradientElement_get_y2(This,p) (This)->lpVtbl->get_y2(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGLinearGradientElement_QueryInterface(ISVGLinearGradientElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGLinearGradientElement_AddRef(ISVGLinearGradientElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGLinearGradientElement_Release(ISVGLinearGradientElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGLinearGradientElement_GetTypeInfoCount(ISVGLinearGradientElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGLinearGradientElement_GetTypeInfo(ISVGLinearGradientElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGLinearGradientElement_GetIDsOfNames(ISVGLinearGradientElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGLinearGradientElement_Invoke(ISVGLinearGradientElement* 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);
}
/*** ISVGLinearGradientElement methods ***/
static FORCEINLINE HRESULT ISVGLinearGradientElement_putref_x1(ISVGLinearGradientElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_x1(This,v);
}
static FORCEINLINE HRESULT ISVGLinearGradientElement_get_x1(ISVGLinearGradientElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_x1(This,p);
}
static FORCEINLINE HRESULT ISVGLinearGradientElement_putref_y1(ISVGLinearGradientElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_y1(This,v);
}
static FORCEINLINE HRESULT ISVGLinearGradientElement_get_y1(ISVGLinearGradientElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_y1(This,p);
}
static FORCEINLINE HRESULT ISVGLinearGradientElement_putref_x2(ISVGLinearGradientElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_x2(This,v);
}
static FORCEINLINE HRESULT ISVGLinearGradientElement_get_x2(ISVGLinearGradientElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_x2(This,p);
}
static FORCEINLINE HRESULT ISVGLinearGradientElement_putref_y2(ISVGLinearGradientElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_y2(This,v);
}
static FORCEINLINE HRESULT ISVGLinearGradientElement_get_y2(ISVGLinearGradientElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_y2(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGLinearGradientElement_putref_x1_Proxy(
    ISVGLinearGradientElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGLinearGradientElement_putref_x1_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLinearGradientElement_get_x1_Proxy(
    ISVGLinearGradientElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGLinearGradientElement_get_x1_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLinearGradientElement_putref_y1_Proxy(
    ISVGLinearGradientElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGLinearGradientElement_putref_y1_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLinearGradientElement_get_y1_Proxy(
    ISVGLinearGradientElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGLinearGradientElement_get_y1_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLinearGradientElement_putref_x2_Proxy(
    ISVGLinearGradientElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGLinearGradientElement_putref_x2_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLinearGradientElement_get_x2_Proxy(
    ISVGLinearGradientElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGLinearGradientElement_get_x2_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLinearGradientElement_putref_y2_Proxy(
    ISVGLinearGradientElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGLinearGradientElement_putref_y2_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGLinearGradientElement_get_y2_Proxy(
    ISVGLinearGradientElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGLinearGradientElement_get_y2_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGLinearGradientElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGLinearGradientElement dispinterface
 */
#ifndef __DispSVGLinearGradientElement_DISPINTERFACE_DEFINED__
#define __DispSVGLinearGradientElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGLinearGradientElement, 0x3059002a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059002a-98b5-11cf-bb82-00aa00bdce0b")
DispSVGLinearGradientElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGLinearGradientElement, 0x3059002a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGLinearGradientElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGLinearGradientElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGLinearGradientElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGLinearGradientElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGLinearGradientElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGLinearGradientElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGLinearGradientElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGLinearGradientElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGLinearGradientElementVtbl;
interface DispSVGLinearGradientElement {
    CONST_VTBL DispSVGLinearGradientElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGLinearGradientElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGLinearGradientElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGLinearGradientElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGLinearGradientElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGLinearGradientElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGLinearGradientElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGLinearGradientElement_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 DispSVGLinearGradientElement_QueryInterface(DispSVGLinearGradientElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGLinearGradientElement_AddRef(DispSVGLinearGradientElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGLinearGradientElement_Release(DispSVGLinearGradientElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGLinearGradientElement_GetTypeInfoCount(DispSVGLinearGradientElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGLinearGradientElement_GetTypeInfo(DispSVGLinearGradientElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGLinearGradientElement_GetIDsOfNames(DispSVGLinearGradientElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGLinearGradientElement_Invoke(DispSVGLinearGradientElement* 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  /* __DispSVGLinearGradientElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGLinearGradientElement coclass
 */

DEFINE_GUID(CLSID_SVGLinearGradientElement, 0x305105d2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105d2-98b5-11cf-bb82-00aa00bdce0b") SVGLinearGradientElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGLinearGradientElement, 0x305105d2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGLinearGradientElement;
/*****************************************************************************
 * ISVGRadialGradientElement interface
 */
#ifndef __ISVGRadialGradientElement_INTERFACE_DEFINED__
#define __ISVGRadialGradientElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGRadialGradientElement, 0x3051052a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051052a-98b5-11cf-bb82-00aa00bdce0b")
ISVGRadialGradientElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_cx(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cx(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_cy(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cy(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_r(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_r(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_fx(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fx(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_fy(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fy(
        ISVGAnimatedLength **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGRadialGradientElement, 0x3051052a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGRadialGradientElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGRadialGradientElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGRadialGradientElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGRadialGradientElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGRadialGradientElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGRadialGradientElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGRadialGradientElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGRadialGradientElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGRadialGradientElement methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_cx)(
        ISVGRadialGradientElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_cx)(
        ISVGRadialGradientElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_cy)(
        ISVGRadialGradientElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_cy)(
        ISVGRadialGradientElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_r)(
        ISVGRadialGradientElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_r)(
        ISVGRadialGradientElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_fx)(
        ISVGRadialGradientElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_fx)(
        ISVGRadialGradientElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_fy)(
        ISVGRadialGradientElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_fy)(
        ISVGRadialGradientElement* This,
        ISVGAnimatedLength **p);

    END_INTERFACE
} ISVGRadialGradientElementVtbl;
interface ISVGRadialGradientElement {
    CONST_VTBL ISVGRadialGradientElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGRadialGradientElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGRadialGradientElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGRadialGradientElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGRadialGradientElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGRadialGradientElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGRadialGradientElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGRadialGradientElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGRadialGradientElement methods ***/
#define ISVGRadialGradientElement_putref_cx(This,v) (This)->lpVtbl->putref_cx(This,v)
#define ISVGRadialGradientElement_get_cx(This,p) (This)->lpVtbl->get_cx(This,p)
#define ISVGRadialGradientElement_putref_cy(This,v) (This)->lpVtbl->putref_cy(This,v)
#define ISVGRadialGradientElement_get_cy(This,p) (This)->lpVtbl->get_cy(This,p)
#define ISVGRadialGradientElement_putref_r(This,v) (This)->lpVtbl->putref_r(This,v)
#define ISVGRadialGradientElement_get_r(This,p) (This)->lpVtbl->get_r(This,p)
#define ISVGRadialGradientElement_putref_fx(This,v) (This)->lpVtbl->putref_fx(This,v)
#define ISVGRadialGradientElement_get_fx(This,p) (This)->lpVtbl->get_fx(This,p)
#define ISVGRadialGradientElement_putref_fy(This,v) (This)->lpVtbl->putref_fy(This,v)
#define ISVGRadialGradientElement_get_fy(This,p) (This)->lpVtbl->get_fy(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGRadialGradientElement_QueryInterface(ISVGRadialGradientElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGRadialGradientElement_AddRef(ISVGRadialGradientElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGRadialGradientElement_Release(ISVGRadialGradientElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGRadialGradientElement_GetTypeInfoCount(ISVGRadialGradientElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGRadialGradientElement_GetTypeInfo(ISVGRadialGradientElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGRadialGradientElement_GetIDsOfNames(ISVGRadialGradientElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGRadialGradientElement_Invoke(ISVGRadialGradientElement* 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);
}
/*** ISVGRadialGradientElement methods ***/
static FORCEINLINE HRESULT ISVGRadialGradientElement_putref_cx(ISVGRadialGradientElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_cx(This,v);
}
static FORCEINLINE HRESULT ISVGRadialGradientElement_get_cx(ISVGRadialGradientElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_cx(This,p);
}
static FORCEINLINE HRESULT ISVGRadialGradientElement_putref_cy(ISVGRadialGradientElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_cy(This,v);
}
static FORCEINLINE HRESULT ISVGRadialGradientElement_get_cy(ISVGRadialGradientElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_cy(This,p);
}
static FORCEINLINE HRESULT ISVGRadialGradientElement_putref_r(ISVGRadialGradientElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_r(This,v);
}
static FORCEINLINE HRESULT ISVGRadialGradientElement_get_r(ISVGRadialGradientElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_r(This,p);
}
static FORCEINLINE HRESULT ISVGRadialGradientElement_putref_fx(ISVGRadialGradientElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_fx(This,v);
}
static FORCEINLINE HRESULT ISVGRadialGradientElement_get_fx(ISVGRadialGradientElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_fx(This,p);
}
static FORCEINLINE HRESULT ISVGRadialGradientElement_putref_fy(ISVGRadialGradientElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_fy(This,v);
}
static FORCEINLINE HRESULT ISVGRadialGradientElement_get_fy(ISVGRadialGradientElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_fy(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGRadialGradientElement_putref_cx_Proxy(
    ISVGRadialGradientElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGRadialGradientElement_putref_cx_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGRadialGradientElement_get_cx_Proxy(
    ISVGRadialGradientElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGRadialGradientElement_get_cx_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGRadialGradientElement_putref_cy_Proxy(
    ISVGRadialGradientElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGRadialGradientElement_putref_cy_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGRadialGradientElement_get_cy_Proxy(
    ISVGRadialGradientElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGRadialGradientElement_get_cy_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGRadialGradientElement_putref_r_Proxy(
    ISVGRadialGradientElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGRadialGradientElement_putref_r_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGRadialGradientElement_get_r_Proxy(
    ISVGRadialGradientElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGRadialGradientElement_get_r_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGRadialGradientElement_putref_fx_Proxy(
    ISVGRadialGradientElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGRadialGradientElement_putref_fx_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGRadialGradientElement_get_fx_Proxy(
    ISVGRadialGradientElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGRadialGradientElement_get_fx_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGRadialGradientElement_putref_fy_Proxy(
    ISVGRadialGradientElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGRadialGradientElement_putref_fy_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGRadialGradientElement_get_fy_Proxy(
    ISVGRadialGradientElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGRadialGradientElement_get_fy_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGRadialGradientElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGRadialGradientElement dispinterface
 */
#ifndef __DispSVGRadialGradientElement_DISPINTERFACE_DEFINED__
#define __DispSVGRadialGradientElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGRadialGradientElement, 0x3059002b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059002b-98b5-11cf-bb82-00aa00bdce0b")
DispSVGRadialGradientElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGRadialGradientElement, 0x3059002b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGRadialGradientElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGRadialGradientElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGRadialGradientElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGRadialGradientElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGRadialGradientElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGRadialGradientElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGRadialGradientElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGRadialGradientElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGRadialGradientElementVtbl;
interface DispSVGRadialGradientElement {
    CONST_VTBL DispSVGRadialGradientElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGRadialGradientElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGRadialGradientElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGRadialGradientElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGRadialGradientElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGRadialGradientElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGRadialGradientElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGRadialGradientElement_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 DispSVGRadialGradientElement_QueryInterface(DispSVGRadialGradientElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGRadialGradientElement_AddRef(DispSVGRadialGradientElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGRadialGradientElement_Release(DispSVGRadialGradientElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGRadialGradientElement_GetTypeInfoCount(DispSVGRadialGradientElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGRadialGradientElement_GetTypeInfo(DispSVGRadialGradientElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGRadialGradientElement_GetIDsOfNames(DispSVGRadialGradientElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGRadialGradientElement_Invoke(DispSVGRadialGradientElement* 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  /* __DispSVGRadialGradientElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGRadialGradientElement coclass
 */

DEFINE_GUID(CLSID_SVGRadialGradientElement, 0x305105d3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105d3-98b5-11cf-bb82-00aa00bdce0b") SVGRadialGradientElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGRadialGradientElement, 0x305105d3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGRadialGradientElement;
/*****************************************************************************
 * ISVGMaskElement interface
 */
#ifndef __ISVGMaskElement_INTERFACE_DEFINED__
#define __ISVGMaskElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGMaskElement, 0x3051052e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051052e-98b5-11cf-bb82-00aa00bdce0b")
ISVGMaskElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_maskUnits(
        ISVGAnimatedEnumeration *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_maskUnits(
        ISVGAnimatedEnumeration **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_maskContentUnits(
        ISVGAnimatedEnumeration *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_maskContentUnits(
        ISVGAnimatedEnumeration **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_x(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_y(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_width(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_width(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_height(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_height(
        ISVGAnimatedLength **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGMaskElement, 0x3051052e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGMaskElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGMaskElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGMaskElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGMaskElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGMaskElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGMaskElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGMaskElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGMaskElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGMaskElement methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_maskUnits)(
        ISVGMaskElement* This,
        ISVGAnimatedEnumeration *v);

    HRESULT (STDMETHODCALLTYPE *get_maskUnits)(
        ISVGMaskElement* This,
        ISVGAnimatedEnumeration **p);

    HRESULT (STDMETHODCALLTYPE *putref_maskContentUnits)(
        ISVGMaskElement* This,
        ISVGAnimatedEnumeration *v);

    HRESULT (STDMETHODCALLTYPE *get_maskContentUnits)(
        ISVGMaskElement* This,
        ISVGAnimatedEnumeration **p);

    HRESULT (STDMETHODCALLTYPE *putref_x)(
        ISVGMaskElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_x)(
        ISVGMaskElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_y)(
        ISVGMaskElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_y)(
        ISVGMaskElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_width)(
        ISVGMaskElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_width)(
        ISVGMaskElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_height)(
        ISVGMaskElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_height)(
        ISVGMaskElement* This,
        ISVGAnimatedLength **p);

    END_INTERFACE
} ISVGMaskElementVtbl;
interface ISVGMaskElement {
    CONST_VTBL ISVGMaskElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGMaskElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGMaskElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGMaskElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGMaskElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGMaskElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGMaskElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGMaskElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGMaskElement methods ***/
#define ISVGMaskElement_putref_maskUnits(This,v) (This)->lpVtbl->putref_maskUnits(This,v)
#define ISVGMaskElement_get_maskUnits(This,p) (This)->lpVtbl->get_maskUnits(This,p)
#define ISVGMaskElement_putref_maskContentUnits(This,v) (This)->lpVtbl->putref_maskContentUnits(This,v)
#define ISVGMaskElement_get_maskContentUnits(This,p) (This)->lpVtbl->get_maskContentUnits(This,p)
#define ISVGMaskElement_putref_x(This,v) (This)->lpVtbl->putref_x(This,v)
#define ISVGMaskElement_get_x(This,p) (This)->lpVtbl->get_x(This,p)
#define ISVGMaskElement_putref_y(This,v) (This)->lpVtbl->putref_y(This,v)
#define ISVGMaskElement_get_y(This,p) (This)->lpVtbl->get_y(This,p)
#define ISVGMaskElement_putref_width(This,v) (This)->lpVtbl->putref_width(This,v)
#define ISVGMaskElement_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#define ISVGMaskElement_putref_height(This,v) (This)->lpVtbl->putref_height(This,v)
#define ISVGMaskElement_get_height(This,p) (This)->lpVtbl->get_height(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGMaskElement_QueryInterface(ISVGMaskElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGMaskElement_AddRef(ISVGMaskElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGMaskElement_Release(ISVGMaskElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGMaskElement_GetTypeInfoCount(ISVGMaskElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGMaskElement_GetTypeInfo(ISVGMaskElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGMaskElement_GetIDsOfNames(ISVGMaskElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGMaskElement_Invoke(ISVGMaskElement* 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);
}
/*** ISVGMaskElement methods ***/
static FORCEINLINE HRESULT ISVGMaskElement_putref_maskUnits(ISVGMaskElement* This,ISVGAnimatedEnumeration *v) {
    return This->lpVtbl->putref_maskUnits(This,v);
}
static FORCEINLINE HRESULT ISVGMaskElement_get_maskUnits(ISVGMaskElement* This,ISVGAnimatedEnumeration **p) {
    return This->lpVtbl->get_maskUnits(This,p);
}
static FORCEINLINE HRESULT ISVGMaskElement_putref_maskContentUnits(ISVGMaskElement* This,ISVGAnimatedEnumeration *v) {
    return This->lpVtbl->putref_maskContentUnits(This,v);
}
static FORCEINLINE HRESULT ISVGMaskElement_get_maskContentUnits(ISVGMaskElement* This,ISVGAnimatedEnumeration **p) {
    return This->lpVtbl->get_maskContentUnits(This,p);
}
static FORCEINLINE HRESULT ISVGMaskElement_putref_x(ISVGMaskElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_x(This,v);
}
static FORCEINLINE HRESULT ISVGMaskElement_get_x(ISVGMaskElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_x(This,p);
}
static FORCEINLINE HRESULT ISVGMaskElement_putref_y(ISVGMaskElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_y(This,v);
}
static FORCEINLINE HRESULT ISVGMaskElement_get_y(ISVGMaskElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_y(This,p);
}
static FORCEINLINE HRESULT ISVGMaskElement_putref_width(ISVGMaskElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_width(This,v);
}
static FORCEINLINE HRESULT ISVGMaskElement_get_width(ISVGMaskElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_width(This,p);
}
static FORCEINLINE HRESULT ISVGMaskElement_putref_height(ISVGMaskElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_height(This,v);
}
static FORCEINLINE HRESULT ISVGMaskElement_get_height(ISVGMaskElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_height(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGMaskElement_putref_maskUnits_Proxy(
    ISVGMaskElement* This,
    ISVGAnimatedEnumeration *v);
void __RPC_STUB ISVGMaskElement_putref_maskUnits_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMaskElement_get_maskUnits_Proxy(
    ISVGMaskElement* This,
    ISVGAnimatedEnumeration **p);
void __RPC_STUB ISVGMaskElement_get_maskUnits_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMaskElement_putref_maskContentUnits_Proxy(
    ISVGMaskElement* This,
    ISVGAnimatedEnumeration *v);
void __RPC_STUB ISVGMaskElement_putref_maskContentUnits_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMaskElement_get_maskContentUnits_Proxy(
    ISVGMaskElement* This,
    ISVGAnimatedEnumeration **p);
void __RPC_STUB ISVGMaskElement_get_maskContentUnits_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMaskElement_putref_x_Proxy(
    ISVGMaskElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGMaskElement_putref_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMaskElement_get_x_Proxy(
    ISVGMaskElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGMaskElement_get_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMaskElement_putref_y_Proxy(
    ISVGMaskElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGMaskElement_putref_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMaskElement_get_y_Proxy(
    ISVGMaskElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGMaskElement_get_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMaskElement_putref_width_Proxy(
    ISVGMaskElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGMaskElement_putref_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMaskElement_get_width_Proxy(
    ISVGMaskElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGMaskElement_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMaskElement_putref_height_Proxy(
    ISVGMaskElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGMaskElement_putref_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMaskElement_get_height_Proxy(
    ISVGMaskElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGMaskElement_get_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGMaskElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGMaskElement dispinterface
 */
#ifndef __DispSVGMaskElement_DISPINTERFACE_DEFINED__
#define __DispSVGMaskElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGMaskElement, 0x3059003c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059003c-98b5-11cf-bb82-00aa00bdce0b")
DispSVGMaskElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGMaskElement, 0x3059003c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGMaskElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGMaskElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGMaskElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGMaskElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGMaskElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGMaskElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGMaskElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGMaskElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGMaskElementVtbl;
interface DispSVGMaskElement {
    CONST_VTBL DispSVGMaskElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGMaskElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGMaskElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGMaskElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGMaskElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGMaskElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGMaskElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGMaskElement_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 DispSVGMaskElement_QueryInterface(DispSVGMaskElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGMaskElement_AddRef(DispSVGMaskElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGMaskElement_Release(DispSVGMaskElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGMaskElement_GetTypeInfoCount(DispSVGMaskElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGMaskElement_GetTypeInfo(DispSVGMaskElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGMaskElement_GetIDsOfNames(DispSVGMaskElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGMaskElement_Invoke(DispSVGMaskElement* 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  /* __DispSVGMaskElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGMaskElement coclass
 */

DEFINE_GUID(CLSID_SVGMaskElement, 0x305105e7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105e7-98b5-11cf-bb82-00aa00bdce0b") SVGMaskElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGMaskElement, 0x305105e7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGMaskElement;
typedef enum _svgFeblendMode {
    SVG_FEBLEND_MODE_UNKNOWN = 0,
    SVG_FEBLEND_MODE_NORMAL = 1,
    SVG_FEBLEND_MODE_MULTIPLY = 2,
    SVG_FEBLEND_MODE_SCREEN = 3,
    SVG_FEBLEND_MODE_DARKEN = 4,
    SVG_FEBLEND_MODE_LIGHTEN = 5,
    svgFeblendMode_Max = 0x7fffffff
} svgFeblendMode;
typedef enum _svgFecolormatrixType {
    SVG_FECOLORMATRIX_TYPE_UNKNOWN = 0,
    SVG_FECOLORMATRIX_TYPE_MATRIX = 1,
    SVG_FECOLORMATRIX_TYPE_SATURATE = 2,
    SVG_FECOLORMATRIX_TYPE_HUEROTATE = 3,
    SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA = 4,
    svgFecolormatrixType_Max = 0x7fffffff
} svgFecolormatrixType;
typedef enum _svgFecomponenttransferType {
    SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN = 0,
    SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY = 1,
    SVG_FECOMPONENTTRANSFER_TYPE_TABLE = 2,
    SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE = 3,
    SVG_FECOMPONENTTRANSFER_TYPE_LINEAR = 4,
    SVG_FECOMPONENTTRANSFER_TYPE_GAMMA = 5,
    svgFecomponenttransferType_Max = 0x7fffffff
} svgFecomponenttransferType;
typedef enum _svgFecompositeOperator {
    SVG_FECOMPOSITE_OPERATOR_UNKNOWN = 0,
    SVG_FECOMPOSITE_OPERATOR_OVER = 1,
    SVG_FECOMPOSITE_OPERATOR_IN = 2,
    SVG_FECOMPOSITE_OPERATOR_OUT = 3,
    SVG_FECOMPOSITE_OPERATOR_ATOP = 4,
    SVG_FECOMPOSITE_OPERATOR_XOR = 5,
    SVG_FECOMPOSITE_OPERATOR_ARITHMETIC = 6,
    svgFecompositeOperator_Max = 0x7fffffff
} svgFecompositeOperator;
typedef enum _svgEdgemode {
    SVG_EDGEMODE_UNKNOWN = 0,
    SVG_EDGEMODE_DUPLICATE = 1,
    SVG_EDGEMODE_WRAP = 2,
    SVG_EDGEMODE_NONE = 3,
    svgEdgemode_Max = 0x7fffffff
} svgEdgemode;
typedef enum _svgPreserveAlpha {
    SVG_PRESERVEALPHA_FALSE = 0,
    SVG_PRESERVEALPHA_TRUE = 1,
    svgPreserveAlpha_Max = 0x7fffffff
} svgPreserveAlpha;
typedef enum _svgChannel {
    SVG_CHANNEL_UNKNOWN = 0,
    SVG_CHANNEL_R = 1,
    SVG_CHANNEL_G = 2,
    SVG_CHANNEL_B = 3,
    SVG_CHANNEL_A = 4,
    svgChannel_Max = 0x7fffffff
} svgChannel;
typedef enum _svgMorphologyOperator {
    SVG_MORPHOLOGY_OPERATOR_UNKNOWN = 0,
    SVG_MORPHOLOGY_OPERATOR_ERODE = 1,
    SVG_MORPHOLOGY_OPERATOR_DILATE = 2,
    svgMorphologyOperator_Max = 0x7fffffff
} svgMorphologyOperator;
typedef enum _svgTurbulenceType {
    SVG_TURBULENCE_TYPE_UNKNOWN = 0,
    SVG_TURBULENCE_TYPE_FACTALNOISE = 1,
    SVG_TURBULENCE_TYPE_TURBULENCE = 2,
    svgTurbulenceType_Max = 0x7fffffff
} svgTurbulenceType;
typedef enum _svgStitchtype {
    SVG_STITCHTYPE_UNKNOWN = 0,
    SVG_STITCHTYPE_STITCH = 1,
    SVG_STITCHTYPE_NOSTITCH = 2,
    svgStitchtype_Max = 0x7fffffff
} svgStitchtype;
typedef enum _svgMarkerUnits {
    SVG_MARKERUNITS_UNKNOWN = 0,
    SVG_MARKERUNITS_USERSPACEONUSE = 1,
    SVG_MARKERUNITS_STROKEWIDTH = 2,
    svgMarkerUnits_Max = 0x7fffffff
} svgMarkerUnits;
typedef enum _svgMarkerOrient {
    SVG_MARKER_ORIENT_UNKNOWN = 0,
    SVG_MARKER_ORIENT_AUTO = 1,
    SVG_MARKER_ORIENT_ANGLE = 2,
    svgMarkerOrient_Max = 0x7fffffff
} svgMarkerOrient;
typedef enum _svgMarkerOrientAttribute {
    svgMarkerOrientAttributeAuto = 0,
    svgMarkerOrientAttribute_Max = 0x7fffffff
} svgMarkerOrientAttribute;
/*****************************************************************************
 * ISVGMarkerElement interface
 */
#ifndef __ISVGMarkerElement_INTERFACE_DEFINED__
#define __ISVGMarkerElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGMarkerElement, 0x30510525, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510525-98b5-11cf-bb82-00aa00bdce0b")
ISVGMarkerElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_refX(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_refX(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_refY(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_refY(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_markerUnits(
        ISVGAnimatedEnumeration *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_markerUnits(
        ISVGAnimatedEnumeration **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_markerWidth(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_markerWidth(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_markerHeight(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_markerHeight(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_orientType(
        ISVGAnimatedEnumeration *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_orientType(
        ISVGAnimatedEnumeration **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_orientAngle(
        ISVGAnimatedAngle *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_orientAngle(
        ISVGAnimatedAngle **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE setOrientToAuto(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE setOrientToAngle(
        ISVGAngle *pSVGAngle) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGMarkerElement, 0x30510525, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGMarkerElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGMarkerElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGMarkerElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGMarkerElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGMarkerElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGMarkerElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGMarkerElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGMarkerElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGMarkerElement methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_refX)(
        ISVGMarkerElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_refX)(
        ISVGMarkerElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_refY)(
        ISVGMarkerElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_refY)(
        ISVGMarkerElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_markerUnits)(
        ISVGMarkerElement* This,
        ISVGAnimatedEnumeration *v);

    HRESULT (STDMETHODCALLTYPE *get_markerUnits)(
        ISVGMarkerElement* This,
        ISVGAnimatedEnumeration **p);

    HRESULT (STDMETHODCALLTYPE *putref_markerWidth)(
        ISVGMarkerElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_markerWidth)(
        ISVGMarkerElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_markerHeight)(
        ISVGMarkerElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_markerHeight)(
        ISVGMarkerElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_orientType)(
        ISVGMarkerElement* This,
        ISVGAnimatedEnumeration *v);

    HRESULT (STDMETHODCALLTYPE *get_orientType)(
        ISVGMarkerElement* This,
        ISVGAnimatedEnumeration **p);

    HRESULT (STDMETHODCALLTYPE *putref_orientAngle)(
        ISVGMarkerElement* This,
        ISVGAnimatedAngle *v);

    HRESULT (STDMETHODCALLTYPE *get_orientAngle)(
        ISVGMarkerElement* This,
        ISVGAnimatedAngle **p);

    HRESULT (STDMETHODCALLTYPE *setOrientToAuto)(
        ISVGMarkerElement* This);

    HRESULT (STDMETHODCALLTYPE *setOrientToAngle)(
        ISVGMarkerElement* This,
        ISVGAngle *pSVGAngle);

    END_INTERFACE
} ISVGMarkerElementVtbl;
interface ISVGMarkerElement {
    CONST_VTBL ISVGMarkerElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGMarkerElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGMarkerElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGMarkerElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGMarkerElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGMarkerElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGMarkerElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGMarkerElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGMarkerElement methods ***/
#define ISVGMarkerElement_putref_refX(This,v) (This)->lpVtbl->putref_refX(This,v)
#define ISVGMarkerElement_get_refX(This,p) (This)->lpVtbl->get_refX(This,p)
#define ISVGMarkerElement_putref_refY(This,v) (This)->lpVtbl->putref_refY(This,v)
#define ISVGMarkerElement_get_refY(This,p) (This)->lpVtbl->get_refY(This,p)
#define ISVGMarkerElement_putref_markerUnits(This,v) (This)->lpVtbl->putref_markerUnits(This,v)
#define ISVGMarkerElement_get_markerUnits(This,p) (This)->lpVtbl->get_markerUnits(This,p)
#define ISVGMarkerElement_putref_markerWidth(This,v) (This)->lpVtbl->putref_markerWidth(This,v)
#define ISVGMarkerElement_get_markerWidth(This,p) (This)->lpVtbl->get_markerWidth(This,p)
#define ISVGMarkerElement_putref_markerHeight(This,v) (This)->lpVtbl->putref_markerHeight(This,v)
#define ISVGMarkerElement_get_markerHeight(This,p) (This)->lpVtbl->get_markerHeight(This,p)
#define ISVGMarkerElement_putref_orientType(This,v) (This)->lpVtbl->putref_orientType(This,v)
#define ISVGMarkerElement_get_orientType(This,p) (This)->lpVtbl->get_orientType(This,p)
#define ISVGMarkerElement_putref_orientAngle(This,v) (This)->lpVtbl->putref_orientAngle(This,v)
#define ISVGMarkerElement_get_orientAngle(This,p) (This)->lpVtbl->get_orientAngle(This,p)
#define ISVGMarkerElement_setOrientToAuto(This) (This)->lpVtbl->setOrientToAuto(This)
#define ISVGMarkerElement_setOrientToAngle(This,pSVGAngle) (This)->lpVtbl->setOrientToAngle(This,pSVGAngle)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGMarkerElement_QueryInterface(ISVGMarkerElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGMarkerElement_AddRef(ISVGMarkerElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGMarkerElement_Release(ISVGMarkerElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGMarkerElement_GetTypeInfoCount(ISVGMarkerElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGMarkerElement_GetTypeInfo(ISVGMarkerElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGMarkerElement_GetIDsOfNames(ISVGMarkerElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGMarkerElement_Invoke(ISVGMarkerElement* 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);
}
/*** ISVGMarkerElement methods ***/
static FORCEINLINE HRESULT ISVGMarkerElement_putref_refX(ISVGMarkerElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_refX(This,v);
}
static FORCEINLINE HRESULT ISVGMarkerElement_get_refX(ISVGMarkerElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_refX(This,p);
}
static FORCEINLINE HRESULT ISVGMarkerElement_putref_refY(ISVGMarkerElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_refY(This,v);
}
static FORCEINLINE HRESULT ISVGMarkerElement_get_refY(ISVGMarkerElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_refY(This,p);
}
static FORCEINLINE HRESULT ISVGMarkerElement_putref_markerUnits(ISVGMarkerElement* This,ISVGAnimatedEnumeration *v) {
    return This->lpVtbl->putref_markerUnits(This,v);
}
static FORCEINLINE HRESULT ISVGMarkerElement_get_markerUnits(ISVGMarkerElement* This,ISVGAnimatedEnumeration **p) {
    return This->lpVtbl->get_markerUnits(This,p);
}
static FORCEINLINE HRESULT ISVGMarkerElement_putref_markerWidth(ISVGMarkerElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_markerWidth(This,v);
}
static FORCEINLINE HRESULT ISVGMarkerElement_get_markerWidth(ISVGMarkerElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_markerWidth(This,p);
}
static FORCEINLINE HRESULT ISVGMarkerElement_putref_markerHeight(ISVGMarkerElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_markerHeight(This,v);
}
static FORCEINLINE HRESULT ISVGMarkerElement_get_markerHeight(ISVGMarkerElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_markerHeight(This,p);
}
static FORCEINLINE HRESULT ISVGMarkerElement_putref_orientType(ISVGMarkerElement* This,ISVGAnimatedEnumeration *v) {
    return This->lpVtbl->putref_orientType(This,v);
}
static FORCEINLINE HRESULT ISVGMarkerElement_get_orientType(ISVGMarkerElement* This,ISVGAnimatedEnumeration **p) {
    return This->lpVtbl->get_orientType(This,p);
}
static FORCEINLINE HRESULT ISVGMarkerElement_putref_orientAngle(ISVGMarkerElement* This,ISVGAnimatedAngle *v) {
    return This->lpVtbl->putref_orientAngle(This,v);
}
static FORCEINLINE HRESULT ISVGMarkerElement_get_orientAngle(ISVGMarkerElement* This,ISVGAnimatedAngle **p) {
    return This->lpVtbl->get_orientAngle(This,p);
}
static FORCEINLINE HRESULT ISVGMarkerElement_setOrientToAuto(ISVGMarkerElement* This) {
    return This->lpVtbl->setOrientToAuto(This);
}
static FORCEINLINE HRESULT ISVGMarkerElement_setOrientToAngle(ISVGMarkerElement* This,ISVGAngle *pSVGAngle) {
    return This->lpVtbl->setOrientToAngle(This,pSVGAngle);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGMarkerElement_putref_refX_Proxy(
    ISVGMarkerElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGMarkerElement_putref_refX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMarkerElement_get_refX_Proxy(
    ISVGMarkerElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGMarkerElement_get_refX_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMarkerElement_putref_refY_Proxy(
    ISVGMarkerElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGMarkerElement_putref_refY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMarkerElement_get_refY_Proxy(
    ISVGMarkerElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGMarkerElement_get_refY_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMarkerElement_putref_markerUnits_Proxy(
    ISVGMarkerElement* This,
    ISVGAnimatedEnumeration *v);
void __RPC_STUB ISVGMarkerElement_putref_markerUnits_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMarkerElement_get_markerUnits_Proxy(
    ISVGMarkerElement* This,
    ISVGAnimatedEnumeration **p);
void __RPC_STUB ISVGMarkerElement_get_markerUnits_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMarkerElement_putref_markerWidth_Proxy(
    ISVGMarkerElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGMarkerElement_putref_markerWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMarkerElement_get_markerWidth_Proxy(
    ISVGMarkerElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGMarkerElement_get_markerWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMarkerElement_putref_markerHeight_Proxy(
    ISVGMarkerElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGMarkerElement_putref_markerHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMarkerElement_get_markerHeight_Proxy(
    ISVGMarkerElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGMarkerElement_get_markerHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMarkerElement_putref_orientType_Proxy(
    ISVGMarkerElement* This,
    ISVGAnimatedEnumeration *v);
void __RPC_STUB ISVGMarkerElement_putref_orientType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMarkerElement_get_orientType_Proxy(
    ISVGMarkerElement* This,
    ISVGAnimatedEnumeration **p);
void __RPC_STUB ISVGMarkerElement_get_orientType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMarkerElement_putref_orientAngle_Proxy(
    ISVGMarkerElement* This,
    ISVGAnimatedAngle *v);
void __RPC_STUB ISVGMarkerElement_putref_orientAngle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMarkerElement_get_orientAngle_Proxy(
    ISVGMarkerElement* This,
    ISVGAnimatedAngle **p);
void __RPC_STUB ISVGMarkerElement_get_orientAngle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMarkerElement_setOrientToAuto_Proxy(
    ISVGMarkerElement* This);
void __RPC_STUB ISVGMarkerElement_setOrientToAuto_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGMarkerElement_setOrientToAngle_Proxy(
    ISVGMarkerElement* This,
    ISVGAngle *pSVGAngle);
void __RPC_STUB ISVGMarkerElement_setOrientToAngle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGMarkerElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGMarkerElement dispinterface
 */
#ifndef __DispSVGMarkerElement_DISPINTERFACE_DEFINED__
#define __DispSVGMarkerElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGMarkerElement, 0x30590036, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590036-98b5-11cf-bb82-00aa00bdce0b")
DispSVGMarkerElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGMarkerElement, 0x30590036, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGMarkerElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGMarkerElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGMarkerElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGMarkerElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGMarkerElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGMarkerElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGMarkerElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGMarkerElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGMarkerElementVtbl;
interface DispSVGMarkerElement {
    CONST_VTBL DispSVGMarkerElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGMarkerElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGMarkerElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGMarkerElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGMarkerElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGMarkerElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGMarkerElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGMarkerElement_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 DispSVGMarkerElement_QueryInterface(DispSVGMarkerElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGMarkerElement_AddRef(DispSVGMarkerElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGMarkerElement_Release(DispSVGMarkerElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGMarkerElement_GetTypeInfoCount(DispSVGMarkerElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGMarkerElement_GetTypeInfo(DispSVGMarkerElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGMarkerElement_GetIDsOfNames(DispSVGMarkerElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGMarkerElement_Invoke(DispSVGMarkerElement* 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  /* __DispSVGMarkerElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGMarkerElement coclass
 */

DEFINE_GUID(CLSID_SVGMarkerElement, 0x305105de, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105de-98b5-11cf-bb82-00aa00bdce0b") SVGMarkerElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGMarkerElement, 0x305105de, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGMarkerElement;
/*****************************************************************************
 * ISVGZoomEvent interface
 */
#ifndef __ISVGZoomEvent_INTERFACE_DEFINED__
#define __ISVGZoomEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGZoomEvent, 0x3051054e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051054e-98b5-11cf-bb82-00aa00bdce0b")
ISVGZoomEvent : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_zoomRectScreen(
        ISVGRect **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_previousScale(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_previousTranslate(
        ISVGPoint **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_newScale(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_newTranslate(
        ISVGPoint **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGZoomEvent, 0x3051054e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGZoomEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGZoomEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGZoomEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGZoomEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGZoomEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGZoomEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGZoomEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGZoomEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGZoomEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *get_zoomRectScreen)(
        ISVGZoomEvent* This,
        ISVGRect **p);

    HRESULT (STDMETHODCALLTYPE *get_previousScale)(
        ISVGZoomEvent* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *get_previousTranslate)(
        ISVGZoomEvent* This,
        ISVGPoint **p);

    HRESULT (STDMETHODCALLTYPE *get_newScale)(
        ISVGZoomEvent* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *get_newTranslate)(
        ISVGZoomEvent* This,
        ISVGPoint **p);

    END_INTERFACE
} ISVGZoomEventVtbl;
interface ISVGZoomEvent {
    CONST_VTBL ISVGZoomEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGZoomEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGZoomEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGZoomEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGZoomEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGZoomEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGZoomEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGZoomEvent_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGZoomEvent methods ***/
#define ISVGZoomEvent_get_zoomRectScreen(This,p) (This)->lpVtbl->get_zoomRectScreen(This,p)
#define ISVGZoomEvent_get_previousScale(This,p) (This)->lpVtbl->get_previousScale(This,p)
#define ISVGZoomEvent_get_previousTranslate(This,p) (This)->lpVtbl->get_previousTranslate(This,p)
#define ISVGZoomEvent_get_newScale(This,p) (This)->lpVtbl->get_newScale(This,p)
#define ISVGZoomEvent_get_newTranslate(This,p) (This)->lpVtbl->get_newTranslate(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGZoomEvent_QueryInterface(ISVGZoomEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGZoomEvent_AddRef(ISVGZoomEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGZoomEvent_Release(ISVGZoomEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGZoomEvent_GetTypeInfoCount(ISVGZoomEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGZoomEvent_GetTypeInfo(ISVGZoomEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGZoomEvent_GetIDsOfNames(ISVGZoomEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGZoomEvent_Invoke(ISVGZoomEvent* 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);
}
/*** ISVGZoomEvent methods ***/
static FORCEINLINE HRESULT ISVGZoomEvent_get_zoomRectScreen(ISVGZoomEvent* This,ISVGRect **p) {
    return This->lpVtbl->get_zoomRectScreen(This,p);
}
static FORCEINLINE HRESULT ISVGZoomEvent_get_previousScale(ISVGZoomEvent* This,float *p) {
    return This->lpVtbl->get_previousScale(This,p);
}
static FORCEINLINE HRESULT ISVGZoomEvent_get_previousTranslate(ISVGZoomEvent* This,ISVGPoint **p) {
    return This->lpVtbl->get_previousTranslate(This,p);
}
static FORCEINLINE HRESULT ISVGZoomEvent_get_newScale(ISVGZoomEvent* This,float *p) {
    return This->lpVtbl->get_newScale(This,p);
}
static FORCEINLINE HRESULT ISVGZoomEvent_get_newTranslate(ISVGZoomEvent* This,ISVGPoint **p) {
    return This->lpVtbl->get_newTranslate(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGZoomEvent_get_zoomRectScreen_Proxy(
    ISVGZoomEvent* This,
    ISVGRect **p);
void __RPC_STUB ISVGZoomEvent_get_zoomRectScreen_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGZoomEvent_get_previousScale_Proxy(
    ISVGZoomEvent* This,
    float *p);
void __RPC_STUB ISVGZoomEvent_get_previousScale_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGZoomEvent_get_previousTranslate_Proxy(
    ISVGZoomEvent* This,
    ISVGPoint **p);
void __RPC_STUB ISVGZoomEvent_get_previousTranslate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGZoomEvent_get_newScale_Proxy(
    ISVGZoomEvent* This,
    float *p);
void __RPC_STUB ISVGZoomEvent_get_newScale_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGZoomEvent_get_newTranslate_Proxy(
    ISVGZoomEvent* This,
    ISVGPoint **p);
void __RPC_STUB ISVGZoomEvent_get_newTranslate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGZoomEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGZoomEvent dispinterface
 */
#ifndef __DispSVGZoomEvent_DISPINTERFACE_DEFINED__
#define __DispSVGZoomEvent_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGZoomEvent, 0x30590031, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590031-98b5-11cf-bb82-00aa00bdce0b")
DispSVGZoomEvent : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGZoomEvent, 0x30590031, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGZoomEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGZoomEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGZoomEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGZoomEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGZoomEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGZoomEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGZoomEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGZoomEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGZoomEventVtbl;
interface DispSVGZoomEvent {
    CONST_VTBL DispSVGZoomEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGZoomEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGZoomEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGZoomEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGZoomEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGZoomEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGZoomEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGZoomEvent_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 DispSVGZoomEvent_QueryInterface(DispSVGZoomEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGZoomEvent_AddRef(DispSVGZoomEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGZoomEvent_Release(DispSVGZoomEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGZoomEvent_GetTypeInfoCount(DispSVGZoomEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGZoomEvent_GetTypeInfo(DispSVGZoomEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGZoomEvent_GetIDsOfNames(DispSVGZoomEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGZoomEvent_Invoke(DispSVGZoomEvent* 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  /* __DispSVGZoomEvent_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGZoomEvent coclass
 */

DEFINE_GUID(CLSID_SVGZoomEvent, 0x305105d9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105d9-98b5-11cf-bb82-00aa00bdce0b") SVGZoomEvent;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGZoomEvent, 0x305105d9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGZoomEvent;
/*****************************************************************************
 * ISVGAElement interface
 */
#ifndef __ISVGAElement_INTERFACE_DEFINED__
#define __ISVGAElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGAElement, 0x3051054b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051054b-98b5-11cf-bb82-00aa00bdce0b")
ISVGAElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_target(
        ISVGAnimatedString *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_target(
        ISVGAnimatedString **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGAElement, 0x3051054b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGAElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGAElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGAElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGAElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGAElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGAElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGAElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGAElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGAElement methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_target)(
        ISVGAElement* This,
        ISVGAnimatedString *v);

    HRESULT (STDMETHODCALLTYPE *get_target)(
        ISVGAElement* This,
        ISVGAnimatedString **p);

    END_INTERFACE
} ISVGAElementVtbl;
interface ISVGAElement {
    CONST_VTBL ISVGAElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGAElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGAElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGAElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGAElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGAElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGAElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGAElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGAElement methods ***/
#define ISVGAElement_putref_target(This,v) (This)->lpVtbl->putref_target(This,v)
#define ISVGAElement_get_target(This,p) (This)->lpVtbl->get_target(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGAElement_QueryInterface(ISVGAElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGAElement_AddRef(ISVGAElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGAElement_Release(ISVGAElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGAElement_GetTypeInfoCount(ISVGAElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGAElement_GetTypeInfo(ISVGAElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGAElement_GetIDsOfNames(ISVGAElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGAElement_Invoke(ISVGAElement* 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);
}
/*** ISVGAElement methods ***/
static FORCEINLINE HRESULT ISVGAElement_putref_target(ISVGAElement* This,ISVGAnimatedString *v) {
    return This->lpVtbl->putref_target(This,v);
}
static FORCEINLINE HRESULT ISVGAElement_get_target(ISVGAElement* This,ISVGAnimatedString **p) {
    return This->lpVtbl->get_target(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGAElement_putref_target_Proxy(
    ISVGAElement* This,
    ISVGAnimatedString *v);
void __RPC_STUB ISVGAElement_putref_target_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGAElement_get_target_Proxy(
    ISVGAElement* This,
    ISVGAnimatedString **p);
void __RPC_STUB ISVGAElement_get_target_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGAElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGAElement dispinterface
 */
#ifndef __DispSVGAElement_DISPINTERFACE_DEFINED__
#define __DispSVGAElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGAElement, 0x30590033, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590033-98b5-11cf-bb82-00aa00bdce0b")
DispSVGAElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGAElement, 0x30590033, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGAElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGAElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGAElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGAElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGAElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGAElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGAElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGAElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGAElementVtbl;
interface DispSVGAElement {
    CONST_VTBL DispSVGAElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGAElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGAElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGAElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGAElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGAElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGAElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGAElement_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 DispSVGAElement_QueryInterface(DispSVGAElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGAElement_AddRef(DispSVGAElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGAElement_Release(DispSVGAElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGAElement_GetTypeInfoCount(DispSVGAElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGAElement_GetTypeInfo(DispSVGAElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGAElement_GetIDsOfNames(DispSVGAElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGAElement_Invoke(DispSVGAElement* 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  /* __DispSVGAElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGAElement coclass
 */

DEFINE_GUID(CLSID_SVGAElement, 0x305105db, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105db-98b5-11cf-bb82-00aa00bdce0b") SVGAElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGAElement, 0x305105db, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGAElement;
/*****************************************************************************
 * ISVGViewElement interface
 */
#ifndef __ISVGViewElement_INTERFACE_DEFINED__
#define __ISVGViewElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGViewElement, 0x3051054c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051054c-98b5-11cf-bb82-00aa00bdce0b")
ISVGViewElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_viewTarget(
        ISVGStringList *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_viewTarget(
        ISVGStringList **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGViewElement, 0x3051054c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGViewElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGViewElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGViewElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGViewElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGViewElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGViewElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGViewElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGViewElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGViewElement methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_viewTarget)(
        ISVGViewElement* This,
        ISVGStringList *v);

    HRESULT (STDMETHODCALLTYPE *get_viewTarget)(
        ISVGViewElement* This,
        ISVGStringList **p);

    END_INTERFACE
} ISVGViewElementVtbl;
interface ISVGViewElement {
    CONST_VTBL ISVGViewElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGViewElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGViewElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGViewElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGViewElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGViewElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGViewElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGViewElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGViewElement methods ***/
#define ISVGViewElement_putref_viewTarget(This,v) (This)->lpVtbl->putref_viewTarget(This,v)
#define ISVGViewElement_get_viewTarget(This,p) (This)->lpVtbl->get_viewTarget(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGViewElement_QueryInterface(ISVGViewElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGViewElement_AddRef(ISVGViewElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGViewElement_Release(ISVGViewElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGViewElement_GetTypeInfoCount(ISVGViewElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGViewElement_GetTypeInfo(ISVGViewElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGViewElement_GetIDsOfNames(ISVGViewElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGViewElement_Invoke(ISVGViewElement* 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);
}
/*** ISVGViewElement methods ***/
static FORCEINLINE HRESULT ISVGViewElement_putref_viewTarget(ISVGViewElement* This,ISVGStringList *v) {
    return This->lpVtbl->putref_viewTarget(This,v);
}
static FORCEINLINE HRESULT ISVGViewElement_get_viewTarget(ISVGViewElement* This,ISVGStringList **p) {
    return This->lpVtbl->get_viewTarget(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGViewElement_putref_viewTarget_Proxy(
    ISVGViewElement* This,
    ISVGStringList *v);
void __RPC_STUB ISVGViewElement_putref_viewTarget_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGViewElement_get_viewTarget_Proxy(
    ISVGViewElement* This,
    ISVGStringList **p);
void __RPC_STUB ISVGViewElement_get_viewTarget_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGViewElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGViewElement dispinterface
 */
#ifndef __DispSVGViewElement_DISPINTERFACE_DEFINED__
#define __DispSVGViewElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGViewElement, 0x30590034, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590034-98b5-11cf-bb82-00aa00bdce0b")
DispSVGViewElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGViewElement, 0x30590034, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGViewElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGViewElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGViewElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGViewElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGViewElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGViewElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGViewElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGViewElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGViewElementVtbl;
interface DispSVGViewElement {
    CONST_VTBL DispSVGViewElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGViewElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGViewElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGViewElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGViewElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGViewElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGViewElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGViewElement_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 DispSVGViewElement_QueryInterface(DispSVGViewElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGViewElement_AddRef(DispSVGViewElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGViewElement_Release(DispSVGViewElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGViewElement_GetTypeInfoCount(DispSVGViewElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGViewElement_GetTypeInfo(DispSVGViewElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGViewElement_GetIDsOfNames(DispSVGViewElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGViewElement_Invoke(DispSVGViewElement* 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  /* __DispSVGViewElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGViewElement coclass
 */

DEFINE_GUID(CLSID_SVGViewElement, 0x305105dc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105dc-98b5-11cf-bb82-00aa00bdce0b") SVGViewElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGViewElement, 0x305105dc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGViewElement;
typedef enum _htmlMediaNetworkState {
    htmlMediaNetworkStateEmpty = 0,
    htmlMediaNetworkStateIdle = 1,
    htmlMediaNetworkStateLoading = 2,
    htmlMediaNetworkStateNoSource = 3,
    htmlMediaNetworkState_Max = 0x7fffffff
} htmlMediaNetworkState;
typedef enum _htmlMediaReadyState {
    htmlMediaReadyStateHaveNothing = 0,
    htmlMediaReadyStateHaveMetadata = 1,
    htmlMediaReadyStateHaveCurrentData = 2,
    htmlMediaReadyStateHaveFutureData = 3,
    htmlMediaReadyStateHaveEnoughData = 4,
    htmlMediaReadyState_Max = 0x7fffffff
} htmlMediaReadyState;
typedef enum _htmlMediaErr {
    htmlMediaErrAborted = 0,
    htmlMediaErrNetwork = 1,
    htmlMediaErrDecode = 2,
    htmlMediaErrSrcNotSupported = 3,
    htmlMediaErr_Max = 0x7fffffff
} htmlMediaErr;
/*****************************************************************************
 * IHTMLMediaError interface
 */
#ifndef __IHTMLMediaError_INTERFACE_DEFINED__
#define __IHTMLMediaError_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLMediaError, 0x30510704, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510704-98b5-11cf-bb82-00aa00bdce0b")
IHTMLMediaError : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_code(
        short *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLMediaError, 0x30510704, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLMediaErrorVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLMediaError* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLMediaError* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLMediaError* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLMediaError* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLMediaError* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLMediaError* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLMediaError* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLMediaError methods ***/
    HRESULT (STDMETHODCALLTYPE *get_code)(
        IHTMLMediaError* This,
        short *p);

    END_INTERFACE
} IHTMLMediaErrorVtbl;
interface IHTMLMediaError {
    CONST_VTBL IHTMLMediaErrorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLMediaError_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLMediaError_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLMediaError_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLMediaError_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLMediaError_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLMediaError_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLMediaError_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLMediaError methods ***/
#define IHTMLMediaError_get_code(This,p) (This)->lpVtbl->get_code(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLMediaError_QueryInterface(IHTMLMediaError* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLMediaError_AddRef(IHTMLMediaError* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLMediaError_Release(IHTMLMediaError* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLMediaError_GetTypeInfoCount(IHTMLMediaError* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLMediaError_GetTypeInfo(IHTMLMediaError* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLMediaError_GetIDsOfNames(IHTMLMediaError* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLMediaError_Invoke(IHTMLMediaError* 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);
}
/*** IHTMLMediaError methods ***/
static FORCEINLINE HRESULT IHTMLMediaError_get_code(IHTMLMediaError* This,short *p) {
    return This->lpVtbl->get_code(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLMediaError_get_code_Proxy(
    IHTMLMediaError* This,
    short *p);
void __RPC_STUB IHTMLMediaError_get_code_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLMediaError_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLTimeRanges interface
 */
#ifndef __IHTMLTimeRanges_INTERFACE_DEFINED__
#define __IHTMLTimeRanges_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTimeRanges, 0x30510705, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510705-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTimeRanges : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE start(
        LONG index,
        float *startTime) = 0;

    virtual HRESULT STDMETHODCALLTYPE end(
        LONG index,
        float *endTime) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTimeRanges, 0x30510705, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTimeRangesVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTimeRanges* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTimeRanges* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTimeRanges* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTimeRanges* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTimeRanges* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTimeRanges* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTimeRanges* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLTimeRanges methods ***/
    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLTimeRanges* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *start)(
        IHTMLTimeRanges* This,
        LONG index,
        float *startTime);

    HRESULT (STDMETHODCALLTYPE *end)(
        IHTMLTimeRanges* This,
        LONG index,
        float *endTime);

    END_INTERFACE
} IHTMLTimeRangesVtbl;
interface IHTMLTimeRanges {
    CONST_VTBL IHTMLTimeRangesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTimeRanges_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTimeRanges_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTimeRanges_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTimeRanges_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTimeRanges_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTimeRanges_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTimeRanges_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLTimeRanges methods ***/
#define IHTMLTimeRanges_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLTimeRanges_start(This,index,startTime) (This)->lpVtbl->start(This,index,startTime)
#define IHTMLTimeRanges_end(This,index,endTime) (This)->lpVtbl->end(This,index,endTime)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLTimeRanges_QueryInterface(IHTMLTimeRanges* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTimeRanges_AddRef(IHTMLTimeRanges* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTimeRanges_Release(IHTMLTimeRanges* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTimeRanges_GetTypeInfoCount(IHTMLTimeRanges* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTimeRanges_GetTypeInfo(IHTMLTimeRanges* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTimeRanges_GetIDsOfNames(IHTMLTimeRanges* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTimeRanges_Invoke(IHTMLTimeRanges* 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);
}
/*** IHTMLTimeRanges methods ***/
static FORCEINLINE HRESULT IHTMLTimeRanges_get_length(IHTMLTimeRanges* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IHTMLTimeRanges_start(IHTMLTimeRanges* This,LONG index,float *startTime) {
    return This->lpVtbl->start(This,index,startTime);
}
static FORCEINLINE HRESULT IHTMLTimeRanges_end(IHTMLTimeRanges* This,LONG index,float *endTime) {
    return This->lpVtbl->end(This,index,endTime);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLTimeRanges_get_length_Proxy(
    IHTMLTimeRanges* This,
    LONG *p);
void __RPC_STUB IHTMLTimeRanges_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTimeRanges_start_Proxy(
    IHTMLTimeRanges* This,
    LONG index,
    float *startTime);
void __RPC_STUB IHTMLTimeRanges_start_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTimeRanges_end_Proxy(
    IHTMLTimeRanges* This,
    LONG index,
    float *endTime);
void __RPC_STUB IHTMLTimeRanges_end_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLTimeRanges_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLTimeRanges2 interface
 */
#ifndef __IHTMLTimeRanges2_INTERFACE_DEFINED__
#define __IHTMLTimeRanges2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLTimeRanges2, 0x3051080b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051080b-98b5-11cf-bb82-00aa00bdce0b")
IHTMLTimeRanges2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE startDouble(
        LONG index,
        double *startTime) = 0;

    virtual HRESULT STDMETHODCALLTYPE endDouble(
        LONG index,
        double *endTime) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLTimeRanges2, 0x3051080b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLTimeRanges2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLTimeRanges2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLTimeRanges2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLTimeRanges2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLTimeRanges2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLTimeRanges2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLTimeRanges2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLTimeRanges2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLTimeRanges2 methods ***/
    HRESULT (STDMETHODCALLTYPE *startDouble)(
        IHTMLTimeRanges2* This,
        LONG index,
        double *startTime);

    HRESULT (STDMETHODCALLTYPE *endDouble)(
        IHTMLTimeRanges2* This,
        LONG index,
        double *endTime);

    END_INTERFACE
} IHTMLTimeRanges2Vtbl;
interface IHTMLTimeRanges2 {
    CONST_VTBL IHTMLTimeRanges2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLTimeRanges2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLTimeRanges2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLTimeRanges2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLTimeRanges2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLTimeRanges2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLTimeRanges2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLTimeRanges2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLTimeRanges2 methods ***/
#define IHTMLTimeRanges2_startDouble(This,index,startTime) (This)->lpVtbl->startDouble(This,index,startTime)
#define IHTMLTimeRanges2_endDouble(This,index,endTime) (This)->lpVtbl->endDouble(This,index,endTime)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLTimeRanges2_QueryInterface(IHTMLTimeRanges2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLTimeRanges2_AddRef(IHTMLTimeRanges2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLTimeRanges2_Release(IHTMLTimeRanges2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLTimeRanges2_GetTypeInfoCount(IHTMLTimeRanges2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLTimeRanges2_GetTypeInfo(IHTMLTimeRanges2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLTimeRanges2_GetIDsOfNames(IHTMLTimeRanges2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLTimeRanges2_Invoke(IHTMLTimeRanges2* 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);
}
/*** IHTMLTimeRanges2 methods ***/
static FORCEINLINE HRESULT IHTMLTimeRanges2_startDouble(IHTMLTimeRanges2* This,LONG index,double *startTime) {
    return This->lpVtbl->startDouble(This,index,startTime);
}
static FORCEINLINE HRESULT IHTMLTimeRanges2_endDouble(IHTMLTimeRanges2* This,LONG index,double *endTime) {
    return This->lpVtbl->endDouble(This,index,endTime);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLTimeRanges2_startDouble_Proxy(
    IHTMLTimeRanges2* This,
    LONG index,
    double *startTime);
void __RPC_STUB IHTMLTimeRanges2_startDouble_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLTimeRanges2_endDouble_Proxy(
    IHTMLTimeRanges2* This,
    LONG index,
    double *endTime);
void __RPC_STUB IHTMLTimeRanges2_endDouble_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLTimeRanges2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLMediaElement interface
 */
#ifndef __IHTMLMediaElement_INTERFACE_DEFINED__
#define __IHTMLMediaElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLMediaElement, 0x30510706, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510706-98b5-11cf-bb82-00aa00bdce0b")
IHTMLMediaElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_error(
        IHTMLMediaError **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_src(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_src(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_currentSrc(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_networkState(
        USHORT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_preload(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_preload(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_buffered(
        IHTMLTimeRanges **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE load(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE canPlayType(
        BSTR type,
        BSTR *canPlay) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_seeking(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_currentTime(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_currentTime(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_initialTime(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_duration(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_paused(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_defaultPlaybackRate(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_defaultPlaybackRate(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_playbackRate(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_playbackRate(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_played(
        IHTMLTimeRanges **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_seekable(
        IHTMLTimeRanges **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ended(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_autoplay(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_autoplay(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_loop(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_loop(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE play(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE pause(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_controls(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_controls(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_volume(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_volume(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_muted(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_muted(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_autobuffer(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_autobuffer(
        VARIANT_BOOL *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLMediaElement, 0x30510706, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLMediaElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLMediaElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLMediaElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLMediaElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLMediaElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLMediaElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLMediaElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLMediaElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLMediaElement methods ***/
    HRESULT (STDMETHODCALLTYPE *get_error)(
        IHTMLMediaElement* This,
        IHTMLMediaError **p);

    HRESULT (STDMETHODCALLTYPE *put_src)(
        IHTMLMediaElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_src)(
        IHTMLMediaElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_currentSrc)(
        IHTMLMediaElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_networkState)(
        IHTMLMediaElement* This,
        USHORT *p);

    HRESULT (STDMETHODCALLTYPE *put_preload)(
        IHTMLMediaElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_preload)(
        IHTMLMediaElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_buffered)(
        IHTMLMediaElement* This,
        IHTMLTimeRanges **p);

    HRESULT (STDMETHODCALLTYPE *load)(
        IHTMLMediaElement* This);

    HRESULT (STDMETHODCALLTYPE *canPlayType)(
        IHTMLMediaElement* This,
        BSTR type,
        BSTR *canPlay);

    HRESULT (STDMETHODCALLTYPE *get_seeking)(
        IHTMLMediaElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_currentTime)(
        IHTMLMediaElement* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_currentTime)(
        IHTMLMediaElement* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *get_initialTime)(
        IHTMLMediaElement* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *get_duration)(
        IHTMLMediaElement* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *get_paused)(
        IHTMLMediaElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_defaultPlaybackRate)(
        IHTMLMediaElement* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_defaultPlaybackRate)(
        IHTMLMediaElement* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_playbackRate)(
        IHTMLMediaElement* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_playbackRate)(
        IHTMLMediaElement* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *get_played)(
        IHTMLMediaElement* This,
        IHTMLTimeRanges **p);

    HRESULT (STDMETHODCALLTYPE *get_seekable)(
        IHTMLMediaElement* This,
        IHTMLTimeRanges **p);

    HRESULT (STDMETHODCALLTYPE *get_ended)(
        IHTMLMediaElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_autoplay)(
        IHTMLMediaElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_autoplay)(
        IHTMLMediaElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_loop)(
        IHTMLMediaElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_loop)(
        IHTMLMediaElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *play)(
        IHTMLMediaElement* This);

    HRESULT (STDMETHODCALLTYPE *pause)(
        IHTMLMediaElement* This);

    HRESULT (STDMETHODCALLTYPE *put_controls)(
        IHTMLMediaElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_controls)(
        IHTMLMediaElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_volume)(
        IHTMLMediaElement* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_volume)(
        IHTMLMediaElement* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_muted)(
        IHTMLMediaElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_muted)(
        IHTMLMediaElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_autobuffer)(
        IHTMLMediaElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_autobuffer)(
        IHTMLMediaElement* This,
        VARIANT_BOOL *p);

    END_INTERFACE
} IHTMLMediaElementVtbl;
interface IHTMLMediaElement {
    CONST_VTBL IHTMLMediaElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLMediaElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLMediaElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLMediaElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLMediaElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLMediaElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLMediaElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLMediaElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLMediaElement methods ***/
#define IHTMLMediaElement_get_error(This,p) (This)->lpVtbl->get_error(This,p)
#define IHTMLMediaElement_put_src(This,v) (This)->lpVtbl->put_src(This,v)
#define IHTMLMediaElement_get_src(This,p) (This)->lpVtbl->get_src(This,p)
#define IHTMLMediaElement_get_currentSrc(This,p) (This)->lpVtbl->get_currentSrc(This,p)
#define IHTMLMediaElement_get_networkState(This,p) (This)->lpVtbl->get_networkState(This,p)
#define IHTMLMediaElement_put_preload(This,v) (This)->lpVtbl->put_preload(This,v)
#define IHTMLMediaElement_get_preload(This,p) (This)->lpVtbl->get_preload(This,p)
#define IHTMLMediaElement_get_buffered(This,p) (This)->lpVtbl->get_buffered(This,p)
#define IHTMLMediaElement_load(This) (This)->lpVtbl->load(This)
#define IHTMLMediaElement_canPlayType(This,type,canPlay) (This)->lpVtbl->canPlayType(This,type,canPlay)
#define IHTMLMediaElement_get_seeking(This,p) (This)->lpVtbl->get_seeking(This,p)
#define IHTMLMediaElement_put_currentTime(This,v) (This)->lpVtbl->put_currentTime(This,v)
#define IHTMLMediaElement_get_currentTime(This,p) (This)->lpVtbl->get_currentTime(This,p)
#define IHTMLMediaElement_get_initialTime(This,p) (This)->lpVtbl->get_initialTime(This,p)
#define IHTMLMediaElement_get_duration(This,p) (This)->lpVtbl->get_duration(This,p)
#define IHTMLMediaElement_get_paused(This,p) (This)->lpVtbl->get_paused(This,p)
#define IHTMLMediaElement_put_defaultPlaybackRate(This,v) (This)->lpVtbl->put_defaultPlaybackRate(This,v)
#define IHTMLMediaElement_get_defaultPlaybackRate(This,p) (This)->lpVtbl->get_defaultPlaybackRate(This,p)
#define IHTMLMediaElement_put_playbackRate(This,v) (This)->lpVtbl->put_playbackRate(This,v)
#define IHTMLMediaElement_get_playbackRate(This,p) (This)->lpVtbl->get_playbackRate(This,p)
#define IHTMLMediaElement_get_played(This,p) (This)->lpVtbl->get_played(This,p)
#define IHTMLMediaElement_get_seekable(This,p) (This)->lpVtbl->get_seekable(This,p)
#define IHTMLMediaElement_get_ended(This,p) (This)->lpVtbl->get_ended(This,p)
#define IHTMLMediaElement_put_autoplay(This,v) (This)->lpVtbl->put_autoplay(This,v)
#define IHTMLMediaElement_get_autoplay(This,p) (This)->lpVtbl->get_autoplay(This,p)
#define IHTMLMediaElement_put_loop(This,v) (This)->lpVtbl->put_loop(This,v)
#define IHTMLMediaElement_get_loop(This,p) (This)->lpVtbl->get_loop(This,p)
#define IHTMLMediaElement_play(This) (This)->lpVtbl->play(This)
#define IHTMLMediaElement_pause(This) (This)->lpVtbl->pause(This)
#define IHTMLMediaElement_put_controls(This,v) (This)->lpVtbl->put_controls(This,v)
#define IHTMLMediaElement_get_controls(This,p) (This)->lpVtbl->get_controls(This,p)
#define IHTMLMediaElement_put_volume(This,v) (This)->lpVtbl->put_volume(This,v)
#define IHTMLMediaElement_get_volume(This,p) (This)->lpVtbl->get_volume(This,p)
#define IHTMLMediaElement_put_muted(This,v) (This)->lpVtbl->put_muted(This,v)
#define IHTMLMediaElement_get_muted(This,p) (This)->lpVtbl->get_muted(This,p)
#define IHTMLMediaElement_put_autobuffer(This,v) (This)->lpVtbl->put_autobuffer(This,v)
#define IHTMLMediaElement_get_autobuffer(This,p) (This)->lpVtbl->get_autobuffer(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLMediaElement_QueryInterface(IHTMLMediaElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLMediaElement_AddRef(IHTMLMediaElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLMediaElement_Release(IHTMLMediaElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLMediaElement_GetTypeInfoCount(IHTMLMediaElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLMediaElement_GetTypeInfo(IHTMLMediaElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLMediaElement_GetIDsOfNames(IHTMLMediaElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLMediaElement_Invoke(IHTMLMediaElement* 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);
}
/*** IHTMLMediaElement methods ***/
static FORCEINLINE HRESULT IHTMLMediaElement_get_error(IHTMLMediaElement* This,IHTMLMediaError **p) {
    return This->lpVtbl->get_error(This,p);
}
static FORCEINLINE HRESULT IHTMLMediaElement_put_src(IHTMLMediaElement* This,BSTR v) {
    return This->lpVtbl->put_src(This,v);
}
static FORCEINLINE HRESULT IHTMLMediaElement_get_src(IHTMLMediaElement* This,BSTR *p) {
    return This->lpVtbl->get_src(This,p);
}
static FORCEINLINE HRESULT IHTMLMediaElement_get_currentSrc(IHTMLMediaElement* This,BSTR *p) {
    return This->lpVtbl->get_currentSrc(This,p);
}
static FORCEINLINE HRESULT IHTMLMediaElement_get_networkState(IHTMLMediaElement* This,USHORT *p) {
    return This->lpVtbl->get_networkState(This,p);
}
static FORCEINLINE HRESULT IHTMLMediaElement_put_preload(IHTMLMediaElement* This,BSTR v) {
    return This->lpVtbl->put_preload(This,v);
}
static FORCEINLINE HRESULT IHTMLMediaElement_get_preload(IHTMLMediaElement* This,BSTR *p) {
    return This->lpVtbl->get_preload(This,p);
}
static FORCEINLINE HRESULT IHTMLMediaElement_get_buffered(IHTMLMediaElement* This,IHTMLTimeRanges **p) {
    return This->lpVtbl->get_buffered(This,p);
}
static FORCEINLINE HRESULT IHTMLMediaElement_load(IHTMLMediaElement* This) {
    return This->lpVtbl->load(This);
}
static FORCEINLINE HRESULT IHTMLMediaElement_canPlayType(IHTMLMediaElement* This,BSTR type,BSTR *canPlay) {
    return This->lpVtbl->canPlayType(This,type,canPlay);
}
static FORCEINLINE HRESULT IHTMLMediaElement_get_seeking(IHTMLMediaElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_seeking(This,p);
}
static FORCEINLINE HRESULT IHTMLMediaElement_put_currentTime(IHTMLMediaElement* This,float v) {
    return This->lpVtbl->put_currentTime(This,v);
}
static FORCEINLINE HRESULT IHTMLMediaElement_get_currentTime(IHTMLMediaElement* This,float *p) {
    return This->lpVtbl->get_currentTime(This,p);
}
static FORCEINLINE HRESULT IHTMLMediaElement_get_initialTime(IHTMLMediaElement* This,float *p) {
    return This->lpVtbl->get_initialTime(This,p);
}
static FORCEINLINE HRESULT IHTMLMediaElement_get_duration(IHTMLMediaElement* This,float *p) {
    return This->lpVtbl->get_duration(This,p);
}
static FORCEINLINE HRESULT IHTMLMediaElement_get_paused(IHTMLMediaElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_paused(This,p);
}
static FORCEINLINE HRESULT IHTMLMediaElement_put_defaultPlaybackRate(IHTMLMediaElement* This,float v) {
    return This->lpVtbl->put_defaultPlaybackRate(This,v);
}
static FORCEINLINE HRESULT IHTMLMediaElement_get_defaultPlaybackRate(IHTMLMediaElement* This,float *p) {
    return This->lpVtbl->get_defaultPlaybackRate(This,p);
}
static FORCEINLINE HRESULT IHTMLMediaElement_put_playbackRate(IHTMLMediaElement* This,float v) {
    return This->lpVtbl->put_playbackRate(This,v);
}
static FORCEINLINE HRESULT IHTMLMediaElement_get_playbackRate(IHTMLMediaElement* This,float *p) {
    return This->lpVtbl->get_playbackRate(This,p);
}
static FORCEINLINE HRESULT IHTMLMediaElement_get_played(IHTMLMediaElement* This,IHTMLTimeRanges **p) {
    return This->lpVtbl->get_played(This,p);
}
static FORCEINLINE HRESULT IHTMLMediaElement_get_seekable(IHTMLMediaElement* This,IHTMLTimeRanges **p) {
    return This->lpVtbl->get_seekable(This,p);
}
static FORCEINLINE HRESULT IHTMLMediaElement_get_ended(IHTMLMediaElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_ended(This,p);
}
static FORCEINLINE HRESULT IHTMLMediaElement_put_autoplay(IHTMLMediaElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_autoplay(This,v);
}
static FORCEINLINE HRESULT IHTMLMediaElement_get_autoplay(IHTMLMediaElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_autoplay(This,p);
}
static FORCEINLINE HRESULT IHTMLMediaElement_put_loop(IHTMLMediaElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_loop(This,v);
}
static FORCEINLINE HRESULT IHTMLMediaElement_get_loop(IHTMLMediaElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_loop(This,p);
}
static FORCEINLINE HRESULT IHTMLMediaElement_play(IHTMLMediaElement* This) {
    return This->lpVtbl->play(This);
}
static FORCEINLINE HRESULT IHTMLMediaElement_pause(IHTMLMediaElement* This) {
    return This->lpVtbl->pause(This);
}
static FORCEINLINE HRESULT IHTMLMediaElement_put_controls(IHTMLMediaElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_controls(This,v);
}
static FORCEINLINE HRESULT IHTMLMediaElement_get_controls(IHTMLMediaElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_controls(This,p);
}
static FORCEINLINE HRESULT IHTMLMediaElement_put_volume(IHTMLMediaElement* This,float v) {
    return This->lpVtbl->put_volume(This,v);
}
static FORCEINLINE HRESULT IHTMLMediaElement_get_volume(IHTMLMediaElement* This,float *p) {
    return This->lpVtbl->get_volume(This,p);
}
static FORCEINLINE HRESULT IHTMLMediaElement_put_muted(IHTMLMediaElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_muted(This,v);
}
static FORCEINLINE HRESULT IHTMLMediaElement_get_muted(IHTMLMediaElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_muted(This,p);
}
static FORCEINLINE HRESULT IHTMLMediaElement_put_autobuffer(IHTMLMediaElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_autobuffer(This,v);
}
static FORCEINLINE HRESULT IHTMLMediaElement_get_autobuffer(IHTMLMediaElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_autobuffer(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLMediaElement_get_error_Proxy(
    IHTMLMediaElement* This,
    IHTMLMediaError **p);
void __RPC_STUB IHTMLMediaElement_get_error_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_put_src_Proxy(
    IHTMLMediaElement* This,
    BSTR v);
void __RPC_STUB IHTMLMediaElement_put_src_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_get_src_Proxy(
    IHTMLMediaElement* This,
    BSTR *p);
void __RPC_STUB IHTMLMediaElement_get_src_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_get_currentSrc_Proxy(
    IHTMLMediaElement* This,
    BSTR *p);
void __RPC_STUB IHTMLMediaElement_get_currentSrc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_get_networkState_Proxy(
    IHTMLMediaElement* This,
    USHORT *p);
void __RPC_STUB IHTMLMediaElement_get_networkState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_put_preload_Proxy(
    IHTMLMediaElement* This,
    BSTR v);
void __RPC_STUB IHTMLMediaElement_put_preload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_get_preload_Proxy(
    IHTMLMediaElement* This,
    BSTR *p);
void __RPC_STUB IHTMLMediaElement_get_preload_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_get_buffered_Proxy(
    IHTMLMediaElement* This,
    IHTMLTimeRanges **p);
void __RPC_STUB IHTMLMediaElement_get_buffered_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_load_Proxy(
    IHTMLMediaElement* This);
void __RPC_STUB IHTMLMediaElement_load_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_canPlayType_Proxy(
    IHTMLMediaElement* This,
    BSTR type,
    BSTR *canPlay);
void __RPC_STUB IHTMLMediaElement_canPlayType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_get_seeking_Proxy(
    IHTMLMediaElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLMediaElement_get_seeking_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_put_currentTime_Proxy(
    IHTMLMediaElement* This,
    float v);
void __RPC_STUB IHTMLMediaElement_put_currentTime_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_get_currentTime_Proxy(
    IHTMLMediaElement* This,
    float *p);
void __RPC_STUB IHTMLMediaElement_get_currentTime_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_get_initialTime_Proxy(
    IHTMLMediaElement* This,
    float *p);
void __RPC_STUB IHTMLMediaElement_get_initialTime_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_get_duration_Proxy(
    IHTMLMediaElement* This,
    float *p);
void __RPC_STUB IHTMLMediaElement_get_duration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_get_paused_Proxy(
    IHTMLMediaElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLMediaElement_get_paused_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_put_defaultPlaybackRate_Proxy(
    IHTMLMediaElement* This,
    float v);
void __RPC_STUB IHTMLMediaElement_put_defaultPlaybackRate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_get_defaultPlaybackRate_Proxy(
    IHTMLMediaElement* This,
    float *p);
void __RPC_STUB IHTMLMediaElement_get_defaultPlaybackRate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_put_playbackRate_Proxy(
    IHTMLMediaElement* This,
    float v);
void __RPC_STUB IHTMLMediaElement_put_playbackRate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_get_playbackRate_Proxy(
    IHTMLMediaElement* This,
    float *p);
void __RPC_STUB IHTMLMediaElement_get_playbackRate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_get_played_Proxy(
    IHTMLMediaElement* This,
    IHTMLTimeRanges **p);
void __RPC_STUB IHTMLMediaElement_get_played_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_get_seekable_Proxy(
    IHTMLMediaElement* This,
    IHTMLTimeRanges **p);
void __RPC_STUB IHTMLMediaElement_get_seekable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_get_ended_Proxy(
    IHTMLMediaElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLMediaElement_get_ended_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_put_autoplay_Proxy(
    IHTMLMediaElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLMediaElement_put_autoplay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_get_autoplay_Proxy(
    IHTMLMediaElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLMediaElement_get_autoplay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_put_loop_Proxy(
    IHTMLMediaElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLMediaElement_put_loop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_get_loop_Proxy(
    IHTMLMediaElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLMediaElement_get_loop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_play_Proxy(
    IHTMLMediaElement* This);
void __RPC_STUB IHTMLMediaElement_play_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_pause_Proxy(
    IHTMLMediaElement* This);
void __RPC_STUB IHTMLMediaElement_pause_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_put_controls_Proxy(
    IHTMLMediaElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLMediaElement_put_controls_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_get_controls_Proxy(
    IHTMLMediaElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLMediaElement_get_controls_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_put_volume_Proxy(
    IHTMLMediaElement* This,
    float v);
void __RPC_STUB IHTMLMediaElement_put_volume_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_get_volume_Proxy(
    IHTMLMediaElement* This,
    float *p);
void __RPC_STUB IHTMLMediaElement_get_volume_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_put_muted_Proxy(
    IHTMLMediaElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLMediaElement_put_muted_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_get_muted_Proxy(
    IHTMLMediaElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLMediaElement_get_muted_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_put_autobuffer_Proxy(
    IHTMLMediaElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLMediaElement_put_autobuffer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement_get_autobuffer_Proxy(
    IHTMLMediaElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLMediaElement_get_autobuffer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLMediaElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLMediaElement2 interface
 */
#ifndef __IHTMLMediaElement2_INTERFACE_DEFINED__
#define __IHTMLMediaElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLMediaElement2, 0x30510809, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510809-98b5-11cf-bb82-00aa00bdce0b")
IHTMLMediaElement2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_currentTimeDouble(
        double v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_currentTimeDouble(
        double *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_initialTimeDouble(
        double *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_durationDouble(
        double *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_defaultPlaybackRateDouble(
        double v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_defaultPlaybackRateDouble(
        double *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_playbackRateDouble(
        double v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_playbackRateDouble(
        double *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_volumeDouble(
        double v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_volumeDouble(
        double *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLMediaElement2, 0x30510809, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLMediaElement2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLMediaElement2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLMediaElement2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLMediaElement2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLMediaElement2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLMediaElement2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLMediaElement2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLMediaElement2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLMediaElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_currentTimeDouble)(
        IHTMLMediaElement2* This,
        double v);

    HRESULT (STDMETHODCALLTYPE *get_currentTimeDouble)(
        IHTMLMediaElement2* This,
        double *p);

    HRESULT (STDMETHODCALLTYPE *get_initialTimeDouble)(
        IHTMLMediaElement2* This,
        double *p);

    HRESULT (STDMETHODCALLTYPE *get_durationDouble)(
        IHTMLMediaElement2* This,
        double *p);

    HRESULT (STDMETHODCALLTYPE *put_defaultPlaybackRateDouble)(
        IHTMLMediaElement2* This,
        double v);

    HRESULT (STDMETHODCALLTYPE *get_defaultPlaybackRateDouble)(
        IHTMLMediaElement2* This,
        double *p);

    HRESULT (STDMETHODCALLTYPE *put_playbackRateDouble)(
        IHTMLMediaElement2* This,
        double v);

    HRESULT (STDMETHODCALLTYPE *get_playbackRateDouble)(
        IHTMLMediaElement2* This,
        double *p);

    HRESULT (STDMETHODCALLTYPE *put_volumeDouble)(
        IHTMLMediaElement2* This,
        double v);

    HRESULT (STDMETHODCALLTYPE *get_volumeDouble)(
        IHTMLMediaElement2* This,
        double *p);

    END_INTERFACE
} IHTMLMediaElement2Vtbl;
interface IHTMLMediaElement2 {
    CONST_VTBL IHTMLMediaElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLMediaElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLMediaElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLMediaElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLMediaElement2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLMediaElement2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLMediaElement2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLMediaElement2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLMediaElement2 methods ***/
#define IHTMLMediaElement2_put_currentTimeDouble(This,v) (This)->lpVtbl->put_currentTimeDouble(This,v)
#define IHTMLMediaElement2_get_currentTimeDouble(This,p) (This)->lpVtbl->get_currentTimeDouble(This,p)
#define IHTMLMediaElement2_get_initialTimeDouble(This,p) (This)->lpVtbl->get_initialTimeDouble(This,p)
#define IHTMLMediaElement2_get_durationDouble(This,p) (This)->lpVtbl->get_durationDouble(This,p)
#define IHTMLMediaElement2_put_defaultPlaybackRateDouble(This,v) (This)->lpVtbl->put_defaultPlaybackRateDouble(This,v)
#define IHTMLMediaElement2_get_defaultPlaybackRateDouble(This,p) (This)->lpVtbl->get_defaultPlaybackRateDouble(This,p)
#define IHTMLMediaElement2_put_playbackRateDouble(This,v) (This)->lpVtbl->put_playbackRateDouble(This,v)
#define IHTMLMediaElement2_get_playbackRateDouble(This,p) (This)->lpVtbl->get_playbackRateDouble(This,p)
#define IHTMLMediaElement2_put_volumeDouble(This,v) (This)->lpVtbl->put_volumeDouble(This,v)
#define IHTMLMediaElement2_get_volumeDouble(This,p) (This)->lpVtbl->get_volumeDouble(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLMediaElement2_QueryInterface(IHTMLMediaElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLMediaElement2_AddRef(IHTMLMediaElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLMediaElement2_Release(IHTMLMediaElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLMediaElement2_GetTypeInfoCount(IHTMLMediaElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLMediaElement2_GetTypeInfo(IHTMLMediaElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLMediaElement2_GetIDsOfNames(IHTMLMediaElement2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLMediaElement2_Invoke(IHTMLMediaElement2* 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);
}
/*** IHTMLMediaElement2 methods ***/
static FORCEINLINE HRESULT IHTMLMediaElement2_put_currentTimeDouble(IHTMLMediaElement2* This,double v) {
    return This->lpVtbl->put_currentTimeDouble(This,v);
}
static FORCEINLINE HRESULT IHTMLMediaElement2_get_currentTimeDouble(IHTMLMediaElement2* This,double *p) {
    return This->lpVtbl->get_currentTimeDouble(This,p);
}
static FORCEINLINE HRESULT IHTMLMediaElement2_get_initialTimeDouble(IHTMLMediaElement2* This,double *p) {
    return This->lpVtbl->get_initialTimeDouble(This,p);
}
static FORCEINLINE HRESULT IHTMLMediaElement2_get_durationDouble(IHTMLMediaElement2* This,double *p) {
    return This->lpVtbl->get_durationDouble(This,p);
}
static FORCEINLINE HRESULT IHTMLMediaElement2_put_defaultPlaybackRateDouble(IHTMLMediaElement2* This,double v) {
    return This->lpVtbl->put_defaultPlaybackRateDouble(This,v);
}
static FORCEINLINE HRESULT IHTMLMediaElement2_get_defaultPlaybackRateDouble(IHTMLMediaElement2* This,double *p) {
    return This->lpVtbl->get_defaultPlaybackRateDouble(This,p);
}
static FORCEINLINE HRESULT IHTMLMediaElement2_put_playbackRateDouble(IHTMLMediaElement2* This,double v) {
    return This->lpVtbl->put_playbackRateDouble(This,v);
}
static FORCEINLINE HRESULT IHTMLMediaElement2_get_playbackRateDouble(IHTMLMediaElement2* This,double *p) {
    return This->lpVtbl->get_playbackRateDouble(This,p);
}
static FORCEINLINE HRESULT IHTMLMediaElement2_put_volumeDouble(IHTMLMediaElement2* This,double v) {
    return This->lpVtbl->put_volumeDouble(This,v);
}
static FORCEINLINE HRESULT IHTMLMediaElement2_get_volumeDouble(IHTMLMediaElement2* This,double *p) {
    return This->lpVtbl->get_volumeDouble(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLMediaElement2_put_currentTimeDouble_Proxy(
    IHTMLMediaElement2* This,
    double v);
void __RPC_STUB IHTMLMediaElement2_put_currentTimeDouble_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement2_get_currentTimeDouble_Proxy(
    IHTMLMediaElement2* This,
    double *p);
void __RPC_STUB IHTMLMediaElement2_get_currentTimeDouble_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement2_get_initialTimeDouble_Proxy(
    IHTMLMediaElement2* This,
    double *p);
void __RPC_STUB IHTMLMediaElement2_get_initialTimeDouble_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement2_get_durationDouble_Proxy(
    IHTMLMediaElement2* This,
    double *p);
void __RPC_STUB IHTMLMediaElement2_get_durationDouble_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement2_put_defaultPlaybackRateDouble_Proxy(
    IHTMLMediaElement2* This,
    double v);
void __RPC_STUB IHTMLMediaElement2_put_defaultPlaybackRateDouble_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement2_get_defaultPlaybackRateDouble_Proxy(
    IHTMLMediaElement2* This,
    double *p);
void __RPC_STUB IHTMLMediaElement2_get_defaultPlaybackRateDouble_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement2_put_playbackRateDouble_Proxy(
    IHTMLMediaElement2* This,
    double v);
void __RPC_STUB IHTMLMediaElement2_put_playbackRateDouble_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement2_get_playbackRateDouble_Proxy(
    IHTMLMediaElement2* This,
    double *p);
void __RPC_STUB IHTMLMediaElement2_get_playbackRateDouble_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement2_put_volumeDouble_Proxy(
    IHTMLMediaElement2* This,
    double v);
void __RPC_STUB IHTMLMediaElement2_put_volumeDouble_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMediaElement2_get_volumeDouble_Proxy(
    IHTMLMediaElement2* This,
    double *p);
void __RPC_STUB IHTMLMediaElement2_get_volumeDouble_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLMediaElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLMSMediaElement interface
 */
#ifndef __IHTMLMSMediaElement_INTERFACE_DEFINED__
#define __IHTMLMSMediaElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLMSMediaElement, 0x30510792, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510792-98b5-11cf-bb82-00aa00bdce0b")
IHTMLMSMediaElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_msPlayToDisabled(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msPlayToDisabled(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_msPlayToPrimary(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msPlayToPrimary(
        VARIANT_BOOL *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLMSMediaElement, 0x30510792, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLMSMediaElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLMSMediaElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLMSMediaElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLMSMediaElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLMSMediaElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLMSMediaElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLMSMediaElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLMSMediaElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLMSMediaElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_msPlayToDisabled)(
        IHTMLMSMediaElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_msPlayToDisabled)(
        IHTMLMSMediaElement* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_msPlayToPrimary)(
        IHTMLMSMediaElement* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_msPlayToPrimary)(
        IHTMLMSMediaElement* This,
        VARIANT_BOOL *p);

    END_INTERFACE
} IHTMLMSMediaElementVtbl;
interface IHTMLMSMediaElement {
    CONST_VTBL IHTMLMSMediaElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLMSMediaElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLMSMediaElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLMSMediaElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLMSMediaElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLMSMediaElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLMSMediaElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLMSMediaElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLMSMediaElement methods ***/
#define IHTMLMSMediaElement_put_msPlayToDisabled(This,v) (This)->lpVtbl->put_msPlayToDisabled(This,v)
#define IHTMLMSMediaElement_get_msPlayToDisabled(This,p) (This)->lpVtbl->get_msPlayToDisabled(This,p)
#define IHTMLMSMediaElement_put_msPlayToPrimary(This,v) (This)->lpVtbl->put_msPlayToPrimary(This,v)
#define IHTMLMSMediaElement_get_msPlayToPrimary(This,p) (This)->lpVtbl->get_msPlayToPrimary(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLMSMediaElement_QueryInterface(IHTMLMSMediaElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLMSMediaElement_AddRef(IHTMLMSMediaElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLMSMediaElement_Release(IHTMLMSMediaElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLMSMediaElement_GetTypeInfoCount(IHTMLMSMediaElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLMSMediaElement_GetTypeInfo(IHTMLMSMediaElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLMSMediaElement_GetIDsOfNames(IHTMLMSMediaElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLMSMediaElement_Invoke(IHTMLMSMediaElement* 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);
}
/*** IHTMLMSMediaElement methods ***/
static FORCEINLINE HRESULT IHTMLMSMediaElement_put_msPlayToDisabled(IHTMLMSMediaElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_msPlayToDisabled(This,v);
}
static FORCEINLINE HRESULT IHTMLMSMediaElement_get_msPlayToDisabled(IHTMLMSMediaElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_msPlayToDisabled(This,p);
}
static FORCEINLINE HRESULT IHTMLMSMediaElement_put_msPlayToPrimary(IHTMLMSMediaElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_msPlayToPrimary(This,v);
}
static FORCEINLINE HRESULT IHTMLMSMediaElement_get_msPlayToPrimary(IHTMLMSMediaElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_msPlayToPrimary(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLMSMediaElement_put_msPlayToDisabled_Proxy(
    IHTMLMSMediaElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLMSMediaElement_put_msPlayToDisabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMSMediaElement_get_msPlayToDisabled_Proxy(
    IHTMLMSMediaElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLMSMediaElement_get_msPlayToDisabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMSMediaElement_put_msPlayToPrimary_Proxy(
    IHTMLMSMediaElement* This,
    VARIANT_BOOL v);
void __RPC_STUB IHTMLMSMediaElement_put_msPlayToPrimary_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLMSMediaElement_get_msPlayToPrimary_Proxy(
    IHTMLMSMediaElement* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLMSMediaElement_get_msPlayToPrimary_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLMSMediaElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLSourceElement interface
 */
#ifndef __IHTMLSourceElement_INTERFACE_DEFINED__
#define __IHTMLSourceElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLSourceElement, 0x30510707, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510707-98b5-11cf-bb82-00aa00bdce0b")
IHTMLSourceElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_src(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_src(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_type(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_media(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_media(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLSourceElement, 0x30510707, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLSourceElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLSourceElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLSourceElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLSourceElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLSourceElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLSourceElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLSourceElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLSourceElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLSourceElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_src)(
        IHTMLSourceElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_src)(
        IHTMLSourceElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_type)(
        IHTMLSourceElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLSourceElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_media)(
        IHTMLSourceElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_media)(
        IHTMLSourceElement* This,
        BSTR *p);

    END_INTERFACE
} IHTMLSourceElementVtbl;
interface IHTMLSourceElement {
    CONST_VTBL IHTMLSourceElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLSourceElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLSourceElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLSourceElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLSourceElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLSourceElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLSourceElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLSourceElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLSourceElement methods ***/
#define IHTMLSourceElement_put_src(This,v) (This)->lpVtbl->put_src(This,v)
#define IHTMLSourceElement_get_src(This,p) (This)->lpVtbl->get_src(This,p)
#define IHTMLSourceElement_put_type(This,v) (This)->lpVtbl->put_type(This,v)
#define IHTMLSourceElement_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#define IHTMLSourceElement_put_media(This,v) (This)->lpVtbl->put_media(This,v)
#define IHTMLSourceElement_get_media(This,p) (This)->lpVtbl->get_media(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLSourceElement_QueryInterface(IHTMLSourceElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLSourceElement_AddRef(IHTMLSourceElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLSourceElement_Release(IHTMLSourceElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLSourceElement_GetTypeInfoCount(IHTMLSourceElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLSourceElement_GetTypeInfo(IHTMLSourceElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLSourceElement_GetIDsOfNames(IHTMLSourceElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLSourceElement_Invoke(IHTMLSourceElement* 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);
}
/*** IHTMLSourceElement methods ***/
static FORCEINLINE HRESULT IHTMLSourceElement_put_src(IHTMLSourceElement* This,BSTR v) {
    return This->lpVtbl->put_src(This,v);
}
static FORCEINLINE HRESULT IHTMLSourceElement_get_src(IHTMLSourceElement* This,BSTR *p) {
    return This->lpVtbl->get_src(This,p);
}
static FORCEINLINE HRESULT IHTMLSourceElement_put_type(IHTMLSourceElement* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static FORCEINLINE HRESULT IHTMLSourceElement_get_type(IHTMLSourceElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static FORCEINLINE HRESULT IHTMLSourceElement_put_media(IHTMLSourceElement* This,BSTR v) {
    return This->lpVtbl->put_media(This,v);
}
static FORCEINLINE HRESULT IHTMLSourceElement_get_media(IHTMLSourceElement* This,BSTR *p) {
    return This->lpVtbl->get_media(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLSourceElement_put_src_Proxy(
    IHTMLSourceElement* This,
    BSTR v);
void __RPC_STUB IHTMLSourceElement_put_src_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSourceElement_get_src_Proxy(
    IHTMLSourceElement* This,
    BSTR *p);
void __RPC_STUB IHTMLSourceElement_get_src_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSourceElement_put_type_Proxy(
    IHTMLSourceElement* This,
    BSTR v);
void __RPC_STUB IHTMLSourceElement_put_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSourceElement_get_type_Proxy(
    IHTMLSourceElement* This,
    BSTR *p);
void __RPC_STUB IHTMLSourceElement_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSourceElement_put_media_Proxy(
    IHTMLSourceElement* This,
    BSTR v);
void __RPC_STUB IHTMLSourceElement_put_media_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLSourceElement_get_media_Proxy(
    IHTMLSourceElement* This,
    BSTR *p);
void __RPC_STUB IHTMLSourceElement_get_media_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLSourceElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLAudioElement interface
 */
#ifndef __IHTMLAudioElement_INTERFACE_DEFINED__
#define __IHTMLAudioElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLAudioElement, 0x30510708, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510708-98b5-11cf-bb82-00aa00bdce0b")
IHTMLAudioElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLAudioElement, 0x30510708, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLAudioElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLAudioElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLAudioElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLAudioElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLAudioElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLAudioElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLAudioElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLAudioElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} IHTMLAudioElementVtbl;
interface IHTMLAudioElement {
    CONST_VTBL IHTMLAudioElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLAudioElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLAudioElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLAudioElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLAudioElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLAudioElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLAudioElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLAudioElement_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 IHTMLAudioElement_QueryInterface(IHTMLAudioElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLAudioElement_AddRef(IHTMLAudioElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLAudioElement_Release(IHTMLAudioElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLAudioElement_GetTypeInfoCount(IHTMLAudioElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLAudioElement_GetTypeInfo(IHTMLAudioElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLAudioElement_GetIDsOfNames(IHTMLAudioElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLAudioElement_Invoke(IHTMLAudioElement* 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  /* __IHTMLAudioElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLVideoElement interface
 */
#ifndef __IHTMLVideoElement_INTERFACE_DEFINED__
#define __IHTMLVideoElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLVideoElement, 0x30510709, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510709-98b5-11cf-bb82-00aa00bdce0b")
IHTMLVideoElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_width(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_width(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_height(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_height(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_videoWidth(
        ULONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_videoHeight(
        ULONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_poster(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_poster(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLVideoElement, 0x30510709, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLVideoElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLVideoElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLVideoElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLVideoElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLVideoElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLVideoElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLVideoElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLVideoElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLVideoElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_width)(
        IHTMLVideoElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_width)(
        IHTMLVideoElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_height)(
        IHTMLVideoElement* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_height)(
        IHTMLVideoElement* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_videoWidth)(
        IHTMLVideoElement* This,
        ULONG *p);

    HRESULT (STDMETHODCALLTYPE *get_videoHeight)(
        IHTMLVideoElement* This,
        ULONG *p);

    HRESULT (STDMETHODCALLTYPE *put_poster)(
        IHTMLVideoElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_poster)(
        IHTMLVideoElement* This,
        BSTR *p);

    END_INTERFACE
} IHTMLVideoElementVtbl;
interface IHTMLVideoElement {
    CONST_VTBL IHTMLVideoElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLVideoElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLVideoElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLVideoElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLVideoElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLVideoElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLVideoElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLVideoElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLVideoElement methods ***/
#define IHTMLVideoElement_put_width(This,v) (This)->lpVtbl->put_width(This,v)
#define IHTMLVideoElement_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#define IHTMLVideoElement_put_height(This,v) (This)->lpVtbl->put_height(This,v)
#define IHTMLVideoElement_get_height(This,p) (This)->lpVtbl->get_height(This,p)
#define IHTMLVideoElement_get_videoWidth(This,p) (This)->lpVtbl->get_videoWidth(This,p)
#define IHTMLVideoElement_get_videoHeight(This,p) (This)->lpVtbl->get_videoHeight(This,p)
#define IHTMLVideoElement_put_poster(This,v) (This)->lpVtbl->put_poster(This,v)
#define IHTMLVideoElement_get_poster(This,p) (This)->lpVtbl->get_poster(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLVideoElement_QueryInterface(IHTMLVideoElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLVideoElement_AddRef(IHTMLVideoElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLVideoElement_Release(IHTMLVideoElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLVideoElement_GetTypeInfoCount(IHTMLVideoElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLVideoElement_GetTypeInfo(IHTMLVideoElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLVideoElement_GetIDsOfNames(IHTMLVideoElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLVideoElement_Invoke(IHTMLVideoElement* 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);
}
/*** IHTMLVideoElement methods ***/
static FORCEINLINE HRESULT IHTMLVideoElement_put_width(IHTMLVideoElement* This,LONG v) {
    return This->lpVtbl->put_width(This,v);
}
static FORCEINLINE HRESULT IHTMLVideoElement_get_width(IHTMLVideoElement* This,LONG *p) {
    return This->lpVtbl->get_width(This,p);
}
static FORCEINLINE HRESULT IHTMLVideoElement_put_height(IHTMLVideoElement* This,LONG v) {
    return This->lpVtbl->put_height(This,v);
}
static FORCEINLINE HRESULT IHTMLVideoElement_get_height(IHTMLVideoElement* This,LONG *p) {
    return This->lpVtbl->get_height(This,p);
}
static FORCEINLINE HRESULT IHTMLVideoElement_get_videoWidth(IHTMLVideoElement* This,ULONG *p) {
    return This->lpVtbl->get_videoWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLVideoElement_get_videoHeight(IHTMLVideoElement* This,ULONG *p) {
    return This->lpVtbl->get_videoHeight(This,p);
}
static FORCEINLINE HRESULT IHTMLVideoElement_put_poster(IHTMLVideoElement* This,BSTR v) {
    return This->lpVtbl->put_poster(This,v);
}
static FORCEINLINE HRESULT IHTMLVideoElement_get_poster(IHTMLVideoElement* This,BSTR *p) {
    return This->lpVtbl->get_poster(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLVideoElement_put_width_Proxy(
    IHTMLVideoElement* This,
    LONG v);
void __RPC_STUB IHTMLVideoElement_put_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLVideoElement_get_width_Proxy(
    IHTMLVideoElement* This,
    LONG *p);
void __RPC_STUB IHTMLVideoElement_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLVideoElement_put_height_Proxy(
    IHTMLVideoElement* This,
    LONG v);
void __RPC_STUB IHTMLVideoElement_put_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLVideoElement_get_height_Proxy(
    IHTMLVideoElement* This,
    LONG *p);
void __RPC_STUB IHTMLVideoElement_get_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLVideoElement_get_videoWidth_Proxy(
    IHTMLVideoElement* This,
    ULONG *p);
void __RPC_STUB IHTMLVideoElement_get_videoWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLVideoElement_get_videoHeight_Proxy(
    IHTMLVideoElement* This,
    ULONG *p);
void __RPC_STUB IHTMLVideoElement_get_videoHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLVideoElement_put_poster_Proxy(
    IHTMLVideoElement* This,
    BSTR v);
void __RPC_STUB IHTMLVideoElement_put_poster_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLVideoElement_get_poster_Proxy(
    IHTMLVideoElement* This,
    BSTR *p);
void __RPC_STUB IHTMLVideoElement_get_poster_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLVideoElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLAudioElementFactory interface
 */
#ifndef __IHTMLAudioElementFactory_INTERFACE_DEFINED__
#define __IHTMLAudioElementFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLAudioElementFactory, 0x305107eb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305107eb-98b5-11cf-bb82-00aa00bdce0b")
IHTMLAudioElementFactory : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE create(
        VARIANT src,
        IHTMLAudioElement **a) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLAudioElementFactory, 0x305107eb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLAudioElementFactoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLAudioElementFactory* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLAudioElementFactory* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLAudioElementFactory* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLAudioElementFactory* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLAudioElementFactory* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLAudioElementFactory* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLAudioElementFactory* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLAudioElementFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *create)(
        IHTMLAudioElementFactory* This,
        VARIANT src,
        IHTMLAudioElement **a);

    END_INTERFACE
} IHTMLAudioElementFactoryVtbl;
interface IHTMLAudioElementFactory {
    CONST_VTBL IHTMLAudioElementFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLAudioElementFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLAudioElementFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLAudioElementFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLAudioElementFactory_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLAudioElementFactory_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLAudioElementFactory_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLAudioElementFactory_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLAudioElementFactory methods ***/
#define IHTMLAudioElementFactory_create(This,src,a) (This)->lpVtbl->create(This,src,a)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLAudioElementFactory_QueryInterface(IHTMLAudioElementFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLAudioElementFactory_AddRef(IHTMLAudioElementFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLAudioElementFactory_Release(IHTMLAudioElementFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLAudioElementFactory_GetTypeInfoCount(IHTMLAudioElementFactory* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLAudioElementFactory_GetTypeInfo(IHTMLAudioElementFactory* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLAudioElementFactory_GetIDsOfNames(IHTMLAudioElementFactory* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLAudioElementFactory_Invoke(IHTMLAudioElementFactory* 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);
}
/*** IHTMLAudioElementFactory methods ***/
static FORCEINLINE HRESULT IHTMLAudioElementFactory_create(IHTMLAudioElementFactory* This,VARIANT src,IHTMLAudioElement **a) {
    return This->lpVtbl->create(This,src,a);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLAudioElementFactory_create_Proxy(
    IHTMLAudioElementFactory* This,
    VARIANT src,
    IHTMLAudioElement **a);
void __RPC_STUB IHTMLAudioElementFactory_create_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLAudioElementFactory_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLMediaError dispinterface
 */
#ifndef __DispHTMLMediaError_DISPINTERFACE_DEFINED__
#define __DispHTMLMediaError_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLMediaError, 0x30590086, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590086-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLMediaError : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLMediaError, 0x30590086, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLMediaErrorVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLMediaError* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLMediaError* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLMediaError* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLMediaError* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLMediaError* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLMediaError* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLMediaError* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLMediaErrorVtbl;
interface DispHTMLMediaError {
    CONST_VTBL DispHTMLMediaErrorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLMediaError_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLMediaError_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLMediaError_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLMediaError_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLMediaError_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLMediaError_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLMediaError_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 DispHTMLMediaError_QueryInterface(DispHTMLMediaError* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLMediaError_AddRef(DispHTMLMediaError* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLMediaError_Release(DispHTMLMediaError* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLMediaError_GetTypeInfoCount(DispHTMLMediaError* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLMediaError_GetTypeInfo(DispHTMLMediaError* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLMediaError_GetIDsOfNames(DispHTMLMediaError* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLMediaError_Invoke(DispHTMLMediaError* 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  /* __DispHTMLMediaError_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLMediaError coclass
 */

DEFINE_GUID(CLSID_HTMLMediaError, 0x3051070a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3051070a-98b5-11cf-bb82-00aa00bdce0b") HTMLMediaError;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLMediaError, 0x3051070a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CMediaError;
/*****************************************************************************
 * DispHTMLTimeRanges dispinterface
 */
#ifndef __DispHTMLTimeRanges_DISPINTERFACE_DEFINED__
#define __DispHTMLTimeRanges_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLTimeRanges, 0x30590087, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590087-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLTimeRanges : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLTimeRanges, 0x30590087, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLTimeRangesVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLTimeRanges* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLTimeRanges* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLTimeRanges* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLTimeRanges* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLTimeRanges* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLTimeRanges* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLTimeRanges* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLTimeRangesVtbl;
interface DispHTMLTimeRanges {
    CONST_VTBL DispHTMLTimeRangesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLTimeRanges_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLTimeRanges_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLTimeRanges_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLTimeRanges_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLTimeRanges_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLTimeRanges_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLTimeRanges_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 DispHTMLTimeRanges_QueryInterface(DispHTMLTimeRanges* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLTimeRanges_AddRef(DispHTMLTimeRanges* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLTimeRanges_Release(DispHTMLTimeRanges* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLTimeRanges_GetTypeInfoCount(DispHTMLTimeRanges* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLTimeRanges_GetTypeInfo(DispHTMLTimeRanges* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLTimeRanges_GetIDsOfNames(DispHTMLTimeRanges* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLTimeRanges_Invoke(DispHTMLTimeRanges* 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  /* __DispHTMLTimeRanges_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLTimeRanges coclass
 */

DEFINE_GUID(CLSID_HTMLTimeRanges, 0x3051070b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3051070b-98b5-11cf-bb82-00aa00bdce0b") HTMLTimeRanges;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLTimeRanges, 0x3051070b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CTimeRanges;
/*****************************************************************************
 * DispHTMLMediaElement dispinterface
 */
#ifndef __DispHTMLMediaElement_DISPINTERFACE_DEFINED__
#define __DispHTMLMediaElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLMediaElement, 0x30590088, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590088-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLMediaElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLMediaElement, 0x30590088, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLMediaElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLMediaElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLMediaElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLMediaElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLMediaElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLMediaElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLMediaElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLMediaElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLMediaElementVtbl;
interface DispHTMLMediaElement {
    CONST_VTBL DispHTMLMediaElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLMediaElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLMediaElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLMediaElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLMediaElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLMediaElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLMediaElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLMediaElement_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 DispHTMLMediaElement_QueryInterface(DispHTMLMediaElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLMediaElement_AddRef(DispHTMLMediaElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLMediaElement_Release(DispHTMLMediaElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLMediaElement_GetTypeInfoCount(DispHTMLMediaElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLMediaElement_GetTypeInfo(DispHTMLMediaElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLMediaElement_GetIDsOfNames(DispHTMLMediaElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLMediaElement_Invoke(DispHTMLMediaElement* 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  /* __DispHTMLMediaElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLMediaElement coclass
 */

DEFINE_GUID(CLSID_HTMLMediaElement, 0x3051070c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3051070c-98b5-11cf-bb82-00aa00bdce0b") HTMLMediaElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLMediaElement, 0x3051070c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CMediaElement;
/*****************************************************************************
 * DispHTMLSourceElement dispinterface
 */
#ifndef __DispHTMLSourceElement_DISPINTERFACE_DEFINED__
#define __DispHTMLSourceElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLSourceElement, 0x30590089, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590089-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLSourceElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLSourceElement, 0x30590089, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLSourceElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLSourceElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLSourceElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLSourceElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLSourceElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLSourceElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLSourceElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLSourceElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLSourceElementVtbl;
interface DispHTMLSourceElement {
    CONST_VTBL DispHTMLSourceElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLSourceElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLSourceElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLSourceElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLSourceElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLSourceElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLSourceElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLSourceElement_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 DispHTMLSourceElement_QueryInterface(DispHTMLSourceElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLSourceElement_AddRef(DispHTMLSourceElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLSourceElement_Release(DispHTMLSourceElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLSourceElement_GetTypeInfoCount(DispHTMLSourceElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLSourceElement_GetTypeInfo(DispHTMLSourceElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLSourceElement_GetIDsOfNames(DispHTMLSourceElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLSourceElement_Invoke(DispHTMLSourceElement* 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  /* __DispHTMLSourceElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLSourceElement coclass
 */

DEFINE_GUID(CLSID_HTMLSourceElement, 0x3051070d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3051070d-98b5-11cf-bb82-00aa00bdce0b") HTMLSourceElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLSourceElement, 0x3051070d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSourceElement;
/*****************************************************************************
 * DispHTMLAudioElement dispinterface
 */
#ifndef __DispHTMLAudioElement_DISPINTERFACE_DEFINED__
#define __DispHTMLAudioElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLAudioElement, 0x3059008a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059008a-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLAudioElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLAudioElement, 0x3059008a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLAudioElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLAudioElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLAudioElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLAudioElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLAudioElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLAudioElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLAudioElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLAudioElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLAudioElementVtbl;
interface DispHTMLAudioElement {
    CONST_VTBL DispHTMLAudioElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLAudioElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLAudioElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLAudioElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLAudioElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLAudioElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLAudioElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLAudioElement_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 DispHTMLAudioElement_QueryInterface(DispHTMLAudioElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLAudioElement_AddRef(DispHTMLAudioElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLAudioElement_Release(DispHTMLAudioElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLAudioElement_GetTypeInfoCount(DispHTMLAudioElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLAudioElement_GetTypeInfo(DispHTMLAudioElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLAudioElement_GetIDsOfNames(DispHTMLAudioElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLAudioElement_Invoke(DispHTMLAudioElement* 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  /* __DispHTMLAudioElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLAudioElement coclass
 */

DEFINE_GUID(CLSID_HTMLAudioElement, 0x3051070e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3051070e-98b5-11cf-bb82-00aa00bdce0b") HTMLAudioElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLAudioElement, 0x3051070e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CAudioElement;
/*****************************************************************************
 * HTMLAudioElementFactory coclass
 */

DEFINE_GUID(CLSID_HTMLAudioElementFactory, 0x305107ec, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305107ec-98b5-11cf-bb82-00aa00bdce0b") HTMLAudioElementFactory;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLAudioElementFactory, 0x305107ec, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CAudioElementFactory;
/*****************************************************************************
 * DispHTMLVideoElement dispinterface
 */
#ifndef __DispHTMLVideoElement_DISPINTERFACE_DEFINED__
#define __DispHTMLVideoElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLVideoElement, 0x3059008b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059008b-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLVideoElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLVideoElement, 0x3059008b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLVideoElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLVideoElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLVideoElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLVideoElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLVideoElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLVideoElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLVideoElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLVideoElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLVideoElementVtbl;
interface DispHTMLVideoElement {
    CONST_VTBL DispHTMLVideoElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLVideoElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLVideoElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLVideoElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLVideoElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLVideoElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLVideoElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLVideoElement_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 DispHTMLVideoElement_QueryInterface(DispHTMLVideoElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLVideoElement_AddRef(DispHTMLVideoElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLVideoElement_Release(DispHTMLVideoElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLVideoElement_GetTypeInfoCount(DispHTMLVideoElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLVideoElement_GetTypeInfo(DispHTMLVideoElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLVideoElement_GetIDsOfNames(DispHTMLVideoElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLVideoElement_Invoke(DispHTMLVideoElement* 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  /* __DispHTMLVideoElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLVideoElement coclass
 */

DEFINE_GUID(CLSID_HTMLVideoElement, 0x3051070f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3051070f-98b5-11cf-bb82-00aa00bdce0b") HTMLVideoElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLVideoElement, 0x3051070f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CVideoElement;
/*****************************************************************************
 * ISVGSwitchElement interface
 */
#ifndef __ISVGSwitchElement_INTERFACE_DEFINED__
#define __ISVGSwitchElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGSwitchElement, 0x305104f1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104f1-98b5-11cf-bb82-00aa00bdce0b")
ISVGSwitchElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGSwitchElement, 0x305104f1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGSwitchElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGSwitchElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGSwitchElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGSwitchElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGSwitchElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGSwitchElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGSwitchElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGSwitchElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} ISVGSwitchElementVtbl;
interface ISVGSwitchElement {
    CONST_VTBL ISVGSwitchElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGSwitchElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGSwitchElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGSwitchElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGSwitchElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGSwitchElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGSwitchElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGSwitchElement_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 ISVGSwitchElement_QueryInterface(ISVGSwitchElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGSwitchElement_AddRef(ISVGSwitchElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGSwitchElement_Release(ISVGSwitchElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGSwitchElement_GetTypeInfoCount(ISVGSwitchElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGSwitchElement_GetTypeInfo(ISVGSwitchElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGSwitchElement_GetIDsOfNames(ISVGSwitchElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGSwitchElement_Invoke(ISVGSwitchElement* 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  /* __ISVGSwitchElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGSwitchElement dispinterface
 */
#ifndef __DispSVGSwitchElement_DISPINTERFACE_DEFINED__
#define __DispSVGSwitchElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGSwitchElement, 0x30590030, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590030-98b5-11cf-bb82-00aa00bdce0b")
DispSVGSwitchElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGSwitchElement, 0x30590030, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGSwitchElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGSwitchElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGSwitchElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGSwitchElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGSwitchElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGSwitchElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGSwitchElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGSwitchElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGSwitchElementVtbl;
interface DispSVGSwitchElement {
    CONST_VTBL DispSVGSwitchElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGSwitchElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGSwitchElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGSwitchElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGSwitchElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGSwitchElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGSwitchElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGSwitchElement_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 DispSVGSwitchElement_QueryInterface(DispSVGSwitchElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGSwitchElement_AddRef(DispSVGSwitchElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGSwitchElement_Release(DispSVGSwitchElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGSwitchElement_GetTypeInfoCount(DispSVGSwitchElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGSwitchElement_GetTypeInfo(DispSVGSwitchElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGSwitchElement_GetIDsOfNames(DispSVGSwitchElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGSwitchElement_Invoke(DispSVGSwitchElement* 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  /* __DispSVGSwitchElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGSwitchElement coclass
 */

DEFINE_GUID(CLSID_SVGSwitchElement, 0x305105d8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105d8-98b5-11cf-bb82-00aa00bdce0b") SVGSwitchElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGSwitchElement, 0x305105d8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGSwitchElement;
/*****************************************************************************
 * ISVGDescElement interface
 */
#ifndef __ISVGDescElement_INTERFACE_DEFINED__
#define __ISVGDescElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGDescElement, 0x305104ea, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104ea-98b5-11cf-bb82-00aa00bdce0b")
ISVGDescElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGDescElement, 0x305104ea, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGDescElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGDescElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGDescElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGDescElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGDescElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGDescElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGDescElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGDescElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} ISVGDescElementVtbl;
interface ISVGDescElement {
    CONST_VTBL ISVGDescElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGDescElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGDescElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGDescElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGDescElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGDescElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGDescElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGDescElement_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 ISVGDescElement_QueryInterface(ISVGDescElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGDescElement_AddRef(ISVGDescElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGDescElement_Release(ISVGDescElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGDescElement_GetTypeInfoCount(ISVGDescElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGDescElement_GetTypeInfo(ISVGDescElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGDescElement_GetIDsOfNames(ISVGDescElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGDescElement_Invoke(ISVGDescElement* 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  /* __ISVGDescElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGDescElement dispinterface
 */
#ifndef __DispSVGDescElement_DISPINTERFACE_DEFINED__
#define __DispSVGDescElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGDescElement, 0x30590005, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590005-98b5-11cf-bb82-00aa00bdce0b")
DispSVGDescElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGDescElement, 0x30590005, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGDescElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGDescElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGDescElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGDescElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGDescElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGDescElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGDescElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGDescElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGDescElementVtbl;
interface DispSVGDescElement {
    CONST_VTBL DispSVGDescElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGDescElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGDescElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGDescElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGDescElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGDescElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGDescElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGDescElement_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 DispSVGDescElement_QueryInterface(DispSVGDescElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGDescElement_AddRef(DispSVGDescElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGDescElement_Release(DispSVGDescElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGDescElement_GetTypeInfoCount(DispSVGDescElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGDescElement_GetTypeInfo(DispSVGDescElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGDescElement_GetIDsOfNames(DispSVGDescElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGDescElement_Invoke(DispSVGDescElement* 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  /* __DispSVGDescElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGDescElement coclass
 */

DEFINE_GUID(CLSID_SVGDescElement, 0x30510572, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510572-98b5-11cf-bb82-00aa00bdce0b") SVGDescElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGDescElement, 0x30510572, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGDescElement;
/*****************************************************************************
 * ISVGTitleElement interface
 */
#ifndef __ISVGTitleElement_INTERFACE_DEFINED__
#define __ISVGTitleElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGTitleElement, 0x305104eb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104eb-98b5-11cf-bb82-00aa00bdce0b")
ISVGTitleElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGTitleElement, 0x305104eb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGTitleElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGTitleElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGTitleElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGTitleElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGTitleElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGTitleElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGTitleElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGTitleElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} ISVGTitleElementVtbl;
interface ISVGTitleElement {
    CONST_VTBL ISVGTitleElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGTitleElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGTitleElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGTitleElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGTitleElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGTitleElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGTitleElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGTitleElement_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 ISVGTitleElement_QueryInterface(ISVGTitleElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGTitleElement_AddRef(ISVGTitleElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGTitleElement_Release(ISVGTitleElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGTitleElement_GetTypeInfoCount(ISVGTitleElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGTitleElement_GetTypeInfo(ISVGTitleElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGTitleElement_GetIDsOfNames(ISVGTitleElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGTitleElement_Invoke(ISVGTitleElement* 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  /* __ISVGTitleElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGTitleElement dispinterface
 */
#ifndef __DispSVGTitleElement_DISPINTERFACE_DEFINED__
#define __DispSVGTitleElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGTitleElement, 0x30590006, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590006-98b5-11cf-bb82-00aa00bdce0b")
DispSVGTitleElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGTitleElement, 0x30590006, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGTitleElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGTitleElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGTitleElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGTitleElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGTitleElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGTitleElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGTitleElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGTitleElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGTitleElementVtbl;
interface DispSVGTitleElement {
    CONST_VTBL DispSVGTitleElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGTitleElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGTitleElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGTitleElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGTitleElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGTitleElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGTitleElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGTitleElement_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 DispSVGTitleElement_QueryInterface(DispSVGTitleElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGTitleElement_AddRef(DispSVGTitleElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGTitleElement_Release(DispSVGTitleElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGTitleElement_GetTypeInfoCount(DispSVGTitleElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGTitleElement_GetTypeInfo(DispSVGTitleElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGTitleElement_GetIDsOfNames(DispSVGTitleElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGTitleElement_Invoke(DispSVGTitleElement* 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  /* __DispSVGTitleElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGTitleElement coclass
 */

DEFINE_GUID(CLSID_SVGTitleElement, 0x30510573, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510573-98b5-11cf-bb82-00aa00bdce0b") SVGTitleElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGTitleElement, 0x30510573, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGTitleElement;
/*****************************************************************************
 * ISVGMetadataElement interface
 */
#ifndef __ISVGMetadataElement_INTERFACE_DEFINED__
#define __ISVGMetadataElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGMetadataElement, 0x30510560, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510560-98b5-11cf-bb82-00aa00bdce0b")
ISVGMetadataElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGMetadataElement, 0x30510560, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGMetadataElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGMetadataElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGMetadataElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGMetadataElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGMetadataElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGMetadataElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGMetadataElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGMetadataElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} ISVGMetadataElementVtbl;
interface ISVGMetadataElement {
    CONST_VTBL ISVGMetadataElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGMetadataElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGMetadataElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGMetadataElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGMetadataElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGMetadataElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGMetadataElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGMetadataElement_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 ISVGMetadataElement_QueryInterface(ISVGMetadataElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGMetadataElement_AddRef(ISVGMetadataElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGMetadataElement_Release(ISVGMetadataElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGMetadataElement_GetTypeInfoCount(ISVGMetadataElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGMetadataElement_GetTypeInfo(ISVGMetadataElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGMetadataElement_GetIDsOfNames(ISVGMetadataElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGMetadataElement_Invoke(ISVGMetadataElement* 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  /* __ISVGMetadataElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGMetadataElement dispinterface
 */
#ifndef __DispSVGMetadataElement_DISPINTERFACE_DEFINED__
#define __DispSVGMetadataElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGMetadataElement, 0x3059002f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059002f-98b5-11cf-bb82-00aa00bdce0b")
DispSVGMetadataElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGMetadataElement, 0x3059002f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGMetadataElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGMetadataElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGMetadataElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGMetadataElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGMetadataElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGMetadataElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGMetadataElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGMetadataElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGMetadataElementVtbl;
interface DispSVGMetadataElement {
    CONST_VTBL DispSVGMetadataElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGMetadataElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGMetadataElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGMetadataElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGMetadataElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGMetadataElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGMetadataElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGMetadataElement_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 DispSVGMetadataElement_QueryInterface(DispSVGMetadataElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGMetadataElement_AddRef(DispSVGMetadataElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGMetadataElement_Release(DispSVGMetadataElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGMetadataElement_GetTypeInfoCount(DispSVGMetadataElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGMetadataElement_GetTypeInfo(DispSVGMetadataElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGMetadataElement_GetIDsOfNames(DispSVGMetadataElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGMetadataElement_Invoke(DispSVGMetadataElement* 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  /* __DispSVGMetadataElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGMetadataElement coclass
 */

DEFINE_GUID(CLSID_SVGMetadataElement, 0x305105d7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105d7-98b5-11cf-bb82-00aa00bdce0b") SVGMetadataElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGMetadataElement, 0x305105d7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGMetadataElement;
#ifndef __ISVGElement_FWD_DEFINED__
#define __ISVGElement_FWD_DEFINED__
typedef interface ISVGElement ISVGElement;
#endif

#ifndef __ISVGUseElement_FWD_DEFINED__
#define __ISVGUseElement_FWD_DEFINED__
typedef interface ISVGUseElement ISVGUseElement;
#endif

#ifndef __ISVGElementInstanceList_FWD_DEFINED__
#define __ISVGElementInstanceList_FWD_DEFINED__
typedef interface ISVGElementInstanceList ISVGElementInstanceList;
#endif

/*****************************************************************************
 * ISVGElementInstance interface
 */
#ifndef __ISVGElementInstance_INTERFACE_DEFINED__
#define __ISVGElementInstance_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGElementInstance, 0x305104ee, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104ee-98b5-11cf-bb82-00aa00bdce0b")
ISVGElementInstance : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_correspondingElement(
        ISVGElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_correspondingUseElement(
        ISVGUseElement **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_parentNode(
        ISVGElementInstance **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_childNodes(
        ISVGElementInstanceList **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_firstChild(
        ISVGElementInstance **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_lastChild(
        ISVGElementInstance **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_previousSibling(
        ISVGElementInstance **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_nextSibling(
        ISVGElementInstance **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGElementInstance, 0x305104ee, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGElementInstanceVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGElementInstance* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGElementInstance* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGElementInstance* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGElementInstance* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGElementInstance* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGElementInstance* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGElementInstance* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGElementInstance methods ***/
    HRESULT (STDMETHODCALLTYPE *get_correspondingElement)(
        ISVGElementInstance* This,
        ISVGElement **p);

    HRESULT (STDMETHODCALLTYPE *get_correspondingUseElement)(
        ISVGElementInstance* This,
        ISVGUseElement **p);

    HRESULT (STDMETHODCALLTYPE *get_parentNode)(
        ISVGElementInstance* This,
        ISVGElementInstance **p);

    HRESULT (STDMETHODCALLTYPE *get_childNodes)(
        ISVGElementInstance* This,
        ISVGElementInstanceList **p);

    HRESULT (STDMETHODCALLTYPE *get_firstChild)(
        ISVGElementInstance* This,
        ISVGElementInstance **p);

    HRESULT (STDMETHODCALLTYPE *get_lastChild)(
        ISVGElementInstance* This,
        ISVGElementInstance **p);

    HRESULT (STDMETHODCALLTYPE *get_previousSibling)(
        ISVGElementInstance* This,
        ISVGElementInstance **p);

    HRESULT (STDMETHODCALLTYPE *get_nextSibling)(
        ISVGElementInstance* This,
        ISVGElementInstance **p);

    END_INTERFACE
} ISVGElementInstanceVtbl;
interface ISVGElementInstance {
    CONST_VTBL ISVGElementInstanceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGElementInstance_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGElementInstance_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGElementInstance_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGElementInstance_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGElementInstance_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGElementInstance_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGElementInstance_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGElementInstance methods ***/
#define ISVGElementInstance_get_correspondingElement(This,p) (This)->lpVtbl->get_correspondingElement(This,p)
#define ISVGElementInstance_get_correspondingUseElement(This,p) (This)->lpVtbl->get_correspondingUseElement(This,p)
#define ISVGElementInstance_get_parentNode(This,p) (This)->lpVtbl->get_parentNode(This,p)
#define ISVGElementInstance_get_childNodes(This,p) (This)->lpVtbl->get_childNodes(This,p)
#define ISVGElementInstance_get_firstChild(This,p) (This)->lpVtbl->get_firstChild(This,p)
#define ISVGElementInstance_get_lastChild(This,p) (This)->lpVtbl->get_lastChild(This,p)
#define ISVGElementInstance_get_previousSibling(This,p) (This)->lpVtbl->get_previousSibling(This,p)
#define ISVGElementInstance_get_nextSibling(This,p) (This)->lpVtbl->get_nextSibling(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGElementInstance_QueryInterface(ISVGElementInstance* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGElementInstance_AddRef(ISVGElementInstance* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGElementInstance_Release(ISVGElementInstance* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGElementInstance_GetTypeInfoCount(ISVGElementInstance* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGElementInstance_GetTypeInfo(ISVGElementInstance* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGElementInstance_GetIDsOfNames(ISVGElementInstance* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGElementInstance_Invoke(ISVGElementInstance* 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);
}
/*** ISVGElementInstance methods ***/
static FORCEINLINE HRESULT ISVGElementInstance_get_correspondingElement(ISVGElementInstance* This,ISVGElement **p) {
    return This->lpVtbl->get_correspondingElement(This,p);
}
static FORCEINLINE HRESULT ISVGElementInstance_get_correspondingUseElement(ISVGElementInstance* This,ISVGUseElement **p) {
    return This->lpVtbl->get_correspondingUseElement(This,p);
}
static FORCEINLINE HRESULT ISVGElementInstance_get_parentNode(ISVGElementInstance* This,ISVGElementInstance **p) {
    return This->lpVtbl->get_parentNode(This,p);
}
static FORCEINLINE HRESULT ISVGElementInstance_get_childNodes(ISVGElementInstance* This,ISVGElementInstanceList **p) {
    return This->lpVtbl->get_childNodes(This,p);
}
static FORCEINLINE HRESULT ISVGElementInstance_get_firstChild(ISVGElementInstance* This,ISVGElementInstance **p) {
    return This->lpVtbl->get_firstChild(This,p);
}
static FORCEINLINE HRESULT ISVGElementInstance_get_lastChild(ISVGElementInstance* This,ISVGElementInstance **p) {
    return This->lpVtbl->get_lastChild(This,p);
}
static FORCEINLINE HRESULT ISVGElementInstance_get_previousSibling(ISVGElementInstance* This,ISVGElementInstance **p) {
    return This->lpVtbl->get_previousSibling(This,p);
}
static FORCEINLINE HRESULT ISVGElementInstance_get_nextSibling(ISVGElementInstance* This,ISVGElementInstance **p) {
    return This->lpVtbl->get_nextSibling(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGElementInstance_get_correspondingElement_Proxy(
    ISVGElementInstance* This,
    ISVGElement **p);
void __RPC_STUB ISVGElementInstance_get_correspondingElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGElementInstance_get_correspondingUseElement_Proxy(
    ISVGElementInstance* This,
    ISVGUseElement **p);
void __RPC_STUB ISVGElementInstance_get_correspondingUseElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGElementInstance_get_parentNode_Proxy(
    ISVGElementInstance* This,
    ISVGElementInstance **p);
void __RPC_STUB ISVGElementInstance_get_parentNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGElementInstance_get_childNodes_Proxy(
    ISVGElementInstance* This,
    ISVGElementInstanceList **p);
void __RPC_STUB ISVGElementInstance_get_childNodes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGElementInstance_get_firstChild_Proxy(
    ISVGElementInstance* This,
    ISVGElementInstance **p);
void __RPC_STUB ISVGElementInstance_get_firstChild_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGElementInstance_get_lastChild_Proxy(
    ISVGElementInstance* This,
    ISVGElementInstance **p);
void __RPC_STUB ISVGElementInstance_get_lastChild_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGElementInstance_get_previousSibling_Proxy(
    ISVGElementInstance* This,
    ISVGElementInstance **p);
void __RPC_STUB ISVGElementInstance_get_previousSibling_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGElementInstance_get_nextSibling_Proxy(
    ISVGElementInstance* This,
    ISVGElementInstance **p);
void __RPC_STUB ISVGElementInstance_get_nextSibling_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGElementInstance_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGElementInstance dispinterface
 */
#ifndef __DispSVGElementInstance_DISPINTERFACE_DEFINED__
#define __DispSVGElementInstance_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGElementInstance, 0x30590007, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590007-98b5-11cf-bb82-00aa00bdce0b")
DispSVGElementInstance : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGElementInstance, 0x30590007, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGElementInstanceVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGElementInstance* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGElementInstance* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGElementInstance* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGElementInstance* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGElementInstance* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGElementInstance* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGElementInstance* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGElementInstanceVtbl;
interface DispSVGElementInstance {
    CONST_VTBL DispSVGElementInstanceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGElementInstance_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGElementInstance_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGElementInstance_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGElementInstance_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGElementInstance_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGElementInstance_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGElementInstance_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 DispSVGElementInstance_QueryInterface(DispSVGElementInstance* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGElementInstance_AddRef(DispSVGElementInstance* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGElementInstance_Release(DispSVGElementInstance* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGElementInstance_GetTypeInfoCount(DispSVGElementInstance* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGElementInstance_GetTypeInfo(DispSVGElementInstance* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGElementInstance_GetIDsOfNames(DispSVGElementInstance* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGElementInstance_Invoke(DispSVGElementInstance* 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  /* __DispSVGElementInstance_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGElementInstance coclass
 */

DEFINE_GUID(CLSID_SVGElementInstance, 0x30510575, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510575-98b5-11cf-bb82-00aa00bdce0b") SVGElementInstance;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGElementInstance, 0x30510575, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGElementInstance;
#ifndef __ISVGElementInstance_FWD_DEFINED__
#define __ISVGElementInstance_FWD_DEFINED__
typedef interface ISVGElementInstance ISVGElementInstance;
#endif

/*****************************************************************************
 * ISVGElementInstanceList interface
 */
#ifndef __ISVGElementInstanceList_INTERFACE_DEFINED__
#define __ISVGElementInstanceList_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGElementInstanceList, 0x305104ef, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104ef-98b5-11cf-bb82-00aa00bdce0b")
ISVGElementInstanceList : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE item(
        LONG index,
        ISVGElementInstance **ppResult) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGElementInstanceList, 0x305104ef, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGElementInstanceListVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGElementInstanceList* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGElementInstanceList* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGElementInstanceList* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGElementInstanceList* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGElementInstanceList* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGElementInstanceList* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGElementInstanceList* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGElementInstanceList methods ***/
    HRESULT (STDMETHODCALLTYPE *get_length)(
        ISVGElementInstanceList* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *item)(
        ISVGElementInstanceList* This,
        LONG index,
        ISVGElementInstance **ppResult);

    END_INTERFACE
} ISVGElementInstanceListVtbl;
interface ISVGElementInstanceList {
    CONST_VTBL ISVGElementInstanceListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGElementInstanceList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGElementInstanceList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGElementInstanceList_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGElementInstanceList_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGElementInstanceList_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGElementInstanceList_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGElementInstanceList_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGElementInstanceList methods ***/
#define ISVGElementInstanceList_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define ISVGElementInstanceList_item(This,index,ppResult) (This)->lpVtbl->item(This,index,ppResult)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGElementInstanceList_QueryInterface(ISVGElementInstanceList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGElementInstanceList_AddRef(ISVGElementInstanceList* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGElementInstanceList_Release(ISVGElementInstanceList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGElementInstanceList_GetTypeInfoCount(ISVGElementInstanceList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGElementInstanceList_GetTypeInfo(ISVGElementInstanceList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGElementInstanceList_GetIDsOfNames(ISVGElementInstanceList* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGElementInstanceList_Invoke(ISVGElementInstanceList* 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);
}
/*** ISVGElementInstanceList methods ***/
static FORCEINLINE HRESULT ISVGElementInstanceList_get_length(ISVGElementInstanceList* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT ISVGElementInstanceList_item(ISVGElementInstanceList* This,LONG index,ISVGElementInstance **ppResult) {
    return This->lpVtbl->item(This,index,ppResult);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGElementInstanceList_get_length_Proxy(
    ISVGElementInstanceList* This,
    LONG *p);
void __RPC_STUB ISVGElementInstanceList_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGElementInstanceList_item_Proxy(
    ISVGElementInstanceList* This,
    LONG index,
    ISVGElementInstance **ppResult);
void __RPC_STUB ISVGElementInstanceList_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGElementInstanceList_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGElementInstanceList dispinterface
 */
#ifndef __DispSVGElementInstanceList_DISPINTERFACE_DEFINED__
#define __DispSVGElementInstanceList_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGElementInstanceList, 0x30590008, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590008-98b5-11cf-bb82-00aa00bdce0b")
DispSVGElementInstanceList : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGElementInstanceList, 0x30590008, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGElementInstanceListVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGElementInstanceList* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGElementInstanceList* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGElementInstanceList* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGElementInstanceList* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGElementInstanceList* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGElementInstanceList* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGElementInstanceList* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGElementInstanceListVtbl;
interface DispSVGElementInstanceList {
    CONST_VTBL DispSVGElementInstanceListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGElementInstanceList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGElementInstanceList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGElementInstanceList_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGElementInstanceList_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGElementInstanceList_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGElementInstanceList_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGElementInstanceList_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 DispSVGElementInstanceList_QueryInterface(DispSVGElementInstanceList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGElementInstanceList_AddRef(DispSVGElementInstanceList* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGElementInstanceList_Release(DispSVGElementInstanceList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGElementInstanceList_GetTypeInfoCount(DispSVGElementInstanceList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGElementInstanceList_GetTypeInfo(DispSVGElementInstanceList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGElementInstanceList_GetIDsOfNames(DispSVGElementInstanceList* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGElementInstanceList_Invoke(DispSVGElementInstanceList* 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  /* __DispSVGElementInstanceList_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGElementInstanceList coclass
 */

DEFINE_GUID(CLSID_SVGElementInstanceList, 0x30510576, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510576-98b5-11cf-bb82-00aa00bdce0b") SVGElementInstanceList;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGElementInstanceList, 0x30510576, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGElementInstanceList;
/*****************************************************************************
 * IDOMException interface
 */
#ifndef __IDOMException_INTERFACE_DEFINED__
#define __IDOMException_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMException, 0x3051072b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051072b-98b5-11cf-bb82-00aa00bdce0b")
IDOMException : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_code(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_code(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_message(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMException, 0x3051072b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMExceptionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMException* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMException* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMException* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDOMException* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDOMException* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDOMException* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDOMException* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDOMException methods ***/
    HRESULT (STDMETHODCALLTYPE *put_code)(
        IDOMException* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_code)(
        IDOMException* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_message)(
        IDOMException* This,
        BSTR *p);

    END_INTERFACE
} IDOMExceptionVtbl;
interface IDOMException {
    CONST_VTBL IDOMExceptionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMException_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMException_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMException_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDOMException_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDOMException_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDOMException_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDOMException_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDOMException methods ***/
#define IDOMException_put_code(This,v) (This)->lpVtbl->put_code(This,v)
#define IDOMException_get_code(This,p) (This)->lpVtbl->get_code(This,p)
#define IDOMException_get_message(This,p) (This)->lpVtbl->get_message(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMException_QueryInterface(IDOMException* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMException_AddRef(IDOMException* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMException_Release(IDOMException* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDOMException_GetTypeInfoCount(IDOMException* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDOMException_GetTypeInfo(IDOMException* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDOMException_GetIDsOfNames(IDOMException* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDOMException_Invoke(IDOMException* 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);
}
/*** IDOMException methods ***/
static FORCEINLINE HRESULT IDOMException_put_code(IDOMException* This,LONG v) {
    return This->lpVtbl->put_code(This,v);
}
static FORCEINLINE HRESULT IDOMException_get_code(IDOMException* This,LONG *p) {
    return This->lpVtbl->get_code(This,p);
}
static FORCEINLINE HRESULT IDOMException_get_message(IDOMException* This,BSTR *p) {
    return This->lpVtbl->get_message(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMException_put_code_Proxy(
    IDOMException* This,
    LONG v);
void __RPC_STUB IDOMException_put_code_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMException_get_code_Proxy(
    IDOMException* This,
    LONG *p);
void __RPC_STUB IDOMException_get_code_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMException_get_message_Proxy(
    IDOMException* This,
    BSTR *p);
void __RPC_STUB IDOMException_get_message_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMException_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRangeException interface
 */
#ifndef __IRangeException_INTERFACE_DEFINED__
#define __IRangeException_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRangeException, 0x3051072d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051072d-98b5-11cf-bb82-00aa00bdce0b")
IRangeException : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_code(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_code(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_message(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRangeException, 0x3051072d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IRangeExceptionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IRangeException* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IRangeException* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IRangeException* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IRangeException* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IRangeException* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IRangeException* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IRangeException* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IRangeException methods ***/
    HRESULT (STDMETHODCALLTYPE *put_code)(
        IRangeException* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_code)(
        IRangeException* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_message)(
        IRangeException* This,
        BSTR *p);

    END_INTERFACE
} IRangeExceptionVtbl;
interface IRangeException {
    CONST_VTBL IRangeExceptionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRangeException_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRangeException_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRangeException_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IRangeException_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IRangeException_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IRangeException_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IRangeException_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IRangeException methods ***/
#define IRangeException_put_code(This,v) (This)->lpVtbl->put_code(This,v)
#define IRangeException_get_code(This,p) (This)->lpVtbl->get_code(This,p)
#define IRangeException_get_message(This,p) (This)->lpVtbl->get_message(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRangeException_QueryInterface(IRangeException* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRangeException_AddRef(IRangeException* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRangeException_Release(IRangeException* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IRangeException_GetTypeInfoCount(IRangeException* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IRangeException_GetTypeInfo(IRangeException* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IRangeException_GetIDsOfNames(IRangeException* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IRangeException_Invoke(IRangeException* 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);
}
/*** IRangeException methods ***/
static FORCEINLINE HRESULT IRangeException_put_code(IRangeException* This,LONG v) {
    return This->lpVtbl->put_code(This,v);
}
static FORCEINLINE HRESULT IRangeException_get_code(IRangeException* This,LONG *p) {
    return This->lpVtbl->get_code(This,p);
}
static FORCEINLINE HRESULT IRangeException_get_message(IRangeException* This,BSTR *p) {
    return This->lpVtbl->get_message(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IRangeException_put_code_Proxy(
    IRangeException* This,
    LONG v);
void __RPC_STUB IRangeException_put_code_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRangeException_get_code_Proxy(
    IRangeException* This,
    LONG *p);
void __RPC_STUB IRangeException_get_code_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRangeException_get_message_Proxy(
    IRangeException* This,
    BSTR *p);
void __RPC_STUB IRangeException_get_message_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IRangeException_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISVGException interface
 */
#ifndef __ISVGException_INTERFACE_DEFINED__
#define __ISVGException_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGException, 0x3051072f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051072f-98b5-11cf-bb82-00aa00bdce0b")
ISVGException : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_code(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_code(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_message(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGException, 0x3051072f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGExceptionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGException* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGException* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGException* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGException* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGException* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGException* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGException* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGException methods ***/
    HRESULT (STDMETHODCALLTYPE *put_code)(
        ISVGException* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_code)(
        ISVGException* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_message)(
        ISVGException* This,
        BSTR *p);

    END_INTERFACE
} ISVGExceptionVtbl;
interface ISVGException {
    CONST_VTBL ISVGExceptionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGException_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGException_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGException_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGException_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGException_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGException_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGException_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGException methods ***/
#define ISVGException_put_code(This,v) (This)->lpVtbl->put_code(This,v)
#define ISVGException_get_code(This,p) (This)->lpVtbl->get_code(This,p)
#define ISVGException_get_message(This,p) (This)->lpVtbl->get_message(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGException_QueryInterface(ISVGException* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGException_AddRef(ISVGException* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGException_Release(ISVGException* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGException_GetTypeInfoCount(ISVGException* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGException_GetTypeInfo(ISVGException* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGException_GetIDsOfNames(ISVGException* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGException_Invoke(ISVGException* 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);
}
/*** ISVGException methods ***/
static FORCEINLINE HRESULT ISVGException_put_code(ISVGException* This,LONG v) {
    return This->lpVtbl->put_code(This,v);
}
static FORCEINLINE HRESULT ISVGException_get_code(ISVGException* This,LONG *p) {
    return This->lpVtbl->get_code(This,p);
}
static FORCEINLINE HRESULT ISVGException_get_message(ISVGException* This,BSTR *p) {
    return This->lpVtbl->get_message(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGException_put_code_Proxy(
    ISVGException* This,
    LONG v);
void __RPC_STUB ISVGException_put_code_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGException_get_code_Proxy(
    ISVGException* This,
    LONG *p);
void __RPC_STUB ISVGException_get_code_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGException_get_message_Proxy(
    ISVGException* This,
    BSTR *p);
void __RPC_STUB ISVGException_get_message_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGException_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IEventException interface
 */
#ifndef __IEventException_INTERFACE_DEFINED__
#define __IEventException_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEventException, 0x3051073a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051073a-98b5-11cf-bb82-00aa00bdce0b")
IEventException : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_code(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_code(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_message(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEventException, 0x3051073a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IEventExceptionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IEventException* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IEventException* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IEventException* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IEventException* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IEventException* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IEventException* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IEventException* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IEventException methods ***/
    HRESULT (STDMETHODCALLTYPE *put_code)(
        IEventException* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_code)(
        IEventException* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_message)(
        IEventException* This,
        BSTR *p);

    END_INTERFACE
} IEventExceptionVtbl;
interface IEventException {
    CONST_VTBL IEventExceptionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEventException_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEventException_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEventException_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IEventException_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IEventException_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IEventException_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IEventException_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IEventException methods ***/
#define IEventException_put_code(This,v) (This)->lpVtbl->put_code(This,v)
#define IEventException_get_code(This,p) (This)->lpVtbl->get_code(This,p)
#define IEventException_get_message(This,p) (This)->lpVtbl->get_message(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEventException_QueryInterface(IEventException* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEventException_AddRef(IEventException* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEventException_Release(IEventException* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IEventException_GetTypeInfoCount(IEventException* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IEventException_GetTypeInfo(IEventException* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IEventException_GetIDsOfNames(IEventException* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IEventException_Invoke(IEventException* 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);
}
/*** IEventException methods ***/
static FORCEINLINE HRESULT IEventException_put_code(IEventException* This,LONG v) {
    return This->lpVtbl->put_code(This,v);
}
static FORCEINLINE HRESULT IEventException_get_code(IEventException* This,LONG *p) {
    return This->lpVtbl->get_code(This,p);
}
static FORCEINLINE HRESULT IEventException_get_message(IEventException* This,BSTR *p) {
    return This->lpVtbl->get_message(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IEventException_put_code_Proxy(
    IEventException* This,
    LONG v);
void __RPC_STUB IEventException_put_code_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IEventException_get_code_Proxy(
    IEventException* This,
    LONG *p);
void __RPC_STUB IEventException_get_code_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IEventException_get_message_Proxy(
    IEventException* This,
    BSTR *p);
void __RPC_STUB IEventException_get_message_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IEventException_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispDOMException dispinterface
 */
#ifndef __DispDOMException_DISPINTERFACE_DEFINED__
#define __DispDOMException_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispDOMException, 0x30590094, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590094-98b5-11cf-bb82-00aa00bdce0b")
DispDOMException : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispDOMException, 0x30590094, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispDOMExceptionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispDOMException* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispDOMException* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispDOMException* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispDOMException* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispDOMException* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispDOMException* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispDOMException* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispDOMExceptionVtbl;
interface DispDOMException {
    CONST_VTBL DispDOMExceptionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispDOMException_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispDOMException_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispDOMException_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispDOMException_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispDOMException_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispDOMException_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispDOMException_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 DispDOMException_QueryInterface(DispDOMException* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispDOMException_AddRef(DispDOMException* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispDOMException_Release(DispDOMException* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispDOMException_GetTypeInfoCount(DispDOMException* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispDOMException_GetTypeInfo(DispDOMException* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispDOMException_GetIDsOfNames(DispDOMException* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispDOMException_Invoke(DispDOMException* 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  /* __DispDOMException_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * DOMException coclass
 */

DEFINE_GUID(CLSID_DOMException, 0x3051072c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3051072c-98b5-11cf-bb82-00aa00bdce0b") DOMException;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMException, 0x3051072c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDOMException;
/*****************************************************************************
 * DispRangeException dispinterface
 */
#ifndef __DispRangeException_DISPINTERFACE_DEFINED__
#define __DispRangeException_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispRangeException, 0x30590095, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590095-98b5-11cf-bb82-00aa00bdce0b")
DispRangeException : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispRangeException, 0x30590095, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispRangeExceptionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispRangeException* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispRangeException* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispRangeException* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispRangeException* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispRangeException* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispRangeException* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispRangeException* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispRangeExceptionVtbl;
interface DispRangeException {
    CONST_VTBL DispRangeExceptionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispRangeException_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispRangeException_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispRangeException_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispRangeException_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispRangeException_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispRangeException_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispRangeException_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 DispRangeException_QueryInterface(DispRangeException* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispRangeException_AddRef(DispRangeException* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispRangeException_Release(DispRangeException* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispRangeException_GetTypeInfoCount(DispRangeException* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispRangeException_GetTypeInfo(DispRangeException* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispRangeException_GetIDsOfNames(DispRangeException* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispRangeException_Invoke(DispRangeException* 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  /* __DispRangeException_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * RangeException coclass
 */

DEFINE_GUID(CLSID_RangeException, 0x3051072e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3051072e-98b5-11cf-bb82-00aa00bdce0b") RangeException;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(RangeException, 0x3051072e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CRangeException;
/*****************************************************************************
 * DispSVGException dispinterface
 */
#ifndef __DispSVGException_DISPINTERFACE_DEFINED__
#define __DispSVGException_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGException, 0x30590096, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590096-98b5-11cf-bb82-00aa00bdce0b")
DispSVGException : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGException, 0x30590096, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGExceptionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGException* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGException* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGException* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGException* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGException* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGException* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGException* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGExceptionVtbl;
interface DispSVGException {
    CONST_VTBL DispSVGExceptionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGException_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGException_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGException_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGException_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGException_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGException_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGException_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 DispSVGException_QueryInterface(DispSVGException* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGException_AddRef(DispSVGException* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGException_Release(DispSVGException* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGException_GetTypeInfoCount(DispSVGException* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGException_GetTypeInfo(DispSVGException* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGException_GetIDsOfNames(DispSVGException* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGException_Invoke(DispSVGException* 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  /* __DispSVGException_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGException coclass
 */

DEFINE_GUID(CLSID_SVGException, 0x30510730, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510730-98b5-11cf-bb82-00aa00bdce0b") SVGException;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGException, 0x30510730, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGException;
/*****************************************************************************
 * DispEventException dispinterface
 */
#ifndef __DispEventException_DISPINTERFACE_DEFINED__
#define __DispEventException_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispEventException, 0x30590099, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590099-98b5-11cf-bb82-00aa00bdce0b")
DispEventException : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispEventException, 0x30590099, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispEventExceptionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispEventException* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispEventException* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispEventException* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispEventException* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispEventException* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispEventException* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispEventException* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispEventExceptionVtbl;
interface DispEventException {
    CONST_VTBL DispEventExceptionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispEventException_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispEventException_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispEventException_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispEventException_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispEventException_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispEventException_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispEventException_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 DispEventException_QueryInterface(DispEventException* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispEventException_AddRef(DispEventException* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispEventException_Release(DispEventException* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispEventException_GetTypeInfoCount(DispEventException* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispEventException_GetTypeInfo(DispEventException* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispEventException_GetIDsOfNames(DispEventException* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispEventException_Invoke(DispEventException* 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  /* __DispEventException_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * EventException coclass
 */

DEFINE_GUID(CLSID_EventException, 0x3051073b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3051073b-98b5-11cf-bb82-00aa00bdce0b") EventException;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(EventException, 0x3051073b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CEventException;
/*****************************************************************************
 * ISVGScriptElement interface
 */
#ifndef __ISVGScriptElement_INTERFACE_DEFINED__
#define __ISVGScriptElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGScriptElement, 0x3051054d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051054d-98b5-11cf-bb82-00aa00bdce0b")
ISVGScriptElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_type(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGScriptElement, 0x3051054d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGScriptElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGScriptElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGScriptElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGScriptElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGScriptElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGScriptElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGScriptElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGScriptElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGScriptElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_type)(
        ISVGScriptElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_type)(
        ISVGScriptElement* This,
        BSTR *p);

    END_INTERFACE
} ISVGScriptElementVtbl;
interface ISVGScriptElement {
    CONST_VTBL ISVGScriptElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGScriptElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGScriptElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGScriptElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGScriptElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGScriptElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGScriptElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGScriptElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGScriptElement methods ***/
#define ISVGScriptElement_put_type(This,v) (This)->lpVtbl->put_type(This,v)
#define ISVGScriptElement_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGScriptElement_QueryInterface(ISVGScriptElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGScriptElement_AddRef(ISVGScriptElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGScriptElement_Release(ISVGScriptElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGScriptElement_GetTypeInfoCount(ISVGScriptElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGScriptElement_GetTypeInfo(ISVGScriptElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGScriptElement_GetIDsOfNames(ISVGScriptElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGScriptElement_Invoke(ISVGScriptElement* 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);
}
/*** ISVGScriptElement methods ***/
static FORCEINLINE HRESULT ISVGScriptElement_put_type(ISVGScriptElement* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static FORCEINLINE HRESULT ISVGScriptElement_get_type(ISVGScriptElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGScriptElement_put_type_Proxy(
    ISVGScriptElement* This,
    BSTR v);
void __RPC_STUB ISVGScriptElement_put_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGScriptElement_get_type_Proxy(
    ISVGScriptElement* This,
    BSTR *p);
void __RPC_STUB ISVGScriptElement_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGScriptElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGScriptElement dispinterface
 */
#ifndef __DispSVGScriptElement_DISPINTERFACE_DEFINED__
#define __DispSVGScriptElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGScriptElement, 0x30590039, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590039-98b5-11cf-bb82-00aa00bdce0b")
DispSVGScriptElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGScriptElement, 0x30590039, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGScriptElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGScriptElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGScriptElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGScriptElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGScriptElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGScriptElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGScriptElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGScriptElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGScriptElementVtbl;
interface DispSVGScriptElement {
    CONST_VTBL DispSVGScriptElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGScriptElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGScriptElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGScriptElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGScriptElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGScriptElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGScriptElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGScriptElement_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 DispSVGScriptElement_QueryInterface(DispSVGScriptElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGScriptElement_AddRef(DispSVGScriptElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGScriptElement_Release(DispSVGScriptElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGScriptElement_GetTypeInfoCount(DispSVGScriptElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGScriptElement_GetTypeInfo(DispSVGScriptElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGScriptElement_GetIDsOfNames(DispSVGScriptElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGScriptElement_Invoke(DispSVGScriptElement* 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  /* __DispSVGScriptElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGScriptElement coclass
 */

DEFINE_GUID(CLSID_SVGScriptElement, 0x305105e1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105e1-98b5-11cf-bb82-00aa00bdce0b") SVGScriptElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGScriptElement, 0x305105e1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGScriptElement;
/*****************************************************************************
 * ISVGStyleElement interface
 */
#ifndef __ISVGStyleElement_INTERFACE_DEFINED__
#define __ISVGStyleElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGStyleElement, 0x305104f3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104f3-98b5-11cf-bb82-00aa00bdce0b")
ISVGStyleElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_type(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_type(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_media(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_media(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGStyleElement, 0x305104f3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGStyleElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGStyleElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGStyleElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGStyleElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGStyleElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGStyleElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGStyleElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGStyleElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGStyleElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_type)(
        ISVGStyleElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_type)(
        ISVGStyleElement* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_media)(
        ISVGStyleElement* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_media)(
        ISVGStyleElement* This,
        BSTR *p);

    END_INTERFACE
} ISVGStyleElementVtbl;
interface ISVGStyleElement {
    CONST_VTBL ISVGStyleElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGStyleElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGStyleElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGStyleElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGStyleElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGStyleElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGStyleElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGStyleElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGStyleElement methods ***/
#define ISVGStyleElement_put_type(This,v) (This)->lpVtbl->put_type(This,v)
#define ISVGStyleElement_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#define ISVGStyleElement_put_media(This,v) (This)->lpVtbl->put_media(This,v)
#define ISVGStyleElement_get_media(This,p) (This)->lpVtbl->get_media(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGStyleElement_QueryInterface(ISVGStyleElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGStyleElement_AddRef(ISVGStyleElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGStyleElement_Release(ISVGStyleElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGStyleElement_GetTypeInfoCount(ISVGStyleElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGStyleElement_GetTypeInfo(ISVGStyleElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGStyleElement_GetIDsOfNames(ISVGStyleElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGStyleElement_Invoke(ISVGStyleElement* 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);
}
/*** ISVGStyleElement methods ***/
static FORCEINLINE HRESULT ISVGStyleElement_put_type(ISVGStyleElement* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static FORCEINLINE HRESULT ISVGStyleElement_get_type(ISVGStyleElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static FORCEINLINE HRESULT ISVGStyleElement_put_media(ISVGStyleElement* This,BSTR v) {
    return This->lpVtbl->put_media(This,v);
}
static FORCEINLINE HRESULT ISVGStyleElement_get_media(ISVGStyleElement* This,BSTR *p) {
    return This->lpVtbl->get_media(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGStyleElement_put_type_Proxy(
    ISVGStyleElement* This,
    BSTR v);
void __RPC_STUB ISVGStyleElement_put_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGStyleElement_get_type_Proxy(
    ISVGStyleElement* This,
    BSTR *p);
void __RPC_STUB ISVGStyleElement_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGStyleElement_put_media_Proxy(
    ISVGStyleElement* This,
    BSTR v);
void __RPC_STUB ISVGStyleElement_put_media_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGStyleElement_get_media_Proxy(
    ISVGStyleElement* This,
    BSTR *p);
void __RPC_STUB ISVGStyleElement_get_media_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGStyleElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGStyleElement dispinterface
 */
#ifndef __DispSVGStyleElement_DISPINTERFACE_DEFINED__
#define __DispSVGStyleElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGStyleElement, 0x30590029, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590029-98b5-11cf-bb82-00aa00bdce0b")
DispSVGStyleElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGStyleElement, 0x30590029, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGStyleElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGStyleElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGStyleElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGStyleElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGStyleElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGStyleElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGStyleElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGStyleElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGStyleElementVtbl;
interface DispSVGStyleElement {
    CONST_VTBL DispSVGStyleElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGStyleElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGStyleElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGStyleElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGStyleElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGStyleElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGStyleElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGStyleElement_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 DispSVGStyleElement_QueryInterface(DispSVGStyleElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGStyleElement_AddRef(DispSVGStyleElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGStyleElement_Release(DispSVGStyleElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGStyleElement_GetTypeInfoCount(DispSVGStyleElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGStyleElement_GetTypeInfo(DispSVGStyleElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGStyleElement_GetIDsOfNames(DispSVGStyleElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGStyleElement_Invoke(DispSVGStyleElement* 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  /* __DispSVGStyleElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGStyleElement coclass
 */

DEFINE_GUID(CLSID_SVGStyleElement, 0x305105d1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105d1-98b5-11cf-bb82-00aa00bdce0b") SVGStyleElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGStyleElement, 0x305105d1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGStyleElement;
typedef enum _lengthAdjust {
    LENGTHADJUST_UNKNOWN = 0,
    LENGTHADJUST_SPACING = 1,
    LENGTHADJUST_SPACINGANDGLYPHS = 2,
    lengthAdjust_Max = 0x7fffffff
} lengthAdjust;
/*****************************************************************************
 * ISVGTextContentElement interface
 */
#ifndef __ISVGTextContentElement_INTERFACE_DEFINED__
#define __ISVGTextContentElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGTextContentElement, 0x3051051a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051051a-98b5-11cf-bb82-00aa00bdce0b")
ISVGTextContentElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_textLength(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textLength(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_lengthAdjust(
        ISVGAnimatedEnumeration *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_lengthAdjust(
        ISVGAnimatedEnumeration **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE getNumberOfChars(
        LONG *pResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE getComputedTextLength(
        float *pResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE getSubStringLength(
        LONG charnum,
        LONG nchars,
        float *pResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE getStartPositionOfChar(
        LONG charnum,
        ISVGPoint **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE getEndPositionOfChar(
        LONG charnum,
        ISVGPoint **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE getExtentOfChar(
        LONG charnum,
        ISVGRect **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE getRotationOfChar(
        LONG charnum,
        float *pResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE getCharNumAtPosition(
        ISVGPoint *point,
        LONG *pResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE selectSubString(
        LONG charnum,
        LONG nchars) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGTextContentElement, 0x3051051a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGTextContentElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGTextContentElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGTextContentElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGTextContentElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGTextContentElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGTextContentElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGTextContentElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGTextContentElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGTextContentElement methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_textLength)(
        ISVGTextContentElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_textLength)(
        ISVGTextContentElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_lengthAdjust)(
        ISVGTextContentElement* This,
        ISVGAnimatedEnumeration *v);

    HRESULT (STDMETHODCALLTYPE *get_lengthAdjust)(
        ISVGTextContentElement* This,
        ISVGAnimatedEnumeration **p);

    HRESULT (STDMETHODCALLTYPE *getNumberOfChars)(
        ISVGTextContentElement* This,
        LONG *pResult);

    HRESULT (STDMETHODCALLTYPE *getComputedTextLength)(
        ISVGTextContentElement* This,
        float *pResult);

    HRESULT (STDMETHODCALLTYPE *getSubStringLength)(
        ISVGTextContentElement* This,
        LONG charnum,
        LONG nchars,
        float *pResult);

    HRESULT (STDMETHODCALLTYPE *getStartPositionOfChar)(
        ISVGTextContentElement* This,
        LONG charnum,
        ISVGPoint **ppResult);

    HRESULT (STDMETHODCALLTYPE *getEndPositionOfChar)(
        ISVGTextContentElement* This,
        LONG charnum,
        ISVGPoint **ppResult);

    HRESULT (STDMETHODCALLTYPE *getExtentOfChar)(
        ISVGTextContentElement* This,
        LONG charnum,
        ISVGRect **ppResult);

    HRESULT (STDMETHODCALLTYPE *getRotationOfChar)(
        ISVGTextContentElement* This,
        LONG charnum,
        float *pResult);

    HRESULT (STDMETHODCALLTYPE *getCharNumAtPosition)(
        ISVGTextContentElement* This,
        ISVGPoint *point,
        LONG *pResult);

    HRESULT (STDMETHODCALLTYPE *selectSubString)(
        ISVGTextContentElement* This,
        LONG charnum,
        LONG nchars);

    END_INTERFACE
} ISVGTextContentElementVtbl;
interface ISVGTextContentElement {
    CONST_VTBL ISVGTextContentElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGTextContentElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGTextContentElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGTextContentElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGTextContentElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGTextContentElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGTextContentElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGTextContentElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGTextContentElement methods ***/
#define ISVGTextContentElement_putref_textLength(This,v) (This)->lpVtbl->putref_textLength(This,v)
#define ISVGTextContentElement_get_textLength(This,p) (This)->lpVtbl->get_textLength(This,p)
#define ISVGTextContentElement_putref_lengthAdjust(This,v) (This)->lpVtbl->putref_lengthAdjust(This,v)
#define ISVGTextContentElement_get_lengthAdjust(This,p) (This)->lpVtbl->get_lengthAdjust(This,p)
#define ISVGTextContentElement_getNumberOfChars(This,pResult) (This)->lpVtbl->getNumberOfChars(This,pResult)
#define ISVGTextContentElement_getComputedTextLength(This,pResult) (This)->lpVtbl->getComputedTextLength(This,pResult)
#define ISVGTextContentElement_getSubStringLength(This,charnum,nchars,pResult) (This)->lpVtbl->getSubStringLength(This,charnum,nchars,pResult)
#define ISVGTextContentElement_getStartPositionOfChar(This,charnum,ppResult) (This)->lpVtbl->getStartPositionOfChar(This,charnum,ppResult)
#define ISVGTextContentElement_getEndPositionOfChar(This,charnum,ppResult) (This)->lpVtbl->getEndPositionOfChar(This,charnum,ppResult)
#define ISVGTextContentElement_getExtentOfChar(This,charnum,ppResult) (This)->lpVtbl->getExtentOfChar(This,charnum,ppResult)
#define ISVGTextContentElement_getRotationOfChar(This,charnum,pResult) (This)->lpVtbl->getRotationOfChar(This,charnum,pResult)
#define ISVGTextContentElement_getCharNumAtPosition(This,point,pResult) (This)->lpVtbl->getCharNumAtPosition(This,point,pResult)
#define ISVGTextContentElement_selectSubString(This,charnum,nchars) (This)->lpVtbl->selectSubString(This,charnum,nchars)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGTextContentElement_QueryInterface(ISVGTextContentElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGTextContentElement_AddRef(ISVGTextContentElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGTextContentElement_Release(ISVGTextContentElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGTextContentElement_GetTypeInfoCount(ISVGTextContentElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGTextContentElement_GetTypeInfo(ISVGTextContentElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGTextContentElement_GetIDsOfNames(ISVGTextContentElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGTextContentElement_Invoke(ISVGTextContentElement* 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);
}
/*** ISVGTextContentElement methods ***/
static FORCEINLINE HRESULT ISVGTextContentElement_putref_textLength(ISVGTextContentElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_textLength(This,v);
}
static FORCEINLINE HRESULT ISVGTextContentElement_get_textLength(ISVGTextContentElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_textLength(This,p);
}
static FORCEINLINE HRESULT ISVGTextContentElement_putref_lengthAdjust(ISVGTextContentElement* This,ISVGAnimatedEnumeration *v) {
    return This->lpVtbl->putref_lengthAdjust(This,v);
}
static FORCEINLINE HRESULT ISVGTextContentElement_get_lengthAdjust(ISVGTextContentElement* This,ISVGAnimatedEnumeration **p) {
    return This->lpVtbl->get_lengthAdjust(This,p);
}
static FORCEINLINE HRESULT ISVGTextContentElement_getNumberOfChars(ISVGTextContentElement* This,LONG *pResult) {
    return This->lpVtbl->getNumberOfChars(This,pResult);
}
static FORCEINLINE HRESULT ISVGTextContentElement_getComputedTextLength(ISVGTextContentElement* This,float *pResult) {
    return This->lpVtbl->getComputedTextLength(This,pResult);
}
static FORCEINLINE HRESULT ISVGTextContentElement_getSubStringLength(ISVGTextContentElement* This,LONG charnum,LONG nchars,float *pResult) {
    return This->lpVtbl->getSubStringLength(This,charnum,nchars,pResult);
}
static FORCEINLINE HRESULT ISVGTextContentElement_getStartPositionOfChar(ISVGTextContentElement* This,LONG charnum,ISVGPoint **ppResult) {
    return This->lpVtbl->getStartPositionOfChar(This,charnum,ppResult);
}
static FORCEINLINE HRESULT ISVGTextContentElement_getEndPositionOfChar(ISVGTextContentElement* This,LONG charnum,ISVGPoint **ppResult) {
    return This->lpVtbl->getEndPositionOfChar(This,charnum,ppResult);
}
static FORCEINLINE HRESULT ISVGTextContentElement_getExtentOfChar(ISVGTextContentElement* This,LONG charnum,ISVGRect **ppResult) {
    return This->lpVtbl->getExtentOfChar(This,charnum,ppResult);
}
static FORCEINLINE HRESULT ISVGTextContentElement_getRotationOfChar(ISVGTextContentElement* This,LONG charnum,float *pResult) {
    return This->lpVtbl->getRotationOfChar(This,charnum,pResult);
}
static FORCEINLINE HRESULT ISVGTextContentElement_getCharNumAtPosition(ISVGTextContentElement* This,ISVGPoint *point,LONG *pResult) {
    return This->lpVtbl->getCharNumAtPosition(This,point,pResult);
}
static FORCEINLINE HRESULT ISVGTextContentElement_selectSubString(ISVGTextContentElement* This,LONG charnum,LONG nchars) {
    return This->lpVtbl->selectSubString(This,charnum,nchars);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGTextContentElement_putref_textLength_Proxy(
    ISVGTextContentElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGTextContentElement_putref_textLength_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTextContentElement_get_textLength_Proxy(
    ISVGTextContentElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGTextContentElement_get_textLength_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTextContentElement_putref_lengthAdjust_Proxy(
    ISVGTextContentElement* This,
    ISVGAnimatedEnumeration *v);
void __RPC_STUB ISVGTextContentElement_putref_lengthAdjust_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTextContentElement_get_lengthAdjust_Proxy(
    ISVGTextContentElement* This,
    ISVGAnimatedEnumeration **p);
void __RPC_STUB ISVGTextContentElement_get_lengthAdjust_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTextContentElement_getNumberOfChars_Proxy(
    ISVGTextContentElement* This,
    LONG *pResult);
void __RPC_STUB ISVGTextContentElement_getNumberOfChars_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTextContentElement_getComputedTextLength_Proxy(
    ISVGTextContentElement* This,
    float *pResult);
void __RPC_STUB ISVGTextContentElement_getComputedTextLength_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTextContentElement_getSubStringLength_Proxy(
    ISVGTextContentElement* This,
    LONG charnum,
    LONG nchars,
    float *pResult);
void __RPC_STUB ISVGTextContentElement_getSubStringLength_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTextContentElement_getStartPositionOfChar_Proxy(
    ISVGTextContentElement* This,
    LONG charnum,
    ISVGPoint **ppResult);
void __RPC_STUB ISVGTextContentElement_getStartPositionOfChar_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTextContentElement_getEndPositionOfChar_Proxy(
    ISVGTextContentElement* This,
    LONG charnum,
    ISVGPoint **ppResult);
void __RPC_STUB ISVGTextContentElement_getEndPositionOfChar_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTextContentElement_getExtentOfChar_Proxy(
    ISVGTextContentElement* This,
    LONG charnum,
    ISVGRect **ppResult);
void __RPC_STUB ISVGTextContentElement_getExtentOfChar_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTextContentElement_getRotationOfChar_Proxy(
    ISVGTextContentElement* This,
    LONG charnum,
    float *pResult);
void __RPC_STUB ISVGTextContentElement_getRotationOfChar_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTextContentElement_getCharNumAtPosition_Proxy(
    ISVGTextContentElement* This,
    ISVGPoint *point,
    LONG *pResult);
void __RPC_STUB ISVGTextContentElement_getCharNumAtPosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTextContentElement_selectSubString_Proxy(
    ISVGTextContentElement* This,
    LONG charnum,
    LONG nchars);
void __RPC_STUB ISVGTextContentElement_selectSubString_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGTextContentElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGTextContentElement dispinterface
 */
#ifndef __DispSVGTextContentElement_DISPINTERFACE_DEFINED__
#define __DispSVGTextContentElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGTextContentElement, 0x30590035, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590035-98b5-11cf-bb82-00aa00bdce0b")
DispSVGTextContentElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGTextContentElement, 0x30590035, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGTextContentElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGTextContentElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGTextContentElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGTextContentElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGTextContentElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGTextContentElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGTextContentElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGTextContentElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGTextContentElementVtbl;
interface DispSVGTextContentElement {
    CONST_VTBL DispSVGTextContentElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGTextContentElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGTextContentElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGTextContentElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGTextContentElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGTextContentElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGTextContentElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGTextContentElement_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 DispSVGTextContentElement_QueryInterface(DispSVGTextContentElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGTextContentElement_AddRef(DispSVGTextContentElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGTextContentElement_Release(DispSVGTextContentElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGTextContentElement_GetTypeInfoCount(DispSVGTextContentElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGTextContentElement_GetTypeInfo(DispSVGTextContentElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGTextContentElement_GetIDsOfNames(DispSVGTextContentElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGTextContentElement_Invoke(DispSVGTextContentElement* 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  /* __DispSVGTextContentElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGTextContentElement coclass
 */

DEFINE_GUID(CLSID_SVGTextContentElement, 0x305105dd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105dd-98b5-11cf-bb82-00aa00bdce0b") SVGTextContentElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGTextContentElement, 0x305105dd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGTextContentElement;
/*****************************************************************************
 * ISVGTextPositioningElement interface
 */
#ifndef __ISVGTextPositioningElement_INTERFACE_DEFINED__
#define __ISVGTextPositioningElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGTextPositioningElement, 0x3051051b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051051b-98b5-11cf-bb82-00aa00bdce0b")
ISVGTextPositioningElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_x(
        ISVGAnimatedLengthList *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_x(
        ISVGAnimatedLengthList **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_y(
        ISVGAnimatedLengthList *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_y(
        ISVGAnimatedLengthList **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_dx(
        ISVGAnimatedLengthList *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_dx(
        ISVGAnimatedLengthList **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_dy(
        ISVGAnimatedLengthList *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_dy(
        ISVGAnimatedLengthList **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_rotate(
        ISVGAnimatedNumberList *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_rotate(
        ISVGAnimatedNumberList **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGTextPositioningElement, 0x3051051b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGTextPositioningElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGTextPositioningElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGTextPositioningElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGTextPositioningElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGTextPositioningElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGTextPositioningElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGTextPositioningElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGTextPositioningElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGTextPositioningElement methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_x)(
        ISVGTextPositioningElement* This,
        ISVGAnimatedLengthList *v);

    HRESULT (STDMETHODCALLTYPE *get_x)(
        ISVGTextPositioningElement* This,
        ISVGAnimatedLengthList **p);

    HRESULT (STDMETHODCALLTYPE *putref_y)(
        ISVGTextPositioningElement* This,
        ISVGAnimatedLengthList *v);

    HRESULT (STDMETHODCALLTYPE *get_y)(
        ISVGTextPositioningElement* This,
        ISVGAnimatedLengthList **p);

    HRESULT (STDMETHODCALLTYPE *putref_dx)(
        ISVGTextPositioningElement* This,
        ISVGAnimatedLengthList *v);

    HRESULT (STDMETHODCALLTYPE *get_dx)(
        ISVGTextPositioningElement* This,
        ISVGAnimatedLengthList **p);

    HRESULT (STDMETHODCALLTYPE *putref_dy)(
        ISVGTextPositioningElement* This,
        ISVGAnimatedLengthList *v);

    HRESULT (STDMETHODCALLTYPE *get_dy)(
        ISVGTextPositioningElement* This,
        ISVGAnimatedLengthList **p);

    HRESULT (STDMETHODCALLTYPE *putref_rotate)(
        ISVGTextPositioningElement* This,
        ISVGAnimatedNumberList *v);

    HRESULT (STDMETHODCALLTYPE *get_rotate)(
        ISVGTextPositioningElement* This,
        ISVGAnimatedNumberList **p);

    END_INTERFACE
} ISVGTextPositioningElementVtbl;
interface ISVGTextPositioningElement {
    CONST_VTBL ISVGTextPositioningElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGTextPositioningElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGTextPositioningElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGTextPositioningElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGTextPositioningElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGTextPositioningElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGTextPositioningElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGTextPositioningElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGTextPositioningElement methods ***/
#define ISVGTextPositioningElement_putref_x(This,v) (This)->lpVtbl->putref_x(This,v)
#define ISVGTextPositioningElement_get_x(This,p) (This)->lpVtbl->get_x(This,p)
#define ISVGTextPositioningElement_putref_y(This,v) (This)->lpVtbl->putref_y(This,v)
#define ISVGTextPositioningElement_get_y(This,p) (This)->lpVtbl->get_y(This,p)
#define ISVGTextPositioningElement_putref_dx(This,v) (This)->lpVtbl->putref_dx(This,v)
#define ISVGTextPositioningElement_get_dx(This,p) (This)->lpVtbl->get_dx(This,p)
#define ISVGTextPositioningElement_putref_dy(This,v) (This)->lpVtbl->putref_dy(This,v)
#define ISVGTextPositioningElement_get_dy(This,p) (This)->lpVtbl->get_dy(This,p)
#define ISVGTextPositioningElement_putref_rotate(This,v) (This)->lpVtbl->putref_rotate(This,v)
#define ISVGTextPositioningElement_get_rotate(This,p) (This)->lpVtbl->get_rotate(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGTextPositioningElement_QueryInterface(ISVGTextPositioningElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGTextPositioningElement_AddRef(ISVGTextPositioningElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGTextPositioningElement_Release(ISVGTextPositioningElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGTextPositioningElement_GetTypeInfoCount(ISVGTextPositioningElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGTextPositioningElement_GetTypeInfo(ISVGTextPositioningElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGTextPositioningElement_GetIDsOfNames(ISVGTextPositioningElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGTextPositioningElement_Invoke(ISVGTextPositioningElement* 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);
}
/*** ISVGTextPositioningElement methods ***/
static FORCEINLINE HRESULT ISVGTextPositioningElement_putref_x(ISVGTextPositioningElement* This,ISVGAnimatedLengthList *v) {
    return This->lpVtbl->putref_x(This,v);
}
static FORCEINLINE HRESULT ISVGTextPositioningElement_get_x(ISVGTextPositioningElement* This,ISVGAnimatedLengthList **p) {
    return This->lpVtbl->get_x(This,p);
}
static FORCEINLINE HRESULT ISVGTextPositioningElement_putref_y(ISVGTextPositioningElement* This,ISVGAnimatedLengthList *v) {
    return This->lpVtbl->putref_y(This,v);
}
static FORCEINLINE HRESULT ISVGTextPositioningElement_get_y(ISVGTextPositioningElement* This,ISVGAnimatedLengthList **p) {
    return This->lpVtbl->get_y(This,p);
}
static FORCEINLINE HRESULT ISVGTextPositioningElement_putref_dx(ISVGTextPositioningElement* This,ISVGAnimatedLengthList *v) {
    return This->lpVtbl->putref_dx(This,v);
}
static FORCEINLINE HRESULT ISVGTextPositioningElement_get_dx(ISVGTextPositioningElement* This,ISVGAnimatedLengthList **p) {
    return This->lpVtbl->get_dx(This,p);
}
static FORCEINLINE HRESULT ISVGTextPositioningElement_putref_dy(ISVGTextPositioningElement* This,ISVGAnimatedLengthList *v) {
    return This->lpVtbl->putref_dy(This,v);
}
static FORCEINLINE HRESULT ISVGTextPositioningElement_get_dy(ISVGTextPositioningElement* This,ISVGAnimatedLengthList **p) {
    return This->lpVtbl->get_dy(This,p);
}
static FORCEINLINE HRESULT ISVGTextPositioningElement_putref_rotate(ISVGTextPositioningElement* This,ISVGAnimatedNumberList *v) {
    return This->lpVtbl->putref_rotate(This,v);
}
static FORCEINLINE HRESULT ISVGTextPositioningElement_get_rotate(ISVGTextPositioningElement* This,ISVGAnimatedNumberList **p) {
    return This->lpVtbl->get_rotate(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGTextPositioningElement_putref_x_Proxy(
    ISVGTextPositioningElement* This,
    ISVGAnimatedLengthList *v);
void __RPC_STUB ISVGTextPositioningElement_putref_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTextPositioningElement_get_x_Proxy(
    ISVGTextPositioningElement* This,
    ISVGAnimatedLengthList **p);
void __RPC_STUB ISVGTextPositioningElement_get_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTextPositioningElement_putref_y_Proxy(
    ISVGTextPositioningElement* This,
    ISVGAnimatedLengthList *v);
void __RPC_STUB ISVGTextPositioningElement_putref_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTextPositioningElement_get_y_Proxy(
    ISVGTextPositioningElement* This,
    ISVGAnimatedLengthList **p);
void __RPC_STUB ISVGTextPositioningElement_get_y_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTextPositioningElement_putref_dx_Proxy(
    ISVGTextPositioningElement* This,
    ISVGAnimatedLengthList *v);
void __RPC_STUB ISVGTextPositioningElement_putref_dx_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTextPositioningElement_get_dx_Proxy(
    ISVGTextPositioningElement* This,
    ISVGAnimatedLengthList **p);
void __RPC_STUB ISVGTextPositioningElement_get_dx_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTextPositioningElement_putref_dy_Proxy(
    ISVGTextPositioningElement* This,
    ISVGAnimatedLengthList *v);
void __RPC_STUB ISVGTextPositioningElement_putref_dy_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTextPositioningElement_get_dy_Proxy(
    ISVGTextPositioningElement* This,
    ISVGAnimatedLengthList **p);
void __RPC_STUB ISVGTextPositioningElement_get_dy_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTextPositioningElement_putref_rotate_Proxy(
    ISVGTextPositioningElement* This,
    ISVGAnimatedNumberList *v);
void __RPC_STUB ISVGTextPositioningElement_putref_rotate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTextPositioningElement_get_rotate_Proxy(
    ISVGTextPositioningElement* This,
    ISVGAnimatedNumberList **p);
void __RPC_STUB ISVGTextPositioningElement_get_rotate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGTextPositioningElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGTextPositioningElement dispinterface
 */
#ifndef __DispSVGTextPositioningElement_DISPINTERFACE_DEFINED__
#define __DispSVGTextPositioningElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGTextPositioningElement, 0x30590038, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590038-98b5-11cf-bb82-00aa00bdce0b")
DispSVGTextPositioningElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGTextPositioningElement, 0x30590038, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGTextPositioningElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGTextPositioningElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGTextPositioningElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGTextPositioningElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGTextPositioningElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGTextPositioningElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGTextPositioningElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGTextPositioningElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGTextPositioningElementVtbl;
interface DispSVGTextPositioningElement {
    CONST_VTBL DispSVGTextPositioningElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGTextPositioningElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGTextPositioningElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGTextPositioningElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGTextPositioningElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGTextPositioningElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGTextPositioningElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGTextPositioningElement_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 DispSVGTextPositioningElement_QueryInterface(DispSVGTextPositioningElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGTextPositioningElement_AddRef(DispSVGTextPositioningElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGTextPositioningElement_Release(DispSVGTextPositioningElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGTextPositioningElement_GetTypeInfoCount(DispSVGTextPositioningElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGTextPositioningElement_GetTypeInfo(DispSVGTextPositioningElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGTextPositioningElement_GetIDsOfNames(DispSVGTextPositioningElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGTextPositioningElement_Invoke(DispSVGTextPositioningElement* 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  /* __DispSVGTextPositioningElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGTextPositioningElement coclass
 */

DEFINE_GUID(CLSID_SVGTextPositioningElement, 0x305105e0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105e0-98b5-11cf-bb82-00aa00bdce0b") SVGTextPositioningElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGTextPositioningElement, 0x305105e0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGTextPositioningElement;
/*****************************************************************************
 * IDOMDocumentType interface
 */
#ifndef __IDOMDocumentType_INTERFACE_DEFINED__
#define __IDOMDocumentType_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMDocumentType, 0x30510738, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510738-98b5-11cf-bb82-00aa00bdce0b")
IDOMDocumentType : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_entities(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_notations(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_publicId(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_systemId(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_internalSubset(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMDocumentType, 0x30510738, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMDocumentTypeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMDocumentType* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMDocumentType* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMDocumentType* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDOMDocumentType* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDOMDocumentType* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDOMDocumentType* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDOMDocumentType* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDOMDocumentType methods ***/
    HRESULT (STDMETHODCALLTYPE *get_name)(
        IDOMDocumentType* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_entities)(
        IDOMDocumentType* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_notations)(
        IDOMDocumentType* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_publicId)(
        IDOMDocumentType* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_systemId)(
        IDOMDocumentType* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_internalSubset)(
        IDOMDocumentType* This,
        VARIANT *p);

    END_INTERFACE
} IDOMDocumentTypeVtbl;
interface IDOMDocumentType {
    CONST_VTBL IDOMDocumentTypeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMDocumentType_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMDocumentType_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMDocumentType_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDOMDocumentType_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDOMDocumentType_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDOMDocumentType_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDOMDocumentType_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDOMDocumentType methods ***/
#define IDOMDocumentType_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#define IDOMDocumentType_get_entities(This,p) (This)->lpVtbl->get_entities(This,p)
#define IDOMDocumentType_get_notations(This,p) (This)->lpVtbl->get_notations(This,p)
#define IDOMDocumentType_get_publicId(This,p) (This)->lpVtbl->get_publicId(This,p)
#define IDOMDocumentType_get_systemId(This,p) (This)->lpVtbl->get_systemId(This,p)
#define IDOMDocumentType_get_internalSubset(This,p) (This)->lpVtbl->get_internalSubset(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMDocumentType_QueryInterface(IDOMDocumentType* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMDocumentType_AddRef(IDOMDocumentType* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMDocumentType_Release(IDOMDocumentType* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDOMDocumentType_GetTypeInfoCount(IDOMDocumentType* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDOMDocumentType_GetTypeInfo(IDOMDocumentType* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDOMDocumentType_GetIDsOfNames(IDOMDocumentType* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDOMDocumentType_Invoke(IDOMDocumentType* 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);
}
/*** IDOMDocumentType methods ***/
static FORCEINLINE HRESULT IDOMDocumentType_get_name(IDOMDocumentType* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static FORCEINLINE HRESULT IDOMDocumentType_get_entities(IDOMDocumentType* This,IDispatch **p) {
    return This->lpVtbl->get_entities(This,p);
}
static FORCEINLINE HRESULT IDOMDocumentType_get_notations(IDOMDocumentType* This,IDispatch **p) {
    return This->lpVtbl->get_notations(This,p);
}
static FORCEINLINE HRESULT IDOMDocumentType_get_publicId(IDOMDocumentType* This,VARIANT *p) {
    return This->lpVtbl->get_publicId(This,p);
}
static FORCEINLINE HRESULT IDOMDocumentType_get_systemId(IDOMDocumentType* This,VARIANT *p) {
    return This->lpVtbl->get_systemId(This,p);
}
static FORCEINLINE HRESULT IDOMDocumentType_get_internalSubset(IDOMDocumentType* This,VARIANT *p) {
    return This->lpVtbl->get_internalSubset(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMDocumentType_get_name_Proxy(
    IDOMDocumentType* This,
    BSTR *p);
void __RPC_STUB IDOMDocumentType_get_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMDocumentType_get_entities_Proxy(
    IDOMDocumentType* This,
    IDispatch **p);
void __RPC_STUB IDOMDocumentType_get_entities_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMDocumentType_get_notations_Proxy(
    IDOMDocumentType* This,
    IDispatch **p);
void __RPC_STUB IDOMDocumentType_get_notations_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMDocumentType_get_publicId_Proxy(
    IDOMDocumentType* This,
    VARIANT *p);
void __RPC_STUB IDOMDocumentType_get_publicId_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMDocumentType_get_systemId_Proxy(
    IDOMDocumentType* This,
    VARIANT *p);
void __RPC_STUB IDOMDocumentType_get_systemId_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMDocumentType_get_internalSubset_Proxy(
    IDOMDocumentType* This,
    VARIANT *p);
void __RPC_STUB IDOMDocumentType_get_internalSubset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMDocumentType_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispDOMDocumentType dispinterface
 */
#ifndef __DispDOMDocumentType_DISPINTERFACE_DEFINED__
#define __DispDOMDocumentType_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispDOMDocumentType, 0x30590098, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30590098-98b5-11cf-bb82-00aa00bdce0b")
DispDOMDocumentType : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispDOMDocumentType, 0x30590098, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispDOMDocumentTypeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispDOMDocumentType* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispDOMDocumentType* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispDOMDocumentType* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispDOMDocumentType* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispDOMDocumentType* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispDOMDocumentType* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispDOMDocumentType* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispDOMDocumentTypeVtbl;
interface DispDOMDocumentType {
    CONST_VTBL DispDOMDocumentTypeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispDOMDocumentType_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispDOMDocumentType_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispDOMDocumentType_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispDOMDocumentType_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispDOMDocumentType_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispDOMDocumentType_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispDOMDocumentType_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 DispDOMDocumentType_QueryInterface(DispDOMDocumentType* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispDOMDocumentType_AddRef(DispDOMDocumentType* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispDOMDocumentType_Release(DispDOMDocumentType* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispDOMDocumentType_GetTypeInfoCount(DispDOMDocumentType* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispDOMDocumentType_GetTypeInfo(DispDOMDocumentType* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispDOMDocumentType_GetIDsOfNames(DispDOMDocumentType* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispDOMDocumentType_Invoke(DispDOMDocumentType* 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  /* __DispDOMDocumentType_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * DOMDocumentType coclass
 */

DEFINE_GUID(CLSID_DOMDocumentType, 0x30510739, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510739-98b5-11cf-bb82-00aa00bdce0b") DOMDocumentType;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMDocumentType, 0x30510739, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDocumentType;
/*****************************************************************************
 * IDOMNodeIterator interface
 */
#ifndef __IDOMNodeIterator_INTERFACE_DEFINED__
#define __IDOMNodeIterator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMNodeIterator, 0x30510746, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510746-98b5-11cf-bb82-00aa00bdce0b")
IDOMNodeIterator : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_root(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_whatToShow(
        ULONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_filter(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_expandEntityReferences(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE nextNode(
        IDispatch **ppRetNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE previousNode(
        IDispatch **ppRetNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE detach(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMNodeIterator, 0x30510746, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMNodeIteratorVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMNodeIterator* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMNodeIterator* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMNodeIterator* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDOMNodeIterator* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDOMNodeIterator* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDOMNodeIterator* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDOMNodeIterator* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDOMNodeIterator methods ***/
    HRESULT (STDMETHODCALLTYPE *get_root)(
        IDOMNodeIterator* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_whatToShow)(
        IDOMNodeIterator* This,
        ULONG *p);

    HRESULT (STDMETHODCALLTYPE *get_filter)(
        IDOMNodeIterator* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_expandEntityReferences)(
        IDOMNodeIterator* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *nextNode)(
        IDOMNodeIterator* This,
        IDispatch **ppRetNode);

    HRESULT (STDMETHODCALLTYPE *previousNode)(
        IDOMNodeIterator* This,
        IDispatch **ppRetNode);

    HRESULT (STDMETHODCALLTYPE *detach)(
        IDOMNodeIterator* This);

    END_INTERFACE
} IDOMNodeIteratorVtbl;
interface IDOMNodeIterator {
    CONST_VTBL IDOMNodeIteratorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMNodeIterator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMNodeIterator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMNodeIterator_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDOMNodeIterator_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDOMNodeIterator_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDOMNodeIterator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDOMNodeIterator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDOMNodeIterator methods ***/
#define IDOMNodeIterator_get_root(This,p) (This)->lpVtbl->get_root(This,p)
#define IDOMNodeIterator_get_whatToShow(This,p) (This)->lpVtbl->get_whatToShow(This,p)
#define IDOMNodeIterator_get_filter(This,p) (This)->lpVtbl->get_filter(This,p)
#define IDOMNodeIterator_get_expandEntityReferences(This,p) (This)->lpVtbl->get_expandEntityReferences(This,p)
#define IDOMNodeIterator_nextNode(This,ppRetNode) (This)->lpVtbl->nextNode(This,ppRetNode)
#define IDOMNodeIterator_previousNode(This,ppRetNode) (This)->lpVtbl->previousNode(This,ppRetNode)
#define IDOMNodeIterator_detach(This) (This)->lpVtbl->detach(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMNodeIterator_QueryInterface(IDOMNodeIterator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMNodeIterator_AddRef(IDOMNodeIterator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMNodeIterator_Release(IDOMNodeIterator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDOMNodeIterator_GetTypeInfoCount(IDOMNodeIterator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDOMNodeIterator_GetTypeInfo(IDOMNodeIterator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDOMNodeIterator_GetIDsOfNames(IDOMNodeIterator* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDOMNodeIterator_Invoke(IDOMNodeIterator* 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);
}
/*** IDOMNodeIterator methods ***/
static FORCEINLINE HRESULT IDOMNodeIterator_get_root(IDOMNodeIterator* This,IDispatch **p) {
    return This->lpVtbl->get_root(This,p);
}
static FORCEINLINE HRESULT IDOMNodeIterator_get_whatToShow(IDOMNodeIterator* This,ULONG *p) {
    return This->lpVtbl->get_whatToShow(This,p);
}
static FORCEINLINE HRESULT IDOMNodeIterator_get_filter(IDOMNodeIterator* This,IDispatch **p) {
    return This->lpVtbl->get_filter(This,p);
}
static FORCEINLINE HRESULT IDOMNodeIterator_get_expandEntityReferences(IDOMNodeIterator* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_expandEntityReferences(This,p);
}
static FORCEINLINE HRESULT IDOMNodeIterator_nextNode(IDOMNodeIterator* This,IDispatch **ppRetNode) {
    return This->lpVtbl->nextNode(This,ppRetNode);
}
static FORCEINLINE HRESULT IDOMNodeIterator_previousNode(IDOMNodeIterator* This,IDispatch **ppRetNode) {
    return This->lpVtbl->previousNode(This,ppRetNode);
}
static FORCEINLINE HRESULT IDOMNodeIterator_detach(IDOMNodeIterator* This) {
    return This->lpVtbl->detach(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMNodeIterator_get_root_Proxy(
    IDOMNodeIterator* This,
    IDispatch **p);
void __RPC_STUB IDOMNodeIterator_get_root_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMNodeIterator_get_whatToShow_Proxy(
    IDOMNodeIterator* This,
    ULONG *p);
void __RPC_STUB IDOMNodeIterator_get_whatToShow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMNodeIterator_get_filter_Proxy(
    IDOMNodeIterator* This,
    IDispatch **p);
void __RPC_STUB IDOMNodeIterator_get_filter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMNodeIterator_get_expandEntityReferences_Proxy(
    IDOMNodeIterator* This,
    VARIANT_BOOL *p);
void __RPC_STUB IDOMNodeIterator_get_expandEntityReferences_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMNodeIterator_nextNode_Proxy(
    IDOMNodeIterator* This,
    IDispatch **ppRetNode);
void __RPC_STUB IDOMNodeIterator_nextNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMNodeIterator_previousNode_Proxy(
    IDOMNodeIterator* This,
    IDispatch **ppRetNode);
void __RPC_STUB IDOMNodeIterator_previousNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMNodeIterator_detach_Proxy(
    IDOMNodeIterator* This);
void __RPC_STUB IDOMNodeIterator_detach_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMNodeIterator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDOMTreeWalker interface
 */
#ifndef __IDOMTreeWalker_INTERFACE_DEFINED__
#define __IDOMTreeWalker_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMTreeWalker, 0x30510748, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510748-98b5-11cf-bb82-00aa00bdce0b")
IDOMTreeWalker : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_root(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_whatToShow(
        ULONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_filter(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_expandEntityReferences(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_currentNode(
        IDispatch *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_currentNode(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE parentNode(
        IDispatch **ppRetNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE firstChild(
        IDispatch **ppRetNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE lastChild(
        IDispatch **ppRetNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE previousSibling(
        IDispatch **ppRetNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE nextSibling(
        IDispatch **ppRetNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE previousNode(
        IDispatch **ppRetNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE nextNode(
        IDispatch **ppRetNode) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMTreeWalker, 0x30510748, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMTreeWalkerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMTreeWalker* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMTreeWalker* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMTreeWalker* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDOMTreeWalker* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDOMTreeWalker* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDOMTreeWalker* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDOMTreeWalker* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDOMTreeWalker methods ***/
    HRESULT (STDMETHODCALLTYPE *get_root)(
        IDOMTreeWalker* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_whatToShow)(
        IDOMTreeWalker* This,
        ULONG *p);

    HRESULT (STDMETHODCALLTYPE *get_filter)(
        IDOMTreeWalker* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_expandEntityReferences)(
        IDOMTreeWalker* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *putref_currentNode)(
        IDOMTreeWalker* This,
        IDispatch *v);

    HRESULT (STDMETHODCALLTYPE *get_currentNode)(
        IDOMTreeWalker* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *parentNode)(
        IDOMTreeWalker* This,
        IDispatch **ppRetNode);

    HRESULT (STDMETHODCALLTYPE *firstChild)(
        IDOMTreeWalker* This,
        IDispatch **ppRetNode);

    HRESULT (STDMETHODCALLTYPE *lastChild)(
        IDOMTreeWalker* This,
        IDispatch **ppRetNode);

    HRESULT (STDMETHODCALLTYPE *previousSibling)(
        IDOMTreeWalker* This,
        IDispatch **ppRetNode);

    HRESULT (STDMETHODCALLTYPE *nextSibling)(
        IDOMTreeWalker* This,
        IDispatch **ppRetNode);

    HRESULT (STDMETHODCALLTYPE *previousNode)(
        IDOMTreeWalker* This,
        IDispatch **ppRetNode);

    HRESULT (STDMETHODCALLTYPE *nextNode)(
        IDOMTreeWalker* This,
        IDispatch **ppRetNode);

    END_INTERFACE
} IDOMTreeWalkerVtbl;
interface IDOMTreeWalker {
    CONST_VTBL IDOMTreeWalkerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMTreeWalker_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMTreeWalker_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMTreeWalker_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDOMTreeWalker_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDOMTreeWalker_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDOMTreeWalker_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDOMTreeWalker_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDOMTreeWalker methods ***/
#define IDOMTreeWalker_get_root(This,p) (This)->lpVtbl->get_root(This,p)
#define IDOMTreeWalker_get_whatToShow(This,p) (This)->lpVtbl->get_whatToShow(This,p)
#define IDOMTreeWalker_get_filter(This,p) (This)->lpVtbl->get_filter(This,p)
#define IDOMTreeWalker_get_expandEntityReferences(This,p) (This)->lpVtbl->get_expandEntityReferences(This,p)
#define IDOMTreeWalker_putref_currentNode(This,v) (This)->lpVtbl->putref_currentNode(This,v)
#define IDOMTreeWalker_get_currentNode(This,p) (This)->lpVtbl->get_currentNode(This,p)
#define IDOMTreeWalker_parentNode(This,ppRetNode) (This)->lpVtbl->parentNode(This,ppRetNode)
#define IDOMTreeWalker_firstChild(This,ppRetNode) (This)->lpVtbl->firstChild(This,ppRetNode)
#define IDOMTreeWalker_lastChild(This,ppRetNode) (This)->lpVtbl->lastChild(This,ppRetNode)
#define IDOMTreeWalker_previousSibling(This,ppRetNode) (This)->lpVtbl->previousSibling(This,ppRetNode)
#define IDOMTreeWalker_nextSibling(This,ppRetNode) (This)->lpVtbl->nextSibling(This,ppRetNode)
#define IDOMTreeWalker_previousNode(This,ppRetNode) (This)->lpVtbl->previousNode(This,ppRetNode)
#define IDOMTreeWalker_nextNode(This,ppRetNode) (This)->lpVtbl->nextNode(This,ppRetNode)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMTreeWalker_QueryInterface(IDOMTreeWalker* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMTreeWalker_AddRef(IDOMTreeWalker* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMTreeWalker_Release(IDOMTreeWalker* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDOMTreeWalker_GetTypeInfoCount(IDOMTreeWalker* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDOMTreeWalker_GetTypeInfo(IDOMTreeWalker* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDOMTreeWalker_GetIDsOfNames(IDOMTreeWalker* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDOMTreeWalker_Invoke(IDOMTreeWalker* 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);
}
/*** IDOMTreeWalker methods ***/
static FORCEINLINE HRESULT IDOMTreeWalker_get_root(IDOMTreeWalker* This,IDispatch **p) {
    return This->lpVtbl->get_root(This,p);
}
static FORCEINLINE HRESULT IDOMTreeWalker_get_whatToShow(IDOMTreeWalker* This,ULONG *p) {
    return This->lpVtbl->get_whatToShow(This,p);
}
static FORCEINLINE HRESULT IDOMTreeWalker_get_filter(IDOMTreeWalker* This,IDispatch **p) {
    return This->lpVtbl->get_filter(This,p);
}
static FORCEINLINE HRESULT IDOMTreeWalker_get_expandEntityReferences(IDOMTreeWalker* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_expandEntityReferences(This,p);
}
static FORCEINLINE HRESULT IDOMTreeWalker_putref_currentNode(IDOMTreeWalker* This,IDispatch *v) {
    return This->lpVtbl->putref_currentNode(This,v);
}
static FORCEINLINE HRESULT IDOMTreeWalker_get_currentNode(IDOMTreeWalker* This,IDispatch **p) {
    return This->lpVtbl->get_currentNode(This,p);
}
static FORCEINLINE HRESULT IDOMTreeWalker_parentNode(IDOMTreeWalker* This,IDispatch **ppRetNode) {
    return This->lpVtbl->parentNode(This,ppRetNode);
}
static FORCEINLINE HRESULT IDOMTreeWalker_firstChild(IDOMTreeWalker* This,IDispatch **ppRetNode) {
    return This->lpVtbl->firstChild(This,ppRetNode);
}
static FORCEINLINE HRESULT IDOMTreeWalker_lastChild(IDOMTreeWalker* This,IDispatch **ppRetNode) {
    return This->lpVtbl->lastChild(This,ppRetNode);
}
static FORCEINLINE HRESULT IDOMTreeWalker_previousSibling(IDOMTreeWalker* This,IDispatch **ppRetNode) {
    return This->lpVtbl->previousSibling(This,ppRetNode);
}
static FORCEINLINE HRESULT IDOMTreeWalker_nextSibling(IDOMTreeWalker* This,IDispatch **ppRetNode) {
    return This->lpVtbl->nextSibling(This,ppRetNode);
}
static FORCEINLINE HRESULT IDOMTreeWalker_previousNode(IDOMTreeWalker* This,IDispatch **ppRetNode) {
    return This->lpVtbl->previousNode(This,ppRetNode);
}
static FORCEINLINE HRESULT IDOMTreeWalker_nextNode(IDOMTreeWalker* This,IDispatch **ppRetNode) {
    return This->lpVtbl->nextNode(This,ppRetNode);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMTreeWalker_get_root_Proxy(
    IDOMTreeWalker* This,
    IDispatch **p);
void __RPC_STUB IDOMTreeWalker_get_root_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMTreeWalker_get_whatToShow_Proxy(
    IDOMTreeWalker* This,
    ULONG *p);
void __RPC_STUB IDOMTreeWalker_get_whatToShow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMTreeWalker_get_filter_Proxy(
    IDOMTreeWalker* This,
    IDispatch **p);
void __RPC_STUB IDOMTreeWalker_get_filter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMTreeWalker_get_expandEntityReferences_Proxy(
    IDOMTreeWalker* This,
    VARIANT_BOOL *p);
void __RPC_STUB IDOMTreeWalker_get_expandEntityReferences_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMTreeWalker_putref_currentNode_Proxy(
    IDOMTreeWalker* This,
    IDispatch *v);
void __RPC_STUB IDOMTreeWalker_putref_currentNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMTreeWalker_get_currentNode_Proxy(
    IDOMTreeWalker* This,
    IDispatch **p);
void __RPC_STUB IDOMTreeWalker_get_currentNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMTreeWalker_parentNode_Proxy(
    IDOMTreeWalker* This,
    IDispatch **ppRetNode);
void __RPC_STUB IDOMTreeWalker_parentNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMTreeWalker_firstChild_Proxy(
    IDOMTreeWalker* This,
    IDispatch **ppRetNode);
void __RPC_STUB IDOMTreeWalker_firstChild_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMTreeWalker_lastChild_Proxy(
    IDOMTreeWalker* This,
    IDispatch **ppRetNode);
void __RPC_STUB IDOMTreeWalker_lastChild_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMTreeWalker_previousSibling_Proxy(
    IDOMTreeWalker* This,
    IDispatch **ppRetNode);
void __RPC_STUB IDOMTreeWalker_previousSibling_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMTreeWalker_nextSibling_Proxy(
    IDOMTreeWalker* This,
    IDispatch **ppRetNode);
void __RPC_STUB IDOMTreeWalker_nextSibling_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMTreeWalker_previousNode_Proxy(
    IDOMTreeWalker* This,
    IDispatch **ppRetNode);
void __RPC_STUB IDOMTreeWalker_previousNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMTreeWalker_nextNode_Proxy(
    IDOMTreeWalker* This,
    IDispatch **ppRetNode);
void __RPC_STUB IDOMTreeWalker_nextNode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMTreeWalker_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispNodeIterator dispinterface
 */
#ifndef __DispNodeIterator_DISPINTERFACE_DEFINED__
#define __DispNodeIterator_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispNodeIterator, 0x3059009c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059009c-98b5-11cf-bb82-00aa00bdce0b")
DispNodeIterator : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispNodeIterator, 0x3059009c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispNodeIteratorVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispNodeIterator* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispNodeIterator* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispNodeIterator* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispNodeIterator* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispNodeIterator* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispNodeIterator* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispNodeIterator* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispNodeIteratorVtbl;
interface DispNodeIterator {
    CONST_VTBL DispNodeIteratorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispNodeIterator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispNodeIterator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispNodeIterator_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispNodeIterator_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispNodeIterator_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispNodeIterator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispNodeIterator_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 DispNodeIterator_QueryInterface(DispNodeIterator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispNodeIterator_AddRef(DispNodeIterator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispNodeIterator_Release(DispNodeIterator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispNodeIterator_GetTypeInfoCount(DispNodeIterator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispNodeIterator_GetTypeInfo(DispNodeIterator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispNodeIterator_GetIDsOfNames(DispNodeIterator* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispNodeIterator_Invoke(DispNodeIterator* 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  /* __DispNodeIterator_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * NodeIterator coclass
 */

DEFINE_GUID(CLSID_NodeIterator, 0x30510745, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510745-98b5-11cf-bb82-00aa00bdce0b") NodeIterator;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(NodeIterator, 0x30510745, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CTraversalNodeIterator;
/*****************************************************************************
 * DispTreeWalker dispinterface
 */
#ifndef __DispTreeWalker_DISPINTERFACE_DEFINED__
#define __DispTreeWalker_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispTreeWalker, 0x3059009d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059009d-98b5-11cf-bb82-00aa00bdce0b")
DispTreeWalker : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispTreeWalker, 0x3059009d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispTreeWalkerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispTreeWalker* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispTreeWalker* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispTreeWalker* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispTreeWalker* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispTreeWalker* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispTreeWalker* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispTreeWalker* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispTreeWalkerVtbl;
interface DispTreeWalker {
    CONST_VTBL DispTreeWalkerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispTreeWalker_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispTreeWalker_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispTreeWalker_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispTreeWalker_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispTreeWalker_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispTreeWalker_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispTreeWalker_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 DispTreeWalker_QueryInterface(DispTreeWalker* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispTreeWalker_AddRef(DispTreeWalker* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispTreeWalker_Release(DispTreeWalker* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispTreeWalker_GetTypeInfoCount(DispTreeWalker* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispTreeWalker_GetTypeInfo(DispTreeWalker* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispTreeWalker_GetIDsOfNames(DispTreeWalker* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispTreeWalker_Invoke(DispTreeWalker* 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  /* __DispTreeWalker_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * TreeWalker coclass
 */

DEFINE_GUID(CLSID_TreeWalker, 0x30510747, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510747-98b5-11cf-bb82-00aa00bdce0b") TreeWalker;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(TreeWalker, 0x30510747, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CTraversalTreeWalker;
/*****************************************************************************
 * IDOMProcessingInstruction interface
 */
#ifndef __IDOMProcessingInstruction_INTERFACE_DEFINED__
#define __IDOMProcessingInstruction_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMProcessingInstruction, 0x30510742, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510742-98b5-11cf-bb82-00aa00bdce0b")
IDOMProcessingInstruction : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_target(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_data(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_data(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMProcessingInstruction, 0x30510742, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMProcessingInstructionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMProcessingInstruction* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMProcessingInstruction* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMProcessingInstruction* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDOMProcessingInstruction* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDOMProcessingInstruction* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDOMProcessingInstruction* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDOMProcessingInstruction* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDOMProcessingInstruction methods ***/
    HRESULT (STDMETHODCALLTYPE *get_target)(
        IDOMProcessingInstruction* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_data)(
        IDOMProcessingInstruction* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_data)(
        IDOMProcessingInstruction* This,
        BSTR *p);

    END_INTERFACE
} IDOMProcessingInstructionVtbl;
interface IDOMProcessingInstruction {
    CONST_VTBL IDOMProcessingInstructionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMProcessingInstruction_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMProcessingInstruction_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMProcessingInstruction_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDOMProcessingInstruction_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDOMProcessingInstruction_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDOMProcessingInstruction_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDOMProcessingInstruction_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDOMProcessingInstruction methods ***/
#define IDOMProcessingInstruction_get_target(This,p) (This)->lpVtbl->get_target(This,p)
#define IDOMProcessingInstruction_put_data(This,v) (This)->lpVtbl->put_data(This,v)
#define IDOMProcessingInstruction_get_data(This,p) (This)->lpVtbl->get_data(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMProcessingInstruction_QueryInterface(IDOMProcessingInstruction* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMProcessingInstruction_AddRef(IDOMProcessingInstruction* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMProcessingInstruction_Release(IDOMProcessingInstruction* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDOMProcessingInstruction_GetTypeInfoCount(IDOMProcessingInstruction* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDOMProcessingInstruction_GetTypeInfo(IDOMProcessingInstruction* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDOMProcessingInstruction_GetIDsOfNames(IDOMProcessingInstruction* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDOMProcessingInstruction_Invoke(IDOMProcessingInstruction* 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);
}
/*** IDOMProcessingInstruction methods ***/
static FORCEINLINE HRESULT IDOMProcessingInstruction_get_target(IDOMProcessingInstruction* This,BSTR *p) {
    return This->lpVtbl->get_target(This,p);
}
static FORCEINLINE HRESULT IDOMProcessingInstruction_put_data(IDOMProcessingInstruction* This,BSTR v) {
    return This->lpVtbl->put_data(This,v);
}
static FORCEINLINE HRESULT IDOMProcessingInstruction_get_data(IDOMProcessingInstruction* This,BSTR *p) {
    return This->lpVtbl->get_data(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMProcessingInstruction_get_target_Proxy(
    IDOMProcessingInstruction* This,
    BSTR *p);
void __RPC_STUB IDOMProcessingInstruction_get_target_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMProcessingInstruction_put_data_Proxy(
    IDOMProcessingInstruction* This,
    BSTR v);
void __RPC_STUB IDOMProcessingInstruction_put_data_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMProcessingInstruction_get_data_Proxy(
    IDOMProcessingInstruction* This,
    BSTR *p);
void __RPC_STUB IDOMProcessingInstruction_get_data_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMProcessingInstruction_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispDOMProcessingInstruction dispinterface
 */
#ifndef __DispDOMProcessingInstruction_DISPINTERFACE_DEFINED__
#define __DispDOMProcessingInstruction_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispDOMProcessingInstruction, 0x3059009b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059009b-98b5-11cf-bb82-00aa00bdce0b")
DispDOMProcessingInstruction : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispDOMProcessingInstruction, 0x3059009b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispDOMProcessingInstructionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispDOMProcessingInstruction* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispDOMProcessingInstruction* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispDOMProcessingInstruction* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispDOMProcessingInstruction* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispDOMProcessingInstruction* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispDOMProcessingInstruction* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispDOMProcessingInstruction* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispDOMProcessingInstructionVtbl;
interface DispDOMProcessingInstruction {
    CONST_VTBL DispDOMProcessingInstructionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispDOMProcessingInstruction_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispDOMProcessingInstruction_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispDOMProcessingInstruction_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispDOMProcessingInstruction_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispDOMProcessingInstruction_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispDOMProcessingInstruction_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispDOMProcessingInstruction_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 DispDOMProcessingInstruction_QueryInterface(DispDOMProcessingInstruction* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispDOMProcessingInstruction_AddRef(DispDOMProcessingInstruction* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispDOMProcessingInstruction_Release(DispDOMProcessingInstruction* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispDOMProcessingInstruction_GetTypeInfoCount(DispDOMProcessingInstruction* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispDOMProcessingInstruction_GetTypeInfo(DispDOMProcessingInstruction* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispDOMProcessingInstruction_GetIDsOfNames(DispDOMProcessingInstruction* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispDOMProcessingInstruction_Invoke(DispDOMProcessingInstruction* 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  /* __DispDOMProcessingInstruction_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * DOMProcessingInstruction coclass
 */

DEFINE_GUID(CLSID_DOMProcessingInstruction, 0x30510743, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510743-98b5-11cf-bb82-00aa00bdce0b") DOMProcessingInstruction;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMProcessingInstruction, 0x30510743, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CProcessingInstruction;
#ifndef __IHTMLPerformance_FWD_DEFINED__
#define __IHTMLPerformance_FWD_DEFINED__
typedef interface IHTMLPerformance IHTMLPerformance;
#endif

#ifndef __IHTMLPerformanceNavigation_FWD_DEFINED__
#define __IHTMLPerformanceNavigation_FWD_DEFINED__
typedef interface IHTMLPerformanceNavigation IHTMLPerformanceNavigation;
#endif

#ifndef __IHTMLPerformanceTiming_FWD_DEFINED__
#define __IHTMLPerformanceTiming_FWD_DEFINED__
typedef interface IHTMLPerformanceTiming IHTMLPerformanceTiming;
#endif

/*****************************************************************************
 * IHTMLPerformance interface
 */
#ifndef __IHTMLPerformance_INTERFACE_DEFINED__
#define __IHTMLPerformance_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLPerformance, 0x3051074e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051074e-98b5-11cf-bb82-00aa00bdce0b")
IHTMLPerformance : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_navigation(
        IHTMLPerformanceNavigation **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_timing(
        IHTMLPerformanceTiming **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE toString(
        BSTR *string) = 0;

    virtual HRESULT STDMETHODCALLTYPE toJSON(
        VARIANT *pVar) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLPerformance, 0x3051074e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLPerformanceVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLPerformance* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLPerformance* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLPerformance* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLPerformance* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLPerformance* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLPerformance* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLPerformance* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLPerformance methods ***/
    HRESULT (STDMETHODCALLTYPE *get_navigation)(
        IHTMLPerformance* This,
        IHTMLPerformanceNavigation **p);

    HRESULT (STDMETHODCALLTYPE *get_timing)(
        IHTMLPerformance* This,
        IHTMLPerformanceTiming **p);

    HRESULT (STDMETHODCALLTYPE *toString)(
        IHTMLPerformance* This,
        BSTR *string);

    HRESULT (STDMETHODCALLTYPE *toJSON)(
        IHTMLPerformance* This,
        VARIANT *pVar);

    END_INTERFACE
} IHTMLPerformanceVtbl;
interface IHTMLPerformance {
    CONST_VTBL IHTMLPerformanceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLPerformance_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLPerformance_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLPerformance_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLPerformance_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLPerformance_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLPerformance_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLPerformance_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLPerformance methods ***/
#define IHTMLPerformance_get_navigation(This,p) (This)->lpVtbl->get_navigation(This,p)
#define IHTMLPerformance_get_timing(This,p) (This)->lpVtbl->get_timing(This,p)
#define IHTMLPerformance_toString(This,string) (This)->lpVtbl->toString(This,string)
#define IHTMLPerformance_toJSON(This,pVar) (This)->lpVtbl->toJSON(This,pVar)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLPerformance_QueryInterface(IHTMLPerformance* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLPerformance_AddRef(IHTMLPerformance* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLPerformance_Release(IHTMLPerformance* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLPerformance_GetTypeInfoCount(IHTMLPerformance* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLPerformance_GetTypeInfo(IHTMLPerformance* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLPerformance_GetIDsOfNames(IHTMLPerformance* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLPerformance_Invoke(IHTMLPerformance* 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);
}
/*** IHTMLPerformance methods ***/
static FORCEINLINE HRESULT IHTMLPerformance_get_navigation(IHTMLPerformance* This,IHTMLPerformanceNavigation **p) {
    return This->lpVtbl->get_navigation(This,p);
}
static FORCEINLINE HRESULT IHTMLPerformance_get_timing(IHTMLPerformance* This,IHTMLPerformanceTiming **p) {
    return This->lpVtbl->get_timing(This,p);
}
static FORCEINLINE HRESULT IHTMLPerformance_toString(IHTMLPerformance* This,BSTR *string) {
    return This->lpVtbl->toString(This,string);
}
static FORCEINLINE HRESULT IHTMLPerformance_toJSON(IHTMLPerformance* This,VARIANT *pVar) {
    return This->lpVtbl->toJSON(This,pVar);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLPerformance_get_navigation_Proxy(
    IHTMLPerformance* This,
    IHTMLPerformanceNavigation **p);
void __RPC_STUB IHTMLPerformance_get_navigation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPerformance_get_timing_Proxy(
    IHTMLPerformance* This,
    IHTMLPerformanceTiming **p);
void __RPC_STUB IHTMLPerformance_get_timing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPerformance_toString_Proxy(
    IHTMLPerformance* This,
    BSTR *string);
void __RPC_STUB IHTMLPerformance_toString_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPerformance_toJSON_Proxy(
    IHTMLPerformance* This,
    VARIANT *pVar);
void __RPC_STUB IHTMLPerformance_toJSON_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLPerformance_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLPerformanceNavigation interface
 */
#ifndef __IHTMLPerformanceNavigation_INTERFACE_DEFINED__
#define __IHTMLPerformanceNavigation_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLPerformanceNavigation, 0x30510750, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510750-98b5-11cf-bb82-00aa00bdce0b")
IHTMLPerformanceNavigation : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_type(
        ULONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_redirectCount(
        ULONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE toString(
        BSTR *string) = 0;

    virtual HRESULT STDMETHODCALLTYPE toJSON(
        VARIANT *pVar) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLPerformanceNavigation, 0x30510750, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLPerformanceNavigationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLPerformanceNavigation* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLPerformanceNavigation* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLPerformanceNavigation* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLPerformanceNavigation* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLPerformanceNavigation* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLPerformanceNavigation* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLPerformanceNavigation* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLPerformanceNavigation methods ***/
    HRESULT (STDMETHODCALLTYPE *get_type)(
        IHTMLPerformanceNavigation* This,
        ULONG *p);

    HRESULT (STDMETHODCALLTYPE *get_redirectCount)(
        IHTMLPerformanceNavigation* This,
        ULONG *p);

    HRESULT (STDMETHODCALLTYPE *toString)(
        IHTMLPerformanceNavigation* This,
        BSTR *string);

    HRESULT (STDMETHODCALLTYPE *toJSON)(
        IHTMLPerformanceNavigation* This,
        VARIANT *pVar);

    END_INTERFACE
} IHTMLPerformanceNavigationVtbl;
interface IHTMLPerformanceNavigation {
    CONST_VTBL IHTMLPerformanceNavigationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLPerformanceNavigation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLPerformanceNavigation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLPerformanceNavigation_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLPerformanceNavigation_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLPerformanceNavigation_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLPerformanceNavigation_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLPerformanceNavigation_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLPerformanceNavigation methods ***/
#define IHTMLPerformanceNavigation_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#define IHTMLPerformanceNavigation_get_redirectCount(This,p) (This)->lpVtbl->get_redirectCount(This,p)
#define IHTMLPerformanceNavigation_toString(This,string) (This)->lpVtbl->toString(This,string)
#define IHTMLPerformanceNavigation_toJSON(This,pVar) (This)->lpVtbl->toJSON(This,pVar)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLPerformanceNavigation_QueryInterface(IHTMLPerformanceNavigation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLPerformanceNavigation_AddRef(IHTMLPerformanceNavigation* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLPerformanceNavigation_Release(IHTMLPerformanceNavigation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLPerformanceNavigation_GetTypeInfoCount(IHTMLPerformanceNavigation* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLPerformanceNavigation_GetTypeInfo(IHTMLPerformanceNavigation* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLPerformanceNavigation_GetIDsOfNames(IHTMLPerformanceNavigation* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLPerformanceNavigation_Invoke(IHTMLPerformanceNavigation* 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);
}
/*** IHTMLPerformanceNavigation methods ***/
static FORCEINLINE HRESULT IHTMLPerformanceNavigation_get_type(IHTMLPerformanceNavigation* This,ULONG *p) {
    return This->lpVtbl->get_type(This,p);
}
static FORCEINLINE HRESULT IHTMLPerformanceNavigation_get_redirectCount(IHTMLPerformanceNavigation* This,ULONG *p) {
    return This->lpVtbl->get_redirectCount(This,p);
}
static FORCEINLINE HRESULT IHTMLPerformanceNavigation_toString(IHTMLPerformanceNavigation* This,BSTR *string) {
    return This->lpVtbl->toString(This,string);
}
static FORCEINLINE HRESULT IHTMLPerformanceNavigation_toJSON(IHTMLPerformanceNavigation* This,VARIANT *pVar) {
    return This->lpVtbl->toJSON(This,pVar);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLPerformanceNavigation_get_type_Proxy(
    IHTMLPerformanceNavigation* This,
    ULONG *p);
void __RPC_STUB IHTMLPerformanceNavigation_get_type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPerformanceNavigation_get_redirectCount_Proxy(
    IHTMLPerformanceNavigation* This,
    ULONG *p);
void __RPC_STUB IHTMLPerformanceNavigation_get_redirectCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPerformanceNavigation_toString_Proxy(
    IHTMLPerformanceNavigation* This,
    BSTR *string);
void __RPC_STUB IHTMLPerformanceNavigation_toString_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPerformanceNavigation_toJSON_Proxy(
    IHTMLPerformanceNavigation* This,
    VARIANT *pVar);
void __RPC_STUB IHTMLPerformanceNavigation_toJSON_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLPerformanceNavigation_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLPerformanceTiming interface
 */
#ifndef __IHTMLPerformanceTiming_INTERFACE_DEFINED__
#define __IHTMLPerformanceTiming_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLPerformanceTiming, 0x30510752, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510752-98b5-11cf-bb82-00aa00bdce0b")
IHTMLPerformanceTiming : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_navigationStart(
        ULONGLONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_unloadEventStart(
        ULONGLONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_unloadEventEnd(
        ULONGLONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_redirectStart(
        ULONGLONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_redirectEnd(
        ULONGLONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fetchStart(
        ULONGLONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_domainLookupStart(
        ULONGLONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_domainLookupEnd(
        ULONGLONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_connectStart(
        ULONGLONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_connectEnd(
        ULONGLONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_requestStart(
        ULONGLONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_responseStart(
        ULONGLONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_responseEnd(
        ULONGLONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_domLoading(
        ULONGLONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_domInteractive(
        ULONGLONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_domContentLoadedEventStart(
        ULONGLONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_domContentLoadedEventEnd(
        ULONGLONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_domComplete(
        ULONGLONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_loadEventStart(
        ULONGLONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_loadEventEnd(
        ULONGLONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_msFirstPaint(
        ULONGLONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE toString(
        BSTR *string) = 0;

    virtual HRESULT STDMETHODCALLTYPE toJSON(
        VARIANT *pVar) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLPerformanceTiming, 0x30510752, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLPerformanceTimingVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLPerformanceTiming* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLPerformanceTiming* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLPerformanceTiming* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLPerformanceTiming* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLPerformanceTiming* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLPerformanceTiming* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLPerformanceTiming* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLPerformanceTiming methods ***/
    HRESULT (STDMETHODCALLTYPE *get_navigationStart)(
        IHTMLPerformanceTiming* This,
        ULONGLONG *p);

    HRESULT (STDMETHODCALLTYPE *get_unloadEventStart)(
        IHTMLPerformanceTiming* This,
        ULONGLONG *p);

    HRESULT (STDMETHODCALLTYPE *get_unloadEventEnd)(
        IHTMLPerformanceTiming* This,
        ULONGLONG *p);

    HRESULT (STDMETHODCALLTYPE *get_redirectStart)(
        IHTMLPerformanceTiming* This,
        ULONGLONG *p);

    HRESULT (STDMETHODCALLTYPE *get_redirectEnd)(
        IHTMLPerformanceTiming* This,
        ULONGLONG *p);

    HRESULT (STDMETHODCALLTYPE *get_fetchStart)(
        IHTMLPerformanceTiming* This,
        ULONGLONG *p);

    HRESULT (STDMETHODCALLTYPE *get_domainLookupStart)(
        IHTMLPerformanceTiming* This,
        ULONGLONG *p);

    HRESULT (STDMETHODCALLTYPE *get_domainLookupEnd)(
        IHTMLPerformanceTiming* This,
        ULONGLONG *p);

    HRESULT (STDMETHODCALLTYPE *get_connectStart)(
        IHTMLPerformanceTiming* This,
        ULONGLONG *p);

    HRESULT (STDMETHODCALLTYPE *get_connectEnd)(
        IHTMLPerformanceTiming* This,
        ULONGLONG *p);

    HRESULT (STDMETHODCALLTYPE *get_requestStart)(
        IHTMLPerformanceTiming* This,
        ULONGLONG *p);

    HRESULT (STDMETHODCALLTYPE *get_responseStart)(
        IHTMLPerformanceTiming* This,
        ULONGLONG *p);

    HRESULT (STDMETHODCALLTYPE *get_responseEnd)(
        IHTMLPerformanceTiming* This,
        ULONGLONG *p);

    HRESULT (STDMETHODCALLTYPE *get_domLoading)(
        IHTMLPerformanceTiming* This,
        ULONGLONG *p);

    HRESULT (STDMETHODCALLTYPE *get_domInteractive)(
        IHTMLPerformanceTiming* This,
        ULONGLONG *p);

    HRESULT (STDMETHODCALLTYPE *get_domContentLoadedEventStart)(
        IHTMLPerformanceTiming* This,
        ULONGLONG *p);

    HRESULT (STDMETHODCALLTYPE *get_domContentLoadedEventEnd)(
        IHTMLPerformanceTiming* This,
        ULONGLONG *p);

    HRESULT (STDMETHODCALLTYPE *get_domComplete)(
        IHTMLPerformanceTiming* This,
        ULONGLONG *p);

    HRESULT (STDMETHODCALLTYPE *get_loadEventStart)(
        IHTMLPerformanceTiming* This,
        ULONGLONG *p);

    HRESULT (STDMETHODCALLTYPE *get_loadEventEnd)(
        IHTMLPerformanceTiming* This,
        ULONGLONG *p);

    HRESULT (STDMETHODCALLTYPE *get_msFirstPaint)(
        IHTMLPerformanceTiming* This,
        ULONGLONG *p);

    HRESULT (STDMETHODCALLTYPE *toString)(
        IHTMLPerformanceTiming* This,
        BSTR *string);

    HRESULT (STDMETHODCALLTYPE *toJSON)(
        IHTMLPerformanceTiming* This,
        VARIANT *pVar);

    END_INTERFACE
} IHTMLPerformanceTimingVtbl;
interface IHTMLPerformanceTiming {
    CONST_VTBL IHTMLPerformanceTimingVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLPerformanceTiming_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLPerformanceTiming_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLPerformanceTiming_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLPerformanceTiming_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLPerformanceTiming_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLPerformanceTiming_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLPerformanceTiming_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLPerformanceTiming methods ***/
#define IHTMLPerformanceTiming_get_navigationStart(This,p) (This)->lpVtbl->get_navigationStart(This,p)
#define IHTMLPerformanceTiming_get_unloadEventStart(This,p) (This)->lpVtbl->get_unloadEventStart(This,p)
#define IHTMLPerformanceTiming_get_unloadEventEnd(This,p) (This)->lpVtbl->get_unloadEventEnd(This,p)
#define IHTMLPerformanceTiming_get_redirectStart(This,p) (This)->lpVtbl->get_redirectStart(This,p)
#define IHTMLPerformanceTiming_get_redirectEnd(This,p) (This)->lpVtbl->get_redirectEnd(This,p)
#define IHTMLPerformanceTiming_get_fetchStart(This,p) (This)->lpVtbl->get_fetchStart(This,p)
#define IHTMLPerformanceTiming_get_domainLookupStart(This,p) (This)->lpVtbl->get_domainLookupStart(This,p)
#define IHTMLPerformanceTiming_get_domainLookupEnd(This,p) (This)->lpVtbl->get_domainLookupEnd(This,p)
#define IHTMLPerformanceTiming_get_connectStart(This,p) (This)->lpVtbl->get_connectStart(This,p)
#define IHTMLPerformanceTiming_get_connectEnd(This,p) (This)->lpVtbl->get_connectEnd(This,p)
#define IHTMLPerformanceTiming_get_requestStart(This,p) (This)->lpVtbl->get_requestStart(This,p)
#define IHTMLPerformanceTiming_get_responseStart(This,p) (This)->lpVtbl->get_responseStart(This,p)
#define IHTMLPerformanceTiming_get_responseEnd(This,p) (This)->lpVtbl->get_responseEnd(This,p)
#define IHTMLPerformanceTiming_get_domLoading(This,p) (This)->lpVtbl->get_domLoading(This,p)
#define IHTMLPerformanceTiming_get_domInteractive(This,p) (This)->lpVtbl->get_domInteractive(This,p)
#define IHTMLPerformanceTiming_get_domContentLoadedEventStart(This,p) (This)->lpVtbl->get_domContentLoadedEventStart(This,p)
#define IHTMLPerformanceTiming_get_domContentLoadedEventEnd(This,p) (This)->lpVtbl->get_domContentLoadedEventEnd(This,p)
#define IHTMLPerformanceTiming_get_domComplete(This,p) (This)->lpVtbl->get_domComplete(This,p)
#define IHTMLPerformanceTiming_get_loadEventStart(This,p) (This)->lpVtbl->get_loadEventStart(This,p)
#define IHTMLPerformanceTiming_get_loadEventEnd(This,p) (This)->lpVtbl->get_loadEventEnd(This,p)
#define IHTMLPerformanceTiming_get_msFirstPaint(This,p) (This)->lpVtbl->get_msFirstPaint(This,p)
#define IHTMLPerformanceTiming_toString(This,string) (This)->lpVtbl->toString(This,string)
#define IHTMLPerformanceTiming_toJSON(This,pVar) (This)->lpVtbl->toJSON(This,pVar)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLPerformanceTiming_QueryInterface(IHTMLPerformanceTiming* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLPerformanceTiming_AddRef(IHTMLPerformanceTiming* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLPerformanceTiming_Release(IHTMLPerformanceTiming* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLPerformanceTiming_GetTypeInfoCount(IHTMLPerformanceTiming* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLPerformanceTiming_GetTypeInfo(IHTMLPerformanceTiming* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLPerformanceTiming_GetIDsOfNames(IHTMLPerformanceTiming* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLPerformanceTiming_Invoke(IHTMLPerformanceTiming* 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);
}
/*** IHTMLPerformanceTiming methods ***/
static FORCEINLINE HRESULT IHTMLPerformanceTiming_get_navigationStart(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_navigationStart(This,p);
}
static FORCEINLINE HRESULT IHTMLPerformanceTiming_get_unloadEventStart(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_unloadEventStart(This,p);
}
static FORCEINLINE HRESULT IHTMLPerformanceTiming_get_unloadEventEnd(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_unloadEventEnd(This,p);
}
static FORCEINLINE HRESULT IHTMLPerformanceTiming_get_redirectStart(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_redirectStart(This,p);
}
static FORCEINLINE HRESULT IHTMLPerformanceTiming_get_redirectEnd(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_redirectEnd(This,p);
}
static FORCEINLINE HRESULT IHTMLPerformanceTiming_get_fetchStart(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_fetchStart(This,p);
}
static FORCEINLINE HRESULT IHTMLPerformanceTiming_get_domainLookupStart(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_domainLookupStart(This,p);
}
static FORCEINLINE HRESULT IHTMLPerformanceTiming_get_domainLookupEnd(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_domainLookupEnd(This,p);
}
static FORCEINLINE HRESULT IHTMLPerformanceTiming_get_connectStart(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_connectStart(This,p);
}
static FORCEINLINE HRESULT IHTMLPerformanceTiming_get_connectEnd(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_connectEnd(This,p);
}
static FORCEINLINE HRESULT IHTMLPerformanceTiming_get_requestStart(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_requestStart(This,p);
}
static FORCEINLINE HRESULT IHTMLPerformanceTiming_get_responseStart(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_responseStart(This,p);
}
static FORCEINLINE HRESULT IHTMLPerformanceTiming_get_responseEnd(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_responseEnd(This,p);
}
static FORCEINLINE HRESULT IHTMLPerformanceTiming_get_domLoading(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_domLoading(This,p);
}
static FORCEINLINE HRESULT IHTMLPerformanceTiming_get_domInteractive(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_domInteractive(This,p);
}
static FORCEINLINE HRESULT IHTMLPerformanceTiming_get_domContentLoadedEventStart(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_domContentLoadedEventStart(This,p);
}
static FORCEINLINE HRESULT IHTMLPerformanceTiming_get_domContentLoadedEventEnd(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_domContentLoadedEventEnd(This,p);
}
static FORCEINLINE HRESULT IHTMLPerformanceTiming_get_domComplete(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_domComplete(This,p);
}
static FORCEINLINE HRESULT IHTMLPerformanceTiming_get_loadEventStart(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_loadEventStart(This,p);
}
static FORCEINLINE HRESULT IHTMLPerformanceTiming_get_loadEventEnd(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_loadEventEnd(This,p);
}
static FORCEINLINE HRESULT IHTMLPerformanceTiming_get_msFirstPaint(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_msFirstPaint(This,p);
}
static FORCEINLINE HRESULT IHTMLPerformanceTiming_toString(IHTMLPerformanceTiming* This,BSTR *string) {
    return This->lpVtbl->toString(This,string);
}
static FORCEINLINE HRESULT IHTMLPerformanceTiming_toJSON(IHTMLPerformanceTiming* This,VARIANT *pVar) {
    return This->lpVtbl->toJSON(This,pVar);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLPerformanceTiming_get_navigationStart_Proxy(
    IHTMLPerformanceTiming* This,
    ULONGLONG *p);
void __RPC_STUB IHTMLPerformanceTiming_get_navigationStart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPerformanceTiming_get_unloadEventStart_Proxy(
    IHTMLPerformanceTiming* This,
    ULONGLONG *p);
void __RPC_STUB IHTMLPerformanceTiming_get_unloadEventStart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPerformanceTiming_get_unloadEventEnd_Proxy(
    IHTMLPerformanceTiming* This,
    ULONGLONG *p);
void __RPC_STUB IHTMLPerformanceTiming_get_unloadEventEnd_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPerformanceTiming_get_redirectStart_Proxy(
    IHTMLPerformanceTiming* This,
    ULONGLONG *p);
void __RPC_STUB IHTMLPerformanceTiming_get_redirectStart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPerformanceTiming_get_redirectEnd_Proxy(
    IHTMLPerformanceTiming* This,
    ULONGLONG *p);
void __RPC_STUB IHTMLPerformanceTiming_get_redirectEnd_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPerformanceTiming_get_fetchStart_Proxy(
    IHTMLPerformanceTiming* This,
    ULONGLONG *p);
void __RPC_STUB IHTMLPerformanceTiming_get_fetchStart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPerformanceTiming_get_domainLookupStart_Proxy(
    IHTMLPerformanceTiming* This,
    ULONGLONG *p);
void __RPC_STUB IHTMLPerformanceTiming_get_domainLookupStart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPerformanceTiming_get_domainLookupEnd_Proxy(
    IHTMLPerformanceTiming* This,
    ULONGLONG *p);
void __RPC_STUB IHTMLPerformanceTiming_get_domainLookupEnd_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPerformanceTiming_get_connectStart_Proxy(
    IHTMLPerformanceTiming* This,
    ULONGLONG *p);
void __RPC_STUB IHTMLPerformanceTiming_get_connectStart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPerformanceTiming_get_connectEnd_Proxy(
    IHTMLPerformanceTiming* This,
    ULONGLONG *p);
void __RPC_STUB IHTMLPerformanceTiming_get_connectEnd_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPerformanceTiming_get_requestStart_Proxy(
    IHTMLPerformanceTiming* This,
    ULONGLONG *p);
void __RPC_STUB IHTMLPerformanceTiming_get_requestStart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPerformanceTiming_get_responseStart_Proxy(
    IHTMLPerformanceTiming* This,
    ULONGLONG *p);
void __RPC_STUB IHTMLPerformanceTiming_get_responseStart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPerformanceTiming_get_responseEnd_Proxy(
    IHTMLPerformanceTiming* This,
    ULONGLONG *p);
void __RPC_STUB IHTMLPerformanceTiming_get_responseEnd_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPerformanceTiming_get_domLoading_Proxy(
    IHTMLPerformanceTiming* This,
    ULONGLONG *p);
void __RPC_STUB IHTMLPerformanceTiming_get_domLoading_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPerformanceTiming_get_domInteractive_Proxy(
    IHTMLPerformanceTiming* This,
    ULONGLONG *p);
void __RPC_STUB IHTMLPerformanceTiming_get_domInteractive_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPerformanceTiming_get_domContentLoadedEventStart_Proxy(
    IHTMLPerformanceTiming* This,
    ULONGLONG *p);
void __RPC_STUB IHTMLPerformanceTiming_get_domContentLoadedEventStart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPerformanceTiming_get_domContentLoadedEventEnd_Proxy(
    IHTMLPerformanceTiming* This,
    ULONGLONG *p);
void __RPC_STUB IHTMLPerformanceTiming_get_domContentLoadedEventEnd_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPerformanceTiming_get_domComplete_Proxy(
    IHTMLPerformanceTiming* This,
    ULONGLONG *p);
void __RPC_STUB IHTMLPerformanceTiming_get_domComplete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPerformanceTiming_get_loadEventStart_Proxy(
    IHTMLPerformanceTiming* This,
    ULONGLONG *p);
void __RPC_STUB IHTMLPerformanceTiming_get_loadEventStart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPerformanceTiming_get_loadEventEnd_Proxy(
    IHTMLPerformanceTiming* This,
    ULONGLONG *p);
void __RPC_STUB IHTMLPerformanceTiming_get_loadEventEnd_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPerformanceTiming_get_msFirstPaint_Proxy(
    IHTMLPerformanceTiming* This,
    ULONGLONG *p);
void __RPC_STUB IHTMLPerformanceTiming_get_msFirstPaint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPerformanceTiming_toString_Proxy(
    IHTMLPerformanceTiming* This,
    BSTR *string);
void __RPC_STUB IHTMLPerformanceTiming_toString_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPerformanceTiming_toJSON_Proxy(
    IHTMLPerformanceTiming* This,
    VARIANT *pVar);
void __RPC_STUB IHTMLPerformanceTiming_toJSON_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLPerformanceTiming_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLPerformance dispinterface
 */
#ifndef __DispHTMLPerformance_DISPINTERFACE_DEFINED__
#define __DispHTMLPerformance_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLPerformance, 0x3059009f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059009f-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLPerformance : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLPerformance, 0x3059009f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLPerformanceVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLPerformance* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLPerformance* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLPerformance* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLPerformance* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLPerformance* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLPerformance* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLPerformance* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLPerformanceVtbl;
interface DispHTMLPerformance {
    CONST_VTBL DispHTMLPerformanceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLPerformance_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLPerformance_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLPerformance_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLPerformance_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLPerformance_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLPerformance_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLPerformance_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 DispHTMLPerformance_QueryInterface(DispHTMLPerformance* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLPerformance_AddRef(DispHTMLPerformance* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLPerformance_Release(DispHTMLPerformance* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLPerformance_GetTypeInfoCount(DispHTMLPerformance* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLPerformance_GetTypeInfo(DispHTMLPerformance* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLPerformance_GetIDsOfNames(DispHTMLPerformance* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLPerformance_Invoke(DispHTMLPerformance* 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  /* __DispHTMLPerformance_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLPerformance coclass
 */

DEFINE_GUID(CLSID_HTMLPerformance, 0x3051074f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3051074f-98b5-11cf-bb82-00aa00bdce0b") HTMLPerformance;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLPerformance, 0x3051074f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CMSPerformance;
/*****************************************************************************
 * DispHTMLPerformanceNavigation dispinterface
 */
#ifndef __DispHTMLPerformanceNavigation_DISPINTERFACE_DEFINED__
#define __DispHTMLPerformanceNavigation_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLPerformanceNavigation, 0x305900a0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305900a0-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLPerformanceNavigation : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLPerformanceNavigation, 0x305900a0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLPerformanceNavigationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLPerformanceNavigation* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLPerformanceNavigation* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLPerformanceNavigation* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLPerformanceNavigation* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLPerformanceNavigation* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLPerformanceNavigation* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLPerformanceNavigation* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLPerformanceNavigationVtbl;
interface DispHTMLPerformanceNavigation {
    CONST_VTBL DispHTMLPerformanceNavigationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLPerformanceNavigation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLPerformanceNavigation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLPerformanceNavigation_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLPerformanceNavigation_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLPerformanceNavigation_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLPerformanceNavigation_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLPerformanceNavigation_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 DispHTMLPerformanceNavigation_QueryInterface(DispHTMLPerformanceNavigation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLPerformanceNavigation_AddRef(DispHTMLPerformanceNavigation* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLPerformanceNavigation_Release(DispHTMLPerformanceNavigation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLPerformanceNavigation_GetTypeInfoCount(DispHTMLPerformanceNavigation* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLPerformanceNavigation_GetTypeInfo(DispHTMLPerformanceNavigation* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLPerformanceNavigation_GetIDsOfNames(DispHTMLPerformanceNavigation* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLPerformanceNavigation_Invoke(DispHTMLPerformanceNavigation* 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  /* __DispHTMLPerformanceNavigation_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLPerformanceNavigation coclass
 */

DEFINE_GUID(CLSID_HTMLPerformanceNavigation, 0x30510751, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510751-98b5-11cf-bb82-00aa00bdce0b") HTMLPerformanceNavigation;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLPerformanceNavigation, 0x30510751, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CMSPerformanceNavigation;
/*****************************************************************************
 * DispHTMLPerformanceTiming dispinterface
 */
#ifndef __DispHTMLPerformanceTiming_DISPINTERFACE_DEFINED__
#define __DispHTMLPerformanceTiming_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLPerformanceTiming, 0x305900a1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305900a1-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLPerformanceTiming : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLPerformanceTiming, 0x305900a1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLPerformanceTimingVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLPerformanceTiming* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLPerformanceTiming* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLPerformanceTiming* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLPerformanceTiming* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLPerformanceTiming* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLPerformanceTiming* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLPerformanceTiming* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLPerformanceTimingVtbl;
interface DispHTMLPerformanceTiming {
    CONST_VTBL DispHTMLPerformanceTimingVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLPerformanceTiming_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLPerformanceTiming_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLPerformanceTiming_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLPerformanceTiming_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLPerformanceTiming_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLPerformanceTiming_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLPerformanceTiming_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 DispHTMLPerformanceTiming_QueryInterface(DispHTMLPerformanceTiming* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLPerformanceTiming_AddRef(DispHTMLPerformanceTiming* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLPerformanceTiming_Release(DispHTMLPerformanceTiming* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLPerformanceTiming_GetTypeInfoCount(DispHTMLPerformanceTiming* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLPerformanceTiming_GetTypeInfo(DispHTMLPerformanceTiming* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLPerformanceTiming_GetIDsOfNames(DispHTMLPerformanceTiming* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLPerformanceTiming_Invoke(DispHTMLPerformanceTiming* 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  /* __DispHTMLPerformanceTiming_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLPerformanceTiming coclass
 */

DEFINE_GUID(CLSID_HTMLPerformanceTiming, 0x30510753, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510753-98b5-11cf-bb82-00aa00bdce0b") HTMLPerformanceTiming;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLPerformanceTiming, 0x30510753, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CMSPerformanceTiming;
/*****************************************************************************
 * ISVGTSpanElement interface
 */
#ifndef __ISVGTSpanElement_INTERFACE_DEFINED__
#define __ISVGTSpanElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGTSpanElement, 0x3051051d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051051d-98b5-11cf-bb82-00aa00bdce0b")
ISVGTSpanElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGTSpanElement, 0x3051051d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGTSpanElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGTSpanElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGTSpanElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGTSpanElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGTSpanElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGTSpanElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGTSpanElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGTSpanElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} ISVGTSpanElementVtbl;
interface ISVGTSpanElement {
    CONST_VTBL ISVGTSpanElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGTSpanElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGTSpanElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGTSpanElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGTSpanElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGTSpanElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGTSpanElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGTSpanElement_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 ISVGTSpanElement_QueryInterface(ISVGTSpanElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGTSpanElement_AddRef(ISVGTSpanElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGTSpanElement_Release(ISVGTSpanElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGTSpanElement_GetTypeInfoCount(ISVGTSpanElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGTSpanElement_GetTypeInfo(ISVGTSpanElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGTSpanElement_GetIDsOfNames(ISVGTSpanElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGTSpanElement_Invoke(ISVGTSpanElement* 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  /* __ISVGTSpanElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGTSpanElement dispinterface
 */
#ifndef __DispSVGTSpanElement_DISPINTERFACE_DEFINED__
#define __DispSVGTSpanElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGTSpanElement, 0x3059003a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059003a-98b5-11cf-bb82-00aa00bdce0b")
DispSVGTSpanElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGTSpanElement, 0x3059003a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGTSpanElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGTSpanElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGTSpanElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGTSpanElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGTSpanElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGTSpanElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGTSpanElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGTSpanElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGTSpanElementVtbl;
interface DispSVGTSpanElement {
    CONST_VTBL DispSVGTSpanElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGTSpanElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGTSpanElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGTSpanElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGTSpanElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGTSpanElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGTSpanElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGTSpanElement_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 DispSVGTSpanElement_QueryInterface(DispSVGTSpanElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGTSpanElement_AddRef(DispSVGTSpanElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGTSpanElement_Release(DispSVGTSpanElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGTSpanElement_GetTypeInfoCount(DispSVGTSpanElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGTSpanElement_GetTypeInfo(DispSVGTSpanElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGTSpanElement_GetIDsOfNames(DispSVGTSpanElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGTSpanElement_Invoke(DispSVGTSpanElement* 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  /* __DispSVGTSpanElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGTSpanElement coclass
 */

DEFINE_GUID(CLSID_SVGTSpanElement, 0x305105e2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105e2-98b5-11cf-bb82-00aa00bdce0b") SVGTSpanElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGTSpanElement, 0x305105e2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGTSpanElement;
/*****************************************************************************
 * ITemplatePrinter interface
 */
#ifndef __ITemplatePrinter_INTERFACE_DEFINED__
#define __ITemplatePrinter_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITemplatePrinter, 0x3050f6b4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f6b4-98b5-11cf-bb82-00aa00bdce0b")
ITemplatePrinter : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE startDoc(
        BSTR bstrTitle,
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE stopDoc(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE printBlankPage(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE printPage(
        IDispatch *pElemDisp) = 0;

    virtual HRESULT STDMETHODCALLTYPE ensurePrintDialogDefaults(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE showPrintDialog(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE showPageSetupDialog(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE printNonNative(
        IUnknown *pMarkup,
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE printNonNativeFrames(
        IUnknown *pMarkup,
        VARIANT_BOOL fActiveFrame) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_framesetDocument(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_framesetDocument(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_frameActive(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_frameActive(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_frameAsShown(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_frameAsShown(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_selection(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_selection(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_selectedPages(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_selectedPages(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_currentPage(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_currentPage(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_currentPageAvail(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_currentPageAvail(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_collate(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_collate(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_duplex(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_copies(
        USHORT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_copies(
        USHORT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_pageFrom(
        USHORT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pageFrom(
        USHORT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_pageTo(
        USHORT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pageTo(
        USHORT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_tableOfLinks(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_tableOfLinks(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_allLinkedDocuments(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_allLinkedDocuments(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_header(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_header(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_footer(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_footer(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_marginLeft(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_marginLeft(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_marginRight(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_marginRight(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_marginTop(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_marginTop(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_marginBottom(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_marginBottom(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pageWidth(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_pageHeight(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_unprintableLeft(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_unprintableTop(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_unprintableRight(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_unprintableBottom(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE updatePageStatus(
        LONG *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITemplatePrinter, 0x3050f6b4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ITemplatePrinterVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ITemplatePrinter* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ITemplatePrinter* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ITemplatePrinter* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ITemplatePrinter* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ITemplatePrinter* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ITemplatePrinter* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ITemplatePrinter* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITemplatePrinter methods ***/
    HRESULT (STDMETHODCALLTYPE *startDoc)(
        ITemplatePrinter* This,
        BSTR bstrTitle,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *stopDoc)(
        ITemplatePrinter* This);

    HRESULT (STDMETHODCALLTYPE *printBlankPage)(
        ITemplatePrinter* This);

    HRESULT (STDMETHODCALLTYPE *printPage)(
        ITemplatePrinter* This,
        IDispatch *pElemDisp);

    HRESULT (STDMETHODCALLTYPE *ensurePrintDialogDefaults)(
        ITemplatePrinter* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *showPrintDialog)(
        ITemplatePrinter* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *showPageSetupDialog)(
        ITemplatePrinter* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *printNonNative)(
        ITemplatePrinter* This,
        IUnknown *pMarkup,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *printNonNativeFrames)(
        ITemplatePrinter* This,
        IUnknown *pMarkup,
        VARIANT_BOOL fActiveFrame);

    HRESULT (STDMETHODCALLTYPE *put_framesetDocument)(
        ITemplatePrinter* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_framesetDocument)(
        ITemplatePrinter* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_frameActive)(
        ITemplatePrinter* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_frameActive)(
        ITemplatePrinter* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_frameAsShown)(
        ITemplatePrinter* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_frameAsShown)(
        ITemplatePrinter* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_selection)(
        ITemplatePrinter* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_selection)(
        ITemplatePrinter* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_selectedPages)(
        ITemplatePrinter* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_selectedPages)(
        ITemplatePrinter* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_currentPage)(
        ITemplatePrinter* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_currentPage)(
        ITemplatePrinter* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_currentPageAvail)(
        ITemplatePrinter* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_currentPageAvail)(
        ITemplatePrinter* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_collate)(
        ITemplatePrinter* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_collate)(
        ITemplatePrinter* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_duplex)(
        ITemplatePrinter* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_copies)(
        ITemplatePrinter* This,
        USHORT v);

    HRESULT (STDMETHODCALLTYPE *get_copies)(
        ITemplatePrinter* This,
        USHORT *p);

    HRESULT (STDMETHODCALLTYPE *put_pageFrom)(
        ITemplatePrinter* This,
        USHORT v);

    HRESULT (STDMETHODCALLTYPE *get_pageFrom)(
        ITemplatePrinter* This,
        USHORT *p);

    HRESULT (STDMETHODCALLTYPE *put_pageTo)(
        ITemplatePrinter* This,
        USHORT v);

    HRESULT (STDMETHODCALLTYPE *get_pageTo)(
        ITemplatePrinter* This,
        USHORT *p);

    HRESULT (STDMETHODCALLTYPE *put_tableOfLinks)(
        ITemplatePrinter* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_tableOfLinks)(
        ITemplatePrinter* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_allLinkedDocuments)(
        ITemplatePrinter* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_allLinkedDocuments)(
        ITemplatePrinter* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_header)(
        ITemplatePrinter* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_header)(
        ITemplatePrinter* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_footer)(
        ITemplatePrinter* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_footer)(
        ITemplatePrinter* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_marginLeft)(
        ITemplatePrinter* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_marginLeft)(
        ITemplatePrinter* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_marginRight)(
        ITemplatePrinter* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_marginRight)(
        ITemplatePrinter* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_marginTop)(
        ITemplatePrinter* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_marginTop)(
        ITemplatePrinter* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_marginBottom)(
        ITemplatePrinter* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_marginBottom)(
        ITemplatePrinter* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_pageWidth)(
        ITemplatePrinter* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_pageHeight)(
        ITemplatePrinter* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_unprintableLeft)(
        ITemplatePrinter* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_unprintableTop)(
        ITemplatePrinter* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_unprintableRight)(
        ITemplatePrinter* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_unprintableBottom)(
        ITemplatePrinter* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *updatePageStatus)(
        ITemplatePrinter* This,
        LONG *p);

    END_INTERFACE
} ITemplatePrinterVtbl;
interface ITemplatePrinter {
    CONST_VTBL ITemplatePrinterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITemplatePrinter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITemplatePrinter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITemplatePrinter_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ITemplatePrinter_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ITemplatePrinter_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ITemplatePrinter_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ITemplatePrinter_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITemplatePrinter methods ***/
#define ITemplatePrinter_startDoc(This,bstrTitle,p) (This)->lpVtbl->startDoc(This,bstrTitle,p)
#define ITemplatePrinter_stopDoc(This) (This)->lpVtbl->stopDoc(This)
#define ITemplatePrinter_printBlankPage(This) (This)->lpVtbl->printBlankPage(This)
#define ITemplatePrinter_printPage(This,pElemDisp) (This)->lpVtbl->printPage(This,pElemDisp)
#define ITemplatePrinter_ensurePrintDialogDefaults(This,p) (This)->lpVtbl->ensurePrintDialogDefaults(This,p)
#define ITemplatePrinter_showPrintDialog(This,p) (This)->lpVtbl->showPrintDialog(This,p)
#define ITemplatePrinter_showPageSetupDialog(This,p) (This)->lpVtbl->showPageSetupDialog(This,p)
#define ITemplatePrinter_printNonNative(This,pMarkup,p) (This)->lpVtbl->printNonNative(This,pMarkup,p)
#define ITemplatePrinter_printNonNativeFrames(This,pMarkup,fActiveFrame) (This)->lpVtbl->printNonNativeFrames(This,pMarkup,fActiveFrame)
#define ITemplatePrinter_put_framesetDocument(This,v) (This)->lpVtbl->put_framesetDocument(This,v)
#define ITemplatePrinter_get_framesetDocument(This,p) (This)->lpVtbl->get_framesetDocument(This,p)
#define ITemplatePrinter_put_frameActive(This,v) (This)->lpVtbl->put_frameActive(This,v)
#define ITemplatePrinter_get_frameActive(This,p) (This)->lpVtbl->get_frameActive(This,p)
#define ITemplatePrinter_put_frameAsShown(This,v) (This)->lpVtbl->put_frameAsShown(This,v)
#define ITemplatePrinter_get_frameAsShown(This,p) (This)->lpVtbl->get_frameAsShown(This,p)
#define ITemplatePrinter_put_selection(This,v) (This)->lpVtbl->put_selection(This,v)
#define ITemplatePrinter_get_selection(This,p) (This)->lpVtbl->get_selection(This,p)
#define ITemplatePrinter_put_selectedPages(This,v) (This)->lpVtbl->put_selectedPages(This,v)
#define ITemplatePrinter_get_selectedPages(This,p) (This)->lpVtbl->get_selectedPages(This,p)
#define ITemplatePrinter_put_currentPage(This,v) (This)->lpVtbl->put_currentPage(This,v)
#define ITemplatePrinter_get_currentPage(This,p) (This)->lpVtbl->get_currentPage(This,p)
#define ITemplatePrinter_put_currentPageAvail(This,v) (This)->lpVtbl->put_currentPageAvail(This,v)
#define ITemplatePrinter_get_currentPageAvail(This,p) (This)->lpVtbl->get_currentPageAvail(This,p)
#define ITemplatePrinter_put_collate(This,v) (This)->lpVtbl->put_collate(This,v)
#define ITemplatePrinter_get_collate(This,p) (This)->lpVtbl->get_collate(This,p)
#define ITemplatePrinter_get_duplex(This,p) (This)->lpVtbl->get_duplex(This,p)
#define ITemplatePrinter_put_copies(This,v) (This)->lpVtbl->put_copies(This,v)
#define ITemplatePrinter_get_copies(This,p) (This)->lpVtbl->get_copies(This,p)
#define ITemplatePrinter_put_pageFrom(This,v) (This)->lpVtbl->put_pageFrom(This,v)
#define ITemplatePrinter_get_pageFrom(This,p) (This)->lpVtbl->get_pageFrom(This,p)
#define ITemplatePrinter_put_pageTo(This,v) (This)->lpVtbl->put_pageTo(This,v)
#define ITemplatePrinter_get_pageTo(This,p) (This)->lpVtbl->get_pageTo(This,p)
#define ITemplatePrinter_put_tableOfLinks(This,v) (This)->lpVtbl->put_tableOfLinks(This,v)
#define ITemplatePrinter_get_tableOfLinks(This,p) (This)->lpVtbl->get_tableOfLinks(This,p)
#define ITemplatePrinter_put_allLinkedDocuments(This,v) (This)->lpVtbl->put_allLinkedDocuments(This,v)
#define ITemplatePrinter_get_allLinkedDocuments(This,p) (This)->lpVtbl->get_allLinkedDocuments(This,p)
#define ITemplatePrinter_put_header(This,v) (This)->lpVtbl->put_header(This,v)
#define ITemplatePrinter_get_header(This,p) (This)->lpVtbl->get_header(This,p)
#define ITemplatePrinter_put_footer(This,v) (This)->lpVtbl->put_footer(This,v)
#define ITemplatePrinter_get_footer(This,p) (This)->lpVtbl->get_footer(This,p)
#define ITemplatePrinter_put_marginLeft(This,v) (This)->lpVtbl->put_marginLeft(This,v)
#define ITemplatePrinter_get_marginLeft(This,p) (This)->lpVtbl->get_marginLeft(This,p)
#define ITemplatePrinter_put_marginRight(This,v) (This)->lpVtbl->put_marginRight(This,v)
#define ITemplatePrinter_get_marginRight(This,p) (This)->lpVtbl->get_marginRight(This,p)
#define ITemplatePrinter_put_marginTop(This,v) (This)->lpVtbl->put_marginTop(This,v)
#define ITemplatePrinter_get_marginTop(This,p) (This)->lpVtbl->get_marginTop(This,p)
#define ITemplatePrinter_put_marginBottom(This,v) (This)->lpVtbl->put_marginBottom(This,v)
#define ITemplatePrinter_get_marginBottom(This,p) (This)->lpVtbl->get_marginBottom(This,p)
#define ITemplatePrinter_get_pageWidth(This,p) (This)->lpVtbl->get_pageWidth(This,p)
#define ITemplatePrinter_get_pageHeight(This,p) (This)->lpVtbl->get_pageHeight(This,p)
#define ITemplatePrinter_get_unprintableLeft(This,p) (This)->lpVtbl->get_unprintableLeft(This,p)
#define ITemplatePrinter_get_unprintableTop(This,p) (This)->lpVtbl->get_unprintableTop(This,p)
#define ITemplatePrinter_get_unprintableRight(This,p) (This)->lpVtbl->get_unprintableRight(This,p)
#define ITemplatePrinter_get_unprintableBottom(This,p) (This)->lpVtbl->get_unprintableBottom(This,p)
#define ITemplatePrinter_updatePageStatus(This,p) (This)->lpVtbl->updatePageStatus(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ITemplatePrinter_QueryInterface(ITemplatePrinter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ITemplatePrinter_AddRef(ITemplatePrinter* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ITemplatePrinter_Release(ITemplatePrinter* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ITemplatePrinter_GetTypeInfoCount(ITemplatePrinter* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ITemplatePrinter_GetTypeInfo(ITemplatePrinter* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ITemplatePrinter_GetIDsOfNames(ITemplatePrinter* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ITemplatePrinter_Invoke(ITemplatePrinter* 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);
}
/*** ITemplatePrinter methods ***/
static FORCEINLINE HRESULT ITemplatePrinter_startDoc(ITemplatePrinter* This,BSTR bstrTitle,VARIANT_BOOL *p) {
    return This->lpVtbl->startDoc(This,bstrTitle,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_stopDoc(ITemplatePrinter* This) {
    return This->lpVtbl->stopDoc(This);
}
static FORCEINLINE HRESULT ITemplatePrinter_printBlankPage(ITemplatePrinter* This) {
    return This->lpVtbl->printBlankPage(This);
}
static FORCEINLINE HRESULT ITemplatePrinter_printPage(ITemplatePrinter* This,IDispatch *pElemDisp) {
    return This->lpVtbl->printPage(This,pElemDisp);
}
static FORCEINLINE HRESULT ITemplatePrinter_ensurePrintDialogDefaults(ITemplatePrinter* This,VARIANT_BOOL *p) {
    return This->lpVtbl->ensurePrintDialogDefaults(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_showPrintDialog(ITemplatePrinter* This,VARIANT_BOOL *p) {
    return This->lpVtbl->showPrintDialog(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_showPageSetupDialog(ITemplatePrinter* This,VARIANT_BOOL *p) {
    return This->lpVtbl->showPageSetupDialog(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_printNonNative(ITemplatePrinter* This,IUnknown *pMarkup,VARIANT_BOOL *p) {
    return This->lpVtbl->printNonNative(This,pMarkup,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_printNonNativeFrames(ITemplatePrinter* This,IUnknown *pMarkup,VARIANT_BOOL fActiveFrame) {
    return This->lpVtbl->printNonNativeFrames(This,pMarkup,fActiveFrame);
}
static FORCEINLINE HRESULT ITemplatePrinter_put_framesetDocument(ITemplatePrinter* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_framesetDocument(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter_get_framesetDocument(ITemplatePrinter* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_framesetDocument(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_put_frameActive(ITemplatePrinter* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_frameActive(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter_get_frameActive(ITemplatePrinter* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_frameActive(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_put_frameAsShown(ITemplatePrinter* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_frameAsShown(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter_get_frameAsShown(ITemplatePrinter* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_frameAsShown(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_put_selection(ITemplatePrinter* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_selection(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter_get_selection(ITemplatePrinter* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_selection(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_put_selectedPages(ITemplatePrinter* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_selectedPages(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter_get_selectedPages(ITemplatePrinter* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_selectedPages(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_put_currentPage(ITemplatePrinter* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_currentPage(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter_get_currentPage(ITemplatePrinter* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_currentPage(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_put_currentPageAvail(ITemplatePrinter* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_currentPageAvail(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter_get_currentPageAvail(ITemplatePrinter* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_currentPageAvail(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_put_collate(ITemplatePrinter* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_collate(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter_get_collate(ITemplatePrinter* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_collate(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_get_duplex(ITemplatePrinter* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_duplex(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_put_copies(ITemplatePrinter* This,USHORT v) {
    return This->lpVtbl->put_copies(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter_get_copies(ITemplatePrinter* This,USHORT *p) {
    return This->lpVtbl->get_copies(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_put_pageFrom(ITemplatePrinter* This,USHORT v) {
    return This->lpVtbl->put_pageFrom(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter_get_pageFrom(ITemplatePrinter* This,USHORT *p) {
    return This->lpVtbl->get_pageFrom(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_put_pageTo(ITemplatePrinter* This,USHORT v) {
    return This->lpVtbl->put_pageTo(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter_get_pageTo(ITemplatePrinter* This,USHORT *p) {
    return This->lpVtbl->get_pageTo(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_put_tableOfLinks(ITemplatePrinter* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_tableOfLinks(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter_get_tableOfLinks(ITemplatePrinter* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_tableOfLinks(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_put_allLinkedDocuments(ITemplatePrinter* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_allLinkedDocuments(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter_get_allLinkedDocuments(ITemplatePrinter* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_allLinkedDocuments(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_put_header(ITemplatePrinter* This,BSTR v) {
    return This->lpVtbl->put_header(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter_get_header(ITemplatePrinter* This,BSTR *p) {
    return This->lpVtbl->get_header(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_put_footer(ITemplatePrinter* This,BSTR v) {
    return This->lpVtbl->put_footer(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter_get_footer(ITemplatePrinter* This,BSTR *p) {
    return This->lpVtbl->get_footer(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_put_marginLeft(ITemplatePrinter* This,LONG v) {
    return This->lpVtbl->put_marginLeft(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter_get_marginLeft(ITemplatePrinter* This,LONG *p) {
    return This->lpVtbl->get_marginLeft(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_put_marginRight(ITemplatePrinter* This,LONG v) {
    return This->lpVtbl->put_marginRight(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter_get_marginRight(ITemplatePrinter* This,LONG *p) {
    return This->lpVtbl->get_marginRight(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_put_marginTop(ITemplatePrinter* This,LONG v) {
    return This->lpVtbl->put_marginTop(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter_get_marginTop(ITemplatePrinter* This,LONG *p) {
    return This->lpVtbl->get_marginTop(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_put_marginBottom(ITemplatePrinter* This,LONG v) {
    return This->lpVtbl->put_marginBottom(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter_get_marginBottom(ITemplatePrinter* This,LONG *p) {
    return This->lpVtbl->get_marginBottom(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_get_pageWidth(ITemplatePrinter* This,LONG *p) {
    return This->lpVtbl->get_pageWidth(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_get_pageHeight(ITemplatePrinter* This,LONG *p) {
    return This->lpVtbl->get_pageHeight(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_get_unprintableLeft(ITemplatePrinter* This,LONG *p) {
    return This->lpVtbl->get_unprintableLeft(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_get_unprintableTop(ITemplatePrinter* This,LONG *p) {
    return This->lpVtbl->get_unprintableTop(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_get_unprintableRight(ITemplatePrinter* This,LONG *p) {
    return This->lpVtbl->get_unprintableRight(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_get_unprintableBottom(ITemplatePrinter* This,LONG *p) {
    return This->lpVtbl->get_unprintableBottom(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter_updatePageStatus(ITemplatePrinter* This,LONG *p) {
    return This->lpVtbl->updatePageStatus(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ITemplatePrinter_startDoc_Proxy(
    ITemplatePrinter* This,
    BSTR bstrTitle,
    VARIANT_BOOL *p);
void __RPC_STUB ITemplatePrinter_startDoc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_stopDoc_Proxy(
    ITemplatePrinter* This);
void __RPC_STUB ITemplatePrinter_stopDoc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_printBlankPage_Proxy(
    ITemplatePrinter* This);
void __RPC_STUB ITemplatePrinter_printBlankPage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_printPage_Proxy(
    ITemplatePrinter* This,
    IDispatch *pElemDisp);
void __RPC_STUB ITemplatePrinter_printPage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_ensurePrintDialogDefaults_Proxy(
    ITemplatePrinter* This,
    VARIANT_BOOL *p);
void __RPC_STUB ITemplatePrinter_ensurePrintDialogDefaults_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_showPrintDialog_Proxy(
    ITemplatePrinter* This,
    VARIANT_BOOL *p);
void __RPC_STUB ITemplatePrinter_showPrintDialog_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_showPageSetupDialog_Proxy(
    ITemplatePrinter* This,
    VARIANT_BOOL *p);
void __RPC_STUB ITemplatePrinter_showPageSetupDialog_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_printNonNative_Proxy(
    ITemplatePrinter* This,
    IUnknown *pMarkup,
    VARIANT_BOOL *p);
void __RPC_STUB ITemplatePrinter_printNonNative_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_printNonNativeFrames_Proxy(
    ITemplatePrinter* This,
    IUnknown *pMarkup,
    VARIANT_BOOL fActiveFrame);
void __RPC_STUB ITemplatePrinter_printNonNativeFrames_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_put_framesetDocument_Proxy(
    ITemplatePrinter* This,
    VARIANT_BOOL v);
void __RPC_STUB ITemplatePrinter_put_framesetDocument_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_get_framesetDocument_Proxy(
    ITemplatePrinter* This,
    VARIANT_BOOL *p);
void __RPC_STUB ITemplatePrinter_get_framesetDocument_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_put_frameActive_Proxy(
    ITemplatePrinter* This,
    VARIANT_BOOL v);
void __RPC_STUB ITemplatePrinter_put_frameActive_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_get_frameActive_Proxy(
    ITemplatePrinter* This,
    VARIANT_BOOL *p);
void __RPC_STUB ITemplatePrinter_get_frameActive_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_put_frameAsShown_Proxy(
    ITemplatePrinter* This,
    VARIANT_BOOL v);
void __RPC_STUB ITemplatePrinter_put_frameAsShown_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_get_frameAsShown_Proxy(
    ITemplatePrinter* This,
    VARIANT_BOOL *p);
void __RPC_STUB ITemplatePrinter_get_frameAsShown_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_put_selection_Proxy(
    ITemplatePrinter* This,
    VARIANT_BOOL v);
void __RPC_STUB ITemplatePrinter_put_selection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_get_selection_Proxy(
    ITemplatePrinter* This,
    VARIANT_BOOL *p);
void __RPC_STUB ITemplatePrinter_get_selection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_put_selectedPages_Proxy(
    ITemplatePrinter* This,
    VARIANT_BOOL v);
void __RPC_STUB ITemplatePrinter_put_selectedPages_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_get_selectedPages_Proxy(
    ITemplatePrinter* This,
    VARIANT_BOOL *p);
void __RPC_STUB ITemplatePrinter_get_selectedPages_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_put_currentPage_Proxy(
    ITemplatePrinter* This,
    VARIANT_BOOL v);
void __RPC_STUB ITemplatePrinter_put_currentPage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_get_currentPage_Proxy(
    ITemplatePrinter* This,
    VARIANT_BOOL *p);
void __RPC_STUB ITemplatePrinter_get_currentPage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_put_currentPageAvail_Proxy(
    ITemplatePrinter* This,
    VARIANT_BOOL v);
void __RPC_STUB ITemplatePrinter_put_currentPageAvail_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_get_currentPageAvail_Proxy(
    ITemplatePrinter* This,
    VARIANT_BOOL *p);
void __RPC_STUB ITemplatePrinter_get_currentPageAvail_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_put_collate_Proxy(
    ITemplatePrinter* This,
    VARIANT_BOOL v);
void __RPC_STUB ITemplatePrinter_put_collate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_get_collate_Proxy(
    ITemplatePrinter* This,
    VARIANT_BOOL *p);
void __RPC_STUB ITemplatePrinter_get_collate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_get_duplex_Proxy(
    ITemplatePrinter* This,
    VARIANT_BOOL *p);
void __RPC_STUB ITemplatePrinter_get_duplex_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_put_copies_Proxy(
    ITemplatePrinter* This,
    USHORT v);
void __RPC_STUB ITemplatePrinter_put_copies_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_get_copies_Proxy(
    ITemplatePrinter* This,
    USHORT *p);
void __RPC_STUB ITemplatePrinter_get_copies_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_put_pageFrom_Proxy(
    ITemplatePrinter* This,
    USHORT v);
void __RPC_STUB ITemplatePrinter_put_pageFrom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_get_pageFrom_Proxy(
    ITemplatePrinter* This,
    USHORT *p);
void __RPC_STUB ITemplatePrinter_get_pageFrom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_put_pageTo_Proxy(
    ITemplatePrinter* This,
    USHORT v);
void __RPC_STUB ITemplatePrinter_put_pageTo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_get_pageTo_Proxy(
    ITemplatePrinter* This,
    USHORT *p);
void __RPC_STUB ITemplatePrinter_get_pageTo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_put_tableOfLinks_Proxy(
    ITemplatePrinter* This,
    VARIANT_BOOL v);
void __RPC_STUB ITemplatePrinter_put_tableOfLinks_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_get_tableOfLinks_Proxy(
    ITemplatePrinter* This,
    VARIANT_BOOL *p);
void __RPC_STUB ITemplatePrinter_get_tableOfLinks_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_put_allLinkedDocuments_Proxy(
    ITemplatePrinter* This,
    VARIANT_BOOL v);
void __RPC_STUB ITemplatePrinter_put_allLinkedDocuments_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_get_allLinkedDocuments_Proxy(
    ITemplatePrinter* This,
    VARIANT_BOOL *p);
void __RPC_STUB ITemplatePrinter_get_allLinkedDocuments_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_put_header_Proxy(
    ITemplatePrinter* This,
    BSTR v);
void __RPC_STUB ITemplatePrinter_put_header_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_get_header_Proxy(
    ITemplatePrinter* This,
    BSTR *p);
void __RPC_STUB ITemplatePrinter_get_header_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_put_footer_Proxy(
    ITemplatePrinter* This,
    BSTR v);
void __RPC_STUB ITemplatePrinter_put_footer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_get_footer_Proxy(
    ITemplatePrinter* This,
    BSTR *p);
void __RPC_STUB ITemplatePrinter_get_footer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_put_marginLeft_Proxy(
    ITemplatePrinter* This,
    LONG v);
void __RPC_STUB ITemplatePrinter_put_marginLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_get_marginLeft_Proxy(
    ITemplatePrinter* This,
    LONG *p);
void __RPC_STUB ITemplatePrinter_get_marginLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_put_marginRight_Proxy(
    ITemplatePrinter* This,
    LONG v);
void __RPC_STUB ITemplatePrinter_put_marginRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_get_marginRight_Proxy(
    ITemplatePrinter* This,
    LONG *p);
void __RPC_STUB ITemplatePrinter_get_marginRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_put_marginTop_Proxy(
    ITemplatePrinter* This,
    LONG v);
void __RPC_STUB ITemplatePrinter_put_marginTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_get_marginTop_Proxy(
    ITemplatePrinter* This,
    LONG *p);
void __RPC_STUB ITemplatePrinter_get_marginTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_put_marginBottom_Proxy(
    ITemplatePrinter* This,
    LONG v);
void __RPC_STUB ITemplatePrinter_put_marginBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_get_marginBottom_Proxy(
    ITemplatePrinter* This,
    LONG *p);
void __RPC_STUB ITemplatePrinter_get_marginBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_get_pageWidth_Proxy(
    ITemplatePrinter* This,
    LONG *p);
void __RPC_STUB ITemplatePrinter_get_pageWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_get_pageHeight_Proxy(
    ITemplatePrinter* This,
    LONG *p);
void __RPC_STUB ITemplatePrinter_get_pageHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_get_unprintableLeft_Proxy(
    ITemplatePrinter* This,
    LONG *p);
void __RPC_STUB ITemplatePrinter_get_unprintableLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_get_unprintableTop_Proxy(
    ITemplatePrinter* This,
    LONG *p);
void __RPC_STUB ITemplatePrinter_get_unprintableTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_get_unprintableRight_Proxy(
    ITemplatePrinter* This,
    LONG *p);
void __RPC_STUB ITemplatePrinter_get_unprintableRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_get_unprintableBottom_Proxy(
    ITemplatePrinter* This,
    LONG *p);
void __RPC_STUB ITemplatePrinter_get_unprintableBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter_updatePageStatus_Proxy(
    ITemplatePrinter* This,
    LONG *p);
void __RPC_STUB ITemplatePrinter_updatePageStatus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ITemplatePrinter_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITemplatePrinter2 interface
 */
#ifndef __ITemplatePrinter2_INTERFACE_DEFINED__
#define __ITemplatePrinter2_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITemplatePrinter2, 0x3050f83f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f83f-98b5-11cf-bb82-00aa00bdce0b")
ITemplatePrinter2 : public ITemplatePrinter
{
    virtual HRESULT STDMETHODCALLTYPE put_selectionEnabled(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_selectionEnabled(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_frameActiveEnabled(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_frameActiveEnabled(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_orientation(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_orientation(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_usePrinterCopyCollate(
        VARIANT_BOOL v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_usePrinterCopyCollate(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE deviceSupports(
        BSTR bstrProperty,
        VARIANT *pvar) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITemplatePrinter2, 0x3050f83f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ITemplatePrinter2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ITemplatePrinter2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ITemplatePrinter2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ITemplatePrinter2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ITemplatePrinter2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ITemplatePrinter2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ITemplatePrinter2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ITemplatePrinter2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITemplatePrinter methods ***/
    HRESULT (STDMETHODCALLTYPE *startDoc)(
        ITemplatePrinter2* This,
        BSTR bstrTitle,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *stopDoc)(
        ITemplatePrinter2* This);

    HRESULT (STDMETHODCALLTYPE *printBlankPage)(
        ITemplatePrinter2* This);

    HRESULT (STDMETHODCALLTYPE *printPage)(
        ITemplatePrinter2* This,
        IDispatch *pElemDisp);

    HRESULT (STDMETHODCALLTYPE *ensurePrintDialogDefaults)(
        ITemplatePrinter2* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *showPrintDialog)(
        ITemplatePrinter2* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *showPageSetupDialog)(
        ITemplatePrinter2* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *printNonNative)(
        ITemplatePrinter2* This,
        IUnknown *pMarkup,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *printNonNativeFrames)(
        ITemplatePrinter2* This,
        IUnknown *pMarkup,
        VARIANT_BOOL fActiveFrame);

    HRESULT (STDMETHODCALLTYPE *put_framesetDocument)(
        ITemplatePrinter2* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_framesetDocument)(
        ITemplatePrinter2* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_frameActive)(
        ITemplatePrinter2* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_frameActive)(
        ITemplatePrinter2* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_frameAsShown)(
        ITemplatePrinter2* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_frameAsShown)(
        ITemplatePrinter2* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_selection)(
        ITemplatePrinter2* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_selection)(
        ITemplatePrinter2* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_selectedPages)(
        ITemplatePrinter2* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_selectedPages)(
        ITemplatePrinter2* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_currentPage)(
        ITemplatePrinter2* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_currentPage)(
        ITemplatePrinter2* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_currentPageAvail)(
        ITemplatePrinter2* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_currentPageAvail)(
        ITemplatePrinter2* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_collate)(
        ITemplatePrinter2* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_collate)(
        ITemplatePrinter2* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_duplex)(
        ITemplatePrinter2* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_copies)(
        ITemplatePrinter2* This,
        USHORT v);

    HRESULT (STDMETHODCALLTYPE *get_copies)(
        ITemplatePrinter2* This,
        USHORT *p);

    HRESULT (STDMETHODCALLTYPE *put_pageFrom)(
        ITemplatePrinter2* This,
        USHORT v);

    HRESULT (STDMETHODCALLTYPE *get_pageFrom)(
        ITemplatePrinter2* This,
        USHORT *p);

    HRESULT (STDMETHODCALLTYPE *put_pageTo)(
        ITemplatePrinter2* This,
        USHORT v);

    HRESULT (STDMETHODCALLTYPE *get_pageTo)(
        ITemplatePrinter2* This,
        USHORT *p);

    HRESULT (STDMETHODCALLTYPE *put_tableOfLinks)(
        ITemplatePrinter2* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_tableOfLinks)(
        ITemplatePrinter2* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_allLinkedDocuments)(
        ITemplatePrinter2* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_allLinkedDocuments)(
        ITemplatePrinter2* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_header)(
        ITemplatePrinter2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_header)(
        ITemplatePrinter2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_footer)(
        ITemplatePrinter2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_footer)(
        ITemplatePrinter2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_marginLeft)(
        ITemplatePrinter2* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_marginLeft)(
        ITemplatePrinter2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_marginRight)(
        ITemplatePrinter2* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_marginRight)(
        ITemplatePrinter2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_marginTop)(
        ITemplatePrinter2* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_marginTop)(
        ITemplatePrinter2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_marginBottom)(
        ITemplatePrinter2* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_marginBottom)(
        ITemplatePrinter2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_pageWidth)(
        ITemplatePrinter2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_pageHeight)(
        ITemplatePrinter2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_unprintableLeft)(
        ITemplatePrinter2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_unprintableTop)(
        ITemplatePrinter2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_unprintableRight)(
        ITemplatePrinter2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_unprintableBottom)(
        ITemplatePrinter2* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *updatePageStatus)(
        ITemplatePrinter2* This,
        LONG *p);

    /*** ITemplatePrinter2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_selectionEnabled)(
        ITemplatePrinter2* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_selectionEnabled)(
        ITemplatePrinter2* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_frameActiveEnabled)(
        ITemplatePrinter2* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_frameActiveEnabled)(
        ITemplatePrinter2* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_orientation)(
        ITemplatePrinter2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_orientation)(
        ITemplatePrinter2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_usePrinterCopyCollate)(
        ITemplatePrinter2* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_usePrinterCopyCollate)(
        ITemplatePrinter2* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *deviceSupports)(
        ITemplatePrinter2* This,
        BSTR bstrProperty,
        VARIANT *pvar);

    END_INTERFACE
} ITemplatePrinter2Vtbl;
interface ITemplatePrinter2 {
    CONST_VTBL ITemplatePrinter2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITemplatePrinter2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITemplatePrinter2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITemplatePrinter2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ITemplatePrinter2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ITemplatePrinter2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ITemplatePrinter2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ITemplatePrinter2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITemplatePrinter methods ***/
#define ITemplatePrinter2_startDoc(This,bstrTitle,p) (This)->lpVtbl->startDoc(This,bstrTitle,p)
#define ITemplatePrinter2_stopDoc(This) (This)->lpVtbl->stopDoc(This)
#define ITemplatePrinter2_printBlankPage(This) (This)->lpVtbl->printBlankPage(This)
#define ITemplatePrinter2_printPage(This,pElemDisp) (This)->lpVtbl->printPage(This,pElemDisp)
#define ITemplatePrinter2_ensurePrintDialogDefaults(This,p) (This)->lpVtbl->ensurePrintDialogDefaults(This,p)
#define ITemplatePrinter2_showPrintDialog(This,p) (This)->lpVtbl->showPrintDialog(This,p)
#define ITemplatePrinter2_showPageSetupDialog(This,p) (This)->lpVtbl->showPageSetupDialog(This,p)
#define ITemplatePrinter2_printNonNative(This,pMarkup,p) (This)->lpVtbl->printNonNative(This,pMarkup,p)
#define ITemplatePrinter2_printNonNativeFrames(This,pMarkup,fActiveFrame) (This)->lpVtbl->printNonNativeFrames(This,pMarkup,fActiveFrame)
#define ITemplatePrinter2_put_framesetDocument(This,v) (This)->lpVtbl->put_framesetDocument(This,v)
#define ITemplatePrinter2_get_framesetDocument(This,p) (This)->lpVtbl->get_framesetDocument(This,p)
#define ITemplatePrinter2_put_frameActive(This,v) (This)->lpVtbl->put_frameActive(This,v)
#define ITemplatePrinter2_get_frameActive(This,p) (This)->lpVtbl->get_frameActive(This,p)
#define ITemplatePrinter2_put_frameAsShown(This,v) (This)->lpVtbl->put_frameAsShown(This,v)
#define ITemplatePrinter2_get_frameAsShown(This,p) (This)->lpVtbl->get_frameAsShown(This,p)
#define ITemplatePrinter2_put_selection(This,v) (This)->lpVtbl->put_selection(This,v)
#define ITemplatePrinter2_get_selection(This,p) (This)->lpVtbl->get_selection(This,p)
#define ITemplatePrinter2_put_selectedPages(This,v) (This)->lpVtbl->put_selectedPages(This,v)
#define ITemplatePrinter2_get_selectedPages(This,p) (This)->lpVtbl->get_selectedPages(This,p)
#define ITemplatePrinter2_put_currentPage(This,v) (This)->lpVtbl->put_currentPage(This,v)
#define ITemplatePrinter2_get_currentPage(This,p) (This)->lpVtbl->get_currentPage(This,p)
#define ITemplatePrinter2_put_currentPageAvail(This,v) (This)->lpVtbl->put_currentPageAvail(This,v)
#define ITemplatePrinter2_get_currentPageAvail(This,p) (This)->lpVtbl->get_currentPageAvail(This,p)
#define ITemplatePrinter2_put_collate(This,v) (This)->lpVtbl->put_collate(This,v)
#define ITemplatePrinter2_get_collate(This,p) (This)->lpVtbl->get_collate(This,p)
#define ITemplatePrinter2_get_duplex(This,p) (This)->lpVtbl->get_duplex(This,p)
#define ITemplatePrinter2_put_copies(This,v) (This)->lpVtbl->put_copies(This,v)
#define ITemplatePrinter2_get_copies(This,p) (This)->lpVtbl->get_copies(This,p)
#define ITemplatePrinter2_put_pageFrom(This,v) (This)->lpVtbl->put_pageFrom(This,v)
#define ITemplatePrinter2_get_pageFrom(This,p) (This)->lpVtbl->get_pageFrom(This,p)
#define ITemplatePrinter2_put_pageTo(This,v) (This)->lpVtbl->put_pageTo(This,v)
#define ITemplatePrinter2_get_pageTo(This,p) (This)->lpVtbl->get_pageTo(This,p)
#define ITemplatePrinter2_put_tableOfLinks(This,v) (This)->lpVtbl->put_tableOfLinks(This,v)
#define ITemplatePrinter2_get_tableOfLinks(This,p) (This)->lpVtbl->get_tableOfLinks(This,p)
#define ITemplatePrinter2_put_allLinkedDocuments(This,v) (This)->lpVtbl->put_allLinkedDocuments(This,v)
#define ITemplatePrinter2_get_allLinkedDocuments(This,p) (This)->lpVtbl->get_allLinkedDocuments(This,p)
#define ITemplatePrinter2_put_header(This,v) (This)->lpVtbl->put_header(This,v)
#define ITemplatePrinter2_get_header(This,p) (This)->lpVtbl->get_header(This,p)
#define ITemplatePrinter2_put_footer(This,v) (This)->lpVtbl->put_footer(This,v)
#define ITemplatePrinter2_get_footer(This,p) (This)->lpVtbl->get_footer(This,p)
#define ITemplatePrinter2_put_marginLeft(This,v) (This)->lpVtbl->put_marginLeft(This,v)
#define ITemplatePrinter2_get_marginLeft(This,p) (This)->lpVtbl->get_marginLeft(This,p)
#define ITemplatePrinter2_put_marginRight(This,v) (This)->lpVtbl->put_marginRight(This,v)
#define ITemplatePrinter2_get_marginRight(This,p) (This)->lpVtbl->get_marginRight(This,p)
#define ITemplatePrinter2_put_marginTop(This,v) (This)->lpVtbl->put_marginTop(This,v)
#define ITemplatePrinter2_get_marginTop(This,p) (This)->lpVtbl->get_marginTop(This,p)
#define ITemplatePrinter2_put_marginBottom(This,v) (This)->lpVtbl->put_marginBottom(This,v)
#define ITemplatePrinter2_get_marginBottom(This,p) (This)->lpVtbl->get_marginBottom(This,p)
#define ITemplatePrinter2_get_pageWidth(This,p) (This)->lpVtbl->get_pageWidth(This,p)
#define ITemplatePrinter2_get_pageHeight(This,p) (This)->lpVtbl->get_pageHeight(This,p)
#define ITemplatePrinter2_get_unprintableLeft(This,p) (This)->lpVtbl->get_unprintableLeft(This,p)
#define ITemplatePrinter2_get_unprintableTop(This,p) (This)->lpVtbl->get_unprintableTop(This,p)
#define ITemplatePrinter2_get_unprintableRight(This,p) (This)->lpVtbl->get_unprintableRight(This,p)
#define ITemplatePrinter2_get_unprintableBottom(This,p) (This)->lpVtbl->get_unprintableBottom(This,p)
#define ITemplatePrinter2_updatePageStatus(This,p) (This)->lpVtbl->updatePageStatus(This,p)
/*** ITemplatePrinter2 methods ***/
#define ITemplatePrinter2_put_selectionEnabled(This,v) (This)->lpVtbl->put_selectionEnabled(This,v)
#define ITemplatePrinter2_get_selectionEnabled(This,p) (This)->lpVtbl->get_selectionEnabled(This,p)
#define ITemplatePrinter2_put_frameActiveEnabled(This,v) (This)->lpVtbl->put_frameActiveEnabled(This,v)
#define ITemplatePrinter2_get_frameActiveEnabled(This,p) (This)->lpVtbl->get_frameActiveEnabled(This,p)
#define ITemplatePrinter2_put_orientation(This,v) (This)->lpVtbl->put_orientation(This,v)
#define ITemplatePrinter2_get_orientation(This,p) (This)->lpVtbl->get_orientation(This,p)
#define ITemplatePrinter2_put_usePrinterCopyCollate(This,v) (This)->lpVtbl->put_usePrinterCopyCollate(This,v)
#define ITemplatePrinter2_get_usePrinterCopyCollate(This,p) (This)->lpVtbl->get_usePrinterCopyCollate(This,p)
#define ITemplatePrinter2_deviceSupports(This,bstrProperty,pvar) (This)->lpVtbl->deviceSupports(This,bstrProperty,pvar)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ITemplatePrinter2_QueryInterface(ITemplatePrinter2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ITemplatePrinter2_AddRef(ITemplatePrinter2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ITemplatePrinter2_Release(ITemplatePrinter2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ITemplatePrinter2_GetTypeInfoCount(ITemplatePrinter2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ITemplatePrinter2_GetTypeInfo(ITemplatePrinter2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ITemplatePrinter2_GetIDsOfNames(ITemplatePrinter2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ITemplatePrinter2_Invoke(ITemplatePrinter2* 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);
}
/*** ITemplatePrinter methods ***/
static FORCEINLINE HRESULT ITemplatePrinter2_startDoc(ITemplatePrinter2* This,BSTR bstrTitle,VARIANT_BOOL *p) {
    return This->lpVtbl->startDoc(This,bstrTitle,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_stopDoc(ITemplatePrinter2* This) {
    return This->lpVtbl->stopDoc(This);
}
static FORCEINLINE HRESULT ITemplatePrinter2_printBlankPage(ITemplatePrinter2* This) {
    return This->lpVtbl->printBlankPage(This);
}
static FORCEINLINE HRESULT ITemplatePrinter2_printPage(ITemplatePrinter2* This,IDispatch *pElemDisp) {
    return This->lpVtbl->printPage(This,pElemDisp);
}
static FORCEINLINE HRESULT ITemplatePrinter2_ensurePrintDialogDefaults(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->ensurePrintDialogDefaults(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_showPrintDialog(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->showPrintDialog(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_showPageSetupDialog(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->showPageSetupDialog(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_printNonNative(ITemplatePrinter2* This,IUnknown *pMarkup,VARIANT_BOOL *p) {
    return This->lpVtbl->printNonNative(This,pMarkup,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_printNonNativeFrames(ITemplatePrinter2* This,IUnknown *pMarkup,VARIANT_BOOL fActiveFrame) {
    return This->lpVtbl->printNonNativeFrames(This,pMarkup,fActiveFrame);
}
static FORCEINLINE HRESULT ITemplatePrinter2_put_framesetDocument(ITemplatePrinter2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_framesetDocument(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter2_get_framesetDocument(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_framesetDocument(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_put_frameActive(ITemplatePrinter2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_frameActive(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter2_get_frameActive(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_frameActive(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_put_frameAsShown(ITemplatePrinter2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_frameAsShown(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter2_get_frameAsShown(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_frameAsShown(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_put_selection(ITemplatePrinter2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_selection(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter2_get_selection(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_selection(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_put_selectedPages(ITemplatePrinter2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_selectedPages(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter2_get_selectedPages(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_selectedPages(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_put_currentPage(ITemplatePrinter2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_currentPage(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter2_get_currentPage(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_currentPage(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_put_currentPageAvail(ITemplatePrinter2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_currentPageAvail(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter2_get_currentPageAvail(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_currentPageAvail(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_put_collate(ITemplatePrinter2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_collate(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter2_get_collate(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_collate(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_get_duplex(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_duplex(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_put_copies(ITemplatePrinter2* This,USHORT v) {
    return This->lpVtbl->put_copies(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter2_get_copies(ITemplatePrinter2* This,USHORT *p) {
    return This->lpVtbl->get_copies(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_put_pageFrom(ITemplatePrinter2* This,USHORT v) {
    return This->lpVtbl->put_pageFrom(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter2_get_pageFrom(ITemplatePrinter2* This,USHORT *p) {
    return This->lpVtbl->get_pageFrom(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_put_pageTo(ITemplatePrinter2* This,USHORT v) {
    return This->lpVtbl->put_pageTo(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter2_get_pageTo(ITemplatePrinter2* This,USHORT *p) {
    return This->lpVtbl->get_pageTo(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_put_tableOfLinks(ITemplatePrinter2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_tableOfLinks(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter2_get_tableOfLinks(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_tableOfLinks(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_put_allLinkedDocuments(ITemplatePrinter2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_allLinkedDocuments(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter2_get_allLinkedDocuments(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_allLinkedDocuments(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_put_header(ITemplatePrinter2* This,BSTR v) {
    return This->lpVtbl->put_header(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter2_get_header(ITemplatePrinter2* This,BSTR *p) {
    return This->lpVtbl->get_header(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_put_footer(ITemplatePrinter2* This,BSTR v) {
    return This->lpVtbl->put_footer(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter2_get_footer(ITemplatePrinter2* This,BSTR *p) {
    return This->lpVtbl->get_footer(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_put_marginLeft(ITemplatePrinter2* This,LONG v) {
    return This->lpVtbl->put_marginLeft(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter2_get_marginLeft(ITemplatePrinter2* This,LONG *p) {
    return This->lpVtbl->get_marginLeft(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_put_marginRight(ITemplatePrinter2* This,LONG v) {
    return This->lpVtbl->put_marginRight(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter2_get_marginRight(ITemplatePrinter2* This,LONG *p) {
    return This->lpVtbl->get_marginRight(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_put_marginTop(ITemplatePrinter2* This,LONG v) {
    return This->lpVtbl->put_marginTop(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter2_get_marginTop(ITemplatePrinter2* This,LONG *p) {
    return This->lpVtbl->get_marginTop(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_put_marginBottom(ITemplatePrinter2* This,LONG v) {
    return This->lpVtbl->put_marginBottom(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter2_get_marginBottom(ITemplatePrinter2* This,LONG *p) {
    return This->lpVtbl->get_marginBottom(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_get_pageWidth(ITemplatePrinter2* This,LONG *p) {
    return This->lpVtbl->get_pageWidth(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_get_pageHeight(ITemplatePrinter2* This,LONG *p) {
    return This->lpVtbl->get_pageHeight(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_get_unprintableLeft(ITemplatePrinter2* This,LONG *p) {
    return This->lpVtbl->get_unprintableLeft(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_get_unprintableTop(ITemplatePrinter2* This,LONG *p) {
    return This->lpVtbl->get_unprintableTop(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_get_unprintableRight(ITemplatePrinter2* This,LONG *p) {
    return This->lpVtbl->get_unprintableRight(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_get_unprintableBottom(ITemplatePrinter2* This,LONG *p) {
    return This->lpVtbl->get_unprintableBottom(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_updatePageStatus(ITemplatePrinter2* This,LONG *p) {
    return This->lpVtbl->updatePageStatus(This,p);
}
/*** ITemplatePrinter2 methods ***/
static FORCEINLINE HRESULT ITemplatePrinter2_put_selectionEnabled(ITemplatePrinter2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_selectionEnabled(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter2_get_selectionEnabled(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_selectionEnabled(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_put_frameActiveEnabled(ITemplatePrinter2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_frameActiveEnabled(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter2_get_frameActiveEnabled(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_frameActiveEnabled(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_put_orientation(ITemplatePrinter2* This,BSTR v) {
    return This->lpVtbl->put_orientation(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter2_get_orientation(ITemplatePrinter2* This,BSTR *p) {
    return This->lpVtbl->get_orientation(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_put_usePrinterCopyCollate(ITemplatePrinter2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_usePrinterCopyCollate(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter2_get_usePrinterCopyCollate(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_usePrinterCopyCollate(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter2_deviceSupports(ITemplatePrinter2* This,BSTR bstrProperty,VARIANT *pvar) {
    return This->lpVtbl->deviceSupports(This,bstrProperty,pvar);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ITemplatePrinter2_put_selectionEnabled_Proxy(
    ITemplatePrinter2* This,
    VARIANT_BOOL v);
void __RPC_STUB ITemplatePrinter2_put_selectionEnabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter2_get_selectionEnabled_Proxy(
    ITemplatePrinter2* This,
    VARIANT_BOOL *p);
void __RPC_STUB ITemplatePrinter2_get_selectionEnabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter2_put_frameActiveEnabled_Proxy(
    ITemplatePrinter2* This,
    VARIANT_BOOL v);
void __RPC_STUB ITemplatePrinter2_put_frameActiveEnabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter2_get_frameActiveEnabled_Proxy(
    ITemplatePrinter2* This,
    VARIANT_BOOL *p);
void __RPC_STUB ITemplatePrinter2_get_frameActiveEnabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter2_put_orientation_Proxy(
    ITemplatePrinter2* This,
    BSTR v);
void __RPC_STUB ITemplatePrinter2_put_orientation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter2_get_orientation_Proxy(
    ITemplatePrinter2* This,
    BSTR *p);
void __RPC_STUB ITemplatePrinter2_get_orientation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter2_put_usePrinterCopyCollate_Proxy(
    ITemplatePrinter2* This,
    VARIANT_BOOL v);
void __RPC_STUB ITemplatePrinter2_put_usePrinterCopyCollate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter2_get_usePrinterCopyCollate_Proxy(
    ITemplatePrinter2* This,
    VARIANT_BOOL *p);
void __RPC_STUB ITemplatePrinter2_get_usePrinterCopyCollate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter2_deviceSupports_Proxy(
    ITemplatePrinter2* This,
    BSTR bstrProperty,
    VARIANT *pvar);
void __RPC_STUB ITemplatePrinter2_deviceSupports_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ITemplatePrinter2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITemplatePrinter3 interface
 */
#ifndef __ITemplatePrinter3_INTERFACE_DEFINED__
#define __ITemplatePrinter3_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITemplatePrinter3, 0x305104a3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305104a3-98b5-11cf-bb82-00aa00bdce0b")
ITemplatePrinter3 : public ITemplatePrinter2
{
    virtual HRESULT STDMETHODCALLTYPE put_headerFooterFont(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_headerFooterFont(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE getPageMarginTop(
        IDispatch *pageRule,
        LONG pageWidth,
        LONG pageHeight,
        VARIANT *pMargin) = 0;

    virtual HRESULT STDMETHODCALLTYPE getPageMarginRight(
        IDispatch *pageRule,
        LONG pageWidth,
        LONG pageHeight,
        VARIANT *pMargin) = 0;

    virtual HRESULT STDMETHODCALLTYPE getPageMarginBottom(
        IDispatch *pageRule,
        LONG pageWidth,
        LONG pageHeight,
        VARIANT *pMargin) = 0;

    virtual HRESULT STDMETHODCALLTYPE getPageMarginLeft(
        IDispatch *pageRule,
        LONG pageWidth,
        LONG pageHeight,
        VARIANT *pMargin) = 0;

    virtual HRESULT STDMETHODCALLTYPE getPageMarginTopImportant(
        IDispatch *pageRule,
        VARIANT_BOOL *pbImportant) = 0;

    virtual HRESULT STDMETHODCALLTYPE getPageMarginRightImportant(
        IDispatch *pageRule,
        VARIANT_BOOL *pbImportant) = 0;

    virtual HRESULT STDMETHODCALLTYPE getPageMarginBottomImportant(
        IDispatch *pageRule,
        VARIANT_BOOL *pbImportant) = 0;

    virtual HRESULT STDMETHODCALLTYPE getPageMarginLeftImportant(
        IDispatch *pageRule,
        VARIANT_BOOL *pbImportant) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITemplatePrinter3, 0x305104a3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ITemplatePrinter3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ITemplatePrinter3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ITemplatePrinter3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ITemplatePrinter3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ITemplatePrinter3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ITemplatePrinter3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ITemplatePrinter3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ITemplatePrinter3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITemplatePrinter methods ***/
    HRESULT (STDMETHODCALLTYPE *startDoc)(
        ITemplatePrinter3* This,
        BSTR bstrTitle,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *stopDoc)(
        ITemplatePrinter3* This);

    HRESULT (STDMETHODCALLTYPE *printBlankPage)(
        ITemplatePrinter3* This);

    HRESULT (STDMETHODCALLTYPE *printPage)(
        ITemplatePrinter3* This,
        IDispatch *pElemDisp);

    HRESULT (STDMETHODCALLTYPE *ensurePrintDialogDefaults)(
        ITemplatePrinter3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *showPrintDialog)(
        ITemplatePrinter3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *showPageSetupDialog)(
        ITemplatePrinter3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *printNonNative)(
        ITemplatePrinter3* This,
        IUnknown *pMarkup,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *printNonNativeFrames)(
        ITemplatePrinter3* This,
        IUnknown *pMarkup,
        VARIANT_BOOL fActiveFrame);

    HRESULT (STDMETHODCALLTYPE *put_framesetDocument)(
        ITemplatePrinter3* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_framesetDocument)(
        ITemplatePrinter3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_frameActive)(
        ITemplatePrinter3* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_frameActive)(
        ITemplatePrinter3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_frameAsShown)(
        ITemplatePrinter3* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_frameAsShown)(
        ITemplatePrinter3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_selection)(
        ITemplatePrinter3* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_selection)(
        ITemplatePrinter3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_selectedPages)(
        ITemplatePrinter3* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_selectedPages)(
        ITemplatePrinter3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_currentPage)(
        ITemplatePrinter3* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_currentPage)(
        ITemplatePrinter3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_currentPageAvail)(
        ITemplatePrinter3* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_currentPageAvail)(
        ITemplatePrinter3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_collate)(
        ITemplatePrinter3* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_collate)(
        ITemplatePrinter3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_duplex)(
        ITemplatePrinter3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_copies)(
        ITemplatePrinter3* This,
        USHORT v);

    HRESULT (STDMETHODCALLTYPE *get_copies)(
        ITemplatePrinter3* This,
        USHORT *p);

    HRESULT (STDMETHODCALLTYPE *put_pageFrom)(
        ITemplatePrinter3* This,
        USHORT v);

    HRESULT (STDMETHODCALLTYPE *get_pageFrom)(
        ITemplatePrinter3* This,
        USHORT *p);

    HRESULT (STDMETHODCALLTYPE *put_pageTo)(
        ITemplatePrinter3* This,
        USHORT v);

    HRESULT (STDMETHODCALLTYPE *get_pageTo)(
        ITemplatePrinter3* This,
        USHORT *p);

    HRESULT (STDMETHODCALLTYPE *put_tableOfLinks)(
        ITemplatePrinter3* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_tableOfLinks)(
        ITemplatePrinter3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_allLinkedDocuments)(
        ITemplatePrinter3* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_allLinkedDocuments)(
        ITemplatePrinter3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_header)(
        ITemplatePrinter3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_header)(
        ITemplatePrinter3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_footer)(
        ITemplatePrinter3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_footer)(
        ITemplatePrinter3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_marginLeft)(
        ITemplatePrinter3* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_marginLeft)(
        ITemplatePrinter3* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_marginRight)(
        ITemplatePrinter3* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_marginRight)(
        ITemplatePrinter3* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_marginTop)(
        ITemplatePrinter3* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_marginTop)(
        ITemplatePrinter3* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_marginBottom)(
        ITemplatePrinter3* This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_marginBottom)(
        ITemplatePrinter3* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_pageWidth)(
        ITemplatePrinter3* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_pageHeight)(
        ITemplatePrinter3* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_unprintableLeft)(
        ITemplatePrinter3* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_unprintableTop)(
        ITemplatePrinter3* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_unprintableRight)(
        ITemplatePrinter3* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_unprintableBottom)(
        ITemplatePrinter3* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *updatePageStatus)(
        ITemplatePrinter3* This,
        LONG *p);

    /*** ITemplatePrinter2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_selectionEnabled)(
        ITemplatePrinter3* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_selectionEnabled)(
        ITemplatePrinter3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_frameActiveEnabled)(
        ITemplatePrinter3* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_frameActiveEnabled)(
        ITemplatePrinter3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *put_orientation)(
        ITemplatePrinter3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_orientation)(
        ITemplatePrinter3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_usePrinterCopyCollate)(
        ITemplatePrinter3* This,
        VARIANT_BOOL v);

    HRESULT (STDMETHODCALLTYPE *get_usePrinterCopyCollate)(
        ITemplatePrinter3* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *deviceSupports)(
        ITemplatePrinter3* This,
        BSTR bstrProperty,
        VARIANT *pvar);

    /*** ITemplatePrinter3 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_headerFooterFont)(
        ITemplatePrinter3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_headerFooterFont)(
        ITemplatePrinter3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *getPageMarginTop)(
        ITemplatePrinter3* This,
        IDispatch *pageRule,
        LONG pageWidth,
        LONG pageHeight,
        VARIANT *pMargin);

    HRESULT (STDMETHODCALLTYPE *getPageMarginRight)(
        ITemplatePrinter3* This,
        IDispatch *pageRule,
        LONG pageWidth,
        LONG pageHeight,
        VARIANT *pMargin);

    HRESULT (STDMETHODCALLTYPE *getPageMarginBottom)(
        ITemplatePrinter3* This,
        IDispatch *pageRule,
        LONG pageWidth,
        LONG pageHeight,
        VARIANT *pMargin);

    HRESULT (STDMETHODCALLTYPE *getPageMarginLeft)(
        ITemplatePrinter3* This,
        IDispatch *pageRule,
        LONG pageWidth,
        LONG pageHeight,
        VARIANT *pMargin);

    HRESULT (STDMETHODCALLTYPE *getPageMarginTopImportant)(
        ITemplatePrinter3* This,
        IDispatch *pageRule,
        VARIANT_BOOL *pbImportant);

    HRESULT (STDMETHODCALLTYPE *getPageMarginRightImportant)(
        ITemplatePrinter3* This,
        IDispatch *pageRule,
        VARIANT_BOOL *pbImportant);

    HRESULT (STDMETHODCALLTYPE *getPageMarginBottomImportant)(
        ITemplatePrinter3* This,
        IDispatch *pageRule,
        VARIANT_BOOL *pbImportant);

    HRESULT (STDMETHODCALLTYPE *getPageMarginLeftImportant)(
        ITemplatePrinter3* This,
        IDispatch *pageRule,
        VARIANT_BOOL *pbImportant);

    END_INTERFACE
} ITemplatePrinter3Vtbl;
interface ITemplatePrinter3 {
    CONST_VTBL ITemplatePrinter3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITemplatePrinter3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITemplatePrinter3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITemplatePrinter3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ITemplatePrinter3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ITemplatePrinter3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ITemplatePrinter3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ITemplatePrinter3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITemplatePrinter methods ***/
#define ITemplatePrinter3_startDoc(This,bstrTitle,p) (This)->lpVtbl->startDoc(This,bstrTitle,p)
#define ITemplatePrinter3_stopDoc(This) (This)->lpVtbl->stopDoc(This)
#define ITemplatePrinter3_printBlankPage(This) (This)->lpVtbl->printBlankPage(This)
#define ITemplatePrinter3_printPage(This,pElemDisp) (This)->lpVtbl->printPage(This,pElemDisp)
#define ITemplatePrinter3_ensurePrintDialogDefaults(This,p) (This)->lpVtbl->ensurePrintDialogDefaults(This,p)
#define ITemplatePrinter3_showPrintDialog(This,p) (This)->lpVtbl->showPrintDialog(This,p)
#define ITemplatePrinter3_showPageSetupDialog(This,p) (This)->lpVtbl->showPageSetupDialog(This,p)
#define ITemplatePrinter3_printNonNative(This,pMarkup,p) (This)->lpVtbl->printNonNative(This,pMarkup,p)
#define ITemplatePrinter3_printNonNativeFrames(This,pMarkup,fActiveFrame) (This)->lpVtbl->printNonNativeFrames(This,pMarkup,fActiveFrame)
#define ITemplatePrinter3_put_framesetDocument(This,v) (This)->lpVtbl->put_framesetDocument(This,v)
#define ITemplatePrinter3_get_framesetDocument(This,p) (This)->lpVtbl->get_framesetDocument(This,p)
#define ITemplatePrinter3_put_frameActive(This,v) (This)->lpVtbl->put_frameActive(This,v)
#define ITemplatePrinter3_get_frameActive(This,p) (This)->lpVtbl->get_frameActive(This,p)
#define ITemplatePrinter3_put_frameAsShown(This,v) (This)->lpVtbl->put_frameAsShown(This,v)
#define ITemplatePrinter3_get_frameAsShown(This,p) (This)->lpVtbl->get_frameAsShown(This,p)
#define ITemplatePrinter3_put_selection(This,v) (This)->lpVtbl->put_selection(This,v)
#define ITemplatePrinter3_get_selection(This,p) (This)->lpVtbl->get_selection(This,p)
#define ITemplatePrinter3_put_selectedPages(This,v) (This)->lpVtbl->put_selectedPages(This,v)
#define ITemplatePrinter3_get_selectedPages(This,p) (This)->lpVtbl->get_selectedPages(This,p)
#define ITemplatePrinter3_put_currentPage(This,v) (This)->lpVtbl->put_currentPage(This,v)
#define ITemplatePrinter3_get_currentPage(This,p) (This)->lpVtbl->get_currentPage(This,p)
#define ITemplatePrinter3_put_currentPageAvail(This,v) (This)->lpVtbl->put_currentPageAvail(This,v)
#define ITemplatePrinter3_get_currentPageAvail(This,p) (This)->lpVtbl->get_currentPageAvail(This,p)
#define ITemplatePrinter3_put_collate(This,v) (This)->lpVtbl->put_collate(This,v)
#define ITemplatePrinter3_get_collate(This,p) (This)->lpVtbl->get_collate(This,p)
#define ITemplatePrinter3_get_duplex(This,p) (This)->lpVtbl->get_duplex(This,p)
#define ITemplatePrinter3_put_copies(This,v) (This)->lpVtbl->put_copies(This,v)
#define ITemplatePrinter3_get_copies(This,p) (This)->lpVtbl->get_copies(This,p)
#define ITemplatePrinter3_put_pageFrom(This,v) (This)->lpVtbl->put_pageFrom(This,v)
#define ITemplatePrinter3_get_pageFrom(This,p) (This)->lpVtbl->get_pageFrom(This,p)
#define ITemplatePrinter3_put_pageTo(This,v) (This)->lpVtbl->put_pageTo(This,v)
#define ITemplatePrinter3_get_pageTo(This,p) (This)->lpVtbl->get_pageTo(This,p)
#define ITemplatePrinter3_put_tableOfLinks(This,v) (This)->lpVtbl->put_tableOfLinks(This,v)
#define ITemplatePrinter3_get_tableOfLinks(This,p) (This)->lpVtbl->get_tableOfLinks(This,p)
#define ITemplatePrinter3_put_allLinkedDocuments(This,v) (This)->lpVtbl->put_allLinkedDocuments(This,v)
#define ITemplatePrinter3_get_allLinkedDocuments(This,p) (This)->lpVtbl->get_allLinkedDocuments(This,p)
#define ITemplatePrinter3_put_header(This,v) (This)->lpVtbl->put_header(This,v)
#define ITemplatePrinter3_get_header(This,p) (This)->lpVtbl->get_header(This,p)
#define ITemplatePrinter3_put_footer(This,v) (This)->lpVtbl->put_footer(This,v)
#define ITemplatePrinter3_get_footer(This,p) (This)->lpVtbl->get_footer(This,p)
#define ITemplatePrinter3_put_marginLeft(This,v) (This)->lpVtbl->put_marginLeft(This,v)
#define ITemplatePrinter3_get_marginLeft(This,p) (This)->lpVtbl->get_marginLeft(This,p)
#define ITemplatePrinter3_put_marginRight(This,v) (This)->lpVtbl->put_marginRight(This,v)
#define ITemplatePrinter3_get_marginRight(This,p) (This)->lpVtbl->get_marginRight(This,p)
#define ITemplatePrinter3_put_marginTop(This,v) (This)->lpVtbl->put_marginTop(This,v)
#define ITemplatePrinter3_get_marginTop(This,p) (This)->lpVtbl->get_marginTop(This,p)
#define ITemplatePrinter3_put_marginBottom(This,v) (This)->lpVtbl->put_marginBottom(This,v)
#define ITemplatePrinter3_get_marginBottom(This,p) (This)->lpVtbl->get_marginBottom(This,p)
#define ITemplatePrinter3_get_pageWidth(This,p) (This)->lpVtbl->get_pageWidth(This,p)
#define ITemplatePrinter3_get_pageHeight(This,p) (This)->lpVtbl->get_pageHeight(This,p)
#define ITemplatePrinter3_get_unprintableLeft(This,p) (This)->lpVtbl->get_unprintableLeft(This,p)
#define ITemplatePrinter3_get_unprintableTop(This,p) (This)->lpVtbl->get_unprintableTop(This,p)
#define ITemplatePrinter3_get_unprintableRight(This,p) (This)->lpVtbl->get_unprintableRight(This,p)
#define ITemplatePrinter3_get_unprintableBottom(This,p) (This)->lpVtbl->get_unprintableBottom(This,p)
#define ITemplatePrinter3_updatePageStatus(This,p) (This)->lpVtbl->updatePageStatus(This,p)
/*** ITemplatePrinter2 methods ***/
#define ITemplatePrinter3_put_selectionEnabled(This,v) (This)->lpVtbl->put_selectionEnabled(This,v)
#define ITemplatePrinter3_get_selectionEnabled(This,p) (This)->lpVtbl->get_selectionEnabled(This,p)
#define ITemplatePrinter3_put_frameActiveEnabled(This,v) (This)->lpVtbl->put_frameActiveEnabled(This,v)
#define ITemplatePrinter3_get_frameActiveEnabled(This,p) (This)->lpVtbl->get_frameActiveEnabled(This,p)
#define ITemplatePrinter3_put_orientation(This,v) (This)->lpVtbl->put_orientation(This,v)
#define ITemplatePrinter3_get_orientation(This,p) (This)->lpVtbl->get_orientation(This,p)
#define ITemplatePrinter3_put_usePrinterCopyCollate(This,v) (This)->lpVtbl->put_usePrinterCopyCollate(This,v)
#define ITemplatePrinter3_get_usePrinterCopyCollate(This,p) (This)->lpVtbl->get_usePrinterCopyCollate(This,p)
#define ITemplatePrinter3_deviceSupports(This,bstrProperty,pvar) (This)->lpVtbl->deviceSupports(This,bstrProperty,pvar)
/*** ITemplatePrinter3 methods ***/
#define ITemplatePrinter3_put_headerFooterFont(This,v) (This)->lpVtbl->put_headerFooterFont(This,v)
#define ITemplatePrinter3_get_headerFooterFont(This,p) (This)->lpVtbl->get_headerFooterFont(This,p)
#define ITemplatePrinter3_getPageMarginTop(This,pageRule,pageWidth,pageHeight,pMargin) (This)->lpVtbl->getPageMarginTop(This,pageRule,pageWidth,pageHeight,pMargin)
#define ITemplatePrinter3_getPageMarginRight(This,pageRule,pageWidth,pageHeight,pMargin) (This)->lpVtbl->getPageMarginRight(This,pageRule,pageWidth,pageHeight,pMargin)
#define ITemplatePrinter3_getPageMarginBottom(This,pageRule,pageWidth,pageHeight,pMargin) (This)->lpVtbl->getPageMarginBottom(This,pageRule,pageWidth,pageHeight,pMargin)
#define ITemplatePrinter3_getPageMarginLeft(This,pageRule,pageWidth,pageHeight,pMargin) (This)->lpVtbl->getPageMarginLeft(This,pageRule,pageWidth,pageHeight,pMargin)
#define ITemplatePrinter3_getPageMarginTopImportant(This,pageRule,pbImportant) (This)->lpVtbl->getPageMarginTopImportant(This,pageRule,pbImportant)
#define ITemplatePrinter3_getPageMarginRightImportant(This,pageRule,pbImportant) (This)->lpVtbl->getPageMarginRightImportant(This,pageRule,pbImportant)
#define ITemplatePrinter3_getPageMarginBottomImportant(This,pageRule,pbImportant) (This)->lpVtbl->getPageMarginBottomImportant(This,pageRule,pbImportant)
#define ITemplatePrinter3_getPageMarginLeftImportant(This,pageRule,pbImportant) (This)->lpVtbl->getPageMarginLeftImportant(This,pageRule,pbImportant)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ITemplatePrinter3_QueryInterface(ITemplatePrinter3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ITemplatePrinter3_AddRef(ITemplatePrinter3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ITemplatePrinter3_Release(ITemplatePrinter3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ITemplatePrinter3_GetTypeInfoCount(ITemplatePrinter3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ITemplatePrinter3_GetTypeInfo(ITemplatePrinter3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ITemplatePrinter3_GetIDsOfNames(ITemplatePrinter3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ITemplatePrinter3_Invoke(ITemplatePrinter3* 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);
}
/*** ITemplatePrinter methods ***/
static FORCEINLINE HRESULT ITemplatePrinter3_startDoc(ITemplatePrinter3* This,BSTR bstrTitle,VARIANT_BOOL *p) {
    return This->lpVtbl->startDoc(This,bstrTitle,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_stopDoc(ITemplatePrinter3* This) {
    return This->lpVtbl->stopDoc(This);
}
static FORCEINLINE HRESULT ITemplatePrinter3_printBlankPage(ITemplatePrinter3* This) {
    return This->lpVtbl->printBlankPage(This);
}
static FORCEINLINE HRESULT ITemplatePrinter3_printPage(ITemplatePrinter3* This,IDispatch *pElemDisp) {
    return This->lpVtbl->printPage(This,pElemDisp);
}
static FORCEINLINE HRESULT ITemplatePrinter3_ensurePrintDialogDefaults(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->ensurePrintDialogDefaults(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_showPrintDialog(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->showPrintDialog(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_showPageSetupDialog(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->showPageSetupDialog(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_printNonNative(ITemplatePrinter3* This,IUnknown *pMarkup,VARIANT_BOOL *p) {
    return This->lpVtbl->printNonNative(This,pMarkup,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_printNonNativeFrames(ITemplatePrinter3* This,IUnknown *pMarkup,VARIANT_BOOL fActiveFrame) {
    return This->lpVtbl->printNonNativeFrames(This,pMarkup,fActiveFrame);
}
static FORCEINLINE HRESULT ITemplatePrinter3_put_framesetDocument(ITemplatePrinter3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_framesetDocument(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_framesetDocument(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_framesetDocument(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_put_frameActive(ITemplatePrinter3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_frameActive(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_frameActive(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_frameActive(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_put_frameAsShown(ITemplatePrinter3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_frameAsShown(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_frameAsShown(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_frameAsShown(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_put_selection(ITemplatePrinter3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_selection(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_selection(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_selection(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_put_selectedPages(ITemplatePrinter3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_selectedPages(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_selectedPages(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_selectedPages(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_put_currentPage(ITemplatePrinter3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_currentPage(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_currentPage(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_currentPage(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_put_currentPageAvail(ITemplatePrinter3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_currentPageAvail(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_currentPageAvail(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_currentPageAvail(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_put_collate(ITemplatePrinter3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_collate(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_collate(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_collate(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_duplex(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_duplex(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_put_copies(ITemplatePrinter3* This,USHORT v) {
    return This->lpVtbl->put_copies(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_copies(ITemplatePrinter3* This,USHORT *p) {
    return This->lpVtbl->get_copies(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_put_pageFrom(ITemplatePrinter3* This,USHORT v) {
    return This->lpVtbl->put_pageFrom(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_pageFrom(ITemplatePrinter3* This,USHORT *p) {
    return This->lpVtbl->get_pageFrom(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_put_pageTo(ITemplatePrinter3* This,USHORT v) {
    return This->lpVtbl->put_pageTo(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_pageTo(ITemplatePrinter3* This,USHORT *p) {
    return This->lpVtbl->get_pageTo(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_put_tableOfLinks(ITemplatePrinter3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_tableOfLinks(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_tableOfLinks(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_tableOfLinks(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_put_allLinkedDocuments(ITemplatePrinter3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_allLinkedDocuments(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_allLinkedDocuments(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_allLinkedDocuments(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_put_header(ITemplatePrinter3* This,BSTR v) {
    return This->lpVtbl->put_header(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_header(ITemplatePrinter3* This,BSTR *p) {
    return This->lpVtbl->get_header(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_put_footer(ITemplatePrinter3* This,BSTR v) {
    return This->lpVtbl->put_footer(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_footer(ITemplatePrinter3* This,BSTR *p) {
    return This->lpVtbl->get_footer(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_put_marginLeft(ITemplatePrinter3* This,LONG v) {
    return This->lpVtbl->put_marginLeft(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_marginLeft(ITemplatePrinter3* This,LONG *p) {
    return This->lpVtbl->get_marginLeft(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_put_marginRight(ITemplatePrinter3* This,LONG v) {
    return This->lpVtbl->put_marginRight(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_marginRight(ITemplatePrinter3* This,LONG *p) {
    return This->lpVtbl->get_marginRight(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_put_marginTop(ITemplatePrinter3* This,LONG v) {
    return This->lpVtbl->put_marginTop(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_marginTop(ITemplatePrinter3* This,LONG *p) {
    return This->lpVtbl->get_marginTop(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_put_marginBottom(ITemplatePrinter3* This,LONG v) {
    return This->lpVtbl->put_marginBottom(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_marginBottom(ITemplatePrinter3* This,LONG *p) {
    return This->lpVtbl->get_marginBottom(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_pageWidth(ITemplatePrinter3* This,LONG *p) {
    return This->lpVtbl->get_pageWidth(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_pageHeight(ITemplatePrinter3* This,LONG *p) {
    return This->lpVtbl->get_pageHeight(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_unprintableLeft(ITemplatePrinter3* This,LONG *p) {
    return This->lpVtbl->get_unprintableLeft(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_unprintableTop(ITemplatePrinter3* This,LONG *p) {
    return This->lpVtbl->get_unprintableTop(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_unprintableRight(ITemplatePrinter3* This,LONG *p) {
    return This->lpVtbl->get_unprintableRight(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_unprintableBottom(ITemplatePrinter3* This,LONG *p) {
    return This->lpVtbl->get_unprintableBottom(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_updatePageStatus(ITemplatePrinter3* This,LONG *p) {
    return This->lpVtbl->updatePageStatus(This,p);
}
/*** ITemplatePrinter2 methods ***/
static FORCEINLINE HRESULT ITemplatePrinter3_put_selectionEnabled(ITemplatePrinter3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_selectionEnabled(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_selectionEnabled(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_selectionEnabled(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_put_frameActiveEnabled(ITemplatePrinter3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_frameActiveEnabled(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_frameActiveEnabled(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_frameActiveEnabled(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_put_orientation(ITemplatePrinter3* This,BSTR v) {
    return This->lpVtbl->put_orientation(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_orientation(ITemplatePrinter3* This,BSTR *p) {
    return This->lpVtbl->get_orientation(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_put_usePrinterCopyCollate(ITemplatePrinter3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_usePrinterCopyCollate(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_usePrinterCopyCollate(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_usePrinterCopyCollate(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_deviceSupports(ITemplatePrinter3* This,BSTR bstrProperty,VARIANT *pvar) {
    return This->lpVtbl->deviceSupports(This,bstrProperty,pvar);
}
/*** ITemplatePrinter3 methods ***/
static FORCEINLINE HRESULT ITemplatePrinter3_put_headerFooterFont(ITemplatePrinter3* This,BSTR v) {
    return This->lpVtbl->put_headerFooterFont(This,v);
}
static FORCEINLINE HRESULT ITemplatePrinter3_get_headerFooterFont(ITemplatePrinter3* This,BSTR *p) {
    return This->lpVtbl->get_headerFooterFont(This,p);
}
static FORCEINLINE HRESULT ITemplatePrinter3_getPageMarginTop(ITemplatePrinter3* This,IDispatch *pageRule,LONG pageWidth,LONG pageHeight,VARIANT *pMargin) {
    return This->lpVtbl->getPageMarginTop(This,pageRule,pageWidth,pageHeight,pMargin);
}
static FORCEINLINE HRESULT ITemplatePrinter3_getPageMarginRight(ITemplatePrinter3* This,IDispatch *pageRule,LONG pageWidth,LONG pageHeight,VARIANT *pMargin) {
    return This->lpVtbl->getPageMarginRight(This,pageRule,pageWidth,pageHeight,pMargin);
}
static FORCEINLINE HRESULT ITemplatePrinter3_getPageMarginBottom(ITemplatePrinter3* This,IDispatch *pageRule,LONG pageWidth,LONG pageHeight,VARIANT *pMargin) {
    return This->lpVtbl->getPageMarginBottom(This,pageRule,pageWidth,pageHeight,pMargin);
}
static FORCEINLINE HRESULT ITemplatePrinter3_getPageMarginLeft(ITemplatePrinter3* This,IDispatch *pageRule,LONG pageWidth,LONG pageHeight,VARIANT *pMargin) {
    return This->lpVtbl->getPageMarginLeft(This,pageRule,pageWidth,pageHeight,pMargin);
}
static FORCEINLINE HRESULT ITemplatePrinter3_getPageMarginTopImportant(ITemplatePrinter3* This,IDispatch *pageRule,VARIANT_BOOL *pbImportant) {
    return This->lpVtbl->getPageMarginTopImportant(This,pageRule,pbImportant);
}
static FORCEINLINE HRESULT ITemplatePrinter3_getPageMarginRightImportant(ITemplatePrinter3* This,IDispatch *pageRule,VARIANT_BOOL *pbImportant) {
    return This->lpVtbl->getPageMarginRightImportant(This,pageRule,pbImportant);
}
static FORCEINLINE HRESULT ITemplatePrinter3_getPageMarginBottomImportant(ITemplatePrinter3* This,IDispatch *pageRule,VARIANT_BOOL *pbImportant) {
    return This->lpVtbl->getPageMarginBottomImportant(This,pageRule,pbImportant);
}
static FORCEINLINE HRESULT ITemplatePrinter3_getPageMarginLeftImportant(ITemplatePrinter3* This,IDispatch *pageRule,VARIANT_BOOL *pbImportant) {
    return This->lpVtbl->getPageMarginLeftImportant(This,pageRule,pbImportant);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ITemplatePrinter3_put_headerFooterFont_Proxy(
    ITemplatePrinter3* This,
    BSTR v);
void __RPC_STUB ITemplatePrinter3_put_headerFooterFont_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter3_get_headerFooterFont_Proxy(
    ITemplatePrinter3* This,
    BSTR *p);
void __RPC_STUB ITemplatePrinter3_get_headerFooterFont_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter3_getPageMarginTop_Proxy(
    ITemplatePrinter3* This,
    IDispatch *pageRule,
    LONG pageWidth,
    LONG pageHeight,
    VARIANT *pMargin);
void __RPC_STUB ITemplatePrinter3_getPageMarginTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter3_getPageMarginRight_Proxy(
    ITemplatePrinter3* This,
    IDispatch *pageRule,
    LONG pageWidth,
    LONG pageHeight,
    VARIANT *pMargin);
void __RPC_STUB ITemplatePrinter3_getPageMarginRight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter3_getPageMarginBottom_Proxy(
    ITemplatePrinter3* This,
    IDispatch *pageRule,
    LONG pageWidth,
    LONG pageHeight,
    VARIANT *pMargin);
void __RPC_STUB ITemplatePrinter3_getPageMarginBottom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter3_getPageMarginLeft_Proxy(
    ITemplatePrinter3* This,
    IDispatch *pageRule,
    LONG pageWidth,
    LONG pageHeight,
    VARIANT *pMargin);
void __RPC_STUB ITemplatePrinter3_getPageMarginLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter3_getPageMarginTopImportant_Proxy(
    ITemplatePrinter3* This,
    IDispatch *pageRule,
    VARIANT_BOOL *pbImportant);
void __RPC_STUB ITemplatePrinter3_getPageMarginTopImportant_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter3_getPageMarginRightImportant_Proxy(
    ITemplatePrinter3* This,
    IDispatch *pageRule,
    VARIANT_BOOL *pbImportant);
void __RPC_STUB ITemplatePrinter3_getPageMarginRightImportant_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter3_getPageMarginBottomImportant_Proxy(
    ITemplatePrinter3* This,
    IDispatch *pageRule,
    VARIANT_BOOL *pbImportant);
void __RPC_STUB ITemplatePrinter3_getPageMarginBottomImportant_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITemplatePrinter3_getPageMarginLeftImportant_Proxy(
    ITemplatePrinter3* This,
    IDispatch *pageRule,
    VARIANT_BOOL *pbImportant);
void __RPC_STUB ITemplatePrinter3_getPageMarginLeftImportant_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ITemplatePrinter3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IPrintManagerTemplatePrinter interface
 */
#ifndef __IPrintManagerTemplatePrinter_INTERFACE_DEFINED__
#define __IPrintManagerTemplatePrinter_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPrintManagerTemplatePrinter, 0xf633be14, 0x9eff, 0x4c4d, 0x92,0x9e, 0x05,0x71,0x7b,0x21,0xb3,0xe6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f633be14-9eff-4c4d-929e-05717b21b3e6")
IPrintManagerTemplatePrinter : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE startPrint(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE drawPreviewPage(
        IDispatch *pElemDisp,
        LONG nPage) = 0;

    virtual HRESULT STDMETHODCALLTYPE setPageCount(
        LONG nPage) = 0;

    virtual HRESULT STDMETHODCALLTYPE invalidatePreview(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE getPrintTaskOptionValue(
        BSTR bstrKey,
        VARIANT *pvarin) = 0;

    virtual HRESULT STDMETHODCALLTYPE endPrint(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPrintManagerTemplatePrinter, 0xf633be14, 0x9eff, 0x4c4d, 0x92,0x9e, 0x05,0x71,0x7b,0x21,0xb3,0xe6)
#endif
#else
typedef struct IPrintManagerTemplatePrinterVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPrintManagerTemplatePrinter* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPrintManagerTemplatePrinter* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPrintManagerTemplatePrinter* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IPrintManagerTemplatePrinter* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IPrintManagerTemplatePrinter* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IPrintManagerTemplatePrinter* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IPrintManagerTemplatePrinter* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IPrintManagerTemplatePrinter methods ***/
    HRESULT (STDMETHODCALLTYPE *startPrint)(
        IPrintManagerTemplatePrinter* This);

    HRESULT (STDMETHODCALLTYPE *drawPreviewPage)(
        IPrintManagerTemplatePrinter* This,
        IDispatch *pElemDisp,
        LONG nPage);

    HRESULT (STDMETHODCALLTYPE *setPageCount)(
        IPrintManagerTemplatePrinter* This,
        LONG nPage);

    HRESULT (STDMETHODCALLTYPE *invalidatePreview)(
        IPrintManagerTemplatePrinter* This);

    HRESULT (STDMETHODCALLTYPE *getPrintTaskOptionValue)(
        IPrintManagerTemplatePrinter* This,
        BSTR bstrKey,
        VARIANT *pvarin);

    HRESULT (STDMETHODCALLTYPE *endPrint)(
        IPrintManagerTemplatePrinter* This);

    END_INTERFACE
} IPrintManagerTemplatePrinterVtbl;
interface IPrintManagerTemplatePrinter {
    CONST_VTBL IPrintManagerTemplatePrinterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPrintManagerTemplatePrinter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPrintManagerTemplatePrinter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPrintManagerTemplatePrinter_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IPrintManagerTemplatePrinter_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IPrintManagerTemplatePrinter_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IPrintManagerTemplatePrinter_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IPrintManagerTemplatePrinter_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IPrintManagerTemplatePrinter methods ***/
#define IPrintManagerTemplatePrinter_startPrint(This) (This)->lpVtbl->startPrint(This)
#define IPrintManagerTemplatePrinter_drawPreviewPage(This,pElemDisp,nPage) (This)->lpVtbl->drawPreviewPage(This,pElemDisp,nPage)
#define IPrintManagerTemplatePrinter_setPageCount(This,nPage) (This)->lpVtbl->setPageCount(This,nPage)
#define IPrintManagerTemplatePrinter_invalidatePreview(This) (This)->lpVtbl->invalidatePreview(This)
#define IPrintManagerTemplatePrinter_getPrintTaskOptionValue(This,bstrKey,pvarin) (This)->lpVtbl->getPrintTaskOptionValue(This,bstrKey,pvarin)
#define IPrintManagerTemplatePrinter_endPrint(This) (This)->lpVtbl->endPrint(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IPrintManagerTemplatePrinter_QueryInterface(IPrintManagerTemplatePrinter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IPrintManagerTemplatePrinter_AddRef(IPrintManagerTemplatePrinter* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IPrintManagerTemplatePrinter_Release(IPrintManagerTemplatePrinter* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IPrintManagerTemplatePrinter_GetTypeInfoCount(IPrintManagerTemplatePrinter* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IPrintManagerTemplatePrinter_GetTypeInfo(IPrintManagerTemplatePrinter* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IPrintManagerTemplatePrinter_GetIDsOfNames(IPrintManagerTemplatePrinter* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IPrintManagerTemplatePrinter_Invoke(IPrintManagerTemplatePrinter* 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);
}
/*** IPrintManagerTemplatePrinter methods ***/
static FORCEINLINE HRESULT IPrintManagerTemplatePrinter_startPrint(IPrintManagerTemplatePrinter* This) {
    return This->lpVtbl->startPrint(This);
}
static FORCEINLINE HRESULT IPrintManagerTemplatePrinter_drawPreviewPage(IPrintManagerTemplatePrinter* This,IDispatch *pElemDisp,LONG nPage) {
    return This->lpVtbl->drawPreviewPage(This,pElemDisp,nPage);
}
static FORCEINLINE HRESULT IPrintManagerTemplatePrinter_setPageCount(IPrintManagerTemplatePrinter* This,LONG nPage) {
    return This->lpVtbl->setPageCount(This,nPage);
}
static FORCEINLINE HRESULT IPrintManagerTemplatePrinter_invalidatePreview(IPrintManagerTemplatePrinter* This) {
    return This->lpVtbl->invalidatePreview(This);
}
static FORCEINLINE HRESULT IPrintManagerTemplatePrinter_getPrintTaskOptionValue(IPrintManagerTemplatePrinter* This,BSTR bstrKey,VARIANT *pvarin) {
    return This->lpVtbl->getPrintTaskOptionValue(This,bstrKey,pvarin);
}
static FORCEINLINE HRESULT IPrintManagerTemplatePrinter_endPrint(IPrintManagerTemplatePrinter* This) {
    return This->lpVtbl->endPrint(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IPrintManagerTemplatePrinter_startPrint_Proxy(
    IPrintManagerTemplatePrinter* This);
void __RPC_STUB IPrintManagerTemplatePrinter_startPrint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IPrintManagerTemplatePrinter_drawPreviewPage_Proxy(
    IPrintManagerTemplatePrinter* This,
    IDispatch *pElemDisp,
    LONG nPage);
void __RPC_STUB IPrintManagerTemplatePrinter_drawPreviewPage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IPrintManagerTemplatePrinter_setPageCount_Proxy(
    IPrintManagerTemplatePrinter* This,
    LONG nPage);
void __RPC_STUB IPrintManagerTemplatePrinter_setPageCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IPrintManagerTemplatePrinter_invalidatePreview_Proxy(
    IPrintManagerTemplatePrinter* This);
void __RPC_STUB IPrintManagerTemplatePrinter_invalidatePreview_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IPrintManagerTemplatePrinter_getPrintTaskOptionValue_Proxy(
    IPrintManagerTemplatePrinter* This,
    BSTR bstrKey,
    VARIANT *pvarin);
void __RPC_STUB IPrintManagerTemplatePrinter_getPrintTaskOptionValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IPrintManagerTemplatePrinter_endPrint_Proxy(
    IPrintManagerTemplatePrinter* This);
void __RPC_STUB IPrintManagerTemplatePrinter_endPrint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IPrintManagerTemplatePrinter_INTERFACE_DEFINED__ */

/*****************************************************************************
 * CTemplatePrinter coclass
 */

DEFINE_GUID(CLSID_CTemplatePrinter, 0x3050f6b3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f6b3-98b5-11cf-bb82-00aa00bdce0b") CTemplatePrinter;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(CTemplatePrinter, 0x3050f6b3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CTemplatePrinter;
/*****************************************************************************
 * DispCPrintManagerTemplatePrinter dispinterface
 */
#ifndef __DispCPrintManagerTemplatePrinter_DISPINTERFACE_DEFINED__
#define __DispCPrintManagerTemplatePrinter_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispCPrintManagerTemplatePrinter, 0x305900e9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305900e9-98b5-11cf-bb82-00aa00bdce0b")
DispCPrintManagerTemplatePrinter : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispCPrintManagerTemplatePrinter, 0x305900e9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispCPrintManagerTemplatePrinterVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispCPrintManagerTemplatePrinter* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispCPrintManagerTemplatePrinter* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispCPrintManagerTemplatePrinter* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispCPrintManagerTemplatePrinter* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispCPrintManagerTemplatePrinter* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispCPrintManagerTemplatePrinter* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispCPrintManagerTemplatePrinter* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispCPrintManagerTemplatePrinterVtbl;
interface DispCPrintManagerTemplatePrinter {
    CONST_VTBL DispCPrintManagerTemplatePrinterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispCPrintManagerTemplatePrinter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispCPrintManagerTemplatePrinter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispCPrintManagerTemplatePrinter_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispCPrintManagerTemplatePrinter_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispCPrintManagerTemplatePrinter_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispCPrintManagerTemplatePrinter_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispCPrintManagerTemplatePrinter_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 DispCPrintManagerTemplatePrinter_QueryInterface(DispCPrintManagerTemplatePrinter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispCPrintManagerTemplatePrinter_AddRef(DispCPrintManagerTemplatePrinter* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispCPrintManagerTemplatePrinter_Release(DispCPrintManagerTemplatePrinter* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispCPrintManagerTemplatePrinter_GetTypeInfoCount(DispCPrintManagerTemplatePrinter* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispCPrintManagerTemplatePrinter_GetTypeInfo(DispCPrintManagerTemplatePrinter* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispCPrintManagerTemplatePrinter_GetIDsOfNames(DispCPrintManagerTemplatePrinter* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispCPrintManagerTemplatePrinter_Invoke(DispCPrintManagerTemplatePrinter* 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  /* __DispCPrintManagerTemplatePrinter_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * CPrintManagerTemplatePrinter coclass
 */

DEFINE_GUID(CLSID_CPrintManagerTemplatePrinter, 0x63619f54, 0x9d71, 0x4c23, 0xa0,0x8d, 0x50,0xd7,0xf1,0x8d,0xb2,0xe9);

#ifdef __cplusplus
class DECLSPEC_UUID("63619f54-9d71-4c23-a08d-50d7f18db2e9") CPrintManagerTemplatePrinter;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(CPrintManagerTemplatePrinter, 0x63619f54, 0x9d71, 0x4c23, 0xa0,0x8d, 0x50,0xd7,0xf1,0x8d,0xb2,0xe9)
#endif
#endif

EXTERN_C const GUID CLSID_CPrintManagerTemplatePrinter;
typedef enum _textpathMethodtype {
    TEXTPATH_METHODTYPE_UNKNOWN = 0,
    TEXTPATH_METHODTYPE_ALIGN = 1,
    TEXTPATH_METHODTYPE_STRETCH = 2,
    textpathMethodtype_Max = 0x7fffffff
} textpathMethodtype;
typedef enum _textpathSpacingtype {
    TEXTPATH_SPACINGTYPE_UNKNOWN = 0,
    TEXTPATH_SPACINGTYPE_AUTO = 1,
    TEXTPATH_SPACINGTYPE_EXACT = 2,
    textpathSpacingtype_Max = 0x7fffffff
} textpathSpacingtype;
/*****************************************************************************
 * ISVGTextPathElement interface
 */
#ifndef __ISVGTextPathElement_INTERFACE_DEFINED__
#define __ISVGTextPathElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISVGTextPathElement, 0x3051051f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051051f-98b5-11cf-bb82-00aa00bdce0b")
ISVGTextPathElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_startOffset(
        ISVGAnimatedLength *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_startOffset(
        ISVGAnimatedLength **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_method(
        ISVGAnimatedEnumeration *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_method(
        ISVGAnimatedEnumeration **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_spacing(
        ISVGAnimatedEnumeration *v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_spacing(
        ISVGAnimatedEnumeration **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISVGTextPathElement, 0x3051051f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISVGTextPathElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISVGTextPathElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISVGTextPathElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISVGTextPathElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISVGTextPathElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISVGTextPathElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISVGTextPathElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISVGTextPathElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISVGTextPathElement methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_startOffset)(
        ISVGTextPathElement* This,
        ISVGAnimatedLength *v);

    HRESULT (STDMETHODCALLTYPE *get_startOffset)(
        ISVGTextPathElement* This,
        ISVGAnimatedLength **p);

    HRESULT (STDMETHODCALLTYPE *putref_method)(
        ISVGTextPathElement* This,
        ISVGAnimatedEnumeration *v);

    HRESULT (STDMETHODCALLTYPE *get_method)(
        ISVGTextPathElement* This,
        ISVGAnimatedEnumeration **p);

    HRESULT (STDMETHODCALLTYPE *putref_spacing)(
        ISVGTextPathElement* This,
        ISVGAnimatedEnumeration *v);

    HRESULT (STDMETHODCALLTYPE *get_spacing)(
        ISVGTextPathElement* This,
        ISVGAnimatedEnumeration **p);

    END_INTERFACE
} ISVGTextPathElementVtbl;
interface ISVGTextPathElement {
    CONST_VTBL ISVGTextPathElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISVGTextPathElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISVGTextPathElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISVGTextPathElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISVGTextPathElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISVGTextPathElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISVGTextPathElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISVGTextPathElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISVGTextPathElement methods ***/
#define ISVGTextPathElement_putref_startOffset(This,v) (This)->lpVtbl->putref_startOffset(This,v)
#define ISVGTextPathElement_get_startOffset(This,p) (This)->lpVtbl->get_startOffset(This,p)
#define ISVGTextPathElement_putref_method(This,v) (This)->lpVtbl->putref_method(This,v)
#define ISVGTextPathElement_get_method(This,p) (This)->lpVtbl->get_method(This,p)
#define ISVGTextPathElement_putref_spacing(This,v) (This)->lpVtbl->putref_spacing(This,v)
#define ISVGTextPathElement_get_spacing(This,p) (This)->lpVtbl->get_spacing(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISVGTextPathElement_QueryInterface(ISVGTextPathElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISVGTextPathElement_AddRef(ISVGTextPathElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISVGTextPathElement_Release(ISVGTextPathElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISVGTextPathElement_GetTypeInfoCount(ISVGTextPathElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISVGTextPathElement_GetTypeInfo(ISVGTextPathElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISVGTextPathElement_GetIDsOfNames(ISVGTextPathElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISVGTextPathElement_Invoke(ISVGTextPathElement* 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);
}
/*** ISVGTextPathElement methods ***/
static FORCEINLINE HRESULT ISVGTextPathElement_putref_startOffset(ISVGTextPathElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_startOffset(This,v);
}
static FORCEINLINE HRESULT ISVGTextPathElement_get_startOffset(ISVGTextPathElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_startOffset(This,p);
}
static FORCEINLINE HRESULT ISVGTextPathElement_putref_method(ISVGTextPathElement* This,ISVGAnimatedEnumeration *v) {
    return This->lpVtbl->putref_method(This,v);
}
static FORCEINLINE HRESULT ISVGTextPathElement_get_method(ISVGTextPathElement* This,ISVGAnimatedEnumeration **p) {
    return This->lpVtbl->get_method(This,p);
}
static FORCEINLINE HRESULT ISVGTextPathElement_putref_spacing(ISVGTextPathElement* This,ISVGAnimatedEnumeration *v) {
    return This->lpVtbl->putref_spacing(This,v);
}
static FORCEINLINE HRESULT ISVGTextPathElement_get_spacing(ISVGTextPathElement* This,ISVGAnimatedEnumeration **p) {
    return This->lpVtbl->get_spacing(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISVGTextPathElement_putref_startOffset_Proxy(
    ISVGTextPathElement* This,
    ISVGAnimatedLength *v);
void __RPC_STUB ISVGTextPathElement_putref_startOffset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTextPathElement_get_startOffset_Proxy(
    ISVGTextPathElement* This,
    ISVGAnimatedLength **p);
void __RPC_STUB ISVGTextPathElement_get_startOffset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTextPathElement_putref_method_Proxy(
    ISVGTextPathElement* This,
    ISVGAnimatedEnumeration *v);
void __RPC_STUB ISVGTextPathElement_putref_method_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTextPathElement_get_method_Proxy(
    ISVGTextPathElement* This,
    ISVGAnimatedEnumeration **p);
void __RPC_STUB ISVGTextPathElement_get_method_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTextPathElement_putref_spacing_Proxy(
    ISVGTextPathElement* This,
    ISVGAnimatedEnumeration *v);
void __RPC_STUB ISVGTextPathElement_putref_spacing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISVGTextPathElement_get_spacing_Proxy(
    ISVGTextPathElement* This,
    ISVGAnimatedEnumeration **p);
void __RPC_STUB ISVGTextPathElement_get_spacing_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISVGTextPathElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispSVGTextPathElement dispinterface
 */
#ifndef __DispSVGTextPathElement_DISPINTERFACE_DEFINED__
#define __DispSVGTextPathElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispSVGTextPathElement, 0x3059003d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3059003d-98b5-11cf-bb82-00aa00bdce0b")
DispSVGTextPathElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispSVGTextPathElement, 0x3059003d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispSVGTextPathElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispSVGTextPathElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispSVGTextPathElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispSVGTextPathElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispSVGTextPathElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispSVGTextPathElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispSVGTextPathElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispSVGTextPathElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispSVGTextPathElementVtbl;
interface DispSVGTextPathElement {
    CONST_VTBL DispSVGTextPathElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispSVGTextPathElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispSVGTextPathElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispSVGTextPathElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispSVGTextPathElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispSVGTextPathElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispSVGTextPathElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispSVGTextPathElement_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 DispSVGTextPathElement_QueryInterface(DispSVGTextPathElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispSVGTextPathElement_AddRef(DispSVGTextPathElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispSVGTextPathElement_Release(DispSVGTextPathElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispSVGTextPathElement_GetTypeInfoCount(DispSVGTextPathElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispSVGTextPathElement_GetTypeInfo(DispSVGTextPathElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispSVGTextPathElement_GetIDsOfNames(DispSVGTextPathElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispSVGTextPathElement_Invoke(DispSVGTextPathElement* 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  /* __DispSVGTextPathElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * SVGTextPathElement coclass
 */

DEFINE_GUID(CLSID_SVGTextPathElement, 0x305105eb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305105eb-98b5-11cf-bb82-00aa00bdce0b") SVGTextPathElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SVGTextPathElement, 0x305105eb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSVGTextPathElement;
/*****************************************************************************
 * IDOMXmlSerializer interface
 */
#ifndef __IDOMXmlSerializer_INTERFACE_DEFINED__
#define __IDOMXmlSerializer_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMXmlSerializer, 0x3051077d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051077d-98b5-11cf-bb82-00aa00bdce0b")
IDOMXmlSerializer : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE serializeToString(
        IHTMLDOMNode *pNode,
        BSTR *pString) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMXmlSerializer, 0x3051077d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMXmlSerializerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMXmlSerializer* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMXmlSerializer* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMXmlSerializer* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDOMXmlSerializer* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDOMXmlSerializer* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDOMXmlSerializer* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDOMXmlSerializer* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDOMXmlSerializer methods ***/
    HRESULT (STDMETHODCALLTYPE *serializeToString)(
        IDOMXmlSerializer* This,
        IHTMLDOMNode *pNode,
        BSTR *pString);

    END_INTERFACE
} IDOMXmlSerializerVtbl;
interface IDOMXmlSerializer {
    CONST_VTBL IDOMXmlSerializerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMXmlSerializer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMXmlSerializer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMXmlSerializer_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDOMXmlSerializer_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDOMXmlSerializer_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDOMXmlSerializer_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDOMXmlSerializer_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDOMXmlSerializer methods ***/
#define IDOMXmlSerializer_serializeToString(This,pNode,pString) (This)->lpVtbl->serializeToString(This,pNode,pString)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMXmlSerializer_QueryInterface(IDOMXmlSerializer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMXmlSerializer_AddRef(IDOMXmlSerializer* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMXmlSerializer_Release(IDOMXmlSerializer* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDOMXmlSerializer_GetTypeInfoCount(IDOMXmlSerializer* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDOMXmlSerializer_GetTypeInfo(IDOMXmlSerializer* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDOMXmlSerializer_GetIDsOfNames(IDOMXmlSerializer* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDOMXmlSerializer_Invoke(IDOMXmlSerializer* 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);
}
/*** IDOMXmlSerializer methods ***/
static FORCEINLINE HRESULT IDOMXmlSerializer_serializeToString(IDOMXmlSerializer* This,IHTMLDOMNode *pNode,BSTR *pString) {
    return This->lpVtbl->serializeToString(This,pNode,pString);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMXmlSerializer_serializeToString_Proxy(
    IDOMXmlSerializer* This,
    IHTMLDOMNode *pNode,
    BSTR *pString);
void __RPC_STUB IDOMXmlSerializer_serializeToString_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMXmlSerializer_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDOMXmlSerializerFactory interface
 */
#ifndef __IDOMXmlSerializerFactory_INTERFACE_DEFINED__
#define __IDOMXmlSerializerFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMXmlSerializerFactory, 0x3051077f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051077f-98b5-11cf-bb82-00aa00bdce0b")
IDOMXmlSerializerFactory : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE create(
        IDOMXmlSerializer **a) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMXmlSerializerFactory, 0x3051077f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMXmlSerializerFactoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMXmlSerializerFactory* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMXmlSerializerFactory* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMXmlSerializerFactory* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDOMXmlSerializerFactory* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDOMXmlSerializerFactory* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDOMXmlSerializerFactory* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDOMXmlSerializerFactory* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDOMXmlSerializerFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *create)(
        IDOMXmlSerializerFactory* This,
        IDOMXmlSerializer **a);

    END_INTERFACE
} IDOMXmlSerializerFactoryVtbl;
interface IDOMXmlSerializerFactory {
    CONST_VTBL IDOMXmlSerializerFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMXmlSerializerFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMXmlSerializerFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMXmlSerializerFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDOMXmlSerializerFactory_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDOMXmlSerializerFactory_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDOMXmlSerializerFactory_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDOMXmlSerializerFactory_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDOMXmlSerializerFactory methods ***/
#define IDOMXmlSerializerFactory_create(This,a) (This)->lpVtbl->create(This,a)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMXmlSerializerFactory_QueryInterface(IDOMXmlSerializerFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMXmlSerializerFactory_AddRef(IDOMXmlSerializerFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMXmlSerializerFactory_Release(IDOMXmlSerializerFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDOMXmlSerializerFactory_GetTypeInfoCount(IDOMXmlSerializerFactory* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDOMXmlSerializerFactory_GetTypeInfo(IDOMXmlSerializerFactory* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDOMXmlSerializerFactory_GetIDsOfNames(IDOMXmlSerializerFactory* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDOMXmlSerializerFactory_Invoke(IDOMXmlSerializerFactory* 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);
}
/*** IDOMXmlSerializerFactory methods ***/
static FORCEINLINE HRESULT IDOMXmlSerializerFactory_create(IDOMXmlSerializerFactory* This,IDOMXmlSerializer **a) {
    return This->lpVtbl->create(This,a);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMXmlSerializerFactory_create_Proxy(
    IDOMXmlSerializerFactory* This,
    IDOMXmlSerializer **a);
void __RPC_STUB IDOMXmlSerializerFactory_create_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMXmlSerializerFactory_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDOMParser interface
 */
#ifndef __IDOMParser_INTERFACE_DEFINED__
#define __IDOMParser_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMParser, 0x30510781, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510781-98b5-11cf-bb82-00aa00bdce0b")
IDOMParser : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE parseFromString(
        BSTR xmlSource,
        BSTR mimeType,
        IHTMLDocument2 **ppNode) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMParser, 0x30510781, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMParserVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMParser* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMParser* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMParser* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDOMParser* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDOMParser* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDOMParser* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDOMParser* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDOMParser methods ***/
    HRESULT (STDMETHODCALLTYPE *parseFromString)(
        IDOMParser* This,
        BSTR xmlSource,
        BSTR mimeType,
        IHTMLDocument2 **ppNode);

    END_INTERFACE
} IDOMParserVtbl;
interface IDOMParser {
    CONST_VTBL IDOMParserVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMParser_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMParser_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMParser_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDOMParser_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDOMParser_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDOMParser_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDOMParser_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDOMParser methods ***/
#define IDOMParser_parseFromString(This,xmlSource,mimeType,ppNode) (This)->lpVtbl->parseFromString(This,xmlSource,mimeType,ppNode)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMParser_QueryInterface(IDOMParser* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMParser_AddRef(IDOMParser* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMParser_Release(IDOMParser* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDOMParser_GetTypeInfoCount(IDOMParser* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDOMParser_GetTypeInfo(IDOMParser* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDOMParser_GetIDsOfNames(IDOMParser* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDOMParser_Invoke(IDOMParser* 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);
}
/*** IDOMParser methods ***/
static FORCEINLINE HRESULT IDOMParser_parseFromString(IDOMParser* This,BSTR xmlSource,BSTR mimeType,IHTMLDocument2 **ppNode) {
    return This->lpVtbl->parseFromString(This,xmlSource,mimeType,ppNode);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMParser_parseFromString_Proxy(
    IDOMParser* This,
    BSTR xmlSource,
    BSTR mimeType,
    IHTMLDocument2 **ppNode);
void __RPC_STUB IDOMParser_parseFromString_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMParser_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDOMParserFactory interface
 */
#ifndef __IDOMParserFactory_INTERFACE_DEFINED__
#define __IDOMParserFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMParserFactory, 0x30510783, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510783-98b5-11cf-bb82-00aa00bdce0b")
IDOMParserFactory : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE create(
        IDOMParser **a) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMParserFactory, 0x30510783, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMParserFactoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMParserFactory* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMParserFactory* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMParserFactory* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDOMParserFactory* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDOMParserFactory* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDOMParserFactory* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDOMParserFactory* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDOMParserFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *create)(
        IDOMParserFactory* This,
        IDOMParser **a);

    END_INTERFACE
} IDOMParserFactoryVtbl;
interface IDOMParserFactory {
    CONST_VTBL IDOMParserFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMParserFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMParserFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMParserFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDOMParserFactory_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDOMParserFactory_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDOMParserFactory_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDOMParserFactory_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDOMParserFactory methods ***/
#define IDOMParserFactory_create(This,a) (This)->lpVtbl->create(This,a)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMParserFactory_QueryInterface(IDOMParserFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMParserFactory_AddRef(IDOMParserFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMParserFactory_Release(IDOMParserFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDOMParserFactory_GetTypeInfoCount(IDOMParserFactory* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDOMParserFactory_GetTypeInfo(IDOMParserFactory* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDOMParserFactory_GetIDsOfNames(IDOMParserFactory* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDOMParserFactory_Invoke(IDOMParserFactory* 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);
}
/*** IDOMParserFactory methods ***/
static FORCEINLINE HRESULT IDOMParserFactory_create(IDOMParserFactory* This,IDOMParser **a) {
    return This->lpVtbl->create(This,a);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMParserFactory_create_Proxy(
    IDOMParserFactory* This,
    IDOMParser **a);
void __RPC_STUB IDOMParserFactory_create_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMParserFactory_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispXMLSerializer dispinterface
 */
#ifndef __DispXMLSerializer_DISPINTERFACE_DEFINED__
#define __DispXMLSerializer_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispXMLSerializer, 0x305900ad, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305900ad-98b5-11cf-bb82-00aa00bdce0b")
DispXMLSerializer : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispXMLSerializer, 0x305900ad, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispXMLSerializerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispXMLSerializer* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispXMLSerializer* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispXMLSerializer* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispXMLSerializer* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispXMLSerializer* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispXMLSerializer* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispXMLSerializer* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispXMLSerializerVtbl;
interface DispXMLSerializer {
    CONST_VTBL DispXMLSerializerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispXMLSerializer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispXMLSerializer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispXMLSerializer_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispXMLSerializer_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispXMLSerializer_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispXMLSerializer_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispXMLSerializer_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 DispXMLSerializer_QueryInterface(DispXMLSerializer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispXMLSerializer_AddRef(DispXMLSerializer* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispXMLSerializer_Release(DispXMLSerializer* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispXMLSerializer_GetTypeInfoCount(DispXMLSerializer* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispXMLSerializer_GetTypeInfo(DispXMLSerializer* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispXMLSerializer_GetIDsOfNames(DispXMLSerializer* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispXMLSerializer_Invoke(DispXMLSerializer* 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  /* __DispXMLSerializer_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * XMLSerializer coclass
 */

DEFINE_GUID(CLSID_XMLSerializer, 0x3051077e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3051077e-98b5-11cf-bb82-00aa00bdce0b") XMLSerializer;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XMLSerializer, 0x3051077e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDOMXmlSerializer;
/*****************************************************************************
 * HTMLDOMXmlSerializerFactory coclass
 */

DEFINE_GUID(CLSID_HTMLDOMXmlSerializerFactory, 0x30510780, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510780-98b5-11cf-bb82-00aa00bdce0b") HTMLDOMXmlSerializerFactory;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLDOMXmlSerializerFactory, 0x30510780, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDOMXmlSerializerFactory;
/*****************************************************************************
 * DispDOMParser dispinterface
 */
#ifndef __DispDOMParser_DISPINTERFACE_DEFINED__
#define __DispDOMParser_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispDOMParser, 0x305900ae, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305900ae-98b5-11cf-bb82-00aa00bdce0b")
DispDOMParser : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispDOMParser, 0x305900ae, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispDOMParserVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispDOMParser* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispDOMParser* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispDOMParser* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispDOMParser* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispDOMParser* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispDOMParser* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispDOMParser* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispDOMParserVtbl;
interface DispDOMParser {
    CONST_VTBL DispDOMParserVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispDOMParser_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispDOMParser_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispDOMParser_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispDOMParser_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispDOMParser_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispDOMParser_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispDOMParser_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 DispDOMParser_QueryInterface(DispDOMParser* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispDOMParser_AddRef(DispDOMParser* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispDOMParser_Release(DispDOMParser* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispDOMParser_GetTypeInfoCount(DispDOMParser* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispDOMParser_GetTypeInfo(DispDOMParser* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispDOMParser_GetIDsOfNames(DispDOMParser* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispDOMParser_Invoke(DispDOMParser* 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  /* __DispDOMParser_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * DOMParser coclass
 */

DEFINE_GUID(CLSID_DOMParser, 0x30510782, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510782-98b5-11cf-bb82-00aa00bdce0b") DOMParser;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMParser, 0x30510782, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDOMParser;
/*****************************************************************************
 * DOMParserFactory coclass
 */

DEFINE_GUID(CLSID_DOMParserFactory, 0x30510784, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510784-98b5-11cf-bb82-00aa00bdce0b") DOMParserFactory;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMParserFactory, 0x30510784, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDOMParserFactory;
/*****************************************************************************
 * DispHTMLSemanticElement dispinterface
 */
#ifndef __DispHTMLSemanticElement_DISPINTERFACE_DEFINED__
#define __DispHTMLSemanticElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLSemanticElement, 0x305900ba, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305900ba-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLSemanticElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLSemanticElement, 0x305900ba, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLSemanticElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLSemanticElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLSemanticElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLSemanticElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLSemanticElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLSemanticElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLSemanticElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLSemanticElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLSemanticElementVtbl;
interface DispHTMLSemanticElement {
    CONST_VTBL DispHTMLSemanticElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLSemanticElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLSemanticElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLSemanticElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLSemanticElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLSemanticElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLSemanticElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLSemanticElement_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 DispHTMLSemanticElement_QueryInterface(DispHTMLSemanticElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLSemanticElement_AddRef(DispHTMLSemanticElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLSemanticElement_Release(DispHTMLSemanticElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLSemanticElement_GetTypeInfoCount(DispHTMLSemanticElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLSemanticElement_GetTypeInfo(DispHTMLSemanticElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLSemanticElement_GetIDsOfNames(DispHTMLSemanticElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLSemanticElement_Invoke(DispHTMLSemanticElement* 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  /* __DispHTMLSemanticElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLSemanticElement coclass
 */

DEFINE_GUID(CLSID_HTMLSemanticElement, 0x305107b0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305107b0-98b5-11cf-bb82-00aa00bdce0b") HTMLSemanticElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLSemanticElement, 0x305107b0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CSemanticElement;
/*****************************************************************************
 * IHTMLProgressElement interface
 */
#ifndef __IHTMLProgressElement_INTERFACE_DEFINED__
#define __IHTMLProgressElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLProgressElement, 0x3050f2d6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f2d6-98b5-11cf-bb82-00aa00bdce0b")
IHTMLProgressElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_value(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_value(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_max(
        float v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_max(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_position(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_form(
        IHTMLFormElement **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLProgressElement, 0x3050f2d6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLProgressElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLProgressElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLProgressElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLProgressElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLProgressElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLProgressElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLProgressElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLProgressElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLProgressElement methods ***/
    HRESULT (STDMETHODCALLTYPE *put_value)(
        IHTMLProgressElement* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_value)(
        IHTMLProgressElement* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *put_max)(
        IHTMLProgressElement* This,
        float v);

    HRESULT (STDMETHODCALLTYPE *get_max)(
        IHTMLProgressElement* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *get_position)(
        IHTMLProgressElement* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *get_form)(
        IHTMLProgressElement* This,
        IHTMLFormElement **p);

    END_INTERFACE
} IHTMLProgressElementVtbl;
interface IHTMLProgressElement {
    CONST_VTBL IHTMLProgressElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLProgressElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLProgressElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLProgressElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLProgressElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLProgressElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLProgressElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLProgressElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLProgressElement methods ***/
#define IHTMLProgressElement_put_value(This,v) (This)->lpVtbl->put_value(This,v)
#define IHTMLProgressElement_get_value(This,p) (This)->lpVtbl->get_value(This,p)
#define IHTMLProgressElement_put_max(This,v) (This)->lpVtbl->put_max(This,v)
#define IHTMLProgressElement_get_max(This,p) (This)->lpVtbl->get_max(This,p)
#define IHTMLProgressElement_get_position(This,p) (This)->lpVtbl->get_position(This,p)
#define IHTMLProgressElement_get_form(This,p) (This)->lpVtbl->get_form(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLProgressElement_QueryInterface(IHTMLProgressElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLProgressElement_AddRef(IHTMLProgressElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLProgressElement_Release(IHTMLProgressElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLProgressElement_GetTypeInfoCount(IHTMLProgressElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLProgressElement_GetTypeInfo(IHTMLProgressElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLProgressElement_GetIDsOfNames(IHTMLProgressElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLProgressElement_Invoke(IHTMLProgressElement* 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);
}
/*** IHTMLProgressElement methods ***/
static FORCEINLINE HRESULT IHTMLProgressElement_put_value(IHTMLProgressElement* This,float v) {
    return This->lpVtbl->put_value(This,v);
}
static FORCEINLINE HRESULT IHTMLProgressElement_get_value(IHTMLProgressElement* This,float *p) {
    return This->lpVtbl->get_value(This,p);
}
static FORCEINLINE HRESULT IHTMLProgressElement_put_max(IHTMLProgressElement* This,float v) {
    return This->lpVtbl->put_max(This,v);
}
static FORCEINLINE HRESULT IHTMLProgressElement_get_max(IHTMLProgressElement* This,float *p) {
    return This->lpVtbl->get_max(This,p);
}
static FORCEINLINE HRESULT IHTMLProgressElement_get_position(IHTMLProgressElement* This,float *p) {
    return This->lpVtbl->get_position(This,p);
}
static FORCEINLINE HRESULT IHTMLProgressElement_get_form(IHTMLProgressElement* This,IHTMLFormElement **p) {
    return This->lpVtbl->get_form(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLProgressElement_put_value_Proxy(
    IHTMLProgressElement* This,
    float v);
void __RPC_STUB IHTMLProgressElement_put_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLProgressElement_get_value_Proxy(
    IHTMLProgressElement* This,
    float *p);
void __RPC_STUB IHTMLProgressElement_get_value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLProgressElement_put_max_Proxy(
    IHTMLProgressElement* This,
    float v);
void __RPC_STUB IHTMLProgressElement_put_max_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLProgressElement_get_max_Proxy(
    IHTMLProgressElement* This,
    float *p);
void __RPC_STUB IHTMLProgressElement_get_max_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLProgressElement_get_position_Proxy(
    IHTMLProgressElement* This,
    float *p);
void __RPC_STUB IHTMLProgressElement_get_position_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLProgressElement_get_form_Proxy(
    IHTMLProgressElement* This,
    IHTMLFormElement **p);
void __RPC_STUB IHTMLProgressElement_get_form_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLProgressElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLProgressElement dispinterface
 */
#ifndef __DispHTMLProgressElement_DISPINTERFACE_DEFINED__
#define __DispHTMLProgressElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLProgressElement, 0x305900af, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305900af-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLProgressElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLProgressElement, 0x305900af, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLProgressElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLProgressElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLProgressElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLProgressElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLProgressElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLProgressElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLProgressElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLProgressElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLProgressElementVtbl;
interface DispHTMLProgressElement {
    CONST_VTBL DispHTMLProgressElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLProgressElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLProgressElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLProgressElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLProgressElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLProgressElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLProgressElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLProgressElement_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 DispHTMLProgressElement_QueryInterface(DispHTMLProgressElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLProgressElement_AddRef(DispHTMLProgressElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLProgressElement_Release(DispHTMLProgressElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLProgressElement_GetTypeInfoCount(DispHTMLProgressElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLProgressElement_GetTypeInfo(DispHTMLProgressElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLProgressElement_GetIDsOfNames(DispHTMLProgressElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLProgressElement_Invoke(DispHTMLProgressElement* 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  /* __DispHTMLProgressElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLProgressElement coclass
 */

DEFINE_GUID(CLSID_HTMLProgressElement, 0x3050f2d5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f2d5-98b5-11cf-bb82-00aa00bdce0b") HTMLProgressElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLProgressElement, 0x3050f2d5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CProgressElement;
/*****************************************************************************
 * IDOMMSTransitionEvent interface
 */
#ifndef __IDOMMSTransitionEvent_INTERFACE_DEFINED__
#define __IDOMMSTransitionEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMMSTransitionEvent, 0x305107b5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305107b5-98b5-11cf-bb82-00aa00bdce0b")
IDOMMSTransitionEvent : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_propertyName(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_elapsedTime(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE initMSTransitionEvent(
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        BSTR propertyName,
        float elapsedTime) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMMSTransitionEvent, 0x305107b5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMMSTransitionEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMMSTransitionEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMMSTransitionEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMMSTransitionEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDOMMSTransitionEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDOMMSTransitionEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDOMMSTransitionEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDOMMSTransitionEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDOMMSTransitionEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *get_propertyName)(
        IDOMMSTransitionEvent* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_elapsedTime)(
        IDOMMSTransitionEvent* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *initMSTransitionEvent)(
        IDOMMSTransitionEvent* This,
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        BSTR propertyName,
        float elapsedTime);

    END_INTERFACE
} IDOMMSTransitionEventVtbl;
interface IDOMMSTransitionEvent {
    CONST_VTBL IDOMMSTransitionEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMMSTransitionEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMMSTransitionEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMMSTransitionEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDOMMSTransitionEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDOMMSTransitionEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDOMMSTransitionEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDOMMSTransitionEvent_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDOMMSTransitionEvent methods ***/
#define IDOMMSTransitionEvent_get_propertyName(This,p) (This)->lpVtbl->get_propertyName(This,p)
#define IDOMMSTransitionEvent_get_elapsedTime(This,p) (This)->lpVtbl->get_elapsedTime(This,p)
#define IDOMMSTransitionEvent_initMSTransitionEvent(This,eventType,canBubble,cancelable,propertyName,elapsedTime) (This)->lpVtbl->initMSTransitionEvent(This,eventType,canBubble,cancelable,propertyName,elapsedTime)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMMSTransitionEvent_QueryInterface(IDOMMSTransitionEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMMSTransitionEvent_AddRef(IDOMMSTransitionEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMMSTransitionEvent_Release(IDOMMSTransitionEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDOMMSTransitionEvent_GetTypeInfoCount(IDOMMSTransitionEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDOMMSTransitionEvent_GetTypeInfo(IDOMMSTransitionEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDOMMSTransitionEvent_GetIDsOfNames(IDOMMSTransitionEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDOMMSTransitionEvent_Invoke(IDOMMSTransitionEvent* 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);
}
/*** IDOMMSTransitionEvent methods ***/
static FORCEINLINE HRESULT IDOMMSTransitionEvent_get_propertyName(IDOMMSTransitionEvent* This,BSTR *p) {
    return This->lpVtbl->get_propertyName(This,p);
}
static FORCEINLINE HRESULT IDOMMSTransitionEvent_get_elapsedTime(IDOMMSTransitionEvent* This,float *p) {
    return This->lpVtbl->get_elapsedTime(This,p);
}
static FORCEINLINE HRESULT IDOMMSTransitionEvent_initMSTransitionEvent(IDOMMSTransitionEvent* This,BSTR eventType,VARIANT_BOOL canBubble,VARIANT_BOOL cancelable,BSTR propertyName,float elapsedTime) {
    return This->lpVtbl->initMSTransitionEvent(This,eventType,canBubble,cancelable,propertyName,elapsedTime);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMMSTransitionEvent_get_propertyName_Proxy(
    IDOMMSTransitionEvent* This,
    BSTR *p);
void __RPC_STUB IDOMMSTransitionEvent_get_propertyName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMSTransitionEvent_get_elapsedTime_Proxy(
    IDOMMSTransitionEvent* This,
    float *p);
void __RPC_STUB IDOMMSTransitionEvent_get_elapsedTime_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMSTransitionEvent_initMSTransitionEvent_Proxy(
    IDOMMSTransitionEvent* This,
    BSTR eventType,
    VARIANT_BOOL canBubble,
    VARIANT_BOOL cancelable,
    BSTR propertyName,
    float elapsedTime);
void __RPC_STUB IDOMMSTransitionEvent_initMSTransitionEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMMSTransitionEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispDOMMSTransitionEvent dispinterface
 */
#ifndef __DispDOMMSTransitionEvent_DISPINTERFACE_DEFINED__
#define __DispDOMMSTransitionEvent_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispDOMMSTransitionEvent, 0x305900bb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305900bb-98b5-11cf-bb82-00aa00bdce0b")
DispDOMMSTransitionEvent : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispDOMMSTransitionEvent, 0x305900bb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispDOMMSTransitionEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispDOMMSTransitionEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispDOMMSTransitionEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispDOMMSTransitionEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispDOMMSTransitionEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispDOMMSTransitionEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispDOMMSTransitionEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispDOMMSTransitionEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispDOMMSTransitionEventVtbl;
interface DispDOMMSTransitionEvent {
    CONST_VTBL DispDOMMSTransitionEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispDOMMSTransitionEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispDOMMSTransitionEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispDOMMSTransitionEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispDOMMSTransitionEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispDOMMSTransitionEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispDOMMSTransitionEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispDOMMSTransitionEvent_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 DispDOMMSTransitionEvent_QueryInterface(DispDOMMSTransitionEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispDOMMSTransitionEvent_AddRef(DispDOMMSTransitionEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispDOMMSTransitionEvent_Release(DispDOMMSTransitionEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispDOMMSTransitionEvent_GetTypeInfoCount(DispDOMMSTransitionEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispDOMMSTransitionEvent_GetTypeInfo(DispDOMMSTransitionEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispDOMMSTransitionEvent_GetIDsOfNames(DispDOMMSTransitionEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispDOMMSTransitionEvent_Invoke(DispDOMMSTransitionEvent* 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  /* __DispDOMMSTransitionEvent_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * DOMMSTransitionEvent coclass
 */

DEFINE_GUID(CLSID_DOMMSTransitionEvent, 0x305107b6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305107b6-98b5-11cf-bb82-00aa00bdce0b") DOMMSTransitionEvent;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMMSTransitionEvent, 0x305107b6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDOMMSTransitionEvent;
/*****************************************************************************
 * IDOMMSAnimationEvent interface
 */
#ifndef __IDOMMSAnimationEvent_INTERFACE_DEFINED__
#define __IDOMMSAnimationEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMMSAnimationEvent, 0x305107b7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305107b7-98b5-11cf-bb82-00aa00bdce0b")
IDOMMSAnimationEvent : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_animationName(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_elapsedTime(
        float *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE initMSAnimationEvent(
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        BSTR animationName,
        float elapsedTime) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMMSAnimationEvent, 0x305107b7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMMSAnimationEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMMSAnimationEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMMSAnimationEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMMSAnimationEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDOMMSAnimationEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDOMMSAnimationEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDOMMSAnimationEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDOMMSAnimationEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDOMMSAnimationEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *get_animationName)(
        IDOMMSAnimationEvent* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_elapsedTime)(
        IDOMMSAnimationEvent* This,
        float *p);

    HRESULT (STDMETHODCALLTYPE *initMSAnimationEvent)(
        IDOMMSAnimationEvent* This,
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        BSTR animationName,
        float elapsedTime);

    END_INTERFACE
} IDOMMSAnimationEventVtbl;
interface IDOMMSAnimationEvent {
    CONST_VTBL IDOMMSAnimationEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMMSAnimationEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMMSAnimationEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMMSAnimationEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDOMMSAnimationEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDOMMSAnimationEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDOMMSAnimationEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDOMMSAnimationEvent_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDOMMSAnimationEvent methods ***/
#define IDOMMSAnimationEvent_get_animationName(This,p) (This)->lpVtbl->get_animationName(This,p)
#define IDOMMSAnimationEvent_get_elapsedTime(This,p) (This)->lpVtbl->get_elapsedTime(This,p)
#define IDOMMSAnimationEvent_initMSAnimationEvent(This,eventType,canBubble,cancelable,animationName,elapsedTime) (This)->lpVtbl->initMSAnimationEvent(This,eventType,canBubble,cancelable,animationName,elapsedTime)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMMSAnimationEvent_QueryInterface(IDOMMSAnimationEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMMSAnimationEvent_AddRef(IDOMMSAnimationEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMMSAnimationEvent_Release(IDOMMSAnimationEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDOMMSAnimationEvent_GetTypeInfoCount(IDOMMSAnimationEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDOMMSAnimationEvent_GetTypeInfo(IDOMMSAnimationEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDOMMSAnimationEvent_GetIDsOfNames(IDOMMSAnimationEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDOMMSAnimationEvent_Invoke(IDOMMSAnimationEvent* 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);
}
/*** IDOMMSAnimationEvent methods ***/
static FORCEINLINE HRESULT IDOMMSAnimationEvent_get_animationName(IDOMMSAnimationEvent* This,BSTR *p) {
    return This->lpVtbl->get_animationName(This,p);
}
static FORCEINLINE HRESULT IDOMMSAnimationEvent_get_elapsedTime(IDOMMSAnimationEvent* This,float *p) {
    return This->lpVtbl->get_elapsedTime(This,p);
}
static FORCEINLINE HRESULT IDOMMSAnimationEvent_initMSAnimationEvent(IDOMMSAnimationEvent* This,BSTR eventType,VARIANT_BOOL canBubble,VARIANT_BOOL cancelable,BSTR animationName,float elapsedTime) {
    return This->lpVtbl->initMSAnimationEvent(This,eventType,canBubble,cancelable,animationName,elapsedTime);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMMSAnimationEvent_get_animationName_Proxy(
    IDOMMSAnimationEvent* This,
    BSTR *p);
void __RPC_STUB IDOMMSAnimationEvent_get_animationName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMSAnimationEvent_get_elapsedTime_Proxy(
    IDOMMSAnimationEvent* This,
    float *p);
void __RPC_STUB IDOMMSAnimationEvent_get_elapsedTime_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMSAnimationEvent_initMSAnimationEvent_Proxy(
    IDOMMSAnimationEvent* This,
    BSTR eventType,
    VARIANT_BOOL canBubble,
    VARIANT_BOOL cancelable,
    BSTR animationName,
    float elapsedTime);
void __RPC_STUB IDOMMSAnimationEvent_initMSAnimationEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMMSAnimationEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispDOMMSAnimationEvent dispinterface
 */
#ifndef __DispDOMMSAnimationEvent_DISPINTERFACE_DEFINED__
#define __DispDOMMSAnimationEvent_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispDOMMSAnimationEvent, 0x305900bc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305900bc-98b5-11cf-bb82-00aa00bdce0b")
DispDOMMSAnimationEvent : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispDOMMSAnimationEvent, 0x305900bc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispDOMMSAnimationEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispDOMMSAnimationEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispDOMMSAnimationEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispDOMMSAnimationEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispDOMMSAnimationEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispDOMMSAnimationEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispDOMMSAnimationEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispDOMMSAnimationEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispDOMMSAnimationEventVtbl;
interface DispDOMMSAnimationEvent {
    CONST_VTBL DispDOMMSAnimationEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispDOMMSAnimationEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispDOMMSAnimationEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispDOMMSAnimationEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispDOMMSAnimationEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispDOMMSAnimationEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispDOMMSAnimationEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispDOMMSAnimationEvent_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 DispDOMMSAnimationEvent_QueryInterface(DispDOMMSAnimationEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispDOMMSAnimationEvent_AddRef(DispDOMMSAnimationEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispDOMMSAnimationEvent_Release(DispDOMMSAnimationEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispDOMMSAnimationEvent_GetTypeInfoCount(DispDOMMSAnimationEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispDOMMSAnimationEvent_GetTypeInfo(DispDOMMSAnimationEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispDOMMSAnimationEvent_GetIDsOfNames(DispDOMMSAnimationEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispDOMMSAnimationEvent_Invoke(DispDOMMSAnimationEvent* 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  /* __DispDOMMSAnimationEvent_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * DOMMSAnimationEvent coclass
 */

DEFINE_GUID(CLSID_DOMMSAnimationEvent, 0x305107b8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305107b8-98b5-11cf-bb82-00aa00bdce0b") DOMMSAnimationEvent;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMMSAnimationEvent, 0x305107b8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDOMMSAnimationEvent;
/*****************************************************************************
 * IWebGeolocation interface
 */
#ifndef __IWebGeolocation_INTERFACE_DEFINED__
#define __IWebGeolocation_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWebGeolocation, 0x305107c5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305107c5-98b5-11cf-bb82-00aa00bdce0b")
IWebGeolocation : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE getCurrentPosition(
        IDispatch *successCallback,
        IDispatch *errorCallback = 0,
        IDispatch *options = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE watchPosition(
        IDispatch *successCallback,
        IDispatch *errorCallback = 0,
        IDispatch *options = 0,
        LONG *watchId = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE clearWatch(
        LONG watchId) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWebGeolocation, 0x305107c5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IWebGeolocationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWebGeolocation* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWebGeolocation* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWebGeolocation* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IWebGeolocation* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IWebGeolocation* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IWebGeolocation* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IWebGeolocation* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IWebGeolocation methods ***/
    HRESULT (STDMETHODCALLTYPE *getCurrentPosition)(
        IWebGeolocation* This,
        IDispatch *successCallback,
        IDispatch *errorCallback,
        IDispatch *options);

    HRESULT (STDMETHODCALLTYPE *watchPosition)(
        IWebGeolocation* This,
        IDispatch *successCallback,
        IDispatch *errorCallback,
        IDispatch *options,
        LONG *watchId);

    HRESULT (STDMETHODCALLTYPE *clearWatch)(
        IWebGeolocation* This,
        LONG watchId);

    END_INTERFACE
} IWebGeolocationVtbl;
interface IWebGeolocation {
    CONST_VTBL IWebGeolocationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWebGeolocation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWebGeolocation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWebGeolocation_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWebGeolocation_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWebGeolocation_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWebGeolocation_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWebGeolocation_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWebGeolocation methods ***/
#define IWebGeolocation_getCurrentPosition(This,successCallback,errorCallback,options) (This)->lpVtbl->getCurrentPosition(This,successCallback,errorCallback,options)
#define IWebGeolocation_watchPosition(This,successCallback,errorCallback,options,watchId) (This)->lpVtbl->watchPosition(This,successCallback,errorCallback,options,watchId)
#define IWebGeolocation_clearWatch(This,watchId) (This)->lpVtbl->clearWatch(This,watchId)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWebGeolocation_QueryInterface(IWebGeolocation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWebGeolocation_AddRef(IWebGeolocation* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWebGeolocation_Release(IWebGeolocation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWebGeolocation_GetTypeInfoCount(IWebGeolocation* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWebGeolocation_GetTypeInfo(IWebGeolocation* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IWebGeolocation_GetIDsOfNames(IWebGeolocation* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IWebGeolocation_Invoke(IWebGeolocation* 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);
}
/*** IWebGeolocation methods ***/
static FORCEINLINE HRESULT IWebGeolocation_getCurrentPosition(IWebGeolocation* This,IDispatch *successCallback,IDispatch *errorCallback,IDispatch *options) {
    return This->lpVtbl->getCurrentPosition(This,successCallback,errorCallback,options);
}
static FORCEINLINE HRESULT IWebGeolocation_watchPosition(IWebGeolocation* This,IDispatch *successCallback,IDispatch *errorCallback,IDispatch *options,LONG *watchId) {
    return This->lpVtbl->watchPosition(This,successCallback,errorCallback,options,watchId);
}
static FORCEINLINE HRESULT IWebGeolocation_clearWatch(IWebGeolocation* This,LONG watchId) {
    return This->lpVtbl->clearWatch(This,watchId);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWebGeolocation_getCurrentPosition_Proxy(
    IWebGeolocation* This,
    IDispatch *successCallback,
    IDispatch *errorCallback,
    IDispatch *options);
void __RPC_STUB IWebGeolocation_getCurrentPosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWebGeolocation_watchPosition_Proxy(
    IWebGeolocation* This,
    IDispatch *successCallback,
    IDispatch *errorCallback,
    IDispatch *options,
    LONG *watchId);
void __RPC_STUB IWebGeolocation_watchPosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWebGeolocation_clearWatch_Proxy(
    IWebGeolocation* This,
    LONG watchId);
void __RPC_STUB IWebGeolocation_clearWatch_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWebGeolocation_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWebGeocoordinates interface
 */
#ifndef __IWebGeocoordinates_INTERFACE_DEFINED__
#define __IWebGeocoordinates_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWebGeocoordinates, 0x305107c7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305107c7-98b5-11cf-bb82-00aa00bdce0b")
IWebGeocoordinates : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_latitude(
        double *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_longitude(
        double *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_altitude(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_accuracy(
        double *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_altitudeAccuracy(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_heading(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_speed(
        VARIANT *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWebGeocoordinates, 0x305107c7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IWebGeocoordinatesVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWebGeocoordinates* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWebGeocoordinates* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWebGeocoordinates* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IWebGeocoordinates* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IWebGeocoordinates* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IWebGeocoordinates* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IWebGeocoordinates* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IWebGeocoordinates methods ***/
    HRESULT (STDMETHODCALLTYPE *get_latitude)(
        IWebGeocoordinates* This,
        double *p);

    HRESULT (STDMETHODCALLTYPE *get_longitude)(
        IWebGeocoordinates* This,
        double *p);

    HRESULT (STDMETHODCALLTYPE *get_altitude)(
        IWebGeocoordinates* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_accuracy)(
        IWebGeocoordinates* This,
        double *p);

    HRESULT (STDMETHODCALLTYPE *get_altitudeAccuracy)(
        IWebGeocoordinates* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_heading)(
        IWebGeocoordinates* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_speed)(
        IWebGeocoordinates* This,
        VARIANT *p);

    END_INTERFACE
} IWebGeocoordinatesVtbl;
interface IWebGeocoordinates {
    CONST_VTBL IWebGeocoordinatesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWebGeocoordinates_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWebGeocoordinates_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWebGeocoordinates_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWebGeocoordinates_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWebGeocoordinates_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWebGeocoordinates_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWebGeocoordinates_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWebGeocoordinates methods ***/
#define IWebGeocoordinates_get_latitude(This,p) (This)->lpVtbl->get_latitude(This,p)
#define IWebGeocoordinates_get_longitude(This,p) (This)->lpVtbl->get_longitude(This,p)
#define IWebGeocoordinates_get_altitude(This,p) (This)->lpVtbl->get_altitude(This,p)
#define IWebGeocoordinates_get_accuracy(This,p) (This)->lpVtbl->get_accuracy(This,p)
#define IWebGeocoordinates_get_altitudeAccuracy(This,p) (This)->lpVtbl->get_altitudeAccuracy(This,p)
#define IWebGeocoordinates_get_heading(This,p) (This)->lpVtbl->get_heading(This,p)
#define IWebGeocoordinates_get_speed(This,p) (This)->lpVtbl->get_speed(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWebGeocoordinates_QueryInterface(IWebGeocoordinates* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWebGeocoordinates_AddRef(IWebGeocoordinates* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWebGeocoordinates_Release(IWebGeocoordinates* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWebGeocoordinates_GetTypeInfoCount(IWebGeocoordinates* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWebGeocoordinates_GetTypeInfo(IWebGeocoordinates* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IWebGeocoordinates_GetIDsOfNames(IWebGeocoordinates* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IWebGeocoordinates_Invoke(IWebGeocoordinates* 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);
}
/*** IWebGeocoordinates methods ***/
static FORCEINLINE HRESULT IWebGeocoordinates_get_latitude(IWebGeocoordinates* This,double *p) {
    return This->lpVtbl->get_latitude(This,p);
}
static FORCEINLINE HRESULT IWebGeocoordinates_get_longitude(IWebGeocoordinates* This,double *p) {
    return This->lpVtbl->get_longitude(This,p);
}
static FORCEINLINE HRESULT IWebGeocoordinates_get_altitude(IWebGeocoordinates* This,VARIANT *p) {
    return This->lpVtbl->get_altitude(This,p);
}
static FORCEINLINE HRESULT IWebGeocoordinates_get_accuracy(IWebGeocoordinates* This,double *p) {
    return This->lpVtbl->get_accuracy(This,p);
}
static FORCEINLINE HRESULT IWebGeocoordinates_get_altitudeAccuracy(IWebGeocoordinates* This,VARIANT *p) {
    return This->lpVtbl->get_altitudeAccuracy(This,p);
}
static FORCEINLINE HRESULT IWebGeocoordinates_get_heading(IWebGeocoordinates* This,VARIANT *p) {
    return This->lpVtbl->get_heading(This,p);
}
static FORCEINLINE HRESULT IWebGeocoordinates_get_speed(IWebGeocoordinates* This,VARIANT *p) {
    return This->lpVtbl->get_speed(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWebGeocoordinates_get_latitude_Proxy(
    IWebGeocoordinates* This,
    double *p);
void __RPC_STUB IWebGeocoordinates_get_latitude_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWebGeocoordinates_get_longitude_Proxy(
    IWebGeocoordinates* This,
    double *p);
void __RPC_STUB IWebGeocoordinates_get_longitude_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWebGeocoordinates_get_altitude_Proxy(
    IWebGeocoordinates* This,
    VARIANT *p);
void __RPC_STUB IWebGeocoordinates_get_altitude_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWebGeocoordinates_get_accuracy_Proxy(
    IWebGeocoordinates* This,
    double *p);
void __RPC_STUB IWebGeocoordinates_get_accuracy_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWebGeocoordinates_get_altitudeAccuracy_Proxy(
    IWebGeocoordinates* This,
    VARIANT *p);
void __RPC_STUB IWebGeocoordinates_get_altitudeAccuracy_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWebGeocoordinates_get_heading_Proxy(
    IWebGeocoordinates* This,
    VARIANT *p);
void __RPC_STUB IWebGeocoordinates_get_heading_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWebGeocoordinates_get_speed_Proxy(
    IWebGeocoordinates* This,
    VARIANT *p);
void __RPC_STUB IWebGeocoordinates_get_speed_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWebGeocoordinates_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWebGeopositionError interface
 */
#ifndef __IWebGeopositionError_INTERFACE_DEFINED__
#define __IWebGeopositionError_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWebGeopositionError, 0x305107c9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305107c9-98b5-11cf-bb82-00aa00bdce0b")
IWebGeopositionError : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_code(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_message(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWebGeopositionError, 0x305107c9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IWebGeopositionErrorVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWebGeopositionError* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWebGeopositionError* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWebGeopositionError* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IWebGeopositionError* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IWebGeopositionError* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IWebGeopositionError* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IWebGeopositionError* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IWebGeopositionError methods ***/
    HRESULT (STDMETHODCALLTYPE *get_code)(
        IWebGeopositionError* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_message)(
        IWebGeopositionError* This,
        BSTR *p);

    END_INTERFACE
} IWebGeopositionErrorVtbl;
interface IWebGeopositionError {
    CONST_VTBL IWebGeopositionErrorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWebGeopositionError_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWebGeopositionError_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWebGeopositionError_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWebGeopositionError_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWebGeopositionError_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWebGeopositionError_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWebGeopositionError_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWebGeopositionError methods ***/
#define IWebGeopositionError_get_code(This,p) (This)->lpVtbl->get_code(This,p)
#define IWebGeopositionError_get_message(This,p) (This)->lpVtbl->get_message(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWebGeopositionError_QueryInterface(IWebGeopositionError* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWebGeopositionError_AddRef(IWebGeopositionError* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWebGeopositionError_Release(IWebGeopositionError* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWebGeopositionError_GetTypeInfoCount(IWebGeopositionError* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWebGeopositionError_GetTypeInfo(IWebGeopositionError* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IWebGeopositionError_GetIDsOfNames(IWebGeopositionError* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IWebGeopositionError_Invoke(IWebGeopositionError* 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);
}
/*** IWebGeopositionError methods ***/
static FORCEINLINE HRESULT IWebGeopositionError_get_code(IWebGeopositionError* This,LONG *p) {
    return This->lpVtbl->get_code(This,p);
}
static FORCEINLINE HRESULT IWebGeopositionError_get_message(IWebGeopositionError* This,BSTR *p) {
    return This->lpVtbl->get_message(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWebGeopositionError_get_code_Proxy(
    IWebGeopositionError* This,
    LONG *p);
void __RPC_STUB IWebGeopositionError_get_code_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWebGeopositionError_get_message_Proxy(
    IWebGeopositionError* This,
    BSTR *p);
void __RPC_STUB IWebGeopositionError_get_message_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWebGeopositionError_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWebGeoposition interface
 */
#ifndef __IWebGeoposition_INTERFACE_DEFINED__
#define __IWebGeoposition_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWebGeoposition, 0x305107cd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305107cd-98b5-11cf-bb82-00aa00bdce0b")
IWebGeoposition : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_coords(
        IWebGeocoordinates **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_timestamp(
        ULONGLONG *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWebGeoposition, 0x305107cd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IWebGeopositionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWebGeoposition* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWebGeoposition* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWebGeoposition* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IWebGeoposition* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IWebGeoposition* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IWebGeoposition* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IWebGeoposition* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IWebGeoposition methods ***/
    HRESULT (STDMETHODCALLTYPE *get_coords)(
        IWebGeoposition* This,
        IWebGeocoordinates **p);

    HRESULT (STDMETHODCALLTYPE *get_timestamp)(
        IWebGeoposition* This,
        ULONGLONG *p);

    END_INTERFACE
} IWebGeopositionVtbl;
interface IWebGeoposition {
    CONST_VTBL IWebGeopositionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWebGeoposition_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWebGeoposition_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWebGeoposition_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWebGeoposition_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWebGeoposition_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWebGeoposition_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWebGeoposition_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWebGeoposition methods ***/
#define IWebGeoposition_get_coords(This,p) (This)->lpVtbl->get_coords(This,p)
#define IWebGeoposition_get_timestamp(This,p) (This)->lpVtbl->get_timestamp(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWebGeoposition_QueryInterface(IWebGeoposition* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWebGeoposition_AddRef(IWebGeoposition* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWebGeoposition_Release(IWebGeoposition* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWebGeoposition_GetTypeInfoCount(IWebGeoposition* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWebGeoposition_GetTypeInfo(IWebGeoposition* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IWebGeoposition_GetIDsOfNames(IWebGeoposition* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IWebGeoposition_Invoke(IWebGeoposition* 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);
}
/*** IWebGeoposition methods ***/
static FORCEINLINE HRESULT IWebGeoposition_get_coords(IWebGeoposition* This,IWebGeocoordinates **p) {
    return This->lpVtbl->get_coords(This,p);
}
static FORCEINLINE HRESULT IWebGeoposition_get_timestamp(IWebGeoposition* This,ULONGLONG *p) {
    return This->lpVtbl->get_timestamp(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWebGeoposition_get_coords_Proxy(
    IWebGeoposition* This,
    IWebGeocoordinates **p);
void __RPC_STUB IWebGeoposition_get_coords_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWebGeoposition_get_timestamp_Proxy(
    IWebGeoposition* This,
    ULONGLONG *p);
void __RPC_STUB IWebGeoposition_get_timestamp_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWebGeoposition_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispWebGeolocation dispinterface
 */
#ifndef __DispWebGeolocation_DISPINTERFACE_DEFINED__
#define __DispWebGeolocation_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispWebGeolocation, 0x305900bd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305900bd-98b5-11cf-bb82-00aa00bdce0b")
DispWebGeolocation : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispWebGeolocation, 0x305900bd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispWebGeolocationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispWebGeolocation* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispWebGeolocation* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispWebGeolocation* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispWebGeolocation* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispWebGeolocation* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispWebGeolocation* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispWebGeolocation* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispWebGeolocationVtbl;
interface DispWebGeolocation {
    CONST_VTBL DispWebGeolocationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispWebGeolocation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispWebGeolocation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispWebGeolocation_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispWebGeolocation_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispWebGeolocation_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispWebGeolocation_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispWebGeolocation_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 DispWebGeolocation_QueryInterface(DispWebGeolocation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispWebGeolocation_AddRef(DispWebGeolocation* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispWebGeolocation_Release(DispWebGeolocation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispWebGeolocation_GetTypeInfoCount(DispWebGeolocation* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispWebGeolocation_GetTypeInfo(DispWebGeolocation* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispWebGeolocation_GetIDsOfNames(DispWebGeolocation* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispWebGeolocation_Invoke(DispWebGeolocation* 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  /* __DispWebGeolocation_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * WebGeolocation coclass
 */

DEFINE_GUID(CLSID_WebGeolocation, 0x305107c6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305107c6-98b5-11cf-bb82-00aa00bdce0b") WebGeolocation;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(WebGeolocation, 0x305107c6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CWebGeolocation;
/*****************************************************************************
 * DispWebGeocoordinates dispinterface
 */
#ifndef __DispWebGeocoordinates_DISPINTERFACE_DEFINED__
#define __DispWebGeocoordinates_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispWebGeocoordinates, 0x305900be, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305900be-98b5-11cf-bb82-00aa00bdce0b")
DispWebGeocoordinates : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispWebGeocoordinates, 0x305900be, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispWebGeocoordinatesVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispWebGeocoordinates* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispWebGeocoordinates* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispWebGeocoordinates* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispWebGeocoordinates* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispWebGeocoordinates* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispWebGeocoordinates* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispWebGeocoordinates* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispWebGeocoordinatesVtbl;
interface DispWebGeocoordinates {
    CONST_VTBL DispWebGeocoordinatesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispWebGeocoordinates_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispWebGeocoordinates_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispWebGeocoordinates_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispWebGeocoordinates_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispWebGeocoordinates_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispWebGeocoordinates_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispWebGeocoordinates_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 DispWebGeocoordinates_QueryInterface(DispWebGeocoordinates* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispWebGeocoordinates_AddRef(DispWebGeocoordinates* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispWebGeocoordinates_Release(DispWebGeocoordinates* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispWebGeocoordinates_GetTypeInfoCount(DispWebGeocoordinates* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispWebGeocoordinates_GetTypeInfo(DispWebGeocoordinates* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispWebGeocoordinates_GetIDsOfNames(DispWebGeocoordinates* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispWebGeocoordinates_Invoke(DispWebGeocoordinates* 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  /* __DispWebGeocoordinates_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * WebGeocoordinates coclass
 */

DEFINE_GUID(CLSID_WebGeocoordinates, 0x305107c8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305107c8-98b5-11cf-bb82-00aa00bdce0b") WebGeocoordinates;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(WebGeocoordinates, 0x305107c8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CWebGeocoordinates;
/*****************************************************************************
 * DispWebGeopositionError dispinterface
 */
#ifndef __DispWebGeopositionError_DISPINTERFACE_DEFINED__
#define __DispWebGeopositionError_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispWebGeopositionError, 0x305900bf, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305900bf-98b5-11cf-bb82-00aa00bdce0b")
DispWebGeopositionError : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispWebGeopositionError, 0x305900bf, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispWebGeopositionErrorVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispWebGeopositionError* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispWebGeopositionError* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispWebGeopositionError* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispWebGeopositionError* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispWebGeopositionError* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispWebGeopositionError* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispWebGeopositionError* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispWebGeopositionErrorVtbl;
interface DispWebGeopositionError {
    CONST_VTBL DispWebGeopositionErrorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispWebGeopositionError_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispWebGeopositionError_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispWebGeopositionError_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispWebGeopositionError_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispWebGeopositionError_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispWebGeopositionError_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispWebGeopositionError_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 DispWebGeopositionError_QueryInterface(DispWebGeopositionError* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispWebGeopositionError_AddRef(DispWebGeopositionError* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispWebGeopositionError_Release(DispWebGeopositionError* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispWebGeopositionError_GetTypeInfoCount(DispWebGeopositionError* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispWebGeopositionError_GetTypeInfo(DispWebGeopositionError* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispWebGeopositionError_GetIDsOfNames(DispWebGeopositionError* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispWebGeopositionError_Invoke(DispWebGeopositionError* 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  /* __DispWebGeopositionError_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * WebGeopositionError coclass
 */

DEFINE_GUID(CLSID_WebGeopositionError, 0x305107ca, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305107ca-98b5-11cf-bb82-00aa00bdce0b") WebGeopositionError;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(WebGeopositionError, 0x305107ca, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CWebGeopositionError;
/*****************************************************************************
 * DispWebGeoposition dispinterface
 */
#ifndef __DispWebGeoposition_DISPINTERFACE_DEFINED__
#define __DispWebGeoposition_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispWebGeoposition, 0x305900c1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305900c1-98b5-11cf-bb82-00aa00bdce0b")
DispWebGeoposition : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispWebGeoposition, 0x305900c1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispWebGeopositionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispWebGeoposition* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispWebGeoposition* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispWebGeoposition* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispWebGeoposition* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispWebGeoposition* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispWebGeoposition* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispWebGeoposition* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispWebGeopositionVtbl;
interface DispWebGeoposition {
    CONST_VTBL DispWebGeopositionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispWebGeoposition_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispWebGeoposition_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispWebGeoposition_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispWebGeoposition_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispWebGeoposition_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispWebGeoposition_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispWebGeoposition_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 DispWebGeoposition_QueryInterface(DispWebGeoposition* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispWebGeoposition_AddRef(DispWebGeoposition* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispWebGeoposition_Release(DispWebGeoposition* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispWebGeoposition_GetTypeInfoCount(DispWebGeoposition* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispWebGeoposition_GetTypeInfo(DispWebGeoposition* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispWebGeoposition_GetIDsOfNames(DispWebGeoposition* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispWebGeoposition_Invoke(DispWebGeoposition* 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  /* __DispWebGeoposition_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * WebGeoposition coclass
 */

DEFINE_GUID(CLSID_WebGeoposition, 0x305107ce, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("305107ce-98b5-11cf-bb82-00aa00bdce0b") WebGeoposition;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(WebGeoposition, 0x305107ce, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CWebGeoposition;
/*****************************************************************************
 * IClientCaps interface
 */
#ifndef __IClientCaps_INTERFACE_DEFINED__
#define __IClientCaps_INTERFACE_DEFINED__

DEFINE_GUID(IID_IClientCaps, 0x7e8bc44d, 0xaeff, 0x11d1, 0x89,0xc2, 0x00,0xc0,0x4f,0xb6,0xbf,0xc4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7e8bc44d-aeff-11d1-89c2-00c04fb6bfc4")
IClientCaps : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_javaEnabled(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cookieEnabled(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cpuClass(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_systemLanguage(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_userLanguage(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_platform(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_connectionSpeed(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onLine(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_colorDepth(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_bufferDepth(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_width(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_height(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_availHeight(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_availWidth(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_connectionType(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE isComponentInstalled(
        BSTR bstrName,
        BSTR bstrUrl,
        BSTR bStrVer = L"",
        VARIANT_BOOL *p = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE getComponentVersion(
        BSTR bstrName,
        BSTR bstrUrl,
        BSTR *pbstrVer) = 0;

    virtual HRESULT STDMETHODCALLTYPE compareVersions(
        BSTR bstrVer1,
        BSTR bstrVer2,
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE addComponentRequest(
        BSTR bstrName,
        BSTR bstrUrl,
        BSTR bStrVer = L"") = 0;

    virtual HRESULT STDMETHODCALLTYPE doComponentRequest(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE clearComponentRequest(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IClientCaps, 0x7e8bc44d, 0xaeff, 0x11d1, 0x89,0xc2, 0x00,0xc0,0x4f,0xb6,0xbf,0xc4)
#endif
#else
typedef struct IClientCapsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IClientCaps* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IClientCaps* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IClientCaps* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IClientCaps* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IClientCaps* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IClientCaps* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IClientCaps* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IClientCaps methods ***/
    HRESULT (STDMETHODCALLTYPE *get_javaEnabled)(
        IClientCaps* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_cookieEnabled)(
        IClientCaps* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_cpuClass)(
        IClientCaps* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_systemLanguage)(
        IClientCaps* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_userLanguage)(
        IClientCaps* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_platform)(
        IClientCaps* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_connectionSpeed)(
        IClientCaps* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_onLine)(
        IClientCaps* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_colorDepth)(
        IClientCaps* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_bufferDepth)(
        IClientCaps* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_width)(
        IClientCaps* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_height)(
        IClientCaps* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_availHeight)(
        IClientCaps* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_availWidth)(
        IClientCaps* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_connectionType)(
        IClientCaps* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *isComponentInstalled)(
        IClientCaps* This,
        BSTR bstrName,
        BSTR bstrUrl,
        BSTR bStrVer,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *getComponentVersion)(
        IClientCaps* This,
        BSTR bstrName,
        BSTR bstrUrl,
        BSTR *pbstrVer);

    HRESULT (STDMETHODCALLTYPE *compareVersions)(
        IClientCaps* This,
        BSTR bstrVer1,
        BSTR bstrVer2,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *addComponentRequest)(
        IClientCaps* This,
        BSTR bstrName,
        BSTR bstrUrl,
        BSTR bStrVer);

    HRESULT (STDMETHODCALLTYPE *doComponentRequest)(
        IClientCaps* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *clearComponentRequest)(
        IClientCaps* This);

    END_INTERFACE
} IClientCapsVtbl;
interface IClientCaps {
    CONST_VTBL IClientCapsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IClientCaps_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IClientCaps_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IClientCaps_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IClientCaps_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IClientCaps_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IClientCaps_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IClientCaps_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IClientCaps methods ***/
#define IClientCaps_get_javaEnabled(This,p) (This)->lpVtbl->get_javaEnabled(This,p)
#define IClientCaps_get_cookieEnabled(This,p) (This)->lpVtbl->get_cookieEnabled(This,p)
#define IClientCaps_get_cpuClass(This,p) (This)->lpVtbl->get_cpuClass(This,p)
#define IClientCaps_get_systemLanguage(This,p) (This)->lpVtbl->get_systemLanguage(This,p)
#define IClientCaps_get_userLanguage(This,p) (This)->lpVtbl->get_userLanguage(This,p)
#define IClientCaps_get_platform(This,p) (This)->lpVtbl->get_platform(This,p)
#define IClientCaps_get_connectionSpeed(This,p) (This)->lpVtbl->get_connectionSpeed(This,p)
#define IClientCaps_get_onLine(This,p) (This)->lpVtbl->get_onLine(This,p)
#define IClientCaps_get_colorDepth(This,p) (This)->lpVtbl->get_colorDepth(This,p)
#define IClientCaps_get_bufferDepth(This,p) (This)->lpVtbl->get_bufferDepth(This,p)
#define IClientCaps_get_width(This,p) (This)->lpVtbl->get_width(This,p)
#define IClientCaps_get_height(This,p) (This)->lpVtbl->get_height(This,p)
#define IClientCaps_get_availHeight(This,p) (This)->lpVtbl->get_availHeight(This,p)
#define IClientCaps_get_availWidth(This,p) (This)->lpVtbl->get_availWidth(This,p)
#define IClientCaps_get_connectionType(This,p) (This)->lpVtbl->get_connectionType(This,p)
#define IClientCaps_isComponentInstalled(This,bstrName,bstrUrl,bStrVer,p) (This)->lpVtbl->isComponentInstalled(This,bstrName,bstrUrl,bStrVer,p)
#define IClientCaps_getComponentVersion(This,bstrName,bstrUrl,pbstrVer) (This)->lpVtbl->getComponentVersion(This,bstrName,bstrUrl,pbstrVer)
#define IClientCaps_compareVersions(This,bstrVer1,bstrVer2,p) (This)->lpVtbl->compareVersions(This,bstrVer1,bstrVer2,p)
#define IClientCaps_addComponentRequest(This,bstrName,bstrUrl,bStrVer) (This)->lpVtbl->addComponentRequest(This,bstrName,bstrUrl,bStrVer)
#define IClientCaps_doComponentRequest(This,p) (This)->lpVtbl->doComponentRequest(This,p)
#define IClientCaps_clearComponentRequest(This) (This)->lpVtbl->clearComponentRequest(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IClientCaps_QueryInterface(IClientCaps* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IClientCaps_AddRef(IClientCaps* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IClientCaps_Release(IClientCaps* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IClientCaps_GetTypeInfoCount(IClientCaps* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IClientCaps_GetTypeInfo(IClientCaps* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IClientCaps_GetIDsOfNames(IClientCaps* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IClientCaps_Invoke(IClientCaps* 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);
}
/*** IClientCaps methods ***/
static FORCEINLINE HRESULT IClientCaps_get_javaEnabled(IClientCaps* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_javaEnabled(This,p);
}
static FORCEINLINE HRESULT IClientCaps_get_cookieEnabled(IClientCaps* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_cookieEnabled(This,p);
}
static FORCEINLINE HRESULT IClientCaps_get_cpuClass(IClientCaps* This,BSTR *p) {
    return This->lpVtbl->get_cpuClass(This,p);
}
static FORCEINLINE HRESULT IClientCaps_get_systemLanguage(IClientCaps* This,BSTR *p) {
    return This->lpVtbl->get_systemLanguage(This,p);
}
static FORCEINLINE HRESULT IClientCaps_get_userLanguage(IClientCaps* This,BSTR *p) {
    return This->lpVtbl->get_userLanguage(This,p);
}
static FORCEINLINE HRESULT IClientCaps_get_platform(IClientCaps* This,BSTR *p) {
    return This->lpVtbl->get_platform(This,p);
}
static FORCEINLINE HRESULT IClientCaps_get_connectionSpeed(IClientCaps* This,LONG *p) {
    return This->lpVtbl->get_connectionSpeed(This,p);
}
static FORCEINLINE HRESULT IClientCaps_get_onLine(IClientCaps* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_onLine(This,p);
}
static FORCEINLINE HRESULT IClientCaps_get_colorDepth(IClientCaps* This,LONG *p) {
    return This->lpVtbl->get_colorDepth(This,p);
}
static FORCEINLINE HRESULT IClientCaps_get_bufferDepth(IClientCaps* This,LONG *p) {
    return This->lpVtbl->get_bufferDepth(This,p);
}
static FORCEINLINE HRESULT IClientCaps_get_width(IClientCaps* This,LONG *p) {
    return This->lpVtbl->get_width(This,p);
}
static FORCEINLINE HRESULT IClientCaps_get_height(IClientCaps* This,LONG *p) {
    return This->lpVtbl->get_height(This,p);
}
static FORCEINLINE HRESULT IClientCaps_get_availHeight(IClientCaps* This,LONG *p) {
    return This->lpVtbl->get_availHeight(This,p);
}
static FORCEINLINE HRESULT IClientCaps_get_availWidth(IClientCaps* This,LONG *p) {
    return This->lpVtbl->get_availWidth(This,p);
}
static FORCEINLINE HRESULT IClientCaps_get_connectionType(IClientCaps* This,BSTR *p) {
    return This->lpVtbl->get_connectionType(This,p);
}
static FORCEINLINE HRESULT IClientCaps_isComponentInstalled(IClientCaps* This,BSTR bstrName,BSTR bstrUrl,BSTR bStrVer,VARIANT_BOOL *p) {
    return This->lpVtbl->isComponentInstalled(This,bstrName,bstrUrl,bStrVer,p);
}
static FORCEINLINE HRESULT IClientCaps_getComponentVersion(IClientCaps* This,BSTR bstrName,BSTR bstrUrl,BSTR *pbstrVer) {
    return This->lpVtbl->getComponentVersion(This,bstrName,bstrUrl,pbstrVer);
}
static FORCEINLINE HRESULT IClientCaps_compareVersions(IClientCaps* This,BSTR bstrVer1,BSTR bstrVer2,LONG *p) {
    return This->lpVtbl->compareVersions(This,bstrVer1,bstrVer2,p);
}
static FORCEINLINE HRESULT IClientCaps_addComponentRequest(IClientCaps* This,BSTR bstrName,BSTR bstrUrl,BSTR bStrVer) {
    return This->lpVtbl->addComponentRequest(This,bstrName,bstrUrl,bStrVer);
}
static FORCEINLINE HRESULT IClientCaps_doComponentRequest(IClientCaps* This,VARIANT_BOOL *p) {
    return This->lpVtbl->doComponentRequest(This,p);
}
static FORCEINLINE HRESULT IClientCaps_clearComponentRequest(IClientCaps* This) {
    return This->lpVtbl->clearComponentRequest(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IClientCaps_get_javaEnabled_Proxy(
    IClientCaps* This,
    VARIANT_BOOL *p);
void __RPC_STUB IClientCaps_get_javaEnabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IClientCaps_get_cookieEnabled_Proxy(
    IClientCaps* This,
    VARIANT_BOOL *p);
void __RPC_STUB IClientCaps_get_cookieEnabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IClientCaps_get_cpuClass_Proxy(
    IClientCaps* This,
    BSTR *p);
void __RPC_STUB IClientCaps_get_cpuClass_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IClientCaps_get_systemLanguage_Proxy(
    IClientCaps* This,
    BSTR *p);
void __RPC_STUB IClientCaps_get_systemLanguage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IClientCaps_get_userLanguage_Proxy(
    IClientCaps* This,
    BSTR *p);
void __RPC_STUB IClientCaps_get_userLanguage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IClientCaps_get_platform_Proxy(
    IClientCaps* This,
    BSTR *p);
void __RPC_STUB IClientCaps_get_platform_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IClientCaps_get_connectionSpeed_Proxy(
    IClientCaps* This,
    LONG *p);
void __RPC_STUB IClientCaps_get_connectionSpeed_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IClientCaps_get_onLine_Proxy(
    IClientCaps* This,
    VARIANT_BOOL *p);
void __RPC_STUB IClientCaps_get_onLine_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IClientCaps_get_colorDepth_Proxy(
    IClientCaps* This,
    LONG *p);
void __RPC_STUB IClientCaps_get_colorDepth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IClientCaps_get_bufferDepth_Proxy(
    IClientCaps* This,
    LONG *p);
void __RPC_STUB IClientCaps_get_bufferDepth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IClientCaps_get_width_Proxy(
    IClientCaps* This,
    LONG *p);
void __RPC_STUB IClientCaps_get_width_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IClientCaps_get_height_Proxy(
    IClientCaps* This,
    LONG *p);
void __RPC_STUB IClientCaps_get_height_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IClientCaps_get_availHeight_Proxy(
    IClientCaps* This,
    LONG *p);
void __RPC_STUB IClientCaps_get_availHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IClientCaps_get_availWidth_Proxy(
    IClientCaps* This,
    LONG *p);
void __RPC_STUB IClientCaps_get_availWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IClientCaps_get_connectionType_Proxy(
    IClientCaps* This,
    BSTR *p);
void __RPC_STUB IClientCaps_get_connectionType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IClientCaps_isComponentInstalled_Proxy(
    IClientCaps* This,
    BSTR bstrName,
    BSTR bstrUrl,
    BSTR bStrVer,
    VARIANT_BOOL *p);
void __RPC_STUB IClientCaps_isComponentInstalled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IClientCaps_getComponentVersion_Proxy(
    IClientCaps* This,
    BSTR bstrName,
    BSTR bstrUrl,
    BSTR *pbstrVer);
void __RPC_STUB IClientCaps_getComponentVersion_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IClientCaps_compareVersions_Proxy(
    IClientCaps* This,
    BSTR bstrVer1,
    BSTR bstrVer2,
    LONG *p);
void __RPC_STUB IClientCaps_compareVersions_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IClientCaps_addComponentRequest_Proxy(
    IClientCaps* This,
    BSTR bstrName,
    BSTR bstrUrl,
    BSTR bStrVer);
void __RPC_STUB IClientCaps_addComponentRequest_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IClientCaps_doComponentRequest_Proxy(
    IClientCaps* This,
    VARIANT_BOOL *p);
void __RPC_STUB IClientCaps_doComponentRequest_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IClientCaps_clearComponentRequest_Proxy(
    IClientCaps* This);
void __RPC_STUB IClientCaps_clearComponentRequest_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IClientCaps_INTERFACE_DEFINED__ */

/*****************************************************************************
 * CClientCaps coclass
 */

DEFINE_GUID(CLSID_CClientCaps, 0x7e8bc44e, 0xaeff, 0x11d1, 0x89,0xc2, 0x00,0xc0,0x4f,0xb6,0xbf,0xc4);

#ifdef __cplusplus
class DECLSPEC_UUID("7e8bc44e-aeff-11d1-89c2-00c04fb6bfc4") CClientCaps;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(CClientCaps, 0x7e8bc44e, 0xaeff, 0x11d1, 0x89,0xc2, 0x00,0xc0,0x4f,0xb6,0xbf,0xc4)
#endif
#endif

EXTERN_C const GUID CLSID_CClientCaps;
/*****************************************************************************
 * IDOMMSManipulationEvent interface
 */
#ifndef __IDOMMSManipulationEvent_INTERFACE_DEFINED__
#define __IDOMMSManipulationEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMMSManipulationEvent, 0x30510816, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510816-98b5-11cf-bb82-00aa00bdce0b")
IDOMMSManipulationEvent : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_lastState(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_currentState(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE initMSManipulationEvent(
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        IHTMLWindow2 *viewArg,
        LONG detailArg,
        LONG lastState,
        LONG currentState) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMMSManipulationEvent, 0x30510816, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMMSManipulationEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMMSManipulationEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMMSManipulationEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMMSManipulationEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDOMMSManipulationEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDOMMSManipulationEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDOMMSManipulationEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDOMMSManipulationEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDOMMSManipulationEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *get_lastState)(
        IDOMMSManipulationEvent* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_currentState)(
        IDOMMSManipulationEvent* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *initMSManipulationEvent)(
        IDOMMSManipulationEvent* This,
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        IHTMLWindow2 *viewArg,
        LONG detailArg,
        LONG lastState,
        LONG currentState);

    END_INTERFACE
} IDOMMSManipulationEventVtbl;
interface IDOMMSManipulationEvent {
    CONST_VTBL IDOMMSManipulationEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMMSManipulationEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMMSManipulationEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMMSManipulationEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDOMMSManipulationEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDOMMSManipulationEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDOMMSManipulationEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDOMMSManipulationEvent_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDOMMSManipulationEvent methods ***/
#define IDOMMSManipulationEvent_get_lastState(This,p) (This)->lpVtbl->get_lastState(This,p)
#define IDOMMSManipulationEvent_get_currentState(This,p) (This)->lpVtbl->get_currentState(This,p)
#define IDOMMSManipulationEvent_initMSManipulationEvent(This,eventType,canBubble,cancelable,viewArg,detailArg,lastState,currentState) (This)->lpVtbl->initMSManipulationEvent(This,eventType,canBubble,cancelable,viewArg,detailArg,lastState,currentState)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMMSManipulationEvent_QueryInterface(IDOMMSManipulationEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMMSManipulationEvent_AddRef(IDOMMSManipulationEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMMSManipulationEvent_Release(IDOMMSManipulationEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDOMMSManipulationEvent_GetTypeInfoCount(IDOMMSManipulationEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDOMMSManipulationEvent_GetTypeInfo(IDOMMSManipulationEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDOMMSManipulationEvent_GetIDsOfNames(IDOMMSManipulationEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDOMMSManipulationEvent_Invoke(IDOMMSManipulationEvent* 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);
}
/*** IDOMMSManipulationEvent methods ***/
static FORCEINLINE HRESULT IDOMMSManipulationEvent_get_lastState(IDOMMSManipulationEvent* This,LONG *p) {
    return This->lpVtbl->get_lastState(This,p);
}
static FORCEINLINE HRESULT IDOMMSManipulationEvent_get_currentState(IDOMMSManipulationEvent* This,LONG *p) {
    return This->lpVtbl->get_currentState(This,p);
}
static FORCEINLINE HRESULT IDOMMSManipulationEvent_initMSManipulationEvent(IDOMMSManipulationEvent* This,BSTR eventType,VARIANT_BOOL canBubble,VARIANT_BOOL cancelable,IHTMLWindow2 *viewArg,LONG detailArg,LONG lastState,LONG currentState) {
    return This->lpVtbl->initMSManipulationEvent(This,eventType,canBubble,cancelable,viewArg,detailArg,lastState,currentState);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMMSManipulationEvent_get_lastState_Proxy(
    IDOMMSManipulationEvent* This,
    LONG *p);
void __RPC_STUB IDOMMSManipulationEvent_get_lastState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMSManipulationEvent_get_currentState_Proxy(
    IDOMMSManipulationEvent* This,
    LONG *p);
void __RPC_STUB IDOMMSManipulationEvent_get_currentState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMMSManipulationEvent_initMSManipulationEvent_Proxy(
    IDOMMSManipulationEvent* This,
    BSTR eventType,
    VARIANT_BOOL canBubble,
    VARIANT_BOOL cancelable,
    IHTMLWindow2 *viewArg,
    LONG detailArg,
    LONG lastState,
    LONG currentState);
void __RPC_STUB IDOMMSManipulationEvent_initMSManipulationEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMMSManipulationEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispDOMMSManipulationEvent dispinterface
 */
#ifndef __DispDOMMSManipulationEvent_DISPINTERFACE_DEFINED__
#define __DispDOMMSManipulationEvent_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispDOMMSManipulationEvent, 0x305900e1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305900e1-98b5-11cf-bb82-00aa00bdce0b")
DispDOMMSManipulationEvent : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispDOMMSManipulationEvent, 0x305900e1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispDOMMSManipulationEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispDOMMSManipulationEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispDOMMSManipulationEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispDOMMSManipulationEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispDOMMSManipulationEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispDOMMSManipulationEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispDOMMSManipulationEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispDOMMSManipulationEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispDOMMSManipulationEventVtbl;
interface DispDOMMSManipulationEvent {
    CONST_VTBL DispDOMMSManipulationEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispDOMMSManipulationEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispDOMMSManipulationEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispDOMMSManipulationEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispDOMMSManipulationEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispDOMMSManipulationEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispDOMMSManipulationEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispDOMMSManipulationEvent_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 DispDOMMSManipulationEvent_QueryInterface(DispDOMMSManipulationEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispDOMMSManipulationEvent_AddRef(DispDOMMSManipulationEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispDOMMSManipulationEvent_Release(DispDOMMSManipulationEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispDOMMSManipulationEvent_GetTypeInfoCount(DispDOMMSManipulationEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispDOMMSManipulationEvent_GetTypeInfo(DispDOMMSManipulationEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispDOMMSManipulationEvent_GetIDsOfNames(DispDOMMSManipulationEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispDOMMSManipulationEvent_Invoke(DispDOMMSManipulationEvent* 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  /* __DispDOMMSManipulationEvent_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * DOMMSManipulationEvent coclass
 */

DEFINE_GUID(CLSID_DOMMSManipulationEvent, 0x30510817, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510817-98b5-11cf-bb82-00aa00bdce0b") DOMMSManipulationEvent;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMMSManipulationEvent, 0x30510817, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDOMMSManipulationEvent;
/*****************************************************************************
 * IDOMCloseEvent interface
 */
#ifndef __IDOMCloseEvent_INTERFACE_DEFINED__
#define __IDOMCloseEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMCloseEvent, 0x305107ff, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305107ff-98b5-11cf-bb82-00aa00bdce0b")
IDOMCloseEvent : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_wasClean(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE initCloseEvent(
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        VARIANT_BOOL wasClean,
        LONG code,
        BSTR reason) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMCloseEvent, 0x305107ff, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMCloseEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMCloseEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMCloseEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMCloseEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDOMCloseEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDOMCloseEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDOMCloseEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDOMCloseEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDOMCloseEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *get_wasClean)(
        IDOMCloseEvent* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *initCloseEvent)(
        IDOMCloseEvent* This,
        BSTR eventType,
        VARIANT_BOOL canBubble,
        VARIANT_BOOL cancelable,
        VARIANT_BOOL wasClean,
        LONG code,
        BSTR reason);

    END_INTERFACE
} IDOMCloseEventVtbl;
interface IDOMCloseEvent {
    CONST_VTBL IDOMCloseEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMCloseEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMCloseEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMCloseEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDOMCloseEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDOMCloseEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDOMCloseEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDOMCloseEvent_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDOMCloseEvent methods ***/
#define IDOMCloseEvent_get_wasClean(This,p) (This)->lpVtbl->get_wasClean(This,p)
#define IDOMCloseEvent_initCloseEvent(This,eventType,canBubble,cancelable,wasClean,code,reason) (This)->lpVtbl->initCloseEvent(This,eventType,canBubble,cancelable,wasClean,code,reason)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMCloseEvent_QueryInterface(IDOMCloseEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMCloseEvent_AddRef(IDOMCloseEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMCloseEvent_Release(IDOMCloseEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDOMCloseEvent_GetTypeInfoCount(IDOMCloseEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDOMCloseEvent_GetTypeInfo(IDOMCloseEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDOMCloseEvent_GetIDsOfNames(IDOMCloseEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDOMCloseEvent_Invoke(IDOMCloseEvent* 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);
}
/*** IDOMCloseEvent methods ***/
static FORCEINLINE HRESULT IDOMCloseEvent_get_wasClean(IDOMCloseEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_wasClean(This,p);
}
static FORCEINLINE HRESULT IDOMCloseEvent_initCloseEvent(IDOMCloseEvent* This,BSTR eventType,VARIANT_BOOL canBubble,VARIANT_BOOL cancelable,VARIANT_BOOL wasClean,LONG code,BSTR reason) {
    return This->lpVtbl->initCloseEvent(This,eventType,canBubble,cancelable,wasClean,code,reason);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMCloseEvent_get_wasClean_Proxy(
    IDOMCloseEvent* This,
    VARIANT_BOOL *p);
void __RPC_STUB IDOMCloseEvent_get_wasClean_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMCloseEvent_initCloseEvent_Proxy(
    IDOMCloseEvent* This,
    BSTR eventType,
    VARIANT_BOOL canBubble,
    VARIANT_BOOL cancelable,
    VARIANT_BOOL wasClean,
    LONG code,
    BSTR reason);
void __RPC_STUB IDOMCloseEvent_initCloseEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMCloseEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispDOMCloseEvent dispinterface
 */
#ifndef __DispDOMCloseEvent_DISPINTERFACE_DEFINED__
#define __DispDOMCloseEvent_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispDOMCloseEvent, 0x305900dc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305900dc-98b5-11cf-bb82-00aa00bdce0b")
DispDOMCloseEvent : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispDOMCloseEvent, 0x305900dc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispDOMCloseEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispDOMCloseEvent* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispDOMCloseEvent* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispDOMCloseEvent* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispDOMCloseEvent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispDOMCloseEvent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispDOMCloseEvent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispDOMCloseEvent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispDOMCloseEventVtbl;
interface DispDOMCloseEvent {
    CONST_VTBL DispDOMCloseEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispDOMCloseEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispDOMCloseEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispDOMCloseEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispDOMCloseEvent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispDOMCloseEvent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispDOMCloseEvent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispDOMCloseEvent_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 DispDOMCloseEvent_QueryInterface(DispDOMCloseEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispDOMCloseEvent_AddRef(DispDOMCloseEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispDOMCloseEvent_Release(DispDOMCloseEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispDOMCloseEvent_GetTypeInfoCount(DispDOMCloseEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispDOMCloseEvent_GetTypeInfo(DispDOMCloseEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispDOMCloseEvent_GetIDsOfNames(DispDOMCloseEvent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispDOMCloseEvent_Invoke(DispDOMCloseEvent* 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  /* __DispDOMCloseEvent_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * DOMCloseEvent coclass
 */

DEFINE_GUID(CLSID_DOMCloseEvent, 0x30510800, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510800-98b5-11cf-bb82-00aa00bdce0b") DOMCloseEvent;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMCloseEvent, 0x30510800, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

EXTERN_C const GUID CLSID_CDOMCloseEvent;
/*****************************************************************************
 * IHTMLApplicationCache interface
 */
#ifndef __IHTMLApplicationCache_INTERFACE_DEFINED__
#define __IHTMLApplicationCache_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLApplicationCache, 0x30510828, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510828-98b5-11cf-bb82-00aa00bdce0b")
IHTMLApplicationCache : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_status(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onchecking(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onchecking(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onerror(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onerror(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onnoupdate(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onnoupdate(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondownloading(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ondownloading(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onprogress(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onprogress(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onupdateready(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onupdateready(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_oncached(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_oncached(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onobsolete(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onobsolete(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE update(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE swapCache(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE abort(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLApplicationCache, 0x30510828, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLApplicationCacheVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLApplicationCache* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLApplicationCache* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLApplicationCache* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLApplicationCache* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLApplicationCache* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLApplicationCache* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLApplicationCache* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLApplicationCache methods ***/
    HRESULT (STDMETHODCALLTYPE *get_status)(
        IHTMLApplicationCache* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *put_onchecking)(
        IHTMLApplicationCache* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onchecking)(
        IHTMLApplicationCache* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onerror)(
        IHTMLApplicationCache* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onerror)(
        IHTMLApplicationCache* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onnoupdate)(
        IHTMLApplicationCache* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onnoupdate)(
        IHTMLApplicationCache* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_ondownloading)(
        IHTMLApplicationCache* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_ondownloading)(
        IHTMLApplicationCache* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onprogress)(
        IHTMLApplicationCache* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onprogress)(
        IHTMLApplicationCache* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onupdateready)(
        IHTMLApplicationCache* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onupdateready)(
        IHTMLApplicationCache* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_oncached)(
        IHTMLApplicationCache* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_oncached)(
        IHTMLApplicationCache* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onobsolete)(
        IHTMLApplicationCache* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onobsolete)(
        IHTMLApplicationCache* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *update)(
        IHTMLApplicationCache* This);

    HRESULT (STDMETHODCALLTYPE *swapCache)(
        IHTMLApplicationCache* This);

    HRESULT (STDMETHODCALLTYPE *abort)(
        IHTMLApplicationCache* This);

    END_INTERFACE
} IHTMLApplicationCacheVtbl;
interface IHTMLApplicationCache {
    CONST_VTBL IHTMLApplicationCacheVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLApplicationCache_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLApplicationCache_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLApplicationCache_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLApplicationCache_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLApplicationCache_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLApplicationCache_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLApplicationCache_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLApplicationCache methods ***/
#define IHTMLApplicationCache_get_status(This,p) (This)->lpVtbl->get_status(This,p)
#define IHTMLApplicationCache_put_onchecking(This,v) (This)->lpVtbl->put_onchecking(This,v)
#define IHTMLApplicationCache_get_onchecking(This,p) (This)->lpVtbl->get_onchecking(This,p)
#define IHTMLApplicationCache_put_onerror(This,v) (This)->lpVtbl->put_onerror(This,v)
#define IHTMLApplicationCache_get_onerror(This,p) (This)->lpVtbl->get_onerror(This,p)
#define IHTMLApplicationCache_put_onnoupdate(This,v) (This)->lpVtbl->put_onnoupdate(This,v)
#define IHTMLApplicationCache_get_onnoupdate(This,p) (This)->lpVtbl->get_onnoupdate(This,p)
#define IHTMLApplicationCache_put_ondownloading(This,v) (This)->lpVtbl->put_ondownloading(This,v)
#define IHTMLApplicationCache_get_ondownloading(This,p) (This)->lpVtbl->get_ondownloading(This,p)
#define IHTMLApplicationCache_put_onprogress(This,v) (This)->lpVtbl->put_onprogress(This,v)
#define IHTMLApplicationCache_get_onprogress(This,p) (This)->lpVtbl->get_onprogress(This,p)
#define IHTMLApplicationCache_put_onupdateready(This,v) (This)->lpVtbl->put_onupdateready(This,v)
#define IHTMLApplicationCache_get_onupdateready(This,p) (This)->lpVtbl->get_onupdateready(This,p)
#define IHTMLApplicationCache_put_oncached(This,v) (This)->lpVtbl->put_oncached(This,v)
#define IHTMLApplicationCache_get_oncached(This,p) (This)->lpVtbl->get_oncached(This,p)
#define IHTMLApplicationCache_put_onobsolete(This,v) (This)->lpVtbl->put_onobsolete(This,v)
#define IHTMLApplicationCache_get_onobsolete(This,p) (This)->lpVtbl->get_onobsolete(This,p)
#define IHTMLApplicationCache_update(This) (This)->lpVtbl->update(This)
#define IHTMLApplicationCache_swapCache(This) (This)->lpVtbl->swapCache(This)
#define IHTMLApplicationCache_abort(This) (This)->lpVtbl->abort(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLApplicationCache_QueryInterface(IHTMLApplicationCache* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLApplicationCache_AddRef(IHTMLApplicationCache* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLApplicationCache_Release(IHTMLApplicationCache* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLApplicationCache_GetTypeInfoCount(IHTMLApplicationCache* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLApplicationCache_GetTypeInfo(IHTMLApplicationCache* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLApplicationCache_GetIDsOfNames(IHTMLApplicationCache* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLApplicationCache_Invoke(IHTMLApplicationCache* 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);
}
/*** IHTMLApplicationCache methods ***/
static FORCEINLINE HRESULT IHTMLApplicationCache_get_status(IHTMLApplicationCache* This,LONG *p) {
    return This->lpVtbl->get_status(This,p);
}
static FORCEINLINE HRESULT IHTMLApplicationCache_put_onchecking(IHTMLApplicationCache* This,VARIANT v) {
    return This->lpVtbl->put_onchecking(This,v);
}
static FORCEINLINE HRESULT IHTMLApplicationCache_get_onchecking(IHTMLApplicationCache* This,VARIANT *p) {
    return This->lpVtbl->get_onchecking(This,p);
}
static FORCEINLINE HRESULT IHTMLApplicationCache_put_onerror(IHTMLApplicationCache* This,VARIANT v) {
    return This->lpVtbl->put_onerror(This,v);
}
static FORCEINLINE HRESULT IHTMLApplicationCache_get_onerror(IHTMLApplicationCache* This,VARIANT *p) {
    return This->lpVtbl->get_onerror(This,p);
}
static FORCEINLINE HRESULT IHTMLApplicationCache_put_onnoupdate(IHTMLApplicationCache* This,VARIANT v) {
    return This->lpVtbl->put_onnoupdate(This,v);
}
static FORCEINLINE HRESULT IHTMLApplicationCache_get_onnoupdate(IHTMLApplicationCache* This,VARIANT *p) {
    return This->lpVtbl->get_onnoupdate(This,p);
}
static FORCEINLINE HRESULT IHTMLApplicationCache_put_ondownloading(IHTMLApplicationCache* This,VARIANT v) {
    return This->lpVtbl->put_ondownloading(This,v);
}
static FORCEINLINE HRESULT IHTMLApplicationCache_get_ondownloading(IHTMLApplicationCache* This,VARIANT *p) {
    return This->lpVtbl->get_ondownloading(This,p);
}
static FORCEINLINE HRESULT IHTMLApplicationCache_put_onprogress(IHTMLApplicationCache* This,VARIANT v) {
    return This->lpVtbl->put_onprogress(This,v);
}
static FORCEINLINE HRESULT IHTMLApplicationCache_get_onprogress(IHTMLApplicationCache* This,VARIANT *p) {
    return This->lpVtbl->get_onprogress(This,p);
}
static FORCEINLINE HRESULT IHTMLApplicationCache_put_onupdateready(IHTMLApplicationCache* This,VARIANT v) {
    return This->lpVtbl->put_onupdateready(This,v);
}
static FORCEINLINE HRESULT IHTMLApplicationCache_get_onupdateready(IHTMLApplicationCache* This,VARIANT *p) {
    return This->lpVtbl->get_onupdateready(This,p);
}
static FORCEINLINE HRESULT IHTMLApplicationCache_put_oncached(IHTMLApplicationCache* This,VARIANT v) {
    return This->lpVtbl->put_oncached(This,v);
}
static FORCEINLINE HRESULT IHTMLApplicationCache_get_oncached(IHTMLApplicationCache* This,VARIANT *p) {
    return This->lpVtbl->get_oncached(This,p);
}
static FORCEINLINE HRESULT IHTMLApplicationCache_put_onobsolete(IHTMLApplicationCache* This,VARIANT v) {
    return This->lpVtbl->put_onobsolete(This,v);
}
static FORCEINLINE HRESULT IHTMLApplicationCache_get_onobsolete(IHTMLApplicationCache* This,VARIANT *p) {
    return This->lpVtbl->get_onobsolete(This,p);
}
static FORCEINLINE HRESULT IHTMLApplicationCache_update(IHTMLApplicationCache* This) {
    return This->lpVtbl->update(This);
}
static FORCEINLINE HRESULT IHTMLApplicationCache_swapCache(IHTMLApplicationCache* This) {
    return This->lpVtbl->swapCache(This);
}
static FORCEINLINE HRESULT IHTMLApplicationCache_abort(IHTMLApplicationCache* This) {
    return This->lpVtbl->abort(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLApplicationCache_get_status_Proxy(
    IHTMLApplicationCache* This,
    LONG *p);
void __RPC_STUB IHTMLApplicationCache_get_status_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLApplicationCache_put_onchecking_Proxy(
    IHTMLApplicationCache* This,
    VARIANT v);
void __RPC_STUB IHTMLApplicationCache_put_onchecking_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLApplicationCache_get_onchecking_Proxy(
    IHTMLApplicationCache* This,
    VARIANT *p);
void __RPC_STUB IHTMLApplicationCache_get_onchecking_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLApplicationCache_put_onerror_Proxy(
    IHTMLApplicationCache* This,
    VARIANT v);
void __RPC_STUB IHTMLApplicationCache_put_onerror_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLApplicationCache_get_onerror_Proxy(
    IHTMLApplicationCache* This,
    VARIANT *p);
void __RPC_STUB IHTMLApplicationCache_get_onerror_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLApplicationCache_put_onnoupdate_Proxy(
    IHTMLApplicationCache* This,
    VARIANT v);
void __RPC_STUB IHTMLApplicationCache_put_onnoupdate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLApplicationCache_get_onnoupdate_Proxy(
    IHTMLApplicationCache* This,
    VARIANT *p);
void __RPC_STUB IHTMLApplicationCache_get_onnoupdate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLApplicationCache_put_ondownloading_Proxy(
    IHTMLApplicationCache* This,
    VARIANT v);
void __RPC_STUB IHTMLApplicationCache_put_ondownloading_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLApplicationCache_get_ondownloading_Proxy(
    IHTMLApplicationCache* This,
    VARIANT *p);
void __RPC_STUB IHTMLApplicationCache_get_ondownloading_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLApplicationCache_put_onprogress_Proxy(
    IHTMLApplicationCache* This,
    VARIANT v);
void __RPC_STUB IHTMLApplicationCache_put_onprogress_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLApplicationCache_get_onprogress_Proxy(
    IHTMLApplicationCache* This,
    VARIANT *p);
void __RPC_STUB IHTMLApplicationCache_get_onprogress_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLApplicationCache_put_onupdateready_Proxy(
    IHTMLApplicationCache* This,
    VARIANT v);
void __RPC_STUB IHTMLApplicationCache_put_onupdateready_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLApplicationCache_get_onupdateready_Proxy(
    IHTMLApplicationCache* This,
    VARIANT *p);
void __RPC_STUB IHTMLApplicationCache_get_onupdateready_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLApplicationCache_put_oncached_Proxy(
    IHTMLApplicationCache* This,
    VARIANT v);
void __RPC_STUB IHTMLApplicationCache_put_oncached_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLApplicationCache_get_oncached_Proxy(
    IHTMLApplicationCache* This,
    VARIANT *p);
void __RPC_STUB IHTMLApplicationCache_get_oncached_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLApplicationCache_put_onobsolete_Proxy(
    IHTMLApplicationCache* This,
    VARIANT v);
void __RPC_STUB IHTMLApplicationCache_put_onobsolete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLApplicationCache_get_onobsolete_Proxy(
    IHTMLApplicationCache* This,
    VARIANT *p);
void __RPC_STUB IHTMLApplicationCache_get_onobsolete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLApplicationCache_update_Proxy(
    IHTMLApplicationCache* This);
void __RPC_STUB IHTMLApplicationCache_update_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLApplicationCache_swapCache_Proxy(
    IHTMLApplicationCache* This);
void __RPC_STUB IHTMLApplicationCache_swapCache_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLApplicationCache_abort_Proxy(
    IHTMLApplicationCache* This);
void __RPC_STUB IHTMLApplicationCache_abort_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLApplicationCache_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispApplicationCache dispinterface
 */
#ifndef __DispApplicationCache_DISPINTERFACE_DEFINED__
#define __DispApplicationCache_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispApplicationCache, 0x305900e4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305900e4-98b5-11cf-bb82-00aa00bdce0b")
DispApplicationCache : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispApplicationCache, 0x305900e4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispApplicationCacheVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispApplicationCache* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispApplicationCache* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispApplicationCache* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispApplicationCache* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispApplicationCache* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispApplicationCache* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispApplicationCache* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispApplicationCacheVtbl;
interface DispApplicationCache {
    CONST_VTBL DispApplicationCacheVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispApplicationCache_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispApplicationCache_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispApplicationCache_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispApplicationCache_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispApplicationCache_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispApplicationCache_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispApplicationCache_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 DispApplicationCache_QueryInterface(DispApplicationCache* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispApplicationCache_AddRef(DispApplicationCache* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispApplicationCache_Release(DispApplicationCache* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispApplicationCache_GetTypeInfoCount(DispApplicationCache* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispApplicationCache_GetTypeInfo(DispApplicationCache* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispApplicationCache_GetIDsOfNames(DispApplicationCache* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispApplicationCache_Invoke(DispApplicationCache* 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  /* __DispApplicationCache_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * ApplicationCache coclass
 */

DEFINE_GUID(CLSID_ApplicationCache, 0x30510829, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("30510829-98b5-11cf-bb82-00aa00bdce0b") ApplicationCache;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ApplicationCache, 0x30510829, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

#ifndef __IElementBehaviorSite_FWD_DEFINED__
#define __IElementBehaviorSite_FWD_DEFINED__
typedef interface IElementBehaviorSite IElementBehaviorSite;
#endif

#ifndef __ICSSFilterSite_FWD_DEFINED__
#define __ICSSFilterSite_FWD_DEFINED__
typedef interface ICSSFilterSite ICSSFilterSite;
#endif

#ifndef __IMarkupPointer_FWD_DEFINED__
#define __IMarkupPointer_FWD_DEFINED__
typedef interface IMarkupPointer IMarkupPointer;
#endif

#ifndef __IMarkupContainer_FWD_DEFINED__
#define __IMarkupContainer_FWD_DEFINED__
typedef interface IMarkupContainer IMarkupContainer;
#endif

#ifndef __IMarkupContainer2_FWD_DEFINED__
#define __IMarkupContainer2_FWD_DEFINED__
typedef interface IMarkupContainer2 IMarkupContainer2;
#endif

#ifndef __IHTMLChangeLog_FWD_DEFINED__
#define __IHTMLChangeLog_FWD_DEFINED__
typedef interface IHTMLChangeLog IHTMLChangeLog;
#endif

#ifndef __IHTMLChangeSink_FWD_DEFINED__
#define __IHTMLChangeSink_FWD_DEFINED__
typedef interface IHTMLChangeSink IHTMLChangeSink;
#endif

#ifndef __IHTMLDocument2_FWD_DEFINED__
#define __IHTMLDocument2_FWD_DEFINED__
typedef interface IHTMLDocument2 IHTMLDocument2;
#endif

#ifndef __IActiveIMMApp_FWD_DEFINED__
#define __IActiveIMMApp_FWD_DEFINED__
typedef interface IActiveIMMApp IActiveIMMApp;
#endif

#ifndef __ISegmentList_FWD_DEFINED__
#define __ISegmentList_FWD_DEFINED__
typedef interface ISegmentList ISegmentList;
#endif

#ifndef __ISegmentListIterator_FWD_DEFINED__
#define __ISegmentListIterator_FWD_DEFINED__
typedef interface ISegmentListIterator ISegmentListIterator;
#endif

#ifndef __IHTMLCaret_FWD_DEFINED__
#define __IHTMLCaret_FWD_DEFINED__
typedef interface IHTMLCaret IHTMLCaret;
#endif

#ifndef __ISegment_FWD_DEFINED__
#define __ISegment_FWD_DEFINED__
typedef interface ISegment ISegment;
#endif

#ifndef __IElementSegment_FWD_DEFINED__
#define __IElementSegment_FWD_DEFINED__
typedef interface IElementSegment IElementSegment;
#endif

#ifndef __IHighlightSegment_FWD_DEFINED__
#define __IHighlightSegment_FWD_DEFINED__
typedef interface IHighlightSegment IHighlightSegment;
#endif

#ifndef __IHighlightRenderingServices_FWD_DEFINED__
#define __IHighlightRenderingServices_FWD_DEFINED__
typedef interface IHighlightRenderingServices IHighlightRenderingServices;
#endif

#ifndef __ILineInfo_FWD_DEFINED__
#define __ILineInfo_FWD_DEFINED__
typedef interface ILineInfo ILineInfo;
#endif

#ifndef __IDisplayPointer_FWD_DEFINED__
#define __IDisplayPointer_FWD_DEFINED__
typedef interface IDisplayPointer IDisplayPointer;
#endif

#ifndef __IDisplayServices_FWD_DEFINED__
#define __IDisplayServices_FWD_DEFINED__
typedef interface IDisplayServices IDisplayServices;
#endif

#ifndef __IHtmlDlgSafeHelper_FWD_DEFINED__
#define __IHtmlDlgSafeHelper_FWD_DEFINED__
typedef interface IHtmlDlgSafeHelper IHtmlDlgSafeHelper;
#endif

#ifndef __IBlockFormats_FWD_DEFINED__
#define __IBlockFormats_FWD_DEFINED__
typedef interface IBlockFormats IBlockFormats;
#endif

#ifndef __IFontNames_FWD_DEFINED__
#define __IFontNames_FWD_DEFINED__
typedef interface IFontNames IFontNames;
#endif

#ifndef __IScriptEventHandler_FWD_DEFINED__
#define __IScriptEventHandler_FWD_DEFINED__
typedef interface IScriptEventHandler IScriptEventHandler;
#endif

#ifndef __IHTMLPainter_FWD_DEFINED__
#define __IHTMLPainter_FWD_DEFINED__
typedef interface IHTMLPainter IHTMLPainter;
#endif

#ifndef __IHTMLPaintSite_FWD_DEFINED__
#define __IHTMLPaintSite_FWD_DEFINED__
typedef interface IHTMLPaintSite IHTMLPaintSite;
#endif

EXTERN_C const GUID CLSID_CHTMLNamespace;
EXTERN_C const GUID CLSID_CHTMLNamespaceCollection;
EXTERN_C const GUID CLSID_HtmlDlgSafeHelper;
EXTERN_C const GUID CLSID_BlockFormats;
EXTERN_C const GUID CLSID_FontNames;
EXTERN_C const GUID CLSID_CApplicationCache;
typedef enum _ELEMENT_CORNER {
    ELEMENT_CORNER_NONE = 0,
    ELEMENT_CORNER_TOP = 1,
    ELEMENT_CORNER_LEFT = 2,
    ELEMENT_CORNER_BOTTOM = 3,
    ELEMENT_CORNER_RIGHT = 4,
    ELEMENT_CORNER_TOPLEFT = 5,
    ELEMENT_CORNER_TOPRIGHT = 6,
    ELEMENT_CORNER_BOTTOMLEFT = 7,
    ELEMENT_CORNER_BOTTOMRIGHT = 8,
    ELEMENT_CORNER_Max = 0x7fffffff
} ELEMENT_CORNER;
typedef enum _SECUREURLHOSTVALIDATE_FLAGS {
    SUHV_PROMPTBEFORENO = 0x1,
    SUHV_SILENTYES = 0x2,
    SUHV_UNSECURESOURCE = 0x4,
    SECUREURLHOSTVALIDATE_FLAGS_Max = 0x7fffffff
} SECUREURLHOSTVALIDATE_FLAGS;
typedef enum _POINTER_GRAVITY {
    POINTER_GRAVITY_Left = 0,
    POINTER_GRAVITY_Right = 1,
    POINTER_GRAVITY_Max = 0x7fffffff
} POINTER_GRAVITY;
typedef enum _ELEMENT_ADJACENCY {
    ELEM_ADJ_BeforeBegin = 0,
    ELEM_ADJ_AfterBegin = 1,
    ELEM_ADJ_BeforeEnd = 2,
    ELEM_ADJ_AfterEnd = 3,
    ELEMENT_ADJACENCY_Max = 0x7fffffff
} ELEMENT_ADJACENCY;
typedef enum _MARKUP_CONTEXT_TYPE {
    CONTEXT_TYPE_None = 0,
    CONTEXT_TYPE_Text = 1,
    CONTEXT_TYPE_EnterScope = 2,
    CONTEXT_TYPE_ExitScope = 3,
    CONTEXT_TYPE_NoScope = 4,
    MARKUP_CONTEXT_TYPE_Max = 0x7fffffff
} MARKUP_CONTEXT_TYPE;
typedef enum _FINDTEXT_FLAGS {
    FINDTEXT_BACKWARDS = 0x1,
    FINDTEXT_WHOLEWORD = 0x2,
    FINDTEXT_MATCHCASE = 0x4,
    FINDTEXT_RAW = 0x20000,
    FINDTEXT_MATCHREPEATEDWHITESPACE = 0x40000,
    FINDTEXT_MATCHDIAC = 0x20000000,
    FINDTEXT_MATCHKASHIDA = 0x40000000,
    FINDTEXT_MATCHALEFHAMZA = 0x80000000,
    FINDTEXT_FLAGS_Max = 0x7fffffff
} FINDTEXT_FLAGS;
typedef enum _MOVEUNIT_ACTION {
    MOVEUNIT_PREVCHAR = 0,
    MOVEUNIT_NEXTCHAR = 1,
    MOVEUNIT_PREVCLUSTERBEGIN = 2,
    MOVEUNIT_NEXTCLUSTERBEGIN = 3,
    MOVEUNIT_PREVCLUSTEREND = 4,
    MOVEUNIT_NEXTCLUSTEREND = 5,
    MOVEUNIT_PREVWORDBEGIN = 6,
    MOVEUNIT_NEXTWORDBEGIN = 7,
    MOVEUNIT_PREVWORDEND = 8,
    MOVEUNIT_NEXTWORDEND = 9,
    MOVEUNIT_PREVPROOFWORD = 10,
    MOVEUNIT_NEXTPROOFWORD = 11,
    MOVEUNIT_NEXTURLBEGIN = 12,
    MOVEUNIT_PREVURLBEGIN = 13,
    MOVEUNIT_NEXTURLEND = 14,
    MOVEUNIT_PREVURLEND = 15,
    MOVEUNIT_PREVSENTENCE = 16,
    MOVEUNIT_NEXTSENTENCE = 17,
    MOVEUNIT_PREVBLOCK = 18,
    MOVEUNIT_NEXTBLOCK = 19,
    MOVEUNIT_ACTION_Max = 0x7fffffff
} MOVEUNIT_ACTION;
typedef enum _PARSE_FLAGS {
    PARSE_ABSOLUTIFYIE40URLS = 0x1,
    PARSE_DISABLEVML = 0x2,
    PARSE_FLAGS_Max = 0x7fffffff
} PARSE_FLAGS;
typedef enum _ELEMENT_TAG_ID {
    TAGID_NULL = 0,
    TAGID_UNKNOWN = 1,
    TAGID_A = 2,
    TAGID_ACRONYM = 3,
    TAGID_ADDRESS = 4,
    TAGID_APPLET = 5,
    TAGID_AREA = 6,
    TAGID_B = 7,
    TAGID_BASE = 8,
    TAGID_BASEFONT = 9,
    TAGID_BDO = 10,
    TAGID_BGSOUND = 11,
    TAGID_BIG = 12,
    TAGID_BLINK = 13,
    TAGID_BLOCKQUOTE = 14,
    TAGID_BODY = 15,
    TAGID_BR = 16,
    TAGID_BUTTON = 17,
    TAGID_CAPTION = 18,
    TAGID_CENTER = 19,
    TAGID_CITE = 20,
    TAGID_CODE = 21,
    TAGID_COL = 22,
    TAGID_COLGROUP = 23,
    TAGID_COMMENT = 24,
    TAGID_COMMENT_RAW = 25,
    TAGID_DD = 26,
    TAGID_DEL = 27,
    TAGID_DFN = 28,
    TAGID_DIR = 29,
    TAGID_DIV = 30,
    TAGID_DL = 31,
    TAGID_DT = 32,
    TAGID_EM = 33,
    TAGID_EMBED = 34,
    TAGID_FIELDSET = 35,
    TAGID_FONT = 36,
    TAGID_FORM = 37,
    TAGID_FRAME = 38,
    TAGID_FRAMESET = 39,
    TAGID_GENERIC = 40,
    TAGID_H1 = 41,
    TAGID_H2 = 42,
    TAGID_H3 = 43,
    TAGID_H4 = 44,
    TAGID_H5 = 45,
    TAGID_H6 = 46,
    TAGID_HEAD = 47,
    TAGID_HR = 48,
    TAGID_HTML = 49,
    TAGID_I = 50,
    TAGID_IFRAME = 51,
    TAGID_IMG = 52,
    TAGID_INPUT = 53,
    TAGID_INS = 54,
    TAGID_KBD = 55,
    TAGID_LABEL = 56,
    TAGID_LEGEND = 57,
    TAGID_LI = 58,
    TAGID_LINK = 59,
    TAGID_LISTING = 60,
    TAGID_MAP = 61,
    TAGID_MARQUEE = 62,
    TAGID_MENU = 63,
    TAGID_META = 64,
    TAGID_NEXTID = 65,
    TAGID_NOBR = 66,
    TAGID_NOEMBED = 67,
    TAGID_NOFRAMES = 68,
    TAGID_NOSCRIPT = 69,
    TAGID_OBJECT = 70,
    TAGID_OL = 71,
    TAGID_OPTION = 72,
    TAGID_P = 73,
    TAGID_PARAM = 74,
    TAGID_PLAINTEXT = 75,
    TAGID_PRE = 76,
    TAGID_Q = 77,
    TAGID_RP = 78,
    TAGID_RT = 79,
    TAGID_RUBY = 80,
    TAGID_S = 81,
    TAGID_SAMP = 82,
    TAGID_SCRIPT = 83,
    TAGID_SELECT = 84,
    TAGID_SMALL = 85,
    TAGID_SPAN = 86,
    TAGID_STRIKE = 87,
    TAGID_STRONG = 88,
    TAGID_STYLE = 89,
    TAGID_SUB = 90,
    TAGID_SUP = 91,
    TAGID_TABLE = 92,
    TAGID_TBODY = 93,
    TAGID_TC = 94,
    TAGID_TD = 95,
    TAGID_TEXTAREA = 96,
    TAGID_TFOOT = 97,
    TAGID_TH = 98,
    TAGID_THEAD = 99,
    TAGID_TITLE = 100,
    TAGID_TR = 101,
    TAGID_TT = 102,
    TAGID_U = 103,
    TAGID_UL = 104,
    TAGID_VAR = 105,
    TAGID_WBR = 106,
    TAGID_XMP = 107,
    TAGID_ROOT = 108,
    TAGID_OPTGROUP = 109,
    TAGID_ABBR = 110,
    TAGID_SVG_A = 111,
    TAGID_SVG_ALTGLYPH = 112,
    TAGID_SVG_ALTGLYPHDEF = 113,
    TAGID_SVG_ALTGLYPHITEM = 114,
    TAGID_SVG_ANIMATE = 115,
    TAGID_SVG_ANIMATECOLOR = 116,
    TAGID_SVG_ANIMATEMOTION = 117,
    TAGID_SVG_ANIMATETRANSFORM = 118,
    TAGID_SVG_CIRCLE = 119,
    TAGID_SVG_CLIPPATH = 120,
    TAGID_SVG_COLOR_PROFILE = 121,
    TAGID_SVG_CURSOR = 122,
    TAGID_SVG_DEFINITION_SRC = 123,
    TAGID_SVG_DEFS = 124,
    TAGID_SVG_DESC = 125,
    TAGID_SVG_ELLIPSE = 126,
    TAGID_SVG_FEBLEND = 127,
    TAGID_SVG_FECOLORMATRIX = 128,
    TAGID_SVG_FECOMPONENTTRANSFER = 129,
    TAGID_SVG_FECOMPOSITE = 130,
    TAGID_SVG_FECONVOLVEMATRIX = 131,
    TAGID_SVG_FEDIFFUSELIGHTING = 132,
    TAGID_SVG_FEDISPLACEMENTMAP = 133,
    TAGID_SVG_FEDISTANTLIGHT = 134,
    TAGID_SVG_FEFLOOD = 135,
    TAGID_SVG_FEFUNCA = 136,
    TAGID_SVG_FEFUNCB = 137,
    TAGID_SVG_FEFUNCG = 138,
    TAGID_SVG_FEFUNCR = 139,
    TAGID_SVG_FEGAUSSIANBLUR = 140,
    TAGID_SVG_FEIMAGE = 141,
    TAGID_SVG_FEMERGE = 142,
    TAGID_SVG_FEMERGENODE = 143,
    TAGID_SVG_FEMORPHOLOGY = 144,
    TAGID_SVG_FEOFFSET = 145,
    TAGID_SVG_FEPOINTLIGHT = 146,
    TAGID_SVG_FESPECULARLIGHTING = 147,
    TAGID_SVG_FESPOTLIGHT = 148,
    TAGID_SVG_FETILE = 149,
    TAGID_SVG_FETURBULENCE = 150,
    TAGID_SVG_FILTER = 151,
    TAGID_SVG_FONT = 152,
    TAGID_SVG_FONT_FACE = 153,
    TAGID_SVG_FONT_FACE_FORMAT = 154,
    TAGID_SVG_FONT_FACE_NAME = 155,
    TAGID_SVG_FONT_FACE_SRC = 156,
    TAGID_SVG_FONT_FACE_URI = 157,
    TAGID_SVG_FOREIGNOBJECT = 158,
    TAGID_SVG_G = 159,
    TAGID_SVG_GLYPH = 160,
    TAGID_SVG_GLYPHREF = 161,
    TAGID_SVG_HKERN = 162,
    TAGID_SVG_IMAGE = 163,
    TAGID_SVG_LINE = 164,
    TAGID_SVG_LINEARGRADIENT = 165,
    TAGID_SVG_MARKER = 166,
    TAGID_SVG_MASK = 167,
    TAGID_SVG_METADATA = 168,
    TAGID_SVG_MISSING_GLYPH = 169,
    TAGID_SVG_MPATH = 170,
    TAGID_SVG_PATH = 171,
    TAGID_SVG_PATTERN = 172,
    TAGID_SVG_POLYGON = 173,
    TAGID_SVG_POLYLINE = 174,
    TAGID_SVG_RADIALGRADIENT = 175,
    TAGID_SVG_RECT = 176,
    TAGID_SVG_SCRIPT = 177,
    TAGID_SVG_SET = 178,
    TAGID_SVG_STOP = 179,
    TAGID_SVG_STYLE = 180,
    TAGID_SVG_SVG = 181,
    TAGID_SVG_SWITCH = 182,
    TAGID_SVG_SYMBOL = 183,
    TAGID_SVG_TEXT = 184,
    TAGID_SVG_TEXTPATH = 185,
    TAGID_SVG_TITLE = 186,
    TAGID_SVG_TREF = 187,
    TAGID_SVG_TSPAN = 188,
    TAGID_SVG_USE = 189,
    TAGID_SVG_VIEW = 190,
    TAGID_SVG_VKERN = 191,
    TAGID_AUDIO = 192,
    TAGID_SOURCE = 193,
    TAGID_VIDEO = 194,
    TAGID_CANVAS = 195,
    TAGID_DOCTYPE = 196,
    TAGID_KEYGEN = 197,
    TAGID_PROCESSINGINSTRUCTION = 198,
    TAGID_ARTICLE = 199,
    TAGID_ASIDE = 200,
    TAGID_FIGCAPTION = 201,
    TAGID_FIGURE = 202,
    TAGID_FOOTER = 203,
    TAGID_HEADER = 204,
    TAGID_HGROUP = 205,
    TAGID_MARK = 206,
    TAGID_NAV = 207,
    TAGID_SECTION = 208,
    TAGID_PROGRESS = 209,
    TAGID_MATHML_ANNOTATION_XML = 210,
    TAGID_MATHML_MATH = 211,
    TAGID_MATHML_MI = 212,
    TAGID_MATHML_MN = 213,
    TAGID_MATHML_MO = 214,
    TAGID_MATHML_MS = 215,
    TAGID_MATHML_MTEXT = 216,
    TAGID_DATALIST = 217,
    TAGID_TRACK = 218,
    TAGID_ISINDEX = 219,
    TAGID_COMMAND = 220,
    TAGID_DETAILS = 221,
    TAGID_SUMMARY = 222,
    TAGID_COUNT = 223,
    TAGID_LAST_PREDEFINED = 10000,
    ELEMENT_TAG_ID_Max = 0x7fffffff
} ELEMENT_TAG_ID;
typedef enum _SELECTION_TYPE {
    SELECTION_TYPE_None = 0,
    SELECTION_TYPE_Caret = 1,
    SELECTION_TYPE_Text = 2,
    SELECTION_TYPE_Control = 3,
    SELECTION_TYPE_Max = 0x7fffffff
} SELECTION_TYPE;
typedef enum _SAVE_SEGMENTS_FLAGS {
    SAVE_SEGMENTS_NoIE4SelectionCompat = 0x1,
    SAVE_SEGMENTS_FLAGS_Max = 0x7fffffff
} SAVE_SEGMENTS_FLAGS;
typedef enum _CARET_DIRECTION {
    CARET_DIRECTION_INDETERMINATE = 0,
    CARET_DIRECTION_SAME = 1,
    CARET_DIRECTION_BACKWARD = 2,
    CARET_DIRECTION_FORWARD = 3,
    CARET_DIRECTION_Max = 0x7fffffff
} CARET_DIRECTION;
typedef enum _LINE_DIRECTION {
    LINE_DIRECTION_RightToLeft = 1,
    LINE_DIRECTION_LeftToRight = 2,
    LINE_DIRECTION_Max = 0x7fffffff
} LINE_DIRECTION;
typedef enum _HT_OPTIONS {
    HT_OPT_AllowAfterEOL = 0x1,
    HT_OPTIONS_Max = 0x7fffffff
} HT_OPTIONS;
typedef enum _HT_RESULTS {
    HT_RESULTS_Glyph = 0x1,
    HT_RESULTS_Max = 0x7fffffff
} HT_RESULTS;
typedef enum _DISPLAY_MOVEUNIT {
    DISPLAY_MOVEUNIT_PreviousLine = 1,
    DISPLAY_MOVEUNIT_NextLine = 2,
    DISPLAY_MOVEUNIT_CurrentLineStart = 3,
    DISPLAY_MOVEUNIT_CurrentLineEnd = 4,
    DISPLAY_MOVEUNIT_TopOfWindow = 5,
    DISPLAY_MOVEUNIT_BottomOfWindow = 6,
    DISPLAY_MOVEUNIT_Max = 0x7fffffff
} DISPLAY_MOVEUNIT;
typedef enum _DISPLAY_GRAVITY {
    DISPLAY_GRAVITY_PreviousLine = 1,
    DISPLAY_GRAVITY_NextLine = 2,
    DISPLAY_GRAVITY_Max = 0x7fffffff
} DISPLAY_GRAVITY;
typedef enum _DISPLAY_BREAK {
    DISPLAY_BREAK_None = 0x0,
    DISPLAY_BREAK_Block = 0x1,
    DISPLAY_BREAK_Break = 0x2,
    DISPLAY_BREAK_Max = 0x7fffffff
} DISPLAY_BREAK;
typedef enum _COORD_SYSTEM {
    COORD_SYSTEM_GLOBAL = 0,
    COORD_SYSTEM_PARENT = 1,
    COORD_SYSTEM_CONTAINER = 2,
    COORD_SYSTEM_CONTENT = 3,
    COORD_SYSTEM_FRAME = 4,
    COORD_SYSTEM_CLIENT = 5,
    COORD_SYSTEM_Max = 0x7fffffff
} COORD_SYSTEM;
typedef enum _DEV_CONSOLE_MESSAGE_LEVEL {
    DCML_INFORMATIONAL = 0x0,
    DCML_WARNING = 0x1,
    DCML_ERROR = 0x2,
    DEV_CONSOLE_MESSAGE_LEVEL_Max = 0x7fffffff
} DEV_CONSOLE_MESSAGE_LEVEL;
typedef enum _DOM_EVENT_PHASE {
    DEP_CAPTURING_PHASE = 0x1,
    DEP_AT_TARGET = 0x2,
    DEP_BUBBLING_PHASE = 0x3,
    DOM_EVENT_PHASE_Max = 0x7fffffff
} DOM_EVENT_PHASE;
typedef enum _SCRIPT_TIMER_TYPE {
    STT_TIMEOUT = 0x0,
    STT_INTERVAL = 0x1,
    STT_IMMEDIATE = 0x2,
    STT_ANIMATION_FRAME = 0x3,
    SCRIPT_TIMER_TYPE_Max = 0x7fffffff
} SCRIPT_TIMER_TYPE;
typedef enum _HTML_PAINTER {
    HTMLPAINTER_OPAQUE = 0x1,
    HTMLPAINTER_TRANSPARENT = 0x2,
    HTMLPAINTER_ALPHA = 0x4,
    HTMLPAINTER_COMPLEX = 0x8,
    HTMLPAINTER_OVERLAY = 0x10,
    HTMLPAINTER_HITTEST = 0x20,
    HTMLPAINTER_SURFACE = 0x100,
    HTMLPAINTER_3DSURFACE = 0x200,
    HTMLPAINTER_NOBAND = 0x400,
    HTMLPAINTER_NODC = 0x1000,
    HTMLPAINTER_NOPHYSICALCLIP = 0x2000,
    HTMLPAINTER_NOSAVEDC = 0x4000,
    HTMLPAINTER_SUPPORTS_XFORM = 0x8000,
    HTMLPAINTER_EXPAND = 0x10000,
    HTMLPAINTER_NOSCROLLBITS = 0x20000,
    HTML_PAINTER_Max = 0x7fffffff
} HTML_PAINTER;
typedef enum _HTML_PAINT_ZORDER {
    HTMLPAINT_ZORDER_NONE = 0,
    HTMLPAINT_ZORDER_REPLACE_ALL = 1,
    HTMLPAINT_ZORDER_REPLACE_CONTENT = 2,
    HTMLPAINT_ZORDER_REPLACE_BACKGROUND = 3,
    HTMLPAINT_ZORDER_BELOW_CONTENT = 4,
    HTMLPAINT_ZORDER_BELOW_FLOW = 5,
    HTMLPAINT_ZORDER_ABOVE_FLOW = 6,
    HTMLPAINT_ZORDER_ABOVE_CONTENT = 7,
    HTMLPAINT_ZORDER_WINDOW_TOP = 8,
    HTML_PAINT_ZORDER_Max = 0x7fffffff
} HTML_PAINT_ZORDER;
typedef enum _HTML_PAINT_DRAW_FLAGS {
    HTMLPAINT_DRAW_UPDATEREGION = 0x1,
    HTMLPAINT_DRAW_USE_XFORM = 0x2,
    HTML_PAINT_DRAW_FLAGS_Max = 0x7fffffff
} HTML_PAINT_DRAW_FLAGS;
typedef enum _HTML_PAINT_EVENT_FLAGS {
    HTMLPAINT_EVENT_TARGET = 0x1,
    HTMLPAINT_EVENT_SETCURSOR = 0x2,
    HTML_PAINT_EVENT_FLAGS_Max = 0x7fffffff
} HTML_PAINT_EVENT_FLAGS;
typedef enum _HTML_PAINT_DRAW_INFO_FLAGS {
    HTMLPAINT_DRAWINFO_VIEWPORT = 0x1,
    HTMLPAINT_DRAWINFO_UPDATEREGION = 0x2,
    HTMLPAINT_DRAWINFO_XFORM = 0x4,
    HTML_PAINT_DRAW_INFO_FLAGS_Max = 0x7fffffff
} HTML_PAINT_DRAW_INFO_FLAGS;
typedef struct _HTML_PAINTER_INFO {
    LONG lFlags;
    LONG lZOrder;
    IID iidDrawObject;
    RECT rcExpand;
} HTML_PAINTER_INFO;
typedef struct _HTML_PAINT_XFORM {
    FLOAT eM11;
    FLOAT eM12;
    FLOAT eM21;
    FLOAT eM22;
    FLOAT eDx;
    FLOAT eDy;
} HTML_PAINT_XFORM;
typedef struct _HTML_PAINT_DRAW_INFO {
    RECT rcViewport;
    HRGN hrgnUpdate;
    HTML_PAINT_XFORM xform;
} HTML_PAINT_DRAW_INFO;
#ifndef __IElementBehavior_FWD_DEFINED__
#define __IElementBehavior_FWD_DEFINED__
typedef interface IElementBehavior IElementBehavior;
#endif

#ifndef __IElementBehaviorSite_FWD_DEFINED__
#define __IElementBehaviorSite_FWD_DEFINED__
typedef interface IElementBehaviorSite IElementBehaviorSite;
#endif

#ifndef __IHTMLElementDefaults_FWD_DEFINED__
#define __IHTMLElementDefaults_FWD_DEFINED__
typedef interface IHTMLElementDefaults IHTMLElementDefaults;
#endif

#ifndef __ISurfacePresenter_FWD_DEFINED__
#define __ISurfacePresenter_FWD_DEFINED__
typedef interface ISurfacePresenter ISurfacePresenter;
#endif

EXTERN_C const GUID CLSID_CAppBehavior;
EXTERN_C const GUID CLSID_CHTMLDlg;
EXTERN_C const GUID CLSID_CHTMLPopup;
EXTERN_C const GUID CLSID_CThreadDialogProcParam;
typedef enum _HTMLDlgFlag {
    HTMLDlgFlagNo = 0,
    HTMLDlgFlagOff = 0,
    HTMLDlgFlag0 = 0,
    HTMLDlgFlagYes = 1,
    HTMLDlgFlagOn = 1,
    HTMLDlgFlag1 = 1,
    HTMLDlgFlagNotSet = -1,
    HTMLDlgFlag_Max = 0x7fffffff
} HTMLDlgFlag;
typedef enum _HTMLDlgBorder {
    HTMLDlgBorderThin = 0,
    HTMLDlgBorderThick = 0x40000,
    HTMLDlgBorder_Max = 0x7fffffff
} HTMLDlgBorder;
typedef enum _HTMLDlgEdge {
    HTMLDlgEdgeSunken = 0,
    HTMLDlgEdgeRaised = 16,
    HTMLDlgEdge_Max = 0x7fffffff
} HTMLDlgEdge;
typedef enum _HTMLDlgCenter {
    HTMLDlgCenterNo = 0,
    HTMLDlgCenterOff = 0,
    HTMLDlgCenter0 = 0,
    HTMLDlgCenterYes = 1,
    HTMLDlgCenterOn = 1,
    HTMLDlgCenter1 = 1,
    HTMLDlgCenterParent = 1,
    HTMLDlgCenterDesktop = 2,
    HTMLDlgCenter_Max = 0x7fffffff
} HTMLDlgCenter;
typedef enum _HTMLAppFlag {
    HTMLAppFlagNo = 0,
    HTMLAppFlagOff = 0,
    HTMLAppFlag0 = 0,
    HTMLAppFlagYes = 1,
    HTMLAppFlagOn = 1,
    HTMLAppFlag1 = 1,
    HTMLAppFlag_Max = 0x7fffffff
} HTMLAppFlag;
typedef enum _HTMLMinimizeFlag {
    HTMLMinimizeFlagNo = 0,
    HTMLMinimizeFlagYes = 0x20000,
    HTMLMinimizeFlag_Max = 0x7fffffff
} HTMLMinimizeFlag;
typedef enum _HTMLMaximizeFlag {
    HTMLMaximizeFlagNo = 0,
    HTMLMaximizeFlagYes = 0x10000,
    HTMLMaximizeFlag_Max = 0x7fffffff
} HTMLMaximizeFlag;
typedef enum _HTMLCaptionFlag {
    HTMLCaptionFlagNo = 0,
    HTMLCaptionFlagYes = 0xc00000,
    HTMLCaptionFlag_Max = 0x7fffffff
} HTMLCaptionFlag;
typedef enum _HTMLSysMenuFlag {
    HTMLSysMenuFlagNo = 0,
    HTMLSysMenuFlagYes = 0x80000,
    HTMLSysMenuFlag_Max = 0x7fffffff
} HTMLSysMenuFlag;
typedef enum _HTMLBorder {
    HTMLBorderNone = 0,
    HTMLBorderThick = 0x40000,
    HTMLBorderDialog = 0x400000,
    HTMLBorderThin = 0x800000,
    HTMLBorder_Max = 0x7fffffff
} HTMLBorder;
typedef enum _HTMLBorderStyle {
    HTMLBorderStyleNormal = 0,
    HTMLBorderStyleRaised = 0x100,
    HTMLBorderStyleSunken = 0x200,
    HTMLBorderStylecombined = 0x300,
    HTMLBorderStyleStatic = 0x20000,
    HTMLBorderStyle_Max = 0x7fffffff
} HTMLBorderStyle;
typedef enum _HTMLWindowState {
    HTMLWindowStateNormal = 1,
    HTMLWindowStateMaximize = 3,
    HTMLWindowStateMinimize = 6,
    HTMLWindowState_Max = 0x7fffffff
} HTMLWindowState;
typedef enum _BEHAVIOR_EVENT {
    BEHAVIOREVENT_FIRST = 0,
    BEHAVIOREVENT_CONTENTREADY = 0,
    BEHAVIOREVENT_DOCUMENTREADY = 1,
    BEHAVIOREVENT_APPLYSTYLE = 2,
    BEHAVIOREVENT_DOCUMENTCONTEXTCHANGE = 3,
    BEHAVIOREVENT_CONTENTSAVE = 4,
    BEHAVIOREVENT_LAST = 4,
    BEHAVIOR_EVENT_Max = 0x7fffffff
} BEHAVIOR_EVENT;
typedef enum _BEHAVIOR_EVENT_FLAGS {
    BEHAVIOREVENTFLAGS_BUBBLE = 1,
    BEHAVIOREVENTFLAGS_STANDARDADDITIVE = 2,
    BEHAVIOR_EVENT_FLAGS_Max = 0x7fffffff
} BEHAVIOR_EVENT_FLAGS;
typedef enum _BEHAVIOR_RENDER_INFO {
    BEHAVIORRENDERINFO_BEFOREBACKGROUND = 0x1,
    BEHAVIORRENDERINFO_AFTERBACKGROUND = 0x2,
    BEHAVIORRENDERINFO_BEFORECONTENT = 0x4,
    BEHAVIORRENDERINFO_AFTERCONTENT = 0x8,
    BEHAVIORRENDERINFO_AFTERFOREGROUND = 0x20,
    BEHAVIORRENDERINFO_ABOVECONTENT = 0x28,
    BEHAVIORRENDERINFO_ALLLAYERS = 0xff,
    BEHAVIORRENDERINFO_DISABLEBACKGROUND = 0x100,
    BEHAVIORRENDERINFO_DISABLENEGATIVEZ = 0x200,
    BEHAVIORRENDERINFO_DISABLECONTENT = 0x400,
    BEHAVIORRENDERINFO_DISABLEPOSITIVEZ = 0x800,
    BEHAVIORRENDERINFO_DISABLEALLLAYERS = 0xf00,
    BEHAVIORRENDERINFO_HITTESTING = 0x1000,
    BEHAVIORRENDERINFO_SURFACE = 0x100000,
    BEHAVIORRENDERINFO_3DSURFACE = 0x200000,
    BEHAVIOR_RENDER_INFO_Max = 0x7fffffff
} BEHAVIOR_RENDER_INFO;
typedef enum _BEHAVIOR_RELATION {
    BEHAVIOR_FIRSTRELATION = 0,
    BEHAVIOR_SAMEELEMENT = 0,
    BEHAVIOR_PARENT = 1,
    BEHAVIOR_CHILD = 2,
    BEHAVIOR_SIBLING = 3,
    BEHAVIOR_LASTRELATION = 3,
    BEHAVIOR_RELATION_Max = 0x7fffffff
} BEHAVIOR_RELATION;
typedef enum _BEHAVIOR_LAYOUT_INFO {
    BEHAVIORLAYOUTINFO_FULLDELEGATION = 0x1,
    BEHAVIORLAYOUTINFO_MODIFYNATURAL = 0x2,
    BEHAVIORLAYOUTINFO_MAPSIZE = 0x4,
    BEHAVIOR_LAYOUT_INFO_Max = 0x7fffffff
} BEHAVIOR_LAYOUT_INFO;
typedef enum _BEHAVIOR_LAYOUT_MODE {
    BEHAVIORLAYOUTMODE_NATURAL = 0x1,
    BEHAVIORLAYOUTMODE_MINWIDTH = 0x2,
    BEHAVIORLAYOUTMODE_MAXWIDTH = 0x4,
    BEHAVIORLAYOUTMODE_MEDIA_RESOLUTION = 0x4000,
    BEHAVIORLAYOUTMODE_FINAL_PERCENT = 0x8000,
    BEHAVIOR_LAYOUT_MODE_Max = 0x7fffffff
} BEHAVIOR_LAYOUT_MODE;
typedef enum _ELEMENTDESCRIPTOR_FLAGS {
    ELEMENTDESCRIPTORFLAGS_LITERAL = 1,
    ELEMENTDESCRIPTORFLAGS_NESTED_LITERAL = 2,
    ELEMENTDESCRIPTOR_FLAGS_Max = 0x7fffffff
} ELEMENTDESCRIPTOR_FLAGS;
typedef enum _ELEMENTNAMESPACE_FLAGS {
    ELEMENTNAMESPACEFLAGS_ALLOWANYTAG = 0x1,
    ELEMENTNAMESPACEFLAGS_QUERYFORUNKNOWNTAGS = 0x2,
    ELEMENTNAMESPACE_FLAGS_Max = 0x7fffffff
} ELEMENTNAMESPACE_FLAGS;
typedef enum _VIEW_OBJECT_ALPHA_MODE {
    VIEW_OBJECT_ALPHA_MODE_IGNORE = 0,
    VIEW_OBJECT_ALPHA_MODE_PREMULTIPLIED = 1,
    VIEW_OBJECT_ALPHA_MODE_Max = 0x7fffffff
} VIEW_OBJECT_ALPHA_MODE;
typedef enum _VIEW_OBJECT_COMPOSITION_MODE {
    VIEW_OBJECT_COMPOSITION_MODE_LEGACY = 0,
    VIEW_OBJECT_COMPOSITION_MODE_SURFACEPRESENTER = 1,
    VIEW_OBJECT_COMPOSITION_MODE_Max = 0x7fffffff
} VIEW_OBJECT_COMPOSITION_MODE;
/*****************************************************************************
 * ICSSFilterSite interface
 */
#ifndef __ICSSFilterSite_INTERFACE_DEFINED__
#define __ICSSFilterSite_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICSSFilterSite, 0x3050f3ed, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f3ed-98b5-11cf-bb82-00aa00bdce0b")
ICSSFilterSite : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetElement(
        IHTMLElement **Element) = 0;

    virtual HRESULT STDMETHODCALLTYPE FireOnFilterChangeEvent(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICSSFilterSite, 0x3050f3ed, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ICSSFilterSiteVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICSSFilterSite* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICSSFilterSite* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICSSFilterSite* This);

    /*** ICSSFilterSite methods ***/
    HRESULT (STDMETHODCALLTYPE *GetElement)(
        ICSSFilterSite* This,
        IHTMLElement **Element);

    HRESULT (STDMETHODCALLTYPE *FireOnFilterChangeEvent)(
        ICSSFilterSite* This);

    END_INTERFACE
} ICSSFilterSiteVtbl;
interface ICSSFilterSite {
    CONST_VTBL ICSSFilterSiteVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICSSFilterSite_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICSSFilterSite_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICSSFilterSite_Release(This) (This)->lpVtbl->Release(This)
/*** ICSSFilterSite methods ***/
#define ICSSFilterSite_GetElement(This,Element) (This)->lpVtbl->GetElement(This,Element)
#define ICSSFilterSite_FireOnFilterChangeEvent(This) (This)->lpVtbl->FireOnFilterChangeEvent(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ICSSFilterSite_QueryInterface(ICSSFilterSite* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ICSSFilterSite_AddRef(ICSSFilterSite* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ICSSFilterSite_Release(ICSSFilterSite* This) {
    return This->lpVtbl->Release(This);
}
/*** ICSSFilterSite methods ***/
static FORCEINLINE HRESULT ICSSFilterSite_GetElement(ICSSFilterSite* This,IHTMLElement **Element) {
    return This->lpVtbl->GetElement(This,Element);
}
static FORCEINLINE HRESULT ICSSFilterSite_FireOnFilterChangeEvent(ICSSFilterSite* This) {
    return This->lpVtbl->FireOnFilterChangeEvent(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ICSSFilterSite_GetElement_Proxy(
    ICSSFilterSite* This,
    IHTMLElement **Element);
void __RPC_STUB ICSSFilterSite_GetElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICSSFilterSite_FireOnFilterChangeEvent_Proxy(
    ICSSFilterSite* This);
void __RPC_STUB ICSSFilterSite_FireOnFilterChangeEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ICSSFilterSite_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ICSSFilter interface
 */
#ifndef __ICSSFilter_INTERFACE_DEFINED__
#define __ICSSFilter_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICSSFilter, 0x3050f3ec, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f3ec-98b5-11cf-bb82-00aa00bdce0b")
ICSSFilter : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetSite(
        ICSSFilterSite *pSink) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnAmbientPropertyChange(
        LONG dispid) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICSSFilter, 0x3050f3ec, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ICSSFilterVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICSSFilter* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICSSFilter* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICSSFilter* This);

    /*** ICSSFilter methods ***/
    HRESULT (STDMETHODCALLTYPE *SetSite)(
        ICSSFilter* This,
        ICSSFilterSite *pSink);

    HRESULT (STDMETHODCALLTYPE *OnAmbientPropertyChange)(
        ICSSFilter* This,
        LONG dispid);

    END_INTERFACE
} ICSSFilterVtbl;
interface ICSSFilter {
    CONST_VTBL ICSSFilterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICSSFilter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICSSFilter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICSSFilter_Release(This) (This)->lpVtbl->Release(This)
/*** ICSSFilter methods ***/
#define ICSSFilter_SetSite(This,pSink) (This)->lpVtbl->SetSite(This,pSink)
#define ICSSFilter_OnAmbientPropertyChange(This,dispid) (This)->lpVtbl->OnAmbientPropertyChange(This,dispid)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ICSSFilter_QueryInterface(ICSSFilter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ICSSFilter_AddRef(ICSSFilter* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ICSSFilter_Release(ICSSFilter* This) {
    return This->lpVtbl->Release(This);
}
/*** ICSSFilter methods ***/
static FORCEINLINE HRESULT ICSSFilter_SetSite(ICSSFilter* This,ICSSFilterSite *pSink) {
    return This->lpVtbl->SetSite(This,pSink);
}
static FORCEINLINE HRESULT ICSSFilter_OnAmbientPropertyChange(ICSSFilter* This,LONG dispid) {
    return This->lpVtbl->OnAmbientPropertyChange(This,dispid);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ICSSFilter_SetSite_Proxy(
    ICSSFilter* This,
    ICSSFilterSite *pSink);
void __RPC_STUB ICSSFilter_SetSite_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICSSFilter_OnAmbientPropertyChange_Proxy(
    ICSSFilter* This,
    LONG dispid);
void __RPC_STUB ICSSFilter_OnAmbientPropertyChange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ICSSFilter_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISecureUrlHost interface
 */
#ifndef __ISecureUrlHost_INTERFACE_DEFINED__
#define __ISecureUrlHost_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISecureUrlHost, 0xc81984c4, 0x74c8, 0x11d2, 0xba,0xa9, 0x00,0xc0,0x4f,0xc2,0x04,0x0e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c81984c4-74c8-11d2-baa9-00c04fc2040e")
ISecureUrlHost : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ValidateSecureUrl(
        WINBOOL *pfAllow,
        OLECHAR *pchUrlInQuestion,
        DWORD dwFlags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISecureUrlHost, 0xc81984c4, 0x74c8, 0x11d2, 0xba,0xa9, 0x00,0xc0,0x4f,0xc2,0x04,0x0e)
#endif
#else
typedef struct ISecureUrlHostVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISecureUrlHost* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISecureUrlHost* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISecureUrlHost* This);

    /*** ISecureUrlHost methods ***/
    HRESULT (STDMETHODCALLTYPE *ValidateSecureUrl)(
        ISecureUrlHost* This,
        WINBOOL *pfAllow,
        OLECHAR *pchUrlInQuestion,
        DWORD dwFlags);

    END_INTERFACE
} ISecureUrlHostVtbl;
interface ISecureUrlHost {
    CONST_VTBL ISecureUrlHostVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISecureUrlHost_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISecureUrlHost_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISecureUrlHost_Release(This) (This)->lpVtbl->Release(This)
/*** ISecureUrlHost methods ***/
#define ISecureUrlHost_ValidateSecureUrl(This,pfAllow,pchUrlInQuestion,dwFlags) (This)->lpVtbl->ValidateSecureUrl(This,pfAllow,pchUrlInQuestion,dwFlags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISecureUrlHost_QueryInterface(ISecureUrlHost* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISecureUrlHost_AddRef(ISecureUrlHost* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISecureUrlHost_Release(ISecureUrlHost* This) {
    return This->lpVtbl->Release(This);
}
/*** ISecureUrlHost methods ***/
static FORCEINLINE HRESULT ISecureUrlHost_ValidateSecureUrl(ISecureUrlHost* This,WINBOOL *pfAllow,OLECHAR *pchUrlInQuestion,DWORD dwFlags) {
    return This->lpVtbl->ValidateSecureUrl(This,pfAllow,pchUrlInQuestion,dwFlags);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISecureUrlHost_ValidateSecureUrl_Proxy(
    ISecureUrlHost* This,
    WINBOOL *pfAllow,
    OLECHAR *pchUrlInQuestion,
    DWORD dwFlags);
void __RPC_STUB ISecureUrlHost_ValidateSecureUrl_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISecureUrlHost_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMarkupServices interface
 */
#ifndef __IMarkupServices_INTERFACE_DEFINED__
#define __IMarkupServices_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMarkupServices, 0x3050f4a0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f4a0-98b5-11cf-bb82-00aa00bdce0b")
IMarkupServices : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateMarkupPointer(
        IMarkupPointer **ppPointer) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateMarkupContainer(
        IMarkupContainer **ppMarkupContainer) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateElement(
        ELEMENT_TAG_ID tagID,
        OLECHAR *pchAttributes,
        IHTMLElement **ppElement) = 0;

    virtual HRESULT STDMETHODCALLTYPE CloneElement(
        IHTMLElement *pElemCloneThis,
        IHTMLElement **ppElementTheClone) = 0;

    virtual HRESULT STDMETHODCALLTYPE InsertElement(
        IHTMLElement *pElementInsert,
        IMarkupPointer *pPointerStart,
        IMarkupPointer *pPointerFinish) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveElement(
        IHTMLElement *pElementRemove) = 0;

    virtual HRESULT STDMETHODCALLTYPE Remove(
        IMarkupPointer *pPointerStart,
        IMarkupPointer *pPointerFinish) = 0;

    virtual HRESULT STDMETHODCALLTYPE Copy(
        IMarkupPointer *pPointerSourceStart,
        IMarkupPointer *pPointerSourceFinish,
        IMarkupPointer *pPointerTarget) = 0;

    virtual HRESULT STDMETHODCALLTYPE Move(
        IMarkupPointer *pPointerSourceStart,
        IMarkupPointer *pPointerSourceFinish,
        IMarkupPointer *pPointerTarget) = 0;

    virtual HRESULT STDMETHODCALLTYPE InsertText(
        OLECHAR *pchText,
        LONG cch,
        IMarkupPointer *pPointerTarget) = 0;

    virtual HRESULT STDMETHODCALLTYPE ParseString(
        OLECHAR *pchHTML,
        DWORD dwFlags,
        IMarkupContainer **ppContainerResult,
        IMarkupPointer *ppPointerStart,
        IMarkupPointer *ppPointerFinish) = 0;

    virtual HRESULT STDMETHODCALLTYPE ParseGlobal(
        HGLOBAL hglobalHTML,
        DWORD dwFlags,
        IMarkupContainer **ppContainerResult,
        IMarkupPointer *pPointerStart,
        IMarkupPointer *pPointerFinish) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsScopedElement(
        IHTMLElement *pElement,
        WINBOOL *pfScoped) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetElementTagId(
        IHTMLElement *pElement,
        ELEMENT_TAG_ID *ptagId) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTagIDForName(
        BSTR bstrName,
        ELEMENT_TAG_ID *ptagId) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetNameForTagID(
        ELEMENT_TAG_ID tagId,
        BSTR *pbstrName) = 0;

    virtual HRESULT STDMETHODCALLTYPE MovePointersToRange(
        IHTMLTxtRange *pIRange,
        IMarkupPointer *pPointerStart,
        IMarkupPointer *pPointerFinish) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveRangeToPointers(
        IMarkupPointer *pPointerStart,
        IMarkupPointer *pPointerFinish,
        IHTMLTxtRange *pIRange) = 0;

    virtual HRESULT STDMETHODCALLTYPE BeginUndoUnit(
        OLECHAR *pchTitle) = 0;

    virtual HRESULT STDMETHODCALLTYPE EndUndoUnit(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMarkupServices, 0x3050f4a0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IMarkupServicesVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IMarkupServices* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IMarkupServices* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IMarkupServices* This);

    /*** IMarkupServices methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateMarkupPointer)(
        IMarkupServices* This,
        IMarkupPointer **ppPointer);

    HRESULT (STDMETHODCALLTYPE *CreateMarkupContainer)(
        IMarkupServices* This,
        IMarkupContainer **ppMarkupContainer);

    HRESULT (STDMETHODCALLTYPE *CreateElement)(
        IMarkupServices* This,
        ELEMENT_TAG_ID tagID,
        OLECHAR *pchAttributes,
        IHTMLElement **ppElement);

    HRESULT (STDMETHODCALLTYPE *CloneElement)(
        IMarkupServices* This,
        IHTMLElement *pElemCloneThis,
        IHTMLElement **ppElementTheClone);

    HRESULT (STDMETHODCALLTYPE *InsertElement)(
        IMarkupServices* This,
        IHTMLElement *pElementInsert,
        IMarkupPointer *pPointerStart,
        IMarkupPointer *pPointerFinish);

    HRESULT (STDMETHODCALLTYPE *RemoveElement)(
        IMarkupServices* This,
        IHTMLElement *pElementRemove);

    HRESULT (STDMETHODCALLTYPE *Remove)(
        IMarkupServices* This,
        IMarkupPointer *pPointerStart,
        IMarkupPointer *pPointerFinish);

    HRESULT (STDMETHODCALLTYPE *Copy)(
        IMarkupServices* This,
        IMarkupPointer *pPointerSourceStart,
        IMarkupPointer *pPointerSourceFinish,
        IMarkupPointer *pPointerTarget);

    HRESULT (STDMETHODCALLTYPE *Move)(
        IMarkupServices* This,
        IMarkupPointer *pPointerSourceStart,
        IMarkupPointer *pPointerSourceFinish,
        IMarkupPointer *pPointerTarget);

    HRESULT (STDMETHODCALLTYPE *InsertText)(
        IMarkupServices* This,
        OLECHAR *pchText,
        LONG cch,
        IMarkupPointer *pPointerTarget);

    HRESULT (STDMETHODCALLTYPE *ParseString)(
        IMarkupServices* This,
        OLECHAR *pchHTML,
        DWORD dwFlags,
        IMarkupContainer **ppContainerResult,
        IMarkupPointer *ppPointerStart,
        IMarkupPointer *ppPointerFinish);

    HRESULT (STDMETHODCALLTYPE *ParseGlobal)(
        IMarkupServices* This,
        HGLOBAL hglobalHTML,
        DWORD dwFlags,
        IMarkupContainer **ppContainerResult,
        IMarkupPointer *pPointerStart,
        IMarkupPointer *pPointerFinish);

    HRESULT (STDMETHODCALLTYPE *IsScopedElement)(
        IMarkupServices* This,
        IHTMLElement *pElement,
        WINBOOL *pfScoped);

    HRESULT (STDMETHODCALLTYPE *GetElementTagId)(
        IMarkupServices* This,
        IHTMLElement *pElement,
        ELEMENT_TAG_ID *ptagId);

    HRESULT (STDMETHODCALLTYPE *GetTagIDForName)(
        IMarkupServices* This,
        BSTR bstrName,
        ELEMENT_TAG_ID *ptagId);

    HRESULT (STDMETHODCALLTYPE *GetNameForTagID)(
        IMarkupServices* This,
        ELEMENT_TAG_ID tagId,
        BSTR *pbstrName);

    HRESULT (STDMETHODCALLTYPE *MovePointersToRange)(
        IMarkupServices* This,
        IHTMLTxtRange *pIRange,
        IMarkupPointer *pPointerStart,
        IMarkupPointer *pPointerFinish);

    HRESULT (STDMETHODCALLTYPE *MoveRangeToPointers)(
        IMarkupServices* This,
        IMarkupPointer *pPointerStart,
        IMarkupPointer *pPointerFinish,
        IHTMLTxtRange *pIRange);

    HRESULT (STDMETHODCALLTYPE *BeginUndoUnit)(
        IMarkupServices* This,
        OLECHAR *pchTitle);

    HRESULT (STDMETHODCALLTYPE *EndUndoUnit)(
        IMarkupServices* This);

    END_INTERFACE
} IMarkupServicesVtbl;
interface IMarkupServices {
    CONST_VTBL IMarkupServicesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMarkupServices_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMarkupServices_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMarkupServices_Release(This) (This)->lpVtbl->Release(This)
/*** IMarkupServices methods ***/
#define IMarkupServices_CreateMarkupPointer(This,ppPointer) (This)->lpVtbl->CreateMarkupPointer(This,ppPointer)
#define IMarkupServices_CreateMarkupContainer(This,ppMarkupContainer) (This)->lpVtbl->CreateMarkupContainer(This,ppMarkupContainer)
#define IMarkupServices_CreateElement(This,tagID,pchAttributes,ppElement) (This)->lpVtbl->CreateElement(This,tagID,pchAttributes,ppElement)
#define IMarkupServices_CloneElement(This,pElemCloneThis,ppElementTheClone) (This)->lpVtbl->CloneElement(This,pElemCloneThis,ppElementTheClone)
#define IMarkupServices_InsertElement(This,pElementInsert,pPointerStart,pPointerFinish) (This)->lpVtbl->InsertElement(This,pElementInsert,pPointerStart,pPointerFinish)
#define IMarkupServices_RemoveElement(This,pElementRemove) (This)->lpVtbl->RemoveElement(This,pElementRemove)
#define IMarkupServices_Remove(This,pPointerStart,pPointerFinish) (This)->lpVtbl->Remove(This,pPointerStart,pPointerFinish)
#define IMarkupServices_Copy(This,pPointerSourceStart,pPointerSourceFinish,pPointerTarget) (This)->lpVtbl->Copy(This,pPointerSourceStart,pPointerSourceFinish,pPointerTarget)
#define IMarkupServices_Move(This,pPointerSourceStart,pPointerSourceFinish,pPointerTarget) (This)->lpVtbl->Move(This,pPointerSourceStart,pPointerSourceFinish,pPointerTarget)
#define IMarkupServices_InsertText(This,pchText,cch,pPointerTarget) (This)->lpVtbl->InsertText(This,pchText,cch,pPointerTarget)
#define IMarkupServices_ParseString(This,pchHTML,dwFlags,ppContainerResult,ppPointerStart,ppPointerFinish) (This)->lpVtbl->ParseString(This,pchHTML,dwFlags,ppContainerResult,ppPointerStart,ppPointerFinish)
#define IMarkupServices_ParseGlobal(This,hglobalHTML,dwFlags,ppContainerResult,pPointerStart,pPointerFinish) (This)->lpVtbl->ParseGlobal(This,hglobalHTML,dwFlags,ppContainerResult,pPointerStart,pPointerFinish)
#define IMarkupServices_IsScopedElement(This,pElement,pfScoped) (This)->lpVtbl->IsScopedElement(This,pElement,pfScoped)
#define IMarkupServices_GetElementTagId(This,pElement,ptagId) (This)->lpVtbl->GetElementTagId(This,pElement,ptagId)
#define IMarkupServices_GetTagIDForName(This,bstrName,ptagId) (This)->lpVtbl->GetTagIDForName(This,bstrName,ptagId)
#define IMarkupServices_GetNameForTagID(This,tagId,pbstrName) (This)->lpVtbl->GetNameForTagID(This,tagId,pbstrName)
#define IMarkupServices_MovePointersToRange(This,pIRange,pPointerStart,pPointerFinish) (This)->lpVtbl->MovePointersToRange(This,pIRange,pPointerStart,pPointerFinish)
#define IMarkupServices_MoveRangeToPointers(This,pPointerStart,pPointerFinish,pIRange) (This)->lpVtbl->MoveRangeToPointers(This,pPointerStart,pPointerFinish,pIRange)
#define IMarkupServices_BeginUndoUnit(This,pchTitle) (This)->lpVtbl->BeginUndoUnit(This,pchTitle)
#define IMarkupServices_EndUndoUnit(This) (This)->lpVtbl->EndUndoUnit(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMarkupServices_QueryInterface(IMarkupServices* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMarkupServices_AddRef(IMarkupServices* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMarkupServices_Release(IMarkupServices* This) {
    return This->lpVtbl->Release(This);
}
/*** IMarkupServices methods ***/
static FORCEINLINE HRESULT IMarkupServices_CreateMarkupPointer(IMarkupServices* This,IMarkupPointer **ppPointer) {
    return This->lpVtbl->CreateMarkupPointer(This,ppPointer);
}
static FORCEINLINE HRESULT IMarkupServices_CreateMarkupContainer(IMarkupServices* This,IMarkupContainer **ppMarkupContainer) {
    return This->lpVtbl->CreateMarkupContainer(This,ppMarkupContainer);
}
static FORCEINLINE HRESULT IMarkupServices_CreateElement(IMarkupServices* This,ELEMENT_TAG_ID tagID,OLECHAR *pchAttributes,IHTMLElement **ppElement) {
    return This->lpVtbl->CreateElement(This,tagID,pchAttributes,ppElement);
}
static FORCEINLINE HRESULT IMarkupServices_CloneElement(IMarkupServices* This,IHTMLElement *pElemCloneThis,IHTMLElement **ppElementTheClone) {
    return This->lpVtbl->CloneElement(This,pElemCloneThis,ppElementTheClone);
}
static FORCEINLINE HRESULT IMarkupServices_InsertElement(IMarkupServices* This,IHTMLElement *pElementInsert,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish) {
    return This->lpVtbl->InsertElement(This,pElementInsert,pPointerStart,pPointerFinish);
}
static FORCEINLINE HRESULT IMarkupServices_RemoveElement(IMarkupServices* This,IHTMLElement *pElementRemove) {
    return This->lpVtbl->RemoveElement(This,pElementRemove);
}
static FORCEINLINE HRESULT IMarkupServices_Remove(IMarkupServices* This,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish) {
    return This->lpVtbl->Remove(This,pPointerStart,pPointerFinish);
}
static FORCEINLINE HRESULT IMarkupServices_Copy(IMarkupServices* This,IMarkupPointer *pPointerSourceStart,IMarkupPointer *pPointerSourceFinish,IMarkupPointer *pPointerTarget) {
    return This->lpVtbl->Copy(This,pPointerSourceStart,pPointerSourceFinish,pPointerTarget);
}
static FORCEINLINE HRESULT IMarkupServices_Move(IMarkupServices* This,IMarkupPointer *pPointerSourceStart,IMarkupPointer *pPointerSourceFinish,IMarkupPointer *pPointerTarget) {
    return This->lpVtbl->Move(This,pPointerSourceStart,pPointerSourceFinish,pPointerTarget);
}
static FORCEINLINE HRESULT IMarkupServices_InsertText(IMarkupServices* This,OLECHAR *pchText,LONG cch,IMarkupPointer *pPointerTarget) {
    return This->lpVtbl->InsertText(This,pchText,cch,pPointerTarget);
}
static FORCEINLINE HRESULT IMarkupServices_ParseString(IMarkupServices* This,OLECHAR *pchHTML,DWORD dwFlags,IMarkupContainer **ppContainerResult,IMarkupPointer *ppPointerStart,IMarkupPointer *ppPointerFinish) {
    return This->lpVtbl->ParseString(This,pchHTML,dwFlags,ppContainerResult,ppPointerStart,ppPointerFinish);
}
static FORCEINLINE HRESULT IMarkupServices_ParseGlobal(IMarkupServices* This,HGLOBAL hglobalHTML,DWORD dwFlags,IMarkupContainer **ppContainerResult,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish) {
    return This->lpVtbl->ParseGlobal(This,hglobalHTML,dwFlags,ppContainerResult,pPointerStart,pPointerFinish);
}
static FORCEINLINE HRESULT IMarkupServices_IsScopedElement(IMarkupServices* This,IHTMLElement *pElement,WINBOOL *pfScoped) {
    return This->lpVtbl->IsScopedElement(This,pElement,pfScoped);
}
static FORCEINLINE HRESULT IMarkupServices_GetElementTagId(IMarkupServices* This,IHTMLElement *pElement,ELEMENT_TAG_ID *ptagId) {
    return This->lpVtbl->GetElementTagId(This,pElement,ptagId);
}
static FORCEINLINE HRESULT IMarkupServices_GetTagIDForName(IMarkupServices* This,BSTR bstrName,ELEMENT_TAG_ID *ptagId) {
    return This->lpVtbl->GetTagIDForName(This,bstrName,ptagId);
}
static FORCEINLINE HRESULT IMarkupServices_GetNameForTagID(IMarkupServices* This,ELEMENT_TAG_ID tagId,BSTR *pbstrName) {
    return This->lpVtbl->GetNameForTagID(This,tagId,pbstrName);
}
static FORCEINLINE HRESULT IMarkupServices_MovePointersToRange(IMarkupServices* This,IHTMLTxtRange *pIRange,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish) {
    return This->lpVtbl->MovePointersToRange(This,pIRange,pPointerStart,pPointerFinish);
}
static FORCEINLINE HRESULT IMarkupServices_MoveRangeToPointers(IMarkupServices* This,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish,IHTMLTxtRange *pIRange) {
    return This->lpVtbl->MoveRangeToPointers(This,pPointerStart,pPointerFinish,pIRange);
}
static FORCEINLINE HRESULT IMarkupServices_BeginUndoUnit(IMarkupServices* This,OLECHAR *pchTitle) {
    return This->lpVtbl->BeginUndoUnit(This,pchTitle);
}
static FORCEINLINE HRESULT IMarkupServices_EndUndoUnit(IMarkupServices* This) {
    return This->lpVtbl->EndUndoUnit(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IMarkupServices_CreateMarkupPointer_Proxy(
    IMarkupServices* This,
    IMarkupPointer **ppPointer);
void __RPC_STUB IMarkupServices_CreateMarkupPointer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupServices_CreateMarkupContainer_Proxy(
    IMarkupServices* This,
    IMarkupContainer **ppMarkupContainer);
void __RPC_STUB IMarkupServices_CreateMarkupContainer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupServices_CreateElement_Proxy(
    IMarkupServices* This,
    ELEMENT_TAG_ID tagID,
    OLECHAR *pchAttributes,
    IHTMLElement **ppElement);
void __RPC_STUB IMarkupServices_CreateElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupServices_CloneElement_Proxy(
    IMarkupServices* This,
    IHTMLElement *pElemCloneThis,
    IHTMLElement **ppElementTheClone);
void __RPC_STUB IMarkupServices_CloneElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupServices_InsertElement_Proxy(
    IMarkupServices* This,
    IHTMLElement *pElementInsert,
    IMarkupPointer *pPointerStart,
    IMarkupPointer *pPointerFinish);
void __RPC_STUB IMarkupServices_InsertElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupServices_RemoveElement_Proxy(
    IMarkupServices* This,
    IHTMLElement *pElementRemove);
void __RPC_STUB IMarkupServices_RemoveElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupServices_Remove_Proxy(
    IMarkupServices* This,
    IMarkupPointer *pPointerStart,
    IMarkupPointer *pPointerFinish);
void __RPC_STUB IMarkupServices_Remove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupServices_Copy_Proxy(
    IMarkupServices* This,
    IMarkupPointer *pPointerSourceStart,
    IMarkupPointer *pPointerSourceFinish,
    IMarkupPointer *pPointerTarget);
void __RPC_STUB IMarkupServices_Copy_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupServices_Move_Proxy(
    IMarkupServices* This,
    IMarkupPointer *pPointerSourceStart,
    IMarkupPointer *pPointerSourceFinish,
    IMarkupPointer *pPointerTarget);
void __RPC_STUB IMarkupServices_Move_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupServices_InsertText_Proxy(
    IMarkupServices* This,
    OLECHAR *pchText,
    LONG cch,
    IMarkupPointer *pPointerTarget);
void __RPC_STUB IMarkupServices_InsertText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupServices_ParseString_Proxy(
    IMarkupServices* This,
    OLECHAR *pchHTML,
    DWORD dwFlags,
    IMarkupContainer **ppContainerResult,
    IMarkupPointer *ppPointerStart,
    IMarkupPointer *ppPointerFinish);
void __RPC_STUB IMarkupServices_ParseString_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupServices_ParseGlobal_Proxy(
    IMarkupServices* This,
    HGLOBAL hglobalHTML,
    DWORD dwFlags,
    IMarkupContainer **ppContainerResult,
    IMarkupPointer *pPointerStart,
    IMarkupPointer *pPointerFinish);
void __RPC_STUB IMarkupServices_ParseGlobal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupServices_IsScopedElement_Proxy(
    IMarkupServices* This,
    IHTMLElement *pElement,
    WINBOOL *pfScoped);
void __RPC_STUB IMarkupServices_IsScopedElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupServices_GetElementTagId_Proxy(
    IMarkupServices* This,
    IHTMLElement *pElement,
    ELEMENT_TAG_ID *ptagId);
void __RPC_STUB IMarkupServices_GetElementTagId_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupServices_GetTagIDForName_Proxy(
    IMarkupServices* This,
    BSTR bstrName,
    ELEMENT_TAG_ID *ptagId);
void __RPC_STUB IMarkupServices_GetTagIDForName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupServices_GetNameForTagID_Proxy(
    IMarkupServices* This,
    ELEMENT_TAG_ID tagId,
    BSTR *pbstrName);
void __RPC_STUB IMarkupServices_GetNameForTagID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupServices_MovePointersToRange_Proxy(
    IMarkupServices* This,
    IHTMLTxtRange *pIRange,
    IMarkupPointer *pPointerStart,
    IMarkupPointer *pPointerFinish);
void __RPC_STUB IMarkupServices_MovePointersToRange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupServices_MoveRangeToPointers_Proxy(
    IMarkupServices* This,
    IMarkupPointer *pPointerStart,
    IMarkupPointer *pPointerFinish,
    IHTMLTxtRange *pIRange);
void __RPC_STUB IMarkupServices_MoveRangeToPointers_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupServices_BeginUndoUnit_Proxy(
    IMarkupServices* This,
    OLECHAR *pchTitle);
void __RPC_STUB IMarkupServices_BeginUndoUnit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupServices_EndUndoUnit_Proxy(
    IMarkupServices* This);
void __RPC_STUB IMarkupServices_EndUndoUnit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IMarkupServices_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMarkupServices2 interface
 */
#ifndef __IMarkupServices2_INTERFACE_DEFINED__
#define __IMarkupServices2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMarkupServices2, 0x3050f682, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f682-98b5-11cf-bb82-00aa00bdce0b")
IMarkupServices2 : public IMarkupServices
{
    virtual HRESULT STDMETHODCALLTYPE ParseGlobalEx(
        HGLOBAL hglobalHTML,
        DWORD dwFlags,
        IMarkupContainer *pContext,
        IMarkupContainer **ppContainerResult,
        IMarkupPointer *pPointerStart,
        IMarkupPointer *pPointerFinish) = 0;

    virtual HRESULT STDMETHODCALLTYPE ValidateElements(
        IMarkupPointer *pPointerStart,
        IMarkupPointer *pPointerFinish,
        IMarkupPointer *pPointerTarget,
        IMarkupPointer *pPointerStatus,
        IHTMLElement **ppElemFailBottom,
        IHTMLElement **ppElemFailTop) = 0;

    virtual HRESULT STDMETHODCALLTYPE SaveSegmentsToClipboard(
        ISegmentList *pSegmentList,
        DWORD dwFlags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMarkupServices2, 0x3050f682, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IMarkupServices2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IMarkupServices2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IMarkupServices2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IMarkupServices2* This);

    /*** IMarkupServices methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateMarkupPointer)(
        IMarkupServices2* This,
        IMarkupPointer **ppPointer);

    HRESULT (STDMETHODCALLTYPE *CreateMarkupContainer)(
        IMarkupServices2* This,
        IMarkupContainer **ppMarkupContainer);

    HRESULT (STDMETHODCALLTYPE *CreateElement)(
        IMarkupServices2* This,
        ELEMENT_TAG_ID tagID,
        OLECHAR *pchAttributes,
        IHTMLElement **ppElement);

    HRESULT (STDMETHODCALLTYPE *CloneElement)(
        IMarkupServices2* This,
        IHTMLElement *pElemCloneThis,
        IHTMLElement **ppElementTheClone);

    HRESULT (STDMETHODCALLTYPE *InsertElement)(
        IMarkupServices2* This,
        IHTMLElement *pElementInsert,
        IMarkupPointer *pPointerStart,
        IMarkupPointer *pPointerFinish);

    HRESULT (STDMETHODCALLTYPE *RemoveElement)(
        IMarkupServices2* This,
        IHTMLElement *pElementRemove);

    HRESULT (STDMETHODCALLTYPE *Remove)(
        IMarkupServices2* This,
        IMarkupPointer *pPointerStart,
        IMarkupPointer *pPointerFinish);

    HRESULT (STDMETHODCALLTYPE *Copy)(
        IMarkupServices2* This,
        IMarkupPointer *pPointerSourceStart,
        IMarkupPointer *pPointerSourceFinish,
        IMarkupPointer *pPointerTarget);

    HRESULT (STDMETHODCALLTYPE *Move)(
        IMarkupServices2* This,
        IMarkupPointer *pPointerSourceStart,
        IMarkupPointer *pPointerSourceFinish,
        IMarkupPointer *pPointerTarget);

    HRESULT (STDMETHODCALLTYPE *InsertText)(
        IMarkupServices2* This,
        OLECHAR *pchText,
        LONG cch,
        IMarkupPointer *pPointerTarget);

    HRESULT (STDMETHODCALLTYPE *ParseString)(
        IMarkupServices2* This,
        OLECHAR *pchHTML,
        DWORD dwFlags,
        IMarkupContainer **ppContainerResult,
        IMarkupPointer *ppPointerStart,
        IMarkupPointer *ppPointerFinish);

    HRESULT (STDMETHODCALLTYPE *ParseGlobal)(
        IMarkupServices2* This,
        HGLOBAL hglobalHTML,
        DWORD dwFlags,
        IMarkupContainer **ppContainerResult,
        IMarkupPointer *pPointerStart,
        IMarkupPointer *pPointerFinish);

    HRESULT (STDMETHODCALLTYPE *IsScopedElement)(
        IMarkupServices2* This,
        IHTMLElement *pElement,
        WINBOOL *pfScoped);

    HRESULT (STDMETHODCALLTYPE *GetElementTagId)(
        IMarkupServices2* This,
        IHTMLElement *pElement,
        ELEMENT_TAG_ID *ptagId);

    HRESULT (STDMETHODCALLTYPE *GetTagIDForName)(
        IMarkupServices2* This,
        BSTR bstrName,
        ELEMENT_TAG_ID *ptagId);

    HRESULT (STDMETHODCALLTYPE *GetNameForTagID)(
        IMarkupServices2* This,
        ELEMENT_TAG_ID tagId,
        BSTR *pbstrName);

    HRESULT (STDMETHODCALLTYPE *MovePointersToRange)(
        IMarkupServices2* This,
        IHTMLTxtRange *pIRange,
        IMarkupPointer *pPointerStart,
        IMarkupPointer *pPointerFinish);

    HRESULT (STDMETHODCALLTYPE *MoveRangeToPointers)(
        IMarkupServices2* This,
        IMarkupPointer *pPointerStart,
        IMarkupPointer *pPointerFinish,
        IHTMLTxtRange *pIRange);

    HRESULT (STDMETHODCALLTYPE *BeginUndoUnit)(
        IMarkupServices2* This,
        OLECHAR *pchTitle);

    HRESULT (STDMETHODCALLTYPE *EndUndoUnit)(
        IMarkupServices2* This);

    /*** IMarkupServices2 methods ***/
    HRESULT (STDMETHODCALLTYPE *ParseGlobalEx)(
        IMarkupServices2* This,
        HGLOBAL hglobalHTML,
        DWORD dwFlags,
        IMarkupContainer *pContext,
        IMarkupContainer **ppContainerResult,
        IMarkupPointer *pPointerStart,
        IMarkupPointer *pPointerFinish);

    HRESULT (STDMETHODCALLTYPE *ValidateElements)(
        IMarkupServices2* This,
        IMarkupPointer *pPointerStart,
        IMarkupPointer *pPointerFinish,
        IMarkupPointer *pPointerTarget,
        IMarkupPointer *pPointerStatus,
        IHTMLElement **ppElemFailBottom,
        IHTMLElement **ppElemFailTop);

    HRESULT (STDMETHODCALLTYPE *SaveSegmentsToClipboard)(
        IMarkupServices2* This,
        ISegmentList *pSegmentList,
        DWORD dwFlags);

    END_INTERFACE
} IMarkupServices2Vtbl;
interface IMarkupServices2 {
    CONST_VTBL IMarkupServices2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMarkupServices2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMarkupServices2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMarkupServices2_Release(This) (This)->lpVtbl->Release(This)
/*** IMarkupServices methods ***/
#define IMarkupServices2_CreateMarkupPointer(This,ppPointer) (This)->lpVtbl->CreateMarkupPointer(This,ppPointer)
#define IMarkupServices2_CreateMarkupContainer(This,ppMarkupContainer) (This)->lpVtbl->CreateMarkupContainer(This,ppMarkupContainer)
#define IMarkupServices2_CreateElement(This,tagID,pchAttributes,ppElement) (This)->lpVtbl->CreateElement(This,tagID,pchAttributes,ppElement)
#define IMarkupServices2_CloneElement(This,pElemCloneThis,ppElementTheClone) (This)->lpVtbl->CloneElement(This,pElemCloneThis,ppElementTheClone)
#define IMarkupServices2_InsertElement(This,pElementInsert,pPointerStart,pPointerFinish) (This)->lpVtbl->InsertElement(This,pElementInsert,pPointerStart,pPointerFinish)
#define IMarkupServices2_RemoveElement(This,pElementRemove) (This)->lpVtbl->RemoveElement(This,pElementRemove)
#define IMarkupServices2_Remove(This,pPointerStart,pPointerFinish) (This)->lpVtbl->Remove(This,pPointerStart,pPointerFinish)
#define IMarkupServices2_Copy(This,pPointerSourceStart,pPointerSourceFinish,pPointerTarget) (This)->lpVtbl->Copy(This,pPointerSourceStart,pPointerSourceFinish,pPointerTarget)
#define IMarkupServices2_Move(This,pPointerSourceStart,pPointerSourceFinish,pPointerTarget) (This)->lpVtbl->Move(This,pPointerSourceStart,pPointerSourceFinish,pPointerTarget)
#define IMarkupServices2_InsertText(This,pchText,cch,pPointerTarget) (This)->lpVtbl->InsertText(This,pchText,cch,pPointerTarget)
#define IMarkupServices2_ParseString(This,pchHTML,dwFlags,ppContainerResult,ppPointerStart,ppPointerFinish) (This)->lpVtbl->ParseString(This,pchHTML,dwFlags,ppContainerResult,ppPointerStart,ppPointerFinish)
#define IMarkupServices2_ParseGlobal(This,hglobalHTML,dwFlags,ppContainerResult,pPointerStart,pPointerFinish) (This)->lpVtbl->ParseGlobal(This,hglobalHTML,dwFlags,ppContainerResult,pPointerStart,pPointerFinish)
#define IMarkupServices2_IsScopedElement(This,pElement,pfScoped) (This)->lpVtbl->IsScopedElement(This,pElement,pfScoped)
#define IMarkupServices2_GetElementTagId(This,pElement,ptagId) (This)->lpVtbl->GetElementTagId(This,pElement,ptagId)
#define IMarkupServices2_GetTagIDForName(This,bstrName,ptagId) (This)->lpVtbl->GetTagIDForName(This,bstrName,ptagId)
#define IMarkupServices2_GetNameForTagID(This,tagId,pbstrName) (This)->lpVtbl->GetNameForTagID(This,tagId,pbstrName)
#define IMarkupServices2_MovePointersToRange(This,pIRange,pPointerStart,pPointerFinish) (This)->lpVtbl->MovePointersToRange(This,pIRange,pPointerStart,pPointerFinish)
#define IMarkupServices2_MoveRangeToPointers(This,pPointerStart,pPointerFinish,pIRange) (This)->lpVtbl->MoveRangeToPointers(This,pPointerStart,pPointerFinish,pIRange)
#define IMarkupServices2_BeginUndoUnit(This,pchTitle) (This)->lpVtbl->BeginUndoUnit(This,pchTitle)
#define IMarkupServices2_EndUndoUnit(This) (This)->lpVtbl->EndUndoUnit(This)
/*** IMarkupServices2 methods ***/
#define IMarkupServices2_ParseGlobalEx(This,hglobalHTML,dwFlags,pContext,ppContainerResult,pPointerStart,pPointerFinish) (This)->lpVtbl->ParseGlobalEx(This,hglobalHTML,dwFlags,pContext,ppContainerResult,pPointerStart,pPointerFinish)
#define IMarkupServices2_ValidateElements(This,pPointerStart,pPointerFinish,pPointerTarget,pPointerStatus,ppElemFailBottom,ppElemFailTop) (This)->lpVtbl->ValidateElements(This,pPointerStart,pPointerFinish,pPointerTarget,pPointerStatus,ppElemFailBottom,ppElemFailTop)
#define IMarkupServices2_SaveSegmentsToClipboard(This,pSegmentList,dwFlags) (This)->lpVtbl->SaveSegmentsToClipboard(This,pSegmentList,dwFlags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMarkupServices2_QueryInterface(IMarkupServices2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMarkupServices2_AddRef(IMarkupServices2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMarkupServices2_Release(IMarkupServices2* This) {
    return This->lpVtbl->Release(This);
}
/*** IMarkupServices methods ***/
static FORCEINLINE HRESULT IMarkupServices2_CreateMarkupPointer(IMarkupServices2* This,IMarkupPointer **ppPointer) {
    return This->lpVtbl->CreateMarkupPointer(This,ppPointer);
}
static FORCEINLINE HRESULT IMarkupServices2_CreateMarkupContainer(IMarkupServices2* This,IMarkupContainer **ppMarkupContainer) {
    return This->lpVtbl->CreateMarkupContainer(This,ppMarkupContainer);
}
static FORCEINLINE HRESULT IMarkupServices2_CreateElement(IMarkupServices2* This,ELEMENT_TAG_ID tagID,OLECHAR *pchAttributes,IHTMLElement **ppElement) {
    return This->lpVtbl->CreateElement(This,tagID,pchAttributes,ppElement);
}
static FORCEINLINE HRESULT IMarkupServices2_CloneElement(IMarkupServices2* This,IHTMLElement *pElemCloneThis,IHTMLElement **ppElementTheClone) {
    return This->lpVtbl->CloneElement(This,pElemCloneThis,ppElementTheClone);
}
static FORCEINLINE HRESULT IMarkupServices2_InsertElement(IMarkupServices2* This,IHTMLElement *pElementInsert,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish) {
    return This->lpVtbl->InsertElement(This,pElementInsert,pPointerStart,pPointerFinish);
}
static FORCEINLINE HRESULT IMarkupServices2_RemoveElement(IMarkupServices2* This,IHTMLElement *pElementRemove) {
    return This->lpVtbl->RemoveElement(This,pElementRemove);
}
static FORCEINLINE HRESULT IMarkupServices2_Remove(IMarkupServices2* This,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish) {
    return This->lpVtbl->Remove(This,pPointerStart,pPointerFinish);
}
static FORCEINLINE HRESULT IMarkupServices2_Copy(IMarkupServices2* This,IMarkupPointer *pPointerSourceStart,IMarkupPointer *pPointerSourceFinish,IMarkupPointer *pPointerTarget) {
    return This->lpVtbl->Copy(This,pPointerSourceStart,pPointerSourceFinish,pPointerTarget);
}
static FORCEINLINE HRESULT IMarkupServices2_Move(IMarkupServices2* This,IMarkupPointer *pPointerSourceStart,IMarkupPointer *pPointerSourceFinish,IMarkupPointer *pPointerTarget) {
    return This->lpVtbl->Move(This,pPointerSourceStart,pPointerSourceFinish,pPointerTarget);
}
static FORCEINLINE HRESULT IMarkupServices2_InsertText(IMarkupServices2* This,OLECHAR *pchText,LONG cch,IMarkupPointer *pPointerTarget) {
    return This->lpVtbl->InsertText(This,pchText,cch,pPointerTarget);
}
static FORCEINLINE HRESULT IMarkupServices2_ParseString(IMarkupServices2* This,OLECHAR *pchHTML,DWORD dwFlags,IMarkupContainer **ppContainerResult,IMarkupPointer *ppPointerStart,IMarkupPointer *ppPointerFinish) {
    return This->lpVtbl->ParseString(This,pchHTML,dwFlags,ppContainerResult,ppPointerStart,ppPointerFinish);
}
static FORCEINLINE HRESULT IMarkupServices2_ParseGlobal(IMarkupServices2* This,HGLOBAL hglobalHTML,DWORD dwFlags,IMarkupContainer **ppContainerResult,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish) {
    return This->lpVtbl->ParseGlobal(This,hglobalHTML,dwFlags,ppContainerResult,pPointerStart,pPointerFinish);
}
static FORCEINLINE HRESULT IMarkupServices2_IsScopedElement(IMarkupServices2* This,IHTMLElement *pElement,WINBOOL *pfScoped) {
    return This->lpVtbl->IsScopedElement(This,pElement,pfScoped);
}
static FORCEINLINE HRESULT IMarkupServices2_GetElementTagId(IMarkupServices2* This,IHTMLElement *pElement,ELEMENT_TAG_ID *ptagId) {
    return This->lpVtbl->GetElementTagId(This,pElement,ptagId);
}
static FORCEINLINE HRESULT IMarkupServices2_GetTagIDForName(IMarkupServices2* This,BSTR bstrName,ELEMENT_TAG_ID *ptagId) {
    return This->lpVtbl->GetTagIDForName(This,bstrName,ptagId);
}
static FORCEINLINE HRESULT IMarkupServices2_GetNameForTagID(IMarkupServices2* This,ELEMENT_TAG_ID tagId,BSTR *pbstrName) {
    return This->lpVtbl->GetNameForTagID(This,tagId,pbstrName);
}
static FORCEINLINE HRESULT IMarkupServices2_MovePointersToRange(IMarkupServices2* This,IHTMLTxtRange *pIRange,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish) {
    return This->lpVtbl->MovePointersToRange(This,pIRange,pPointerStart,pPointerFinish);
}
static FORCEINLINE HRESULT IMarkupServices2_MoveRangeToPointers(IMarkupServices2* This,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish,IHTMLTxtRange *pIRange) {
    return This->lpVtbl->MoveRangeToPointers(This,pPointerStart,pPointerFinish,pIRange);
}
static FORCEINLINE HRESULT IMarkupServices2_BeginUndoUnit(IMarkupServices2* This,OLECHAR *pchTitle) {
    return This->lpVtbl->BeginUndoUnit(This,pchTitle);
}
static FORCEINLINE HRESULT IMarkupServices2_EndUndoUnit(IMarkupServices2* This) {
    return This->lpVtbl->EndUndoUnit(This);
}
/*** IMarkupServices2 methods ***/
static FORCEINLINE HRESULT IMarkupServices2_ParseGlobalEx(IMarkupServices2* This,HGLOBAL hglobalHTML,DWORD dwFlags,IMarkupContainer *pContext,IMarkupContainer **ppContainerResult,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish) {
    return This->lpVtbl->ParseGlobalEx(This,hglobalHTML,dwFlags,pContext,ppContainerResult,pPointerStart,pPointerFinish);
}
static FORCEINLINE HRESULT IMarkupServices2_ValidateElements(IMarkupServices2* This,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish,IMarkupPointer *pPointerTarget,IMarkupPointer *pPointerStatus,IHTMLElement **ppElemFailBottom,IHTMLElement **ppElemFailTop) {
    return This->lpVtbl->ValidateElements(This,pPointerStart,pPointerFinish,pPointerTarget,pPointerStatus,ppElemFailBottom,ppElemFailTop);
}
static FORCEINLINE HRESULT IMarkupServices2_SaveSegmentsToClipboard(IMarkupServices2* This,ISegmentList *pSegmentList,DWORD dwFlags) {
    return This->lpVtbl->SaveSegmentsToClipboard(This,pSegmentList,dwFlags);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IMarkupServices2_ParseGlobalEx_Proxy(
    IMarkupServices2* This,
    HGLOBAL hglobalHTML,
    DWORD dwFlags,
    IMarkupContainer *pContext,
    IMarkupContainer **ppContainerResult,
    IMarkupPointer *pPointerStart,
    IMarkupPointer *pPointerFinish);
void __RPC_STUB IMarkupServices2_ParseGlobalEx_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupServices2_ValidateElements_Proxy(
    IMarkupServices2* This,
    IMarkupPointer *pPointerStart,
    IMarkupPointer *pPointerFinish,
    IMarkupPointer *pPointerTarget,
    IMarkupPointer *pPointerStatus,
    IHTMLElement **ppElemFailBottom,
    IHTMLElement **ppElemFailTop);
void __RPC_STUB IMarkupServices2_ValidateElements_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupServices2_SaveSegmentsToClipboard_Proxy(
    IMarkupServices2* This,
    ISegmentList *pSegmentList,
    DWORD dwFlags);
void __RPC_STUB IMarkupServices2_SaveSegmentsToClipboard_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IMarkupServices2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMarkupContainer interface
 */
#ifndef __IMarkupContainer_INTERFACE_DEFINED__
#define __IMarkupContainer_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMarkupContainer, 0x3050f5f9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f5f9-98b5-11cf-bb82-00aa00bdce0b")
IMarkupContainer : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OwningDoc(
        IHTMLDocument2 **ppDoc) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMarkupContainer, 0x3050f5f9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IMarkupContainerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IMarkupContainer* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IMarkupContainer* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IMarkupContainer* This);

    /*** IMarkupContainer methods ***/
    HRESULT (STDMETHODCALLTYPE *OwningDoc)(
        IMarkupContainer* This,
        IHTMLDocument2 **ppDoc);

    END_INTERFACE
} IMarkupContainerVtbl;
interface IMarkupContainer {
    CONST_VTBL IMarkupContainerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMarkupContainer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMarkupContainer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMarkupContainer_Release(This) (This)->lpVtbl->Release(This)
/*** IMarkupContainer methods ***/
#define IMarkupContainer_OwningDoc(This,ppDoc) (This)->lpVtbl->OwningDoc(This,ppDoc)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMarkupContainer_QueryInterface(IMarkupContainer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMarkupContainer_AddRef(IMarkupContainer* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMarkupContainer_Release(IMarkupContainer* This) {
    return This->lpVtbl->Release(This);
}
/*** IMarkupContainer methods ***/
static FORCEINLINE HRESULT IMarkupContainer_OwningDoc(IMarkupContainer* This,IHTMLDocument2 **ppDoc) {
    return This->lpVtbl->OwningDoc(This,ppDoc);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IMarkupContainer_OwningDoc_Proxy(
    IMarkupContainer* This,
    IHTMLDocument2 **ppDoc);
void __RPC_STUB IMarkupContainer_OwningDoc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IMarkupContainer_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMarkupContainer2 interface
 */
#ifndef __IMarkupContainer2_INTERFACE_DEFINED__
#define __IMarkupContainer2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMarkupContainer2, 0x3050f648, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f648-98b5-11cf-bb82-00aa00bdce0b")
IMarkupContainer2 : public IMarkupContainer
{
    virtual HRESULT STDMETHODCALLTYPE CreateChangeLog(
        IHTMLChangeSink *pChangeSink,
        IHTMLChangeLog **ppChangeLog,
        WINBOOL fForward,
        WINBOOL fBackward) = 0;

    virtual HRESULT STDMETHODCALLTYPE RegisterForDirtyRange(
        IHTMLChangeSink *pChangeSink,
        DWORD *pdwCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE UnRegisterForDirtyRange(
        DWORD dwCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAndClearDirtyRange(
        DWORD dwCookie,
        IMarkupPointer *pIPointerBegin,
        IMarkupPointer *pIPointerEnd) = 0;

    virtual LONG STDMETHODCALLTYPE GetVersionNumber(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMasterElement(
        IHTMLElement **ppElementMaster) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMarkupContainer2, 0x3050f648, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IMarkupContainer2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IMarkupContainer2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IMarkupContainer2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IMarkupContainer2* This);

    /*** IMarkupContainer methods ***/
    HRESULT (STDMETHODCALLTYPE *OwningDoc)(
        IMarkupContainer2* This,
        IHTMLDocument2 **ppDoc);

    /*** IMarkupContainer2 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateChangeLog)(
        IMarkupContainer2* This,
        IHTMLChangeSink *pChangeSink,
        IHTMLChangeLog **ppChangeLog,
        WINBOOL fForward,
        WINBOOL fBackward);

    HRESULT (STDMETHODCALLTYPE *RegisterForDirtyRange)(
        IMarkupContainer2* This,
        IHTMLChangeSink *pChangeSink,
        DWORD *pdwCookie);

    HRESULT (STDMETHODCALLTYPE *UnRegisterForDirtyRange)(
        IMarkupContainer2* This,
        DWORD dwCookie);

    HRESULT (STDMETHODCALLTYPE *GetAndClearDirtyRange)(
        IMarkupContainer2* This,
        DWORD dwCookie,
        IMarkupPointer *pIPointerBegin,
        IMarkupPointer *pIPointerEnd);

    LONG (STDMETHODCALLTYPE *GetVersionNumber)(
        IMarkupContainer2* This);

    HRESULT (STDMETHODCALLTYPE *GetMasterElement)(
        IMarkupContainer2* This,
        IHTMLElement **ppElementMaster);

    END_INTERFACE
} IMarkupContainer2Vtbl;
interface IMarkupContainer2 {
    CONST_VTBL IMarkupContainer2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMarkupContainer2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMarkupContainer2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMarkupContainer2_Release(This) (This)->lpVtbl->Release(This)
/*** IMarkupContainer methods ***/
#define IMarkupContainer2_OwningDoc(This,ppDoc) (This)->lpVtbl->OwningDoc(This,ppDoc)
/*** IMarkupContainer2 methods ***/
#define IMarkupContainer2_CreateChangeLog(This,pChangeSink,ppChangeLog,fForward,fBackward) (This)->lpVtbl->CreateChangeLog(This,pChangeSink,ppChangeLog,fForward,fBackward)
#define IMarkupContainer2_RegisterForDirtyRange(This,pChangeSink,pdwCookie) (This)->lpVtbl->RegisterForDirtyRange(This,pChangeSink,pdwCookie)
#define IMarkupContainer2_UnRegisterForDirtyRange(This,dwCookie) (This)->lpVtbl->UnRegisterForDirtyRange(This,dwCookie)
#define IMarkupContainer2_GetAndClearDirtyRange(This,dwCookie,pIPointerBegin,pIPointerEnd) (This)->lpVtbl->GetAndClearDirtyRange(This,dwCookie,pIPointerBegin,pIPointerEnd)
#define IMarkupContainer2_GetVersionNumber(This) (This)->lpVtbl->GetVersionNumber(This)
#define IMarkupContainer2_GetMasterElement(This,ppElementMaster) (This)->lpVtbl->GetMasterElement(This,ppElementMaster)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMarkupContainer2_QueryInterface(IMarkupContainer2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMarkupContainer2_AddRef(IMarkupContainer2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMarkupContainer2_Release(IMarkupContainer2* This) {
    return This->lpVtbl->Release(This);
}
/*** IMarkupContainer methods ***/
static FORCEINLINE HRESULT IMarkupContainer2_OwningDoc(IMarkupContainer2* This,IHTMLDocument2 **ppDoc) {
    return This->lpVtbl->OwningDoc(This,ppDoc);
}
/*** IMarkupContainer2 methods ***/
static FORCEINLINE HRESULT IMarkupContainer2_CreateChangeLog(IMarkupContainer2* This,IHTMLChangeSink *pChangeSink,IHTMLChangeLog **ppChangeLog,WINBOOL fForward,WINBOOL fBackward) {
    return This->lpVtbl->CreateChangeLog(This,pChangeSink,ppChangeLog,fForward,fBackward);
}
static FORCEINLINE HRESULT IMarkupContainer2_RegisterForDirtyRange(IMarkupContainer2* This,IHTMLChangeSink *pChangeSink,DWORD *pdwCookie) {
    return This->lpVtbl->RegisterForDirtyRange(This,pChangeSink,pdwCookie);
}
static FORCEINLINE HRESULT IMarkupContainer2_UnRegisterForDirtyRange(IMarkupContainer2* This,DWORD dwCookie) {
    return This->lpVtbl->UnRegisterForDirtyRange(This,dwCookie);
}
static FORCEINLINE HRESULT IMarkupContainer2_GetAndClearDirtyRange(IMarkupContainer2* This,DWORD dwCookie,IMarkupPointer *pIPointerBegin,IMarkupPointer *pIPointerEnd) {
    return This->lpVtbl->GetAndClearDirtyRange(This,dwCookie,pIPointerBegin,pIPointerEnd);
}
static FORCEINLINE LONG IMarkupContainer2_GetVersionNumber(IMarkupContainer2* This) {
    return This->lpVtbl->GetVersionNumber(This);
}
static FORCEINLINE HRESULT IMarkupContainer2_GetMasterElement(IMarkupContainer2* This,IHTMLElement **ppElementMaster) {
    return This->lpVtbl->GetMasterElement(This,ppElementMaster);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IMarkupContainer2_CreateChangeLog_Proxy(
    IMarkupContainer2* This,
    IHTMLChangeSink *pChangeSink,
    IHTMLChangeLog **ppChangeLog,
    WINBOOL fForward,
    WINBOOL fBackward);
void __RPC_STUB IMarkupContainer2_CreateChangeLog_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupContainer2_RegisterForDirtyRange_Proxy(
    IMarkupContainer2* This,
    IHTMLChangeSink *pChangeSink,
    DWORD *pdwCookie);
void __RPC_STUB IMarkupContainer2_RegisterForDirtyRange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupContainer2_UnRegisterForDirtyRange_Proxy(
    IMarkupContainer2* This,
    DWORD dwCookie);
void __RPC_STUB IMarkupContainer2_UnRegisterForDirtyRange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupContainer2_GetAndClearDirtyRange_Proxy(
    IMarkupContainer2* This,
    DWORD dwCookie,
    IMarkupPointer *pIPointerBegin,
    IMarkupPointer *pIPointerEnd);
void __RPC_STUB IMarkupContainer2_GetAndClearDirtyRange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
LONG STDMETHODCALLTYPE IMarkupContainer2_GetVersionNumber_Proxy(
    IMarkupContainer2* This);
void __RPC_STUB IMarkupContainer2_GetVersionNumber_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupContainer2_GetMasterElement_Proxy(
    IMarkupContainer2* This,
    IHTMLElement **ppElementMaster);
void __RPC_STUB IMarkupContainer2_GetMasterElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IMarkupContainer2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLChangePlayback interface
 */
#ifndef __IHTMLChangePlayback_INTERFACE_DEFINED__
#define __IHTMLChangePlayback_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLChangePlayback, 0x3050f6e0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f6e0-98b5-11cf-bb82-00aa00bdce0b")
IHTMLChangePlayback : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ExecChange(
        BYTE *pbRecord,
        WINBOOL fForward) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLChangePlayback, 0x3050f6e0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLChangePlaybackVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLChangePlayback* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLChangePlayback* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLChangePlayback* This);

    /*** IHTMLChangePlayback methods ***/
    HRESULT (STDMETHODCALLTYPE *ExecChange)(
        IHTMLChangePlayback* This,
        BYTE *pbRecord,
        WINBOOL fForward);

    END_INTERFACE
} IHTMLChangePlaybackVtbl;
interface IHTMLChangePlayback {
    CONST_VTBL IHTMLChangePlaybackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLChangePlayback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLChangePlayback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLChangePlayback_Release(This) (This)->lpVtbl->Release(This)
/*** IHTMLChangePlayback methods ***/
#define IHTMLChangePlayback_ExecChange(This,pbRecord,fForward) (This)->lpVtbl->ExecChange(This,pbRecord,fForward)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLChangePlayback_QueryInterface(IHTMLChangePlayback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLChangePlayback_AddRef(IHTMLChangePlayback* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLChangePlayback_Release(IHTMLChangePlayback* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLChangePlayback methods ***/
static FORCEINLINE HRESULT IHTMLChangePlayback_ExecChange(IHTMLChangePlayback* This,BYTE *pbRecord,WINBOOL fForward) {
    return This->lpVtbl->ExecChange(This,pbRecord,fForward);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLChangePlayback_ExecChange_Proxy(
    IHTMLChangePlayback* This,
    BYTE *pbRecord,
    WINBOOL fForward);
void __RPC_STUB IHTMLChangePlayback_ExecChange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLChangePlayback_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMarkupPointer interface
 */
#ifndef __IMarkupPointer_INTERFACE_DEFINED__
#define __IMarkupPointer_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMarkupPointer, 0x3050f49f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f49f-98b5-11cf-bb82-00aa00bdce0b")
IMarkupPointer : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OwningDoc(
        IHTMLDocument2 **ppDoc) = 0;

    virtual HRESULT STDMETHODCALLTYPE Gravity(
        POINTER_GRAVITY *pGravity) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetGravity(
        POINTER_GRAVITY Gravity) = 0;

    virtual HRESULT STDMETHODCALLTYPE Cling(
        WINBOOL *pfCling) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCling(
        WINBOOL fCLing) = 0;

    virtual HRESULT STDMETHODCALLTYPE Unposition(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsPositioned(
        WINBOOL *pfPositioned) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetContainer(
        IMarkupContainer **ppContainer) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveAdjacentToElement(
        IHTMLElement *pElement,
        ELEMENT_ADJACENCY eAdj) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveToPointer(
        IMarkupPointer *pPointer) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveToContainer(
        IMarkupContainer *pContainer,
        WINBOOL fAtStart) = 0;

    virtual HRESULT STDMETHODCALLTYPE Left(
        WINBOOL fMove,
        MARKUP_CONTEXT_TYPE *pContext,
        IHTMLElement **ppElement,
        LONG *pcch,
        OLECHAR *pchText) = 0;

    virtual HRESULT STDMETHODCALLTYPE Right(
        WINBOOL fMove,
        MARKUP_CONTEXT_TYPE *pContext,
        IHTMLElement **ppElement,
        LONG *pcch,
        OLECHAR *pchText) = 0;

    virtual HRESULT STDMETHODCALLTYPE CurrentScope(
        IHTMLElement **ppElemCurrent) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsLeftOf(
        IMarkupPointer *pPointerThat,
        WINBOOL *pfResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsLeftOfOrEqualTo(
        IMarkupPointer *pPointerThat,
        WINBOOL *pfResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsRightOf(
        IMarkupPointer *pPointerThat,
        WINBOOL *pfResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsRightOfOrEqualTo(
        IMarkupPointer *pPointerThat,
        WINBOOL *pfResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsEqualTo(
        IMarkupPointer *pPointerThat,
        WINBOOL *pfAreEqual) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveUnit(
        MOVEUNIT_ACTION muAction) = 0;

    virtual HRESULT STDMETHODCALLTYPE FindText(
        OLECHAR *pchFindText,
        DWORD dwFlags,
        IMarkupPointer *pIEndMatch,
        IMarkupPointer *pIEndSearch) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMarkupPointer, 0x3050f49f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IMarkupPointerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IMarkupPointer* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IMarkupPointer* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IMarkupPointer* This);

    /*** IMarkupPointer methods ***/
    HRESULT (STDMETHODCALLTYPE *OwningDoc)(
        IMarkupPointer* This,
        IHTMLDocument2 **ppDoc);

    HRESULT (STDMETHODCALLTYPE *Gravity)(
        IMarkupPointer* This,
        POINTER_GRAVITY *pGravity);

    HRESULT (STDMETHODCALLTYPE *SetGravity)(
        IMarkupPointer* This,
        POINTER_GRAVITY Gravity);

    HRESULT (STDMETHODCALLTYPE *Cling)(
        IMarkupPointer* This,
        WINBOOL *pfCling);

    HRESULT (STDMETHODCALLTYPE *SetCling)(
        IMarkupPointer* This,
        WINBOOL fCLing);

    HRESULT (STDMETHODCALLTYPE *Unposition)(
        IMarkupPointer* This);

    HRESULT (STDMETHODCALLTYPE *IsPositioned)(
        IMarkupPointer* This,
        WINBOOL *pfPositioned);

    HRESULT (STDMETHODCALLTYPE *GetContainer)(
        IMarkupPointer* This,
        IMarkupContainer **ppContainer);

    HRESULT (STDMETHODCALLTYPE *MoveAdjacentToElement)(
        IMarkupPointer* This,
        IHTMLElement *pElement,
        ELEMENT_ADJACENCY eAdj);

    HRESULT (STDMETHODCALLTYPE *MoveToPointer)(
        IMarkupPointer* This,
        IMarkupPointer *pPointer);

    HRESULT (STDMETHODCALLTYPE *MoveToContainer)(
        IMarkupPointer* This,
        IMarkupContainer *pContainer,
        WINBOOL fAtStart);

    HRESULT (STDMETHODCALLTYPE *Left)(
        IMarkupPointer* This,
        WINBOOL fMove,
        MARKUP_CONTEXT_TYPE *pContext,
        IHTMLElement **ppElement,
        LONG *pcch,
        OLECHAR *pchText);

    HRESULT (STDMETHODCALLTYPE *Right)(
        IMarkupPointer* This,
        WINBOOL fMove,
        MARKUP_CONTEXT_TYPE *pContext,
        IHTMLElement **ppElement,
        LONG *pcch,
        OLECHAR *pchText);

    HRESULT (STDMETHODCALLTYPE *CurrentScope)(
        IMarkupPointer* This,
        IHTMLElement **ppElemCurrent);

    HRESULT (STDMETHODCALLTYPE *IsLeftOf)(
        IMarkupPointer* This,
        IMarkupPointer *pPointerThat,
        WINBOOL *pfResult);

    HRESULT (STDMETHODCALLTYPE *IsLeftOfOrEqualTo)(
        IMarkupPointer* This,
        IMarkupPointer *pPointerThat,
        WINBOOL *pfResult);

    HRESULT (STDMETHODCALLTYPE *IsRightOf)(
        IMarkupPointer* This,
        IMarkupPointer *pPointerThat,
        WINBOOL *pfResult);

    HRESULT (STDMETHODCALLTYPE *IsRightOfOrEqualTo)(
        IMarkupPointer* This,
        IMarkupPointer *pPointerThat,
        WINBOOL *pfResult);

    HRESULT (STDMETHODCALLTYPE *IsEqualTo)(
        IMarkupPointer* This,
        IMarkupPointer *pPointerThat,
        WINBOOL *pfAreEqual);

    HRESULT (STDMETHODCALLTYPE *MoveUnit)(
        IMarkupPointer* This,
        MOVEUNIT_ACTION muAction);

    HRESULT (STDMETHODCALLTYPE *FindText)(
        IMarkupPointer* This,
        OLECHAR *pchFindText,
        DWORD dwFlags,
        IMarkupPointer *pIEndMatch,
        IMarkupPointer *pIEndSearch);

    END_INTERFACE
} IMarkupPointerVtbl;
interface IMarkupPointer {
    CONST_VTBL IMarkupPointerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMarkupPointer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMarkupPointer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMarkupPointer_Release(This) (This)->lpVtbl->Release(This)
/*** IMarkupPointer methods ***/
#define IMarkupPointer_OwningDoc(This,ppDoc) (This)->lpVtbl->OwningDoc(This,ppDoc)
#define IMarkupPointer_Gravity(This,pGravity) (This)->lpVtbl->Gravity(This,pGravity)
#define IMarkupPointer_SetGravity(This,Gravity) (This)->lpVtbl->SetGravity(This,Gravity)
#define IMarkupPointer_Cling(This,pfCling) (This)->lpVtbl->Cling(This,pfCling)
#define IMarkupPointer_SetCling(This,fCLing) (This)->lpVtbl->SetCling(This,fCLing)
#define IMarkupPointer_Unposition(This) (This)->lpVtbl->Unposition(This)
#define IMarkupPointer_IsPositioned(This,pfPositioned) (This)->lpVtbl->IsPositioned(This,pfPositioned)
#define IMarkupPointer_GetContainer(This,ppContainer) (This)->lpVtbl->GetContainer(This,ppContainer)
#define IMarkupPointer_MoveAdjacentToElement(This,pElement,eAdj) (This)->lpVtbl->MoveAdjacentToElement(This,pElement,eAdj)
#define IMarkupPointer_MoveToPointer(This,pPointer) (This)->lpVtbl->MoveToPointer(This,pPointer)
#define IMarkupPointer_MoveToContainer(This,pContainer,fAtStart) (This)->lpVtbl->MoveToContainer(This,pContainer,fAtStart)
#define IMarkupPointer_Left(This,fMove,pContext,ppElement,pcch,pchText) (This)->lpVtbl->Left(This,fMove,pContext,ppElement,pcch,pchText)
#define IMarkupPointer_Right(This,fMove,pContext,ppElement,pcch,pchText) (This)->lpVtbl->Right(This,fMove,pContext,ppElement,pcch,pchText)
#define IMarkupPointer_CurrentScope(This,ppElemCurrent) (This)->lpVtbl->CurrentScope(This,ppElemCurrent)
#define IMarkupPointer_IsLeftOf(This,pPointerThat,pfResult) (This)->lpVtbl->IsLeftOf(This,pPointerThat,pfResult)
#define IMarkupPointer_IsLeftOfOrEqualTo(This,pPointerThat,pfResult) (This)->lpVtbl->IsLeftOfOrEqualTo(This,pPointerThat,pfResult)
#define IMarkupPointer_IsRightOf(This,pPointerThat,pfResult) (This)->lpVtbl->IsRightOf(This,pPointerThat,pfResult)
#define IMarkupPointer_IsRightOfOrEqualTo(This,pPointerThat,pfResult) (This)->lpVtbl->IsRightOfOrEqualTo(This,pPointerThat,pfResult)
#define IMarkupPointer_IsEqualTo(This,pPointerThat,pfAreEqual) (This)->lpVtbl->IsEqualTo(This,pPointerThat,pfAreEqual)
#define IMarkupPointer_MoveUnit(This,muAction) (This)->lpVtbl->MoveUnit(This,muAction)
#define IMarkupPointer_FindText(This,pchFindText,dwFlags,pIEndMatch,pIEndSearch) (This)->lpVtbl->FindText(This,pchFindText,dwFlags,pIEndMatch,pIEndSearch)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMarkupPointer_QueryInterface(IMarkupPointer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMarkupPointer_AddRef(IMarkupPointer* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMarkupPointer_Release(IMarkupPointer* This) {
    return This->lpVtbl->Release(This);
}
/*** IMarkupPointer methods ***/
static FORCEINLINE HRESULT IMarkupPointer_OwningDoc(IMarkupPointer* This,IHTMLDocument2 **ppDoc) {
    return This->lpVtbl->OwningDoc(This,ppDoc);
}
static FORCEINLINE HRESULT IMarkupPointer_Gravity(IMarkupPointer* This,POINTER_GRAVITY *pGravity) {
    return This->lpVtbl->Gravity(This,pGravity);
}
static FORCEINLINE HRESULT IMarkupPointer_SetGravity(IMarkupPointer* This,POINTER_GRAVITY Gravity) {
    return This->lpVtbl->SetGravity(This,Gravity);
}
static FORCEINLINE HRESULT IMarkupPointer_Cling(IMarkupPointer* This,WINBOOL *pfCling) {
    return This->lpVtbl->Cling(This,pfCling);
}
static FORCEINLINE HRESULT IMarkupPointer_SetCling(IMarkupPointer* This,WINBOOL fCLing) {
    return This->lpVtbl->SetCling(This,fCLing);
}
static FORCEINLINE HRESULT IMarkupPointer_Unposition(IMarkupPointer* This) {
    return This->lpVtbl->Unposition(This);
}
static FORCEINLINE HRESULT IMarkupPointer_IsPositioned(IMarkupPointer* This,WINBOOL *pfPositioned) {
    return This->lpVtbl->IsPositioned(This,pfPositioned);
}
static FORCEINLINE HRESULT IMarkupPointer_GetContainer(IMarkupPointer* This,IMarkupContainer **ppContainer) {
    return This->lpVtbl->GetContainer(This,ppContainer);
}
static FORCEINLINE HRESULT IMarkupPointer_MoveAdjacentToElement(IMarkupPointer* This,IHTMLElement *pElement,ELEMENT_ADJACENCY eAdj) {
    return This->lpVtbl->MoveAdjacentToElement(This,pElement,eAdj);
}
static FORCEINLINE HRESULT IMarkupPointer_MoveToPointer(IMarkupPointer* This,IMarkupPointer *pPointer) {
    return This->lpVtbl->MoveToPointer(This,pPointer);
}
static FORCEINLINE HRESULT IMarkupPointer_MoveToContainer(IMarkupPointer* This,IMarkupContainer *pContainer,WINBOOL fAtStart) {
    return This->lpVtbl->MoveToContainer(This,pContainer,fAtStart);
}
static FORCEINLINE HRESULT IMarkupPointer_Left(IMarkupPointer* This,WINBOOL fMove,MARKUP_CONTEXT_TYPE *pContext,IHTMLElement **ppElement,LONG *pcch,OLECHAR *pchText) {
    return This->lpVtbl->Left(This,fMove,pContext,ppElement,pcch,pchText);
}
static FORCEINLINE HRESULT IMarkupPointer_Right(IMarkupPointer* This,WINBOOL fMove,MARKUP_CONTEXT_TYPE *pContext,IHTMLElement **ppElement,LONG *pcch,OLECHAR *pchText) {
    return This->lpVtbl->Right(This,fMove,pContext,ppElement,pcch,pchText);
}
static FORCEINLINE HRESULT IMarkupPointer_CurrentScope(IMarkupPointer* This,IHTMLElement **ppElemCurrent) {
    return This->lpVtbl->CurrentScope(This,ppElemCurrent);
}
static FORCEINLINE HRESULT IMarkupPointer_IsLeftOf(IMarkupPointer* This,IMarkupPointer *pPointerThat,WINBOOL *pfResult) {
    return This->lpVtbl->IsLeftOf(This,pPointerThat,pfResult);
}
static FORCEINLINE HRESULT IMarkupPointer_IsLeftOfOrEqualTo(IMarkupPointer* This,IMarkupPointer *pPointerThat,WINBOOL *pfResult) {
    return This->lpVtbl->IsLeftOfOrEqualTo(This,pPointerThat,pfResult);
}
static FORCEINLINE HRESULT IMarkupPointer_IsRightOf(IMarkupPointer* This,IMarkupPointer *pPointerThat,WINBOOL *pfResult) {
    return This->lpVtbl->IsRightOf(This,pPointerThat,pfResult);
}
static FORCEINLINE HRESULT IMarkupPointer_IsRightOfOrEqualTo(IMarkupPointer* This,IMarkupPointer *pPointerThat,WINBOOL *pfResult) {
    return This->lpVtbl->IsRightOfOrEqualTo(This,pPointerThat,pfResult);
}
static FORCEINLINE HRESULT IMarkupPointer_IsEqualTo(IMarkupPointer* This,IMarkupPointer *pPointerThat,WINBOOL *pfAreEqual) {
    return This->lpVtbl->IsEqualTo(This,pPointerThat,pfAreEqual);
}
static FORCEINLINE HRESULT IMarkupPointer_MoveUnit(IMarkupPointer* This,MOVEUNIT_ACTION muAction) {
    return This->lpVtbl->MoveUnit(This,muAction);
}
static FORCEINLINE HRESULT IMarkupPointer_FindText(IMarkupPointer* This,OLECHAR *pchFindText,DWORD dwFlags,IMarkupPointer *pIEndMatch,IMarkupPointer *pIEndSearch) {
    return This->lpVtbl->FindText(This,pchFindText,dwFlags,pIEndMatch,pIEndSearch);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IMarkupPointer_OwningDoc_Proxy(
    IMarkupPointer* This,
    IHTMLDocument2 **ppDoc);
void __RPC_STUB IMarkupPointer_OwningDoc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupPointer_Gravity_Proxy(
    IMarkupPointer* This,
    POINTER_GRAVITY *pGravity);
void __RPC_STUB IMarkupPointer_Gravity_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupPointer_SetGravity_Proxy(
    IMarkupPointer* This,
    POINTER_GRAVITY Gravity);
void __RPC_STUB IMarkupPointer_SetGravity_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupPointer_Cling_Proxy(
    IMarkupPointer* This,
    WINBOOL *pfCling);
void __RPC_STUB IMarkupPointer_Cling_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupPointer_SetCling_Proxy(
    IMarkupPointer* This,
    WINBOOL fCLing);
void __RPC_STUB IMarkupPointer_SetCling_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupPointer_Unposition_Proxy(
    IMarkupPointer* This);
void __RPC_STUB IMarkupPointer_Unposition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupPointer_IsPositioned_Proxy(
    IMarkupPointer* This,
    WINBOOL *pfPositioned);
void __RPC_STUB IMarkupPointer_IsPositioned_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupPointer_GetContainer_Proxy(
    IMarkupPointer* This,
    IMarkupContainer **ppContainer);
void __RPC_STUB IMarkupPointer_GetContainer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupPointer_MoveAdjacentToElement_Proxy(
    IMarkupPointer* This,
    IHTMLElement *pElement,
    ELEMENT_ADJACENCY eAdj);
void __RPC_STUB IMarkupPointer_MoveAdjacentToElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupPointer_MoveToPointer_Proxy(
    IMarkupPointer* This,
    IMarkupPointer *pPointer);
void __RPC_STUB IMarkupPointer_MoveToPointer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupPointer_MoveToContainer_Proxy(
    IMarkupPointer* This,
    IMarkupContainer *pContainer,
    WINBOOL fAtStart);
void __RPC_STUB IMarkupPointer_MoveToContainer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupPointer_Left_Proxy(
    IMarkupPointer* This,
    WINBOOL fMove,
    MARKUP_CONTEXT_TYPE *pContext,
    IHTMLElement **ppElement,
    LONG *pcch,
    OLECHAR *pchText);
void __RPC_STUB IMarkupPointer_Left_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupPointer_Right_Proxy(
    IMarkupPointer* This,
    WINBOOL fMove,
    MARKUP_CONTEXT_TYPE *pContext,
    IHTMLElement **ppElement,
    LONG *pcch,
    OLECHAR *pchText);
void __RPC_STUB IMarkupPointer_Right_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupPointer_CurrentScope_Proxy(
    IMarkupPointer* This,
    IHTMLElement **ppElemCurrent);
void __RPC_STUB IMarkupPointer_CurrentScope_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupPointer_IsLeftOf_Proxy(
    IMarkupPointer* This,
    IMarkupPointer *pPointerThat,
    WINBOOL *pfResult);
void __RPC_STUB IMarkupPointer_IsLeftOf_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupPointer_IsLeftOfOrEqualTo_Proxy(
    IMarkupPointer* This,
    IMarkupPointer *pPointerThat,
    WINBOOL *pfResult);
void __RPC_STUB IMarkupPointer_IsLeftOfOrEqualTo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupPointer_IsRightOf_Proxy(
    IMarkupPointer* This,
    IMarkupPointer *pPointerThat,
    WINBOOL *pfResult);
void __RPC_STUB IMarkupPointer_IsRightOf_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupPointer_IsRightOfOrEqualTo_Proxy(
    IMarkupPointer* This,
    IMarkupPointer *pPointerThat,
    WINBOOL *pfResult);
void __RPC_STUB IMarkupPointer_IsRightOfOrEqualTo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupPointer_IsEqualTo_Proxy(
    IMarkupPointer* This,
    IMarkupPointer *pPointerThat,
    WINBOOL *pfAreEqual);
void __RPC_STUB IMarkupPointer_IsEqualTo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupPointer_MoveUnit_Proxy(
    IMarkupPointer* This,
    MOVEUNIT_ACTION muAction);
void __RPC_STUB IMarkupPointer_MoveUnit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupPointer_FindText_Proxy(
    IMarkupPointer* This,
    OLECHAR *pchFindText,
    DWORD dwFlags,
    IMarkupPointer *pIEndMatch,
    IMarkupPointer *pIEndSearch);
void __RPC_STUB IMarkupPointer_FindText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IMarkupPointer_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMarkupPointer2 interface
 */
#ifndef __IMarkupPointer2_INTERFACE_DEFINED__
#define __IMarkupPointer2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMarkupPointer2, 0x3050f675, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f675-98b5-11cf-bb82-00aa00bdce0b")
IMarkupPointer2 : public IMarkupPointer
{
    virtual HRESULT STDMETHODCALLTYPE IsAtWordBreak(
        WINBOOL *pfAtBreak) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMarkupPosition(
        LONG *plMP) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveToMarkupPosition(
        IMarkupContainer *pContainer,
        LONG lMP) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveUnitBounded(
        MOVEUNIT_ACTION muAction,
        IMarkupPointer *pIBoundary) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsInsideURL(
        IMarkupPointer *pRight,
        WINBOOL *pfResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveToContent(
        IHTMLElement *pIElement,
        WINBOOL fAtStart) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMarkupPointer2, 0x3050f675, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IMarkupPointer2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IMarkupPointer2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IMarkupPointer2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IMarkupPointer2* This);

    /*** IMarkupPointer methods ***/
    HRESULT (STDMETHODCALLTYPE *OwningDoc)(
        IMarkupPointer2* This,
        IHTMLDocument2 **ppDoc);

    HRESULT (STDMETHODCALLTYPE *Gravity)(
        IMarkupPointer2* This,
        POINTER_GRAVITY *pGravity);

    HRESULT (STDMETHODCALLTYPE *SetGravity)(
        IMarkupPointer2* This,
        POINTER_GRAVITY Gravity);

    HRESULT (STDMETHODCALLTYPE *Cling)(
        IMarkupPointer2* This,
        WINBOOL *pfCling);

    HRESULT (STDMETHODCALLTYPE *SetCling)(
        IMarkupPointer2* This,
        WINBOOL fCLing);

    HRESULT (STDMETHODCALLTYPE *Unposition)(
        IMarkupPointer2* This);

    HRESULT (STDMETHODCALLTYPE *IsPositioned)(
        IMarkupPointer2* This,
        WINBOOL *pfPositioned);

    HRESULT (STDMETHODCALLTYPE *GetContainer)(
        IMarkupPointer2* This,
        IMarkupContainer **ppContainer);

    HRESULT (STDMETHODCALLTYPE *MoveAdjacentToElement)(
        IMarkupPointer2* This,
        IHTMLElement *pElement,
        ELEMENT_ADJACENCY eAdj);

    HRESULT (STDMETHODCALLTYPE *MoveToPointer)(
        IMarkupPointer2* This,
        IMarkupPointer *pPointer);

    HRESULT (STDMETHODCALLTYPE *MoveToContainer)(
        IMarkupPointer2* This,
        IMarkupContainer *pContainer,
        WINBOOL fAtStart);

    HRESULT (STDMETHODCALLTYPE *Left)(
        IMarkupPointer2* This,
        WINBOOL fMove,
        MARKUP_CONTEXT_TYPE *pContext,
        IHTMLElement **ppElement,
        LONG *pcch,
        OLECHAR *pchText);

    HRESULT (STDMETHODCALLTYPE *Right)(
        IMarkupPointer2* This,
        WINBOOL fMove,
        MARKUP_CONTEXT_TYPE *pContext,
        IHTMLElement **ppElement,
        LONG *pcch,
        OLECHAR *pchText);

    HRESULT (STDMETHODCALLTYPE *CurrentScope)(
        IMarkupPointer2* This,
        IHTMLElement **ppElemCurrent);

    HRESULT (STDMETHODCALLTYPE *IsLeftOf)(
        IMarkupPointer2* This,
        IMarkupPointer *pPointerThat,
        WINBOOL *pfResult);

    HRESULT (STDMETHODCALLTYPE *IsLeftOfOrEqualTo)(
        IMarkupPointer2* This,
        IMarkupPointer *pPointerThat,
        WINBOOL *pfResult);

    HRESULT (STDMETHODCALLTYPE *IsRightOf)(
        IMarkupPointer2* This,
        IMarkupPointer *pPointerThat,
        WINBOOL *pfResult);

    HRESULT (STDMETHODCALLTYPE *IsRightOfOrEqualTo)(
        IMarkupPointer2* This,
        IMarkupPointer *pPointerThat,
        WINBOOL *pfResult);

    HRESULT (STDMETHODCALLTYPE *IsEqualTo)(
        IMarkupPointer2* This,
        IMarkupPointer *pPointerThat,
        WINBOOL *pfAreEqual);

    HRESULT (STDMETHODCALLTYPE *MoveUnit)(
        IMarkupPointer2* This,
        MOVEUNIT_ACTION muAction);

    HRESULT (STDMETHODCALLTYPE *FindText)(
        IMarkupPointer2* This,
        OLECHAR *pchFindText,
        DWORD dwFlags,
        IMarkupPointer *pIEndMatch,
        IMarkupPointer *pIEndSearch);

    /*** IMarkupPointer2 methods ***/
    HRESULT (STDMETHODCALLTYPE *IsAtWordBreak)(
        IMarkupPointer2* This,
        WINBOOL *pfAtBreak);

    HRESULT (STDMETHODCALLTYPE *GetMarkupPosition)(
        IMarkupPointer2* This,
        LONG *plMP);

    HRESULT (STDMETHODCALLTYPE *MoveToMarkupPosition)(
        IMarkupPointer2* This,
        IMarkupContainer *pContainer,
        LONG lMP);

    HRESULT (STDMETHODCALLTYPE *MoveUnitBounded)(
        IMarkupPointer2* This,
        MOVEUNIT_ACTION muAction,
        IMarkupPointer *pIBoundary);

    HRESULT (STDMETHODCALLTYPE *IsInsideURL)(
        IMarkupPointer2* This,
        IMarkupPointer *pRight,
        WINBOOL *pfResult);

    HRESULT (STDMETHODCALLTYPE *MoveToContent)(
        IMarkupPointer2* This,
        IHTMLElement *pIElement,
        WINBOOL fAtStart);

    END_INTERFACE
} IMarkupPointer2Vtbl;
interface IMarkupPointer2 {
    CONST_VTBL IMarkupPointer2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMarkupPointer2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMarkupPointer2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMarkupPointer2_Release(This) (This)->lpVtbl->Release(This)
/*** IMarkupPointer methods ***/
#define IMarkupPointer2_OwningDoc(This,ppDoc) (This)->lpVtbl->OwningDoc(This,ppDoc)
#define IMarkupPointer2_Gravity(This,pGravity) (This)->lpVtbl->Gravity(This,pGravity)
#define IMarkupPointer2_SetGravity(This,Gravity) (This)->lpVtbl->SetGravity(This,Gravity)
#define IMarkupPointer2_Cling(This,pfCling) (This)->lpVtbl->Cling(This,pfCling)
#define IMarkupPointer2_SetCling(This,fCLing) (This)->lpVtbl->SetCling(This,fCLing)
#define IMarkupPointer2_Unposition(This) (This)->lpVtbl->Unposition(This)
#define IMarkupPointer2_IsPositioned(This,pfPositioned) (This)->lpVtbl->IsPositioned(This,pfPositioned)
#define IMarkupPointer2_GetContainer(This,ppContainer) (This)->lpVtbl->GetContainer(This,ppContainer)
#define IMarkupPointer2_MoveAdjacentToElement(This,pElement,eAdj) (This)->lpVtbl->MoveAdjacentToElement(This,pElement,eAdj)
#define IMarkupPointer2_MoveToPointer(This,pPointer) (This)->lpVtbl->MoveToPointer(This,pPointer)
#define IMarkupPointer2_MoveToContainer(This,pContainer,fAtStart) (This)->lpVtbl->MoveToContainer(This,pContainer,fAtStart)
#define IMarkupPointer2_Left(This,fMove,pContext,ppElement,pcch,pchText) (This)->lpVtbl->Left(This,fMove,pContext,ppElement,pcch,pchText)
#define IMarkupPointer2_Right(This,fMove,pContext,ppElement,pcch,pchText) (This)->lpVtbl->Right(This,fMove,pContext,ppElement,pcch,pchText)
#define IMarkupPointer2_CurrentScope(This,ppElemCurrent) (This)->lpVtbl->CurrentScope(This,ppElemCurrent)
#define IMarkupPointer2_IsLeftOf(This,pPointerThat,pfResult) (This)->lpVtbl->IsLeftOf(This,pPointerThat,pfResult)
#define IMarkupPointer2_IsLeftOfOrEqualTo(This,pPointerThat,pfResult) (This)->lpVtbl->IsLeftOfOrEqualTo(This,pPointerThat,pfResult)
#define IMarkupPointer2_IsRightOf(This,pPointerThat,pfResult) (This)->lpVtbl->IsRightOf(This,pPointerThat,pfResult)
#define IMarkupPointer2_IsRightOfOrEqualTo(This,pPointerThat,pfResult) (This)->lpVtbl->IsRightOfOrEqualTo(This,pPointerThat,pfResult)
#define IMarkupPointer2_IsEqualTo(This,pPointerThat,pfAreEqual) (This)->lpVtbl->IsEqualTo(This,pPointerThat,pfAreEqual)
#define IMarkupPointer2_MoveUnit(This,muAction) (This)->lpVtbl->MoveUnit(This,muAction)
#define IMarkupPointer2_FindText(This,pchFindText,dwFlags,pIEndMatch,pIEndSearch) (This)->lpVtbl->FindText(This,pchFindText,dwFlags,pIEndMatch,pIEndSearch)
/*** IMarkupPointer2 methods ***/
#define IMarkupPointer2_IsAtWordBreak(This,pfAtBreak) (This)->lpVtbl->IsAtWordBreak(This,pfAtBreak)
#define IMarkupPointer2_GetMarkupPosition(This,plMP) (This)->lpVtbl->GetMarkupPosition(This,plMP)
#define IMarkupPointer2_MoveToMarkupPosition(This,pContainer,lMP) (This)->lpVtbl->MoveToMarkupPosition(This,pContainer,lMP)
#define IMarkupPointer2_MoveUnitBounded(This,muAction,pIBoundary) (This)->lpVtbl->MoveUnitBounded(This,muAction,pIBoundary)
#define IMarkupPointer2_IsInsideURL(This,pRight,pfResult) (This)->lpVtbl->IsInsideURL(This,pRight,pfResult)
#define IMarkupPointer2_MoveToContent(This,pIElement,fAtStart) (This)->lpVtbl->MoveToContent(This,pIElement,fAtStart)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMarkupPointer2_QueryInterface(IMarkupPointer2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMarkupPointer2_AddRef(IMarkupPointer2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMarkupPointer2_Release(IMarkupPointer2* This) {
    return This->lpVtbl->Release(This);
}
/*** IMarkupPointer methods ***/
static FORCEINLINE HRESULT IMarkupPointer2_OwningDoc(IMarkupPointer2* This,IHTMLDocument2 **ppDoc) {
    return This->lpVtbl->OwningDoc(This,ppDoc);
}
static FORCEINLINE HRESULT IMarkupPointer2_Gravity(IMarkupPointer2* This,POINTER_GRAVITY *pGravity) {
    return This->lpVtbl->Gravity(This,pGravity);
}
static FORCEINLINE HRESULT IMarkupPointer2_SetGravity(IMarkupPointer2* This,POINTER_GRAVITY Gravity) {
    return This->lpVtbl->SetGravity(This,Gravity);
}
static FORCEINLINE HRESULT IMarkupPointer2_Cling(IMarkupPointer2* This,WINBOOL *pfCling) {
    return This->lpVtbl->Cling(This,pfCling);
}
static FORCEINLINE HRESULT IMarkupPointer2_SetCling(IMarkupPointer2* This,WINBOOL fCLing) {
    return This->lpVtbl->SetCling(This,fCLing);
}
static FORCEINLINE HRESULT IMarkupPointer2_Unposition(IMarkupPointer2* This) {
    return This->lpVtbl->Unposition(This);
}
static FORCEINLINE HRESULT IMarkupPointer2_IsPositioned(IMarkupPointer2* This,WINBOOL *pfPositioned) {
    return This->lpVtbl->IsPositioned(This,pfPositioned);
}
static FORCEINLINE HRESULT IMarkupPointer2_GetContainer(IMarkupPointer2* This,IMarkupContainer **ppContainer) {
    return This->lpVtbl->GetContainer(This,ppContainer);
}
static FORCEINLINE HRESULT IMarkupPointer2_MoveAdjacentToElement(IMarkupPointer2* This,IHTMLElement *pElement,ELEMENT_ADJACENCY eAdj) {
    return This->lpVtbl->MoveAdjacentToElement(This,pElement,eAdj);
}
static FORCEINLINE HRESULT IMarkupPointer2_MoveToPointer(IMarkupPointer2* This,IMarkupPointer *pPointer) {
    return This->lpVtbl->MoveToPointer(This,pPointer);
}
static FORCEINLINE HRESULT IMarkupPointer2_MoveToContainer(IMarkupPointer2* This,IMarkupContainer *pContainer,WINBOOL fAtStart) {
    return This->lpVtbl->MoveToContainer(This,pContainer,fAtStart);
}
static FORCEINLINE HRESULT IMarkupPointer2_Left(IMarkupPointer2* This,WINBOOL fMove,MARKUP_CONTEXT_TYPE *pContext,IHTMLElement **ppElement,LONG *pcch,OLECHAR *pchText) {
    return This->lpVtbl->Left(This,fMove,pContext,ppElement,pcch,pchText);
}
static FORCEINLINE HRESULT IMarkupPointer2_Right(IMarkupPointer2* This,WINBOOL fMove,MARKUP_CONTEXT_TYPE *pContext,IHTMLElement **ppElement,LONG *pcch,OLECHAR *pchText) {
    return This->lpVtbl->Right(This,fMove,pContext,ppElement,pcch,pchText);
}
static FORCEINLINE HRESULT IMarkupPointer2_CurrentScope(IMarkupPointer2* This,IHTMLElement **ppElemCurrent) {
    return This->lpVtbl->CurrentScope(This,ppElemCurrent);
}
static FORCEINLINE HRESULT IMarkupPointer2_IsLeftOf(IMarkupPointer2* This,IMarkupPointer *pPointerThat,WINBOOL *pfResult) {
    return This->lpVtbl->IsLeftOf(This,pPointerThat,pfResult);
}
static FORCEINLINE HRESULT IMarkupPointer2_IsLeftOfOrEqualTo(IMarkupPointer2* This,IMarkupPointer *pPointerThat,WINBOOL *pfResult) {
    return This->lpVtbl->IsLeftOfOrEqualTo(This,pPointerThat,pfResult);
}
static FORCEINLINE HRESULT IMarkupPointer2_IsRightOf(IMarkupPointer2* This,IMarkupPointer *pPointerThat,WINBOOL *pfResult) {
    return This->lpVtbl->IsRightOf(This,pPointerThat,pfResult);
}
static FORCEINLINE HRESULT IMarkupPointer2_IsRightOfOrEqualTo(IMarkupPointer2* This,IMarkupPointer *pPointerThat,WINBOOL *pfResult) {
    return This->lpVtbl->IsRightOfOrEqualTo(This,pPointerThat,pfResult);
}
static FORCEINLINE HRESULT IMarkupPointer2_IsEqualTo(IMarkupPointer2* This,IMarkupPointer *pPointerThat,WINBOOL *pfAreEqual) {
    return This->lpVtbl->IsEqualTo(This,pPointerThat,pfAreEqual);
}
static FORCEINLINE HRESULT IMarkupPointer2_MoveUnit(IMarkupPointer2* This,MOVEUNIT_ACTION muAction) {
    return This->lpVtbl->MoveUnit(This,muAction);
}
static FORCEINLINE HRESULT IMarkupPointer2_FindText(IMarkupPointer2* This,OLECHAR *pchFindText,DWORD dwFlags,IMarkupPointer *pIEndMatch,IMarkupPointer *pIEndSearch) {
    return This->lpVtbl->FindText(This,pchFindText,dwFlags,pIEndMatch,pIEndSearch);
}
/*** IMarkupPointer2 methods ***/
static FORCEINLINE HRESULT IMarkupPointer2_IsAtWordBreak(IMarkupPointer2* This,WINBOOL *pfAtBreak) {
    return This->lpVtbl->IsAtWordBreak(This,pfAtBreak);
}
static FORCEINLINE HRESULT IMarkupPointer2_GetMarkupPosition(IMarkupPointer2* This,LONG *plMP) {
    return This->lpVtbl->GetMarkupPosition(This,plMP);
}
static FORCEINLINE HRESULT IMarkupPointer2_MoveToMarkupPosition(IMarkupPointer2* This,IMarkupContainer *pContainer,LONG lMP) {
    return This->lpVtbl->MoveToMarkupPosition(This,pContainer,lMP);
}
static FORCEINLINE HRESULT IMarkupPointer2_MoveUnitBounded(IMarkupPointer2* This,MOVEUNIT_ACTION muAction,IMarkupPointer *pIBoundary) {
    return This->lpVtbl->MoveUnitBounded(This,muAction,pIBoundary);
}
static FORCEINLINE HRESULT IMarkupPointer2_IsInsideURL(IMarkupPointer2* This,IMarkupPointer *pRight,WINBOOL *pfResult) {
    return This->lpVtbl->IsInsideURL(This,pRight,pfResult);
}
static FORCEINLINE HRESULT IMarkupPointer2_MoveToContent(IMarkupPointer2* This,IHTMLElement *pIElement,WINBOOL fAtStart) {
    return This->lpVtbl->MoveToContent(This,pIElement,fAtStart);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IMarkupPointer2_IsAtWordBreak_Proxy(
    IMarkupPointer2* This,
    WINBOOL *pfAtBreak);
void __RPC_STUB IMarkupPointer2_IsAtWordBreak_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupPointer2_GetMarkupPosition_Proxy(
    IMarkupPointer2* This,
    LONG *plMP);
void __RPC_STUB IMarkupPointer2_GetMarkupPosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupPointer2_MoveToMarkupPosition_Proxy(
    IMarkupPointer2* This,
    IMarkupContainer *pContainer,
    LONG lMP);
void __RPC_STUB IMarkupPointer2_MoveToMarkupPosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupPointer2_MoveUnitBounded_Proxy(
    IMarkupPointer2* This,
    MOVEUNIT_ACTION muAction,
    IMarkupPointer *pIBoundary);
void __RPC_STUB IMarkupPointer2_MoveUnitBounded_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupPointer2_IsInsideURL_Proxy(
    IMarkupPointer2* This,
    IMarkupPointer *pRight,
    WINBOOL *pfResult);
void __RPC_STUB IMarkupPointer2_IsInsideURL_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupPointer2_MoveToContent_Proxy(
    IMarkupPointer2* This,
    IHTMLElement *pIElement,
    WINBOOL fAtStart);
void __RPC_STUB IMarkupPointer2_MoveToContent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IMarkupPointer2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMarkupTextFrags interface
 */
#ifndef __IMarkupTextFrags_INTERFACE_DEFINED__
#define __IMarkupTextFrags_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMarkupTextFrags, 0x3050f5fa, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f5fa-98b5-11cf-bb82-00aa00bdce0b")
IMarkupTextFrags : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetTextFragCount(
        LONG *pcFrags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTextFrag(
        LONG iFrag,
        BSTR *pbstrFrag,
        IMarkupPointer *pPointerFrag) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveTextFrag(
        LONG iFrag) = 0;

    virtual HRESULT STDMETHODCALLTYPE InsertTextFrag(
        LONG iFrag,
        BSTR bstrInsert,
        IMarkupPointer *pPointerInsert) = 0;

    virtual HRESULT STDMETHODCALLTYPE FindTextFragFromMarkupPointer(
        IMarkupPointer *pPointerFind,
        LONG *piFrag,
        WINBOOL *pfFragFound) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMarkupTextFrags, 0x3050f5fa, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IMarkupTextFragsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IMarkupTextFrags* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IMarkupTextFrags* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IMarkupTextFrags* This);

    /*** IMarkupTextFrags methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTextFragCount)(
        IMarkupTextFrags* This,
        LONG *pcFrags);

    HRESULT (STDMETHODCALLTYPE *GetTextFrag)(
        IMarkupTextFrags* This,
        LONG iFrag,
        BSTR *pbstrFrag,
        IMarkupPointer *pPointerFrag);

    HRESULT (STDMETHODCALLTYPE *RemoveTextFrag)(
        IMarkupTextFrags* This,
        LONG iFrag);

    HRESULT (STDMETHODCALLTYPE *InsertTextFrag)(
        IMarkupTextFrags* This,
        LONG iFrag,
        BSTR bstrInsert,
        IMarkupPointer *pPointerInsert);

    HRESULT (STDMETHODCALLTYPE *FindTextFragFromMarkupPointer)(
        IMarkupTextFrags* This,
        IMarkupPointer *pPointerFind,
        LONG *piFrag,
        WINBOOL *pfFragFound);

    END_INTERFACE
} IMarkupTextFragsVtbl;
interface IMarkupTextFrags {
    CONST_VTBL IMarkupTextFragsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMarkupTextFrags_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMarkupTextFrags_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMarkupTextFrags_Release(This) (This)->lpVtbl->Release(This)
/*** IMarkupTextFrags methods ***/
#define IMarkupTextFrags_GetTextFragCount(This,pcFrags) (This)->lpVtbl->GetTextFragCount(This,pcFrags)
#define IMarkupTextFrags_GetTextFrag(This,iFrag,pbstrFrag,pPointerFrag) (This)->lpVtbl->GetTextFrag(This,iFrag,pbstrFrag,pPointerFrag)
#define IMarkupTextFrags_RemoveTextFrag(This,iFrag) (This)->lpVtbl->RemoveTextFrag(This,iFrag)
#define IMarkupTextFrags_InsertTextFrag(This,iFrag,bstrInsert,pPointerInsert) (This)->lpVtbl->InsertTextFrag(This,iFrag,bstrInsert,pPointerInsert)
#define IMarkupTextFrags_FindTextFragFromMarkupPointer(This,pPointerFind,piFrag,pfFragFound) (This)->lpVtbl->FindTextFragFromMarkupPointer(This,pPointerFind,piFrag,pfFragFound)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMarkupTextFrags_QueryInterface(IMarkupTextFrags* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMarkupTextFrags_AddRef(IMarkupTextFrags* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMarkupTextFrags_Release(IMarkupTextFrags* This) {
    return This->lpVtbl->Release(This);
}
/*** IMarkupTextFrags methods ***/
static FORCEINLINE HRESULT IMarkupTextFrags_GetTextFragCount(IMarkupTextFrags* This,LONG *pcFrags) {
    return This->lpVtbl->GetTextFragCount(This,pcFrags);
}
static FORCEINLINE HRESULT IMarkupTextFrags_GetTextFrag(IMarkupTextFrags* This,LONG iFrag,BSTR *pbstrFrag,IMarkupPointer *pPointerFrag) {
    return This->lpVtbl->GetTextFrag(This,iFrag,pbstrFrag,pPointerFrag);
}
static FORCEINLINE HRESULT IMarkupTextFrags_RemoveTextFrag(IMarkupTextFrags* This,LONG iFrag) {
    return This->lpVtbl->RemoveTextFrag(This,iFrag);
}
static FORCEINLINE HRESULT IMarkupTextFrags_InsertTextFrag(IMarkupTextFrags* This,LONG iFrag,BSTR bstrInsert,IMarkupPointer *pPointerInsert) {
    return This->lpVtbl->InsertTextFrag(This,iFrag,bstrInsert,pPointerInsert);
}
static FORCEINLINE HRESULT IMarkupTextFrags_FindTextFragFromMarkupPointer(IMarkupTextFrags* This,IMarkupPointer *pPointerFind,LONG *piFrag,WINBOOL *pfFragFound) {
    return This->lpVtbl->FindTextFragFromMarkupPointer(This,pPointerFind,piFrag,pfFragFound);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IMarkupTextFrags_GetTextFragCount_Proxy(
    IMarkupTextFrags* This,
    LONG *pcFrags);
void __RPC_STUB IMarkupTextFrags_GetTextFragCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupTextFrags_GetTextFrag_Proxy(
    IMarkupTextFrags* This,
    LONG iFrag,
    BSTR *pbstrFrag,
    IMarkupPointer *pPointerFrag);
void __RPC_STUB IMarkupTextFrags_GetTextFrag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupTextFrags_RemoveTextFrag_Proxy(
    IMarkupTextFrags* This,
    LONG iFrag);
void __RPC_STUB IMarkupTextFrags_RemoveTextFrag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupTextFrags_InsertTextFrag_Proxy(
    IMarkupTextFrags* This,
    LONG iFrag,
    BSTR bstrInsert,
    IMarkupPointer *pPointerInsert);
void __RPC_STUB IMarkupTextFrags_InsertTextFrag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMarkupTextFrags_FindTextFragFromMarkupPointer_Proxy(
    IMarkupTextFrags* This,
    IMarkupPointer *pPointerFind,
    LONG *piFrag,
    WINBOOL *pfFragFound);
void __RPC_STUB IMarkupTextFrags_FindTextFragFromMarkupPointer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IMarkupTextFrags_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLChangeLog interface
 */
#ifndef __IHTMLChangeLog_INTERFACE_DEFINED__
#define __IHTMLChangeLog_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLChangeLog, 0x3050f649, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f649-98b5-11cf-bb82-00aa00bdce0b")
IHTMLChangeLog : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetNextChange(
        BYTE *pbBuffer,
        LONG nBufferSize,
        LONG *pnRecordLength) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLChangeLog, 0x3050f649, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLChangeLogVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLChangeLog* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLChangeLog* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLChangeLog* This);

    /*** IHTMLChangeLog methods ***/
    HRESULT (STDMETHODCALLTYPE *GetNextChange)(
        IHTMLChangeLog* This,
        BYTE *pbBuffer,
        LONG nBufferSize,
        LONG *pnRecordLength);

    END_INTERFACE
} IHTMLChangeLogVtbl;
interface IHTMLChangeLog {
    CONST_VTBL IHTMLChangeLogVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLChangeLog_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLChangeLog_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLChangeLog_Release(This) (This)->lpVtbl->Release(This)
/*** IHTMLChangeLog methods ***/
#define IHTMLChangeLog_GetNextChange(This,pbBuffer,nBufferSize,pnRecordLength) (This)->lpVtbl->GetNextChange(This,pbBuffer,nBufferSize,pnRecordLength)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLChangeLog_QueryInterface(IHTMLChangeLog* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLChangeLog_AddRef(IHTMLChangeLog* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLChangeLog_Release(IHTMLChangeLog* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLChangeLog methods ***/
static FORCEINLINE HRESULT IHTMLChangeLog_GetNextChange(IHTMLChangeLog* This,BYTE *pbBuffer,LONG nBufferSize,LONG *pnRecordLength) {
    return This->lpVtbl->GetNextChange(This,pbBuffer,nBufferSize,pnRecordLength);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLChangeLog_GetNextChange_Proxy(
    IHTMLChangeLog* This,
    BYTE *pbBuffer,
    LONG nBufferSize,
    LONG *pnRecordLength);
void __RPC_STUB IHTMLChangeLog_GetNextChange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLChangeLog_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLChangeSink interface
 */
#ifndef __IHTMLChangeSink_INTERFACE_DEFINED__
#define __IHTMLChangeSink_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLChangeSink, 0x3050f64a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f64a-98b5-11cf-bb82-00aa00bdce0b")
IHTMLChangeSink : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Notify(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLChangeSink, 0x3050f64a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLChangeSinkVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLChangeSink* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLChangeSink* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLChangeSink* This);

    /*** IHTMLChangeSink methods ***/
    HRESULT (STDMETHODCALLTYPE *Notify)(
        IHTMLChangeSink* This);

    END_INTERFACE
} IHTMLChangeSinkVtbl;
interface IHTMLChangeSink {
    CONST_VTBL IHTMLChangeSinkVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLChangeSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLChangeSink_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLChangeSink_Release(This) (This)->lpVtbl->Release(This)
/*** IHTMLChangeSink methods ***/
#define IHTMLChangeSink_Notify(This) (This)->lpVtbl->Notify(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLChangeSink_QueryInterface(IHTMLChangeSink* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLChangeSink_AddRef(IHTMLChangeSink* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLChangeSink_Release(IHTMLChangeSink* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLChangeSink methods ***/
static FORCEINLINE HRESULT IHTMLChangeSink_Notify(IHTMLChangeSink* This) {
    return This->lpVtbl->Notify(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLChangeSink_Notify_Proxy(
    IHTMLChangeSink* This);
void __RPC_STUB IHTMLChangeSink_Notify_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLChangeSink_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLGenericParse interface
 */
#ifndef __IXMLGenericParse_INTERFACE_DEFINED__
#define __IXMLGenericParse_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLGenericParse, 0xe4e23071, 0x4d07, 0x11d2, 0xae,0x76, 0x00,0x80,0xc7,0x3b,0xc1,0x99);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e4e23071-4d07-11d2-ae76-0080c73bc199")
IXMLGenericParse : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetGenericParse(
        VARIANT_BOOL fDoGeneric) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLGenericParse, 0xe4e23071, 0x4d07, 0x11d2, 0xae,0x76, 0x00,0x80,0xc7,0x3b,0xc1,0x99)
#endif
#else
typedef struct IXMLGenericParseVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXMLGenericParse* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXMLGenericParse* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXMLGenericParse* This);

    /*** IXMLGenericParse methods ***/
    HRESULT (STDMETHODCALLTYPE *SetGenericParse)(
        IXMLGenericParse* This,
        VARIANT_BOOL fDoGeneric);

    END_INTERFACE
} IXMLGenericParseVtbl;
interface IXMLGenericParse {
    CONST_VTBL IXMLGenericParseVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLGenericParse_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLGenericParse_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLGenericParse_Release(This) (This)->lpVtbl->Release(This)
/*** IXMLGenericParse methods ***/
#define IXMLGenericParse_SetGenericParse(This,fDoGeneric) (This)->lpVtbl->SetGenericParse(This,fDoGeneric)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IXMLGenericParse_QueryInterface(IXMLGenericParse* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IXMLGenericParse_AddRef(IXMLGenericParse* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IXMLGenericParse_Release(IXMLGenericParse* This) {
    return This->lpVtbl->Release(This);
}
/*** IXMLGenericParse methods ***/
static FORCEINLINE HRESULT IXMLGenericParse_SetGenericParse(IXMLGenericParse* This,VARIANT_BOOL fDoGeneric) {
    return This->lpVtbl->SetGenericParse(This,fDoGeneric);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IXMLGenericParse_SetGenericParse_Proxy(
    IXMLGenericParse* This,
    VARIANT_BOOL fDoGeneric);
void __RPC_STUB IXMLGenericParse_SetGenericParse_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IXMLGenericParse_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLEditHost interface
 */
#ifndef __IHTMLEditHost_INTERFACE_DEFINED__
#define __IHTMLEditHost_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLEditHost, 0x3050f6a0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f6a0-98b5-11cf-bb82-00aa00bdce0b")
IHTMLEditHost : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SnapRect(
        IHTMLElement *pIElement,
        RECT *prcNew,
        ELEMENT_CORNER eHandle) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLEditHost, 0x3050f6a0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLEditHostVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLEditHost* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLEditHost* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLEditHost* This);

    /*** IHTMLEditHost methods ***/
    HRESULT (STDMETHODCALLTYPE *SnapRect)(
        IHTMLEditHost* This,
        IHTMLElement *pIElement,
        RECT *prcNew,
        ELEMENT_CORNER eHandle);

    END_INTERFACE
} IHTMLEditHostVtbl;
interface IHTMLEditHost {
    CONST_VTBL IHTMLEditHostVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLEditHost_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLEditHost_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLEditHost_Release(This) (This)->lpVtbl->Release(This)
/*** IHTMLEditHost methods ***/
#define IHTMLEditHost_SnapRect(This,pIElement,prcNew,eHandle) (This)->lpVtbl->SnapRect(This,pIElement,prcNew,eHandle)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLEditHost_QueryInterface(IHTMLEditHost* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLEditHost_AddRef(IHTMLEditHost* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLEditHost_Release(IHTMLEditHost* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLEditHost methods ***/
static FORCEINLINE HRESULT IHTMLEditHost_SnapRect(IHTMLEditHost* This,IHTMLElement *pIElement,RECT *prcNew,ELEMENT_CORNER eHandle) {
    return This->lpVtbl->SnapRect(This,pIElement,prcNew,eHandle);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLEditHost_SnapRect_Proxy(
    IHTMLEditHost* This,
    IHTMLElement *pIElement,
    RECT *prcNew,
    ELEMENT_CORNER eHandle);
void __RPC_STUB IHTMLEditHost_SnapRect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLEditHost_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLEditHost2 interface
 */
#ifndef __IHTMLEditHost2_INTERFACE_DEFINED__
#define __IHTMLEditHost2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLEditHost2, 0x3050f848, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f848-98b5-11cf-bb82-00aa00bdce0d")
IHTMLEditHost2 : public IHTMLEditHost
{
    virtual HRESULT STDMETHODCALLTYPE PreDrag(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLEditHost2, 0x3050f848, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0d)
#endif
#else
typedef struct IHTMLEditHost2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLEditHost2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLEditHost2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLEditHost2* This);

    /*** IHTMLEditHost methods ***/
    HRESULT (STDMETHODCALLTYPE *SnapRect)(
        IHTMLEditHost2* This,
        IHTMLElement *pIElement,
        RECT *prcNew,
        ELEMENT_CORNER eHandle);

    /*** IHTMLEditHost2 methods ***/
    HRESULT (STDMETHODCALLTYPE *PreDrag)(
        IHTMLEditHost2* This);

    END_INTERFACE
} IHTMLEditHost2Vtbl;
interface IHTMLEditHost2 {
    CONST_VTBL IHTMLEditHost2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLEditHost2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLEditHost2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLEditHost2_Release(This) (This)->lpVtbl->Release(This)
/*** IHTMLEditHost methods ***/
#define IHTMLEditHost2_SnapRect(This,pIElement,prcNew,eHandle) (This)->lpVtbl->SnapRect(This,pIElement,prcNew,eHandle)
/*** IHTMLEditHost2 methods ***/
#define IHTMLEditHost2_PreDrag(This) (This)->lpVtbl->PreDrag(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLEditHost2_QueryInterface(IHTMLEditHost2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLEditHost2_AddRef(IHTMLEditHost2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLEditHost2_Release(IHTMLEditHost2* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLEditHost methods ***/
static FORCEINLINE HRESULT IHTMLEditHost2_SnapRect(IHTMLEditHost2* This,IHTMLElement *pIElement,RECT *prcNew,ELEMENT_CORNER eHandle) {
    return This->lpVtbl->SnapRect(This,pIElement,prcNew,eHandle);
}
/*** IHTMLEditHost2 methods ***/
static FORCEINLINE HRESULT IHTMLEditHost2_PreDrag(IHTMLEditHost2* This) {
    return This->lpVtbl->PreDrag(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLEditHost2_PreDrag_Proxy(
    IHTMLEditHost2* This);
void __RPC_STUB IHTMLEditHost2_PreDrag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLEditHost2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISegment interface
 */
#ifndef __ISegment_INTERFACE_DEFINED__
#define __ISegment_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISegment, 0x3050f683, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f683-98b5-11cf-bb82-00aa00bdce0b")
ISegment : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetPointers(
        IMarkupPointer *pIStart,
        IMarkupPointer *pIEnd) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISegment, 0x3050f683, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISegmentVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISegment* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISegment* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISegment* This);

    /*** ISegment methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPointers)(
        ISegment* This,
        IMarkupPointer *pIStart,
        IMarkupPointer *pIEnd);

    END_INTERFACE
} ISegmentVtbl;
interface ISegment {
    CONST_VTBL ISegmentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISegment_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISegment_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISegment_Release(This) (This)->lpVtbl->Release(This)
/*** ISegment methods ***/
#define ISegment_GetPointers(This,pIStart,pIEnd) (This)->lpVtbl->GetPointers(This,pIStart,pIEnd)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISegment_QueryInterface(ISegment* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISegment_AddRef(ISegment* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISegment_Release(ISegment* This) {
    return This->lpVtbl->Release(This);
}
/*** ISegment methods ***/
static FORCEINLINE HRESULT ISegment_GetPointers(ISegment* This,IMarkupPointer *pIStart,IMarkupPointer *pIEnd) {
    return This->lpVtbl->GetPointers(This,pIStart,pIEnd);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISegment_GetPointers_Proxy(
    ISegment* This,
    IMarkupPointer *pIStart,
    IMarkupPointer *pIEnd);
void __RPC_STUB ISegment_GetPointers_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISegment_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISegmentListIterator interface
 */
#ifndef __ISegmentListIterator_INTERFACE_DEFINED__
#define __ISegmentListIterator_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISegmentListIterator, 0x3050f692, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f692-98b5-11cf-bb82-00aa00bdce0b")
ISegmentListIterator : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Current(
        ISegment **ppISegment) = 0;

    virtual HRESULT STDMETHODCALLTYPE First(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsDone(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Advance(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISegmentListIterator, 0x3050f692, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISegmentListIteratorVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISegmentListIterator* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISegmentListIterator* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISegmentListIterator* This);

    /*** ISegmentListIterator methods ***/
    HRESULT (STDMETHODCALLTYPE *Current)(
        ISegmentListIterator* This,
        ISegment **ppISegment);

    HRESULT (STDMETHODCALLTYPE *First)(
        ISegmentListIterator* This);

    HRESULT (STDMETHODCALLTYPE *IsDone)(
        ISegmentListIterator* This);

    HRESULT (STDMETHODCALLTYPE *Advance)(
        ISegmentListIterator* This);

    END_INTERFACE
} ISegmentListIteratorVtbl;
interface ISegmentListIterator {
    CONST_VTBL ISegmentListIteratorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISegmentListIterator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISegmentListIterator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISegmentListIterator_Release(This) (This)->lpVtbl->Release(This)
/*** ISegmentListIterator methods ***/
#define ISegmentListIterator_Current(This,ppISegment) (This)->lpVtbl->Current(This,ppISegment)
#define ISegmentListIterator_First(This) (This)->lpVtbl->First(This)
#define ISegmentListIterator_IsDone(This) (This)->lpVtbl->IsDone(This)
#define ISegmentListIterator_Advance(This) (This)->lpVtbl->Advance(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISegmentListIterator_QueryInterface(ISegmentListIterator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISegmentListIterator_AddRef(ISegmentListIterator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISegmentListIterator_Release(ISegmentListIterator* This) {
    return This->lpVtbl->Release(This);
}
/*** ISegmentListIterator methods ***/
static FORCEINLINE HRESULT ISegmentListIterator_Current(ISegmentListIterator* This,ISegment **ppISegment) {
    return This->lpVtbl->Current(This,ppISegment);
}
static FORCEINLINE HRESULT ISegmentListIterator_First(ISegmentListIterator* This) {
    return This->lpVtbl->First(This);
}
static FORCEINLINE HRESULT ISegmentListIterator_IsDone(ISegmentListIterator* This) {
    return This->lpVtbl->IsDone(This);
}
static FORCEINLINE HRESULT ISegmentListIterator_Advance(ISegmentListIterator* This) {
    return This->lpVtbl->Advance(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISegmentListIterator_Current_Proxy(
    ISegmentListIterator* This,
    ISegment **ppISegment);
void __RPC_STUB ISegmentListIterator_Current_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISegmentListIterator_First_Proxy(
    ISegmentListIterator* This);
void __RPC_STUB ISegmentListIterator_First_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISegmentListIterator_IsDone_Proxy(
    ISegmentListIterator* This);
void __RPC_STUB ISegmentListIterator_IsDone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISegmentListIterator_Advance_Proxy(
    ISegmentListIterator* This);
void __RPC_STUB ISegmentListIterator_Advance_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISegmentListIterator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISegmentList interface
 */
#ifndef __ISegmentList_INTERFACE_DEFINED__
#define __ISegmentList_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISegmentList, 0x3050f605, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f605-98b5-11cf-bb82-00aa00bdce0b")
ISegmentList : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateIterator(
        ISegmentListIterator **ppIIter) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetType(
        SELECTION_TYPE *peType) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsEmpty(
        WINBOOL *pfEmpty) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISegmentList, 0x3050f605, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISegmentListVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISegmentList* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISegmentList* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISegmentList* This);

    /*** ISegmentList methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateIterator)(
        ISegmentList* This,
        ISegmentListIterator **ppIIter);

    HRESULT (STDMETHODCALLTYPE *GetType)(
        ISegmentList* This,
        SELECTION_TYPE *peType);

    HRESULT (STDMETHODCALLTYPE *IsEmpty)(
        ISegmentList* This,
        WINBOOL *pfEmpty);

    END_INTERFACE
} ISegmentListVtbl;
interface ISegmentList {
    CONST_VTBL ISegmentListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISegmentList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISegmentList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISegmentList_Release(This) (This)->lpVtbl->Release(This)
/*** ISegmentList methods ***/
#define ISegmentList_CreateIterator(This,ppIIter) (This)->lpVtbl->CreateIterator(This,ppIIter)
#define ISegmentList_GetType(This,peType) (This)->lpVtbl->GetType(This,peType)
#define ISegmentList_IsEmpty(This,pfEmpty) (This)->lpVtbl->IsEmpty(This,pfEmpty)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISegmentList_QueryInterface(ISegmentList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISegmentList_AddRef(ISegmentList* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISegmentList_Release(ISegmentList* This) {
    return This->lpVtbl->Release(This);
}
/*** ISegmentList methods ***/
static FORCEINLINE HRESULT ISegmentList_CreateIterator(ISegmentList* This,ISegmentListIterator **ppIIter) {
    return This->lpVtbl->CreateIterator(This,ppIIter);
}
static FORCEINLINE HRESULT ISegmentList_GetType(ISegmentList* This,SELECTION_TYPE *peType) {
    return This->lpVtbl->GetType(This,peType);
}
static FORCEINLINE HRESULT ISegmentList_IsEmpty(ISegmentList* This,WINBOOL *pfEmpty) {
    return This->lpVtbl->IsEmpty(This,pfEmpty);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISegmentList_CreateIterator_Proxy(
    ISegmentList* This,
    ISegmentListIterator **ppIIter);
void __RPC_STUB ISegmentList_CreateIterator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISegmentList_GetType_Proxy(
    ISegmentList* This,
    SELECTION_TYPE *peType);
void __RPC_STUB ISegmentList_GetType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISegmentList_IsEmpty_Proxy(
    ISegmentList* This,
    WINBOOL *pfEmpty);
void __RPC_STUB ISegmentList_IsEmpty_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISegmentList_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISequenceNumber interface
 */
#ifndef __ISequenceNumber_INTERFACE_DEFINED__
#define __ISequenceNumber_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISequenceNumber, 0x3050f6c1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f6c1-98b5-11cf-bb82-00aa00bdce0b")
ISequenceNumber : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSequenceNumber(
        LONG nCurrent,
        LONG *pnNew) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISequenceNumber, 0x3050f6c1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISequenceNumberVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISequenceNumber* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISequenceNumber* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISequenceNumber* This);

    /*** ISequenceNumber methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSequenceNumber)(
        ISequenceNumber* This,
        LONG nCurrent,
        LONG *pnNew);

    END_INTERFACE
} ISequenceNumberVtbl;
interface ISequenceNumber {
    CONST_VTBL ISequenceNumberVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISequenceNumber_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISequenceNumber_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISequenceNumber_Release(This) (This)->lpVtbl->Release(This)
/*** ISequenceNumber methods ***/
#define ISequenceNumber_GetSequenceNumber(This,nCurrent,pnNew) (This)->lpVtbl->GetSequenceNumber(This,nCurrent,pnNew)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISequenceNumber_QueryInterface(ISequenceNumber* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISequenceNumber_AddRef(ISequenceNumber* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISequenceNumber_Release(ISequenceNumber* This) {
    return This->lpVtbl->Release(This);
}
/*** ISequenceNumber methods ***/
static FORCEINLINE HRESULT ISequenceNumber_GetSequenceNumber(ISequenceNumber* This,LONG nCurrent,LONG *pnNew) {
    return This->lpVtbl->GetSequenceNumber(This,nCurrent,pnNew);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISequenceNumber_GetSequenceNumber_Proxy(
    ISequenceNumber* This,
    LONG nCurrent,
    LONG *pnNew);
void __RPC_STUB ISequenceNumber_GetSequenceNumber_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISequenceNumber_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIMEServices interface
 */
#ifndef __IIMEServices_INTERFACE_DEFINED__
#define __IIMEServices_INTERFACE_DEFINED__

DEFINE_GUID(IID_IIMEServices, 0x3050f6ca, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f6ca-98b5-11cf-bb82-00aa00bdce0b")
IIMEServices : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetActiveIMM(
        IActiveIMMApp **ppActiveIMM) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IIMEServices, 0x3050f6ca, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IIMEServicesVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IIMEServices* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IIMEServices* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IIMEServices* This);

    /*** IIMEServices methods ***/
    HRESULT (STDMETHODCALLTYPE *GetActiveIMM)(
        IIMEServices* This,
        IActiveIMMApp **ppActiveIMM);

    END_INTERFACE
} IIMEServicesVtbl;
interface IIMEServices {
    CONST_VTBL IIMEServicesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IIMEServices_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IIMEServices_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IIMEServices_Release(This) (This)->lpVtbl->Release(This)
/*** IIMEServices methods ***/
#define IIMEServices_GetActiveIMM(This,ppActiveIMM) (This)->lpVtbl->GetActiveIMM(This,ppActiveIMM)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IIMEServices_QueryInterface(IIMEServices* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IIMEServices_AddRef(IIMEServices* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IIMEServices_Release(IIMEServices* This) {
    return This->lpVtbl->Release(This);
}
/*** IIMEServices methods ***/
static FORCEINLINE HRESULT IIMEServices_GetActiveIMM(IIMEServices* This,IActiveIMMApp **ppActiveIMM) {
    return This->lpVtbl->GetActiveIMM(This,ppActiveIMM);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IIMEServices_GetActiveIMM_Proxy(
    IIMEServices* This,
    IActiveIMMApp **ppActiveIMM);
void __RPC_STUB IIMEServices_GetActiveIMM_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IIMEServices_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLCaret interface
 */
#ifndef __IHTMLCaret_INTERFACE_DEFINED__
#define __IHTMLCaret_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLCaret, 0x3050f604, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f604-98b5-11cf-bb82-00aa00bdce0b")
IHTMLCaret : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE MoveCaretToPointer(
        IDisplayPointer *pDispPointer,
        WINBOOL fScrollIntoView,
        CARET_DIRECTION eDir) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveCaretToPointerEx(
        IDisplayPointer *pDispPointer,
        WINBOOL fVisible,
        WINBOOL fScrollIntoView,
        CARET_DIRECTION eDir) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveMarkupPointerToCaret(
        IMarkupPointer *pIMarkupPointer) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveDisplayPointerToCaret(
        IDisplayPointer *pDispPointer) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsVisible(
        WINBOOL *pIsVisible) = 0;

    virtual HRESULT STDMETHODCALLTYPE Show(
        WINBOOL fScrollIntoView) = 0;

    virtual HRESULT STDMETHODCALLTYPE Hide(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE InsertText(
        OLECHAR *pText,
        LONG lLen) = 0;

    virtual HRESULT STDMETHODCALLTYPE ScrollIntoView(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLocation(
        POINT *pPoint,
        WINBOOL fTranslate) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCaretDirection(
        CARET_DIRECTION *peDir) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCaretDirection(
        CARET_DIRECTION eDir) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLCaret, 0x3050f604, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLCaretVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLCaret* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLCaret* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLCaret* This);

    /*** IHTMLCaret methods ***/
    HRESULT (STDMETHODCALLTYPE *MoveCaretToPointer)(
        IHTMLCaret* This,
        IDisplayPointer *pDispPointer,
        WINBOOL fScrollIntoView,
        CARET_DIRECTION eDir);

    HRESULT (STDMETHODCALLTYPE *MoveCaretToPointerEx)(
        IHTMLCaret* This,
        IDisplayPointer *pDispPointer,
        WINBOOL fVisible,
        WINBOOL fScrollIntoView,
        CARET_DIRECTION eDir);

    HRESULT (STDMETHODCALLTYPE *MoveMarkupPointerToCaret)(
        IHTMLCaret* This,
        IMarkupPointer *pIMarkupPointer);

    HRESULT (STDMETHODCALLTYPE *MoveDisplayPointerToCaret)(
        IHTMLCaret* This,
        IDisplayPointer *pDispPointer);

    HRESULT (STDMETHODCALLTYPE *IsVisible)(
        IHTMLCaret* This,
        WINBOOL *pIsVisible);

    HRESULT (STDMETHODCALLTYPE *Show)(
        IHTMLCaret* This,
        WINBOOL fScrollIntoView);

    HRESULT (STDMETHODCALLTYPE *Hide)(
        IHTMLCaret* This);

    HRESULT (STDMETHODCALLTYPE *InsertText)(
        IHTMLCaret* This,
        OLECHAR *pText,
        LONG lLen);

    HRESULT (STDMETHODCALLTYPE *ScrollIntoView)(
        IHTMLCaret* This);

    HRESULT (STDMETHODCALLTYPE *GetLocation)(
        IHTMLCaret* This,
        POINT *pPoint,
        WINBOOL fTranslate);

    HRESULT (STDMETHODCALLTYPE *GetCaretDirection)(
        IHTMLCaret* This,
        CARET_DIRECTION *peDir);

    HRESULT (STDMETHODCALLTYPE *SetCaretDirection)(
        IHTMLCaret* This,
        CARET_DIRECTION eDir);

    END_INTERFACE
} IHTMLCaretVtbl;
interface IHTMLCaret {
    CONST_VTBL IHTMLCaretVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLCaret_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLCaret_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLCaret_Release(This) (This)->lpVtbl->Release(This)
/*** IHTMLCaret methods ***/
#define IHTMLCaret_MoveCaretToPointer(This,pDispPointer,fScrollIntoView,eDir) (This)->lpVtbl->MoveCaretToPointer(This,pDispPointer,fScrollIntoView,eDir)
#define IHTMLCaret_MoveCaretToPointerEx(This,pDispPointer,fVisible,fScrollIntoView,eDir) (This)->lpVtbl->MoveCaretToPointerEx(This,pDispPointer,fVisible,fScrollIntoView,eDir)
#define IHTMLCaret_MoveMarkupPointerToCaret(This,pIMarkupPointer) (This)->lpVtbl->MoveMarkupPointerToCaret(This,pIMarkupPointer)
#define IHTMLCaret_MoveDisplayPointerToCaret(This,pDispPointer) (This)->lpVtbl->MoveDisplayPointerToCaret(This,pDispPointer)
#define IHTMLCaret_IsVisible(This,pIsVisible) (This)->lpVtbl->IsVisible(This,pIsVisible)
#define IHTMLCaret_Show(This,fScrollIntoView) (This)->lpVtbl->Show(This,fScrollIntoView)
#define IHTMLCaret_Hide(This) (This)->lpVtbl->Hide(This)
#define IHTMLCaret_InsertText(This,pText,lLen) (This)->lpVtbl->InsertText(This,pText,lLen)
#define IHTMLCaret_ScrollIntoView(This) (This)->lpVtbl->ScrollIntoView(This)
#define IHTMLCaret_GetLocation(This,pPoint,fTranslate) (This)->lpVtbl->GetLocation(This,pPoint,fTranslate)
#define IHTMLCaret_GetCaretDirection(This,peDir) (This)->lpVtbl->GetCaretDirection(This,peDir)
#define IHTMLCaret_SetCaretDirection(This,eDir) (This)->lpVtbl->SetCaretDirection(This,eDir)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLCaret_QueryInterface(IHTMLCaret* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLCaret_AddRef(IHTMLCaret* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLCaret_Release(IHTMLCaret* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLCaret methods ***/
static FORCEINLINE HRESULT IHTMLCaret_MoveCaretToPointer(IHTMLCaret* This,IDisplayPointer *pDispPointer,WINBOOL fScrollIntoView,CARET_DIRECTION eDir) {
    return This->lpVtbl->MoveCaretToPointer(This,pDispPointer,fScrollIntoView,eDir);
}
static FORCEINLINE HRESULT IHTMLCaret_MoveCaretToPointerEx(IHTMLCaret* This,IDisplayPointer *pDispPointer,WINBOOL fVisible,WINBOOL fScrollIntoView,CARET_DIRECTION eDir) {
    return This->lpVtbl->MoveCaretToPointerEx(This,pDispPointer,fVisible,fScrollIntoView,eDir);
}
static FORCEINLINE HRESULT IHTMLCaret_MoveMarkupPointerToCaret(IHTMLCaret* This,IMarkupPointer *pIMarkupPointer) {
    return This->lpVtbl->MoveMarkupPointerToCaret(This,pIMarkupPointer);
}
static FORCEINLINE HRESULT IHTMLCaret_MoveDisplayPointerToCaret(IHTMLCaret* This,IDisplayPointer *pDispPointer) {
    return This->lpVtbl->MoveDisplayPointerToCaret(This,pDispPointer);
}
static FORCEINLINE HRESULT IHTMLCaret_IsVisible(IHTMLCaret* This,WINBOOL *pIsVisible) {
    return This->lpVtbl->IsVisible(This,pIsVisible);
}
static FORCEINLINE HRESULT IHTMLCaret_Show(IHTMLCaret* This,WINBOOL fScrollIntoView) {
    return This->lpVtbl->Show(This,fScrollIntoView);
}
static FORCEINLINE HRESULT IHTMLCaret_Hide(IHTMLCaret* This) {
    return This->lpVtbl->Hide(This);
}
static FORCEINLINE HRESULT IHTMLCaret_InsertText(IHTMLCaret* This,OLECHAR *pText,LONG lLen) {
    return This->lpVtbl->InsertText(This,pText,lLen);
}
static FORCEINLINE HRESULT IHTMLCaret_ScrollIntoView(IHTMLCaret* This) {
    return This->lpVtbl->ScrollIntoView(This);
}
static FORCEINLINE HRESULT IHTMLCaret_GetLocation(IHTMLCaret* This,POINT *pPoint,WINBOOL fTranslate) {
    return This->lpVtbl->GetLocation(This,pPoint,fTranslate);
}
static FORCEINLINE HRESULT IHTMLCaret_GetCaretDirection(IHTMLCaret* This,CARET_DIRECTION *peDir) {
    return This->lpVtbl->GetCaretDirection(This,peDir);
}
static FORCEINLINE HRESULT IHTMLCaret_SetCaretDirection(IHTMLCaret* This,CARET_DIRECTION eDir) {
    return This->lpVtbl->SetCaretDirection(This,eDir);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLCaret_MoveCaretToPointer_Proxy(
    IHTMLCaret* This,
    IDisplayPointer *pDispPointer,
    WINBOOL fScrollIntoView,
    CARET_DIRECTION eDir);
void __RPC_STUB IHTMLCaret_MoveCaretToPointer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCaret_MoveCaretToPointerEx_Proxy(
    IHTMLCaret* This,
    IDisplayPointer *pDispPointer,
    WINBOOL fVisible,
    WINBOOL fScrollIntoView,
    CARET_DIRECTION eDir);
void __RPC_STUB IHTMLCaret_MoveCaretToPointerEx_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCaret_MoveMarkupPointerToCaret_Proxy(
    IHTMLCaret* This,
    IMarkupPointer *pIMarkupPointer);
void __RPC_STUB IHTMLCaret_MoveMarkupPointerToCaret_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCaret_MoveDisplayPointerToCaret_Proxy(
    IHTMLCaret* This,
    IDisplayPointer *pDispPointer);
void __RPC_STUB IHTMLCaret_MoveDisplayPointerToCaret_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCaret_IsVisible_Proxy(
    IHTMLCaret* This,
    WINBOOL *pIsVisible);
void __RPC_STUB IHTMLCaret_IsVisible_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCaret_Show_Proxy(
    IHTMLCaret* This,
    WINBOOL fScrollIntoView);
void __RPC_STUB IHTMLCaret_Show_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCaret_Hide_Proxy(
    IHTMLCaret* This);
void __RPC_STUB IHTMLCaret_Hide_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCaret_InsertText_Proxy(
    IHTMLCaret* This,
    OLECHAR *pText,
    LONG lLen);
void __RPC_STUB IHTMLCaret_InsertText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCaret_ScrollIntoView_Proxy(
    IHTMLCaret* This);
void __RPC_STUB IHTMLCaret_ScrollIntoView_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCaret_GetLocation_Proxy(
    IHTMLCaret* This,
    POINT *pPoint,
    WINBOOL fTranslate);
void __RPC_STUB IHTMLCaret_GetLocation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCaret_GetCaretDirection_Proxy(
    IHTMLCaret* This,
    CARET_DIRECTION *peDir);
void __RPC_STUB IHTMLCaret_GetCaretDirection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLCaret_SetCaretDirection_Proxy(
    IHTMLCaret* This,
    CARET_DIRECTION eDir);
void __RPC_STUB IHTMLCaret_SetCaretDirection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLCaret_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHighlightRenderingServices interface
 */
#ifndef __IHighlightRenderingServices_INTERFACE_DEFINED__
#define __IHighlightRenderingServices_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHighlightRenderingServices, 0x3050f606, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f606-98b5-11cf-bb82-00aa00bdce0b")
IHighlightRenderingServices : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AddSegment(
        IDisplayPointer *pDispPointerStart,
        IDisplayPointer *pDispPointerEnd,
        IHTMLRenderStyle *pIRenderStyle,
        IHighlightSegment **ppISegment) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveSegmentToPointers(
        IHighlightSegment *pISegment,
        IDisplayPointer *pDispPointerStart,
        IDisplayPointer *pDispPointerEnd) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveSegment(
        IHighlightSegment *pISegment) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHighlightRenderingServices, 0x3050f606, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHighlightRenderingServicesVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHighlightRenderingServices* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHighlightRenderingServices* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHighlightRenderingServices* This);

    /*** IHighlightRenderingServices methods ***/
    HRESULT (STDMETHODCALLTYPE *AddSegment)(
        IHighlightRenderingServices* This,
        IDisplayPointer *pDispPointerStart,
        IDisplayPointer *pDispPointerEnd,
        IHTMLRenderStyle *pIRenderStyle,
        IHighlightSegment **ppISegment);

    HRESULT (STDMETHODCALLTYPE *MoveSegmentToPointers)(
        IHighlightRenderingServices* This,
        IHighlightSegment *pISegment,
        IDisplayPointer *pDispPointerStart,
        IDisplayPointer *pDispPointerEnd);

    HRESULT (STDMETHODCALLTYPE *RemoveSegment)(
        IHighlightRenderingServices* This,
        IHighlightSegment *pISegment);

    END_INTERFACE
} IHighlightRenderingServicesVtbl;
interface IHighlightRenderingServices {
    CONST_VTBL IHighlightRenderingServicesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHighlightRenderingServices_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHighlightRenderingServices_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHighlightRenderingServices_Release(This) (This)->lpVtbl->Release(This)
/*** IHighlightRenderingServices methods ***/
#define IHighlightRenderingServices_AddSegment(This,pDispPointerStart,pDispPointerEnd,pIRenderStyle,ppISegment) (This)->lpVtbl->AddSegment(This,pDispPointerStart,pDispPointerEnd,pIRenderStyle,ppISegment)
#define IHighlightRenderingServices_MoveSegmentToPointers(This,pISegment,pDispPointerStart,pDispPointerEnd) (This)->lpVtbl->MoveSegmentToPointers(This,pISegment,pDispPointerStart,pDispPointerEnd)
#define IHighlightRenderingServices_RemoveSegment(This,pISegment) (This)->lpVtbl->RemoveSegment(This,pISegment)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHighlightRenderingServices_QueryInterface(IHighlightRenderingServices* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHighlightRenderingServices_AddRef(IHighlightRenderingServices* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHighlightRenderingServices_Release(IHighlightRenderingServices* This) {
    return This->lpVtbl->Release(This);
}
/*** IHighlightRenderingServices methods ***/
static FORCEINLINE HRESULT IHighlightRenderingServices_AddSegment(IHighlightRenderingServices* This,IDisplayPointer *pDispPointerStart,IDisplayPointer *pDispPointerEnd,IHTMLRenderStyle *pIRenderStyle,IHighlightSegment **ppISegment) {
    return This->lpVtbl->AddSegment(This,pDispPointerStart,pDispPointerEnd,pIRenderStyle,ppISegment);
}
static FORCEINLINE HRESULT IHighlightRenderingServices_MoveSegmentToPointers(IHighlightRenderingServices* This,IHighlightSegment *pISegment,IDisplayPointer *pDispPointerStart,IDisplayPointer *pDispPointerEnd) {
    return This->lpVtbl->MoveSegmentToPointers(This,pISegment,pDispPointerStart,pDispPointerEnd);
}
static FORCEINLINE HRESULT IHighlightRenderingServices_RemoveSegment(IHighlightRenderingServices* This,IHighlightSegment *pISegment) {
    return This->lpVtbl->RemoveSegment(This,pISegment);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHighlightRenderingServices_AddSegment_Proxy(
    IHighlightRenderingServices* This,
    IDisplayPointer *pDispPointerStart,
    IDisplayPointer *pDispPointerEnd,
    IHTMLRenderStyle *pIRenderStyle,
    IHighlightSegment **ppISegment);
void __RPC_STUB IHighlightRenderingServices_AddSegment_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHighlightRenderingServices_MoveSegmentToPointers_Proxy(
    IHighlightRenderingServices* This,
    IHighlightSegment *pISegment,
    IDisplayPointer *pDispPointerStart,
    IDisplayPointer *pDispPointerEnd);
void __RPC_STUB IHighlightRenderingServices_MoveSegmentToPointers_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHighlightRenderingServices_RemoveSegment_Proxy(
    IHighlightRenderingServices* This,
    IHighlightSegment *pISegment);
void __RPC_STUB IHighlightRenderingServices_RemoveSegment_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHighlightRenderingServices_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISelectionServicesListener interface
 */
#ifndef __ISelectionServicesListener_INTERFACE_DEFINED__
#define __ISelectionServicesListener_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISelectionServicesListener, 0x3050f699, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f699-98b5-11cf-bb82-00aa00bdce0b")
ISelectionServicesListener : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE BeginSelectionUndo(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE EndSelectionUndo(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnSelectedElementExit(
        IMarkupPointer *pIElementStart,
        IMarkupPointer *pIElementEnd,
        IMarkupPointer *pIElementContentStart,
        IMarkupPointer *pIElementContentEnd) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnChangeType(
        SELECTION_TYPE eType,
        ISelectionServicesListener *pIListener) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTypeDetail(
        BSTR *pTypeDetail) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISelectionServicesListener, 0x3050f699, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISelectionServicesListenerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISelectionServicesListener* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISelectionServicesListener* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISelectionServicesListener* This);

    /*** ISelectionServicesListener methods ***/
    HRESULT (STDMETHODCALLTYPE *BeginSelectionUndo)(
        ISelectionServicesListener* This);

    HRESULT (STDMETHODCALLTYPE *EndSelectionUndo)(
        ISelectionServicesListener* This);

    HRESULT (STDMETHODCALLTYPE *OnSelectedElementExit)(
        ISelectionServicesListener* This,
        IMarkupPointer *pIElementStart,
        IMarkupPointer *pIElementEnd,
        IMarkupPointer *pIElementContentStart,
        IMarkupPointer *pIElementContentEnd);

    HRESULT (STDMETHODCALLTYPE *OnChangeType)(
        ISelectionServicesListener* This,
        SELECTION_TYPE eType,
        ISelectionServicesListener *pIListener);

    HRESULT (STDMETHODCALLTYPE *GetTypeDetail)(
        ISelectionServicesListener* This,
        BSTR *pTypeDetail);

    END_INTERFACE
} ISelectionServicesListenerVtbl;
interface ISelectionServicesListener {
    CONST_VTBL ISelectionServicesListenerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISelectionServicesListener_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISelectionServicesListener_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISelectionServicesListener_Release(This) (This)->lpVtbl->Release(This)
/*** ISelectionServicesListener methods ***/
#define ISelectionServicesListener_BeginSelectionUndo(This) (This)->lpVtbl->BeginSelectionUndo(This)
#define ISelectionServicesListener_EndSelectionUndo(This) (This)->lpVtbl->EndSelectionUndo(This)
#define ISelectionServicesListener_OnSelectedElementExit(This,pIElementStart,pIElementEnd,pIElementContentStart,pIElementContentEnd) (This)->lpVtbl->OnSelectedElementExit(This,pIElementStart,pIElementEnd,pIElementContentStart,pIElementContentEnd)
#define ISelectionServicesListener_OnChangeType(This,eType,pIListener) (This)->lpVtbl->OnChangeType(This,eType,pIListener)
#define ISelectionServicesListener_GetTypeDetail(This,pTypeDetail) (This)->lpVtbl->GetTypeDetail(This,pTypeDetail)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISelectionServicesListener_QueryInterface(ISelectionServicesListener* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISelectionServicesListener_AddRef(ISelectionServicesListener* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISelectionServicesListener_Release(ISelectionServicesListener* This) {
    return This->lpVtbl->Release(This);
}
/*** ISelectionServicesListener methods ***/
static FORCEINLINE HRESULT ISelectionServicesListener_BeginSelectionUndo(ISelectionServicesListener* This) {
    return This->lpVtbl->BeginSelectionUndo(This);
}
static FORCEINLINE HRESULT ISelectionServicesListener_EndSelectionUndo(ISelectionServicesListener* This) {
    return This->lpVtbl->EndSelectionUndo(This);
}
static FORCEINLINE HRESULT ISelectionServicesListener_OnSelectedElementExit(ISelectionServicesListener* This,IMarkupPointer *pIElementStart,IMarkupPointer *pIElementEnd,IMarkupPointer *pIElementContentStart,IMarkupPointer *pIElementContentEnd) {
    return This->lpVtbl->OnSelectedElementExit(This,pIElementStart,pIElementEnd,pIElementContentStart,pIElementContentEnd);
}
static FORCEINLINE HRESULT ISelectionServicesListener_OnChangeType(ISelectionServicesListener* This,SELECTION_TYPE eType,ISelectionServicesListener *pIListener) {
    return This->lpVtbl->OnChangeType(This,eType,pIListener);
}
static FORCEINLINE HRESULT ISelectionServicesListener_GetTypeDetail(ISelectionServicesListener* This,BSTR *pTypeDetail) {
    return This->lpVtbl->GetTypeDetail(This,pTypeDetail);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISelectionServicesListener_BeginSelectionUndo_Proxy(
    ISelectionServicesListener* This);
void __RPC_STUB ISelectionServicesListener_BeginSelectionUndo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISelectionServicesListener_EndSelectionUndo_Proxy(
    ISelectionServicesListener* This);
void __RPC_STUB ISelectionServicesListener_EndSelectionUndo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISelectionServicesListener_OnSelectedElementExit_Proxy(
    ISelectionServicesListener* This,
    IMarkupPointer *pIElementStart,
    IMarkupPointer *pIElementEnd,
    IMarkupPointer *pIElementContentStart,
    IMarkupPointer *pIElementContentEnd);
void __RPC_STUB ISelectionServicesListener_OnSelectedElementExit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISelectionServicesListener_OnChangeType_Proxy(
    ISelectionServicesListener* This,
    SELECTION_TYPE eType,
    ISelectionServicesListener *pIListener);
void __RPC_STUB ISelectionServicesListener_OnChangeType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISelectionServicesListener_GetTypeDetail_Proxy(
    ISelectionServicesListener* This,
    BSTR *pTypeDetail);
void __RPC_STUB ISelectionServicesListener_GetTypeDetail_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISelectionServicesListener_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISelectionServices interface
 */
#ifndef __ISelectionServices_INTERFACE_DEFINED__
#define __ISelectionServices_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISelectionServices, 0x3050f684, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f684-98b5-11cf-bb82-00aa00bdce0b")
ISelectionServices : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetSelectionType(
        SELECTION_TYPE eType,
        ISelectionServicesListener *pIListener) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMarkupContainer(
        IMarkupContainer **ppIContainer) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddSegment(
        IMarkupPointer *pIStart,
        IMarkupPointer *pIEnd,
        ISegment **ppISegmentAdded) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddElementSegment(
        IHTMLElement *pIElement,
        IElementSegment **ppISegmentAdded) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveSegment(
        ISegment *pISegment) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSelectionServicesListener(
        ISelectionServicesListener **ppISelectionServicesListener) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISelectionServices, 0x3050f684, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISelectionServicesVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISelectionServices* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISelectionServices* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISelectionServices* This);

    /*** ISelectionServices methods ***/
    HRESULT (STDMETHODCALLTYPE *SetSelectionType)(
        ISelectionServices* This,
        SELECTION_TYPE eType,
        ISelectionServicesListener *pIListener);

    HRESULT (STDMETHODCALLTYPE *GetMarkupContainer)(
        ISelectionServices* This,
        IMarkupContainer **ppIContainer);

    HRESULT (STDMETHODCALLTYPE *AddSegment)(
        ISelectionServices* This,
        IMarkupPointer *pIStart,
        IMarkupPointer *pIEnd,
        ISegment **ppISegmentAdded);

    HRESULT (STDMETHODCALLTYPE *AddElementSegment)(
        ISelectionServices* This,
        IHTMLElement *pIElement,
        IElementSegment **ppISegmentAdded);

    HRESULT (STDMETHODCALLTYPE *RemoveSegment)(
        ISelectionServices* This,
        ISegment *pISegment);

    HRESULT (STDMETHODCALLTYPE *GetSelectionServicesListener)(
        ISelectionServices* This,
        ISelectionServicesListener **ppISelectionServicesListener);

    END_INTERFACE
} ISelectionServicesVtbl;
interface ISelectionServices {
    CONST_VTBL ISelectionServicesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISelectionServices_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISelectionServices_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISelectionServices_Release(This) (This)->lpVtbl->Release(This)
/*** ISelectionServices methods ***/
#define ISelectionServices_SetSelectionType(This,eType,pIListener) (This)->lpVtbl->SetSelectionType(This,eType,pIListener)
#define ISelectionServices_GetMarkupContainer(This,ppIContainer) (This)->lpVtbl->GetMarkupContainer(This,ppIContainer)
#define ISelectionServices_AddSegment(This,pIStart,pIEnd,ppISegmentAdded) (This)->lpVtbl->AddSegment(This,pIStart,pIEnd,ppISegmentAdded)
#define ISelectionServices_AddElementSegment(This,pIElement,ppISegmentAdded) (This)->lpVtbl->AddElementSegment(This,pIElement,ppISegmentAdded)
#define ISelectionServices_RemoveSegment(This,pISegment) (This)->lpVtbl->RemoveSegment(This,pISegment)
#define ISelectionServices_GetSelectionServicesListener(This,ppISelectionServicesListener) (This)->lpVtbl->GetSelectionServicesListener(This,ppISelectionServicesListener)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISelectionServices_QueryInterface(ISelectionServices* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISelectionServices_AddRef(ISelectionServices* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISelectionServices_Release(ISelectionServices* This) {
    return This->lpVtbl->Release(This);
}
/*** ISelectionServices methods ***/
static FORCEINLINE HRESULT ISelectionServices_SetSelectionType(ISelectionServices* This,SELECTION_TYPE eType,ISelectionServicesListener *pIListener) {
    return This->lpVtbl->SetSelectionType(This,eType,pIListener);
}
static FORCEINLINE HRESULT ISelectionServices_GetMarkupContainer(ISelectionServices* This,IMarkupContainer **ppIContainer) {
    return This->lpVtbl->GetMarkupContainer(This,ppIContainer);
}
static FORCEINLINE HRESULT ISelectionServices_AddSegment(ISelectionServices* This,IMarkupPointer *pIStart,IMarkupPointer *pIEnd,ISegment **ppISegmentAdded) {
    return This->lpVtbl->AddSegment(This,pIStart,pIEnd,ppISegmentAdded);
}
static FORCEINLINE HRESULT ISelectionServices_AddElementSegment(ISelectionServices* This,IHTMLElement *pIElement,IElementSegment **ppISegmentAdded) {
    return This->lpVtbl->AddElementSegment(This,pIElement,ppISegmentAdded);
}
static FORCEINLINE HRESULT ISelectionServices_RemoveSegment(ISelectionServices* This,ISegment *pISegment) {
    return This->lpVtbl->RemoveSegment(This,pISegment);
}
static FORCEINLINE HRESULT ISelectionServices_GetSelectionServicesListener(ISelectionServices* This,ISelectionServicesListener **ppISelectionServicesListener) {
    return This->lpVtbl->GetSelectionServicesListener(This,ppISelectionServicesListener);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISelectionServices_SetSelectionType_Proxy(
    ISelectionServices* This,
    SELECTION_TYPE eType,
    ISelectionServicesListener *pIListener);
void __RPC_STUB ISelectionServices_SetSelectionType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISelectionServices_GetMarkupContainer_Proxy(
    ISelectionServices* This,
    IMarkupContainer **ppIContainer);
void __RPC_STUB ISelectionServices_GetMarkupContainer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISelectionServices_AddSegment_Proxy(
    ISelectionServices* This,
    IMarkupPointer *pIStart,
    IMarkupPointer *pIEnd,
    ISegment **ppISegmentAdded);
void __RPC_STUB ISelectionServices_AddSegment_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISelectionServices_AddElementSegment_Proxy(
    ISelectionServices* This,
    IHTMLElement *pIElement,
    IElementSegment **ppISegmentAdded);
void __RPC_STUB ISelectionServices_AddElementSegment_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISelectionServices_RemoveSegment_Proxy(
    ISelectionServices* This,
    ISegment *pISegment);
void __RPC_STUB ISelectionServices_RemoveSegment_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISelectionServices_GetSelectionServicesListener_Proxy(
    ISelectionServices* This,
    ISelectionServicesListener **ppISelectionServicesListener);
void __RPC_STUB ISelectionServices_GetSelectionServicesListener_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISelectionServices_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IElementSegment interface
 */
#ifndef __IElementSegment_INTERFACE_DEFINED__
#define __IElementSegment_INTERFACE_DEFINED__

DEFINE_GUID(IID_IElementSegment, 0x3050f68f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f68f-98b5-11cf-bb82-00aa00bdce0b")
IElementSegment : public ISegment
{
    virtual HRESULT STDMETHODCALLTYPE GetElement(
        IHTMLElement **ppIElement) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPrimary(
        WINBOOL fPrimary) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsPrimary(
        WINBOOL *pfPrimary) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IElementSegment, 0x3050f68f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IElementSegmentVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IElementSegment* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IElementSegment* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IElementSegment* This);

    /*** ISegment methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPointers)(
        IElementSegment* This,
        IMarkupPointer *pIStart,
        IMarkupPointer *pIEnd);

    /*** IElementSegment methods ***/
    HRESULT (STDMETHODCALLTYPE *GetElement)(
        IElementSegment* This,
        IHTMLElement **ppIElement);

    HRESULT (STDMETHODCALLTYPE *SetPrimary)(
        IElementSegment* This,
        WINBOOL fPrimary);

    HRESULT (STDMETHODCALLTYPE *IsPrimary)(
        IElementSegment* This,
        WINBOOL *pfPrimary);

    END_INTERFACE
} IElementSegmentVtbl;
interface IElementSegment {
    CONST_VTBL IElementSegmentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IElementSegment_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IElementSegment_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IElementSegment_Release(This) (This)->lpVtbl->Release(This)
/*** ISegment methods ***/
#define IElementSegment_GetPointers(This,pIStart,pIEnd) (This)->lpVtbl->GetPointers(This,pIStart,pIEnd)
/*** IElementSegment methods ***/
#define IElementSegment_GetElement(This,ppIElement) (This)->lpVtbl->GetElement(This,ppIElement)
#define IElementSegment_SetPrimary(This,fPrimary) (This)->lpVtbl->SetPrimary(This,fPrimary)
#define IElementSegment_IsPrimary(This,pfPrimary) (This)->lpVtbl->IsPrimary(This,pfPrimary)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IElementSegment_QueryInterface(IElementSegment* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IElementSegment_AddRef(IElementSegment* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IElementSegment_Release(IElementSegment* This) {
    return This->lpVtbl->Release(This);
}
/*** ISegment methods ***/
static FORCEINLINE HRESULT IElementSegment_GetPointers(IElementSegment* This,IMarkupPointer *pIStart,IMarkupPointer *pIEnd) {
    return This->lpVtbl->GetPointers(This,pIStart,pIEnd);
}
/*** IElementSegment methods ***/
static FORCEINLINE HRESULT IElementSegment_GetElement(IElementSegment* This,IHTMLElement **ppIElement) {
    return This->lpVtbl->GetElement(This,ppIElement);
}
static FORCEINLINE HRESULT IElementSegment_SetPrimary(IElementSegment* This,WINBOOL fPrimary) {
    return This->lpVtbl->SetPrimary(This,fPrimary);
}
static FORCEINLINE HRESULT IElementSegment_IsPrimary(IElementSegment* This,WINBOOL *pfPrimary) {
    return This->lpVtbl->IsPrimary(This,pfPrimary);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IElementSegment_GetElement_Proxy(
    IElementSegment* This,
    IHTMLElement **ppIElement);
void __RPC_STUB IElementSegment_GetElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IElementSegment_SetPrimary_Proxy(
    IElementSegment* This,
    WINBOOL fPrimary);
void __RPC_STUB IElementSegment_SetPrimary_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IElementSegment_IsPrimary_Proxy(
    IElementSegment* This,
    WINBOOL *pfPrimary);
void __RPC_STUB IElementSegment_IsPrimary_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IElementSegment_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHighlightSegment interface
 */
#ifndef __IHighlightSegment_INTERFACE_DEFINED__
#define __IHighlightSegment_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHighlightSegment, 0x3050f690, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f690-98b5-11cf-bb82-00aa00bdce0b")
IHighlightSegment : public ISegment
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHighlightSegment, 0x3050f690, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHighlightSegmentVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHighlightSegment* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHighlightSegment* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHighlightSegment* This);

    /*** ISegment methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPointers)(
        IHighlightSegment* This,
        IMarkupPointer *pIStart,
        IMarkupPointer *pIEnd);

    END_INTERFACE
} IHighlightSegmentVtbl;
interface IHighlightSegment {
    CONST_VTBL IHighlightSegmentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHighlightSegment_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHighlightSegment_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHighlightSegment_Release(This) (This)->lpVtbl->Release(This)
/*** ISegment methods ***/
#define IHighlightSegment_GetPointers(This,pIStart,pIEnd) (This)->lpVtbl->GetPointers(This,pIStart,pIEnd)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHighlightSegment_QueryInterface(IHighlightSegment* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHighlightSegment_AddRef(IHighlightSegment* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHighlightSegment_Release(IHighlightSegment* This) {
    return This->lpVtbl->Release(This);
}
/*** ISegment methods ***/
static FORCEINLINE HRESULT IHighlightSegment_GetPointers(IHighlightSegment* This,IMarkupPointer *pIStart,IMarkupPointer *pIEnd) {
    return This->lpVtbl->GetPointers(This,pIStart,pIEnd);
}
#endif
#endif

#endif


#endif  /* __IHighlightSegment_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLEditDesigner interface
 */
#ifndef __IHTMLEditDesigner_INTERFACE_DEFINED__
#define __IHTMLEditDesigner_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLEditDesigner, 0x3050f662, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f662-98b5-11cf-bb82-00aa00bdce0b")
IHTMLEditDesigner : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE PreHandleEvent(
        DISPID inEvtDispId,
        IHTMLEventObj *pIEventObj) = 0;

    virtual HRESULT STDMETHODCALLTYPE PostHandleEvent(
        DISPID inEvtDispId,
        IHTMLEventObj *pIEventObj) = 0;

    virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator(
        DISPID inEvtDispId,
        IHTMLEventObj *pIEventObj) = 0;

    virtual HRESULT STDMETHODCALLTYPE PostEditorEventNotify(
        DISPID inEvtDispId,
        IHTMLEventObj *pIEventObj) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLEditDesigner, 0x3050f662, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLEditDesignerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLEditDesigner* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLEditDesigner* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLEditDesigner* This);

    /*** IHTMLEditDesigner methods ***/
    HRESULT (STDMETHODCALLTYPE *PreHandleEvent)(
        IHTMLEditDesigner* This,
        DISPID inEvtDispId,
        IHTMLEventObj *pIEventObj);

    HRESULT (STDMETHODCALLTYPE *PostHandleEvent)(
        IHTMLEditDesigner* This,
        DISPID inEvtDispId,
        IHTMLEventObj *pIEventObj);

    HRESULT (STDMETHODCALLTYPE *TranslateAccelerator)(
        IHTMLEditDesigner* This,
        DISPID inEvtDispId,
        IHTMLEventObj *pIEventObj);

    HRESULT (STDMETHODCALLTYPE *PostEditorEventNotify)(
        IHTMLEditDesigner* This,
        DISPID inEvtDispId,
        IHTMLEventObj *pIEventObj);

    END_INTERFACE
} IHTMLEditDesignerVtbl;
interface IHTMLEditDesigner {
    CONST_VTBL IHTMLEditDesignerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLEditDesigner_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLEditDesigner_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLEditDesigner_Release(This) (This)->lpVtbl->Release(This)
/*** IHTMLEditDesigner methods ***/
#define IHTMLEditDesigner_PreHandleEvent(This,inEvtDispId,pIEventObj) (This)->lpVtbl->PreHandleEvent(This,inEvtDispId,pIEventObj)
#define IHTMLEditDesigner_PostHandleEvent(This,inEvtDispId,pIEventObj) (This)->lpVtbl->PostHandleEvent(This,inEvtDispId,pIEventObj)
#define IHTMLEditDesigner_TranslateAccelerator(This,inEvtDispId,pIEventObj) (This)->lpVtbl->TranslateAccelerator(This,inEvtDispId,pIEventObj)
#define IHTMLEditDesigner_PostEditorEventNotify(This,inEvtDispId,pIEventObj) (This)->lpVtbl->PostEditorEventNotify(This,inEvtDispId,pIEventObj)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLEditDesigner_QueryInterface(IHTMLEditDesigner* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLEditDesigner_AddRef(IHTMLEditDesigner* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLEditDesigner_Release(IHTMLEditDesigner* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLEditDesigner methods ***/
static FORCEINLINE HRESULT IHTMLEditDesigner_PreHandleEvent(IHTMLEditDesigner* This,DISPID inEvtDispId,IHTMLEventObj *pIEventObj) {
    return This->lpVtbl->PreHandleEvent(This,inEvtDispId,pIEventObj);
}
static FORCEINLINE HRESULT IHTMLEditDesigner_PostHandleEvent(IHTMLEditDesigner* This,DISPID inEvtDispId,IHTMLEventObj *pIEventObj) {
    return This->lpVtbl->PostHandleEvent(This,inEvtDispId,pIEventObj);
}
static FORCEINLINE HRESULT IHTMLEditDesigner_TranslateAccelerator(IHTMLEditDesigner* This,DISPID inEvtDispId,IHTMLEventObj *pIEventObj) {
    return This->lpVtbl->TranslateAccelerator(This,inEvtDispId,pIEventObj);
}
static FORCEINLINE HRESULT IHTMLEditDesigner_PostEditorEventNotify(IHTMLEditDesigner* This,DISPID inEvtDispId,IHTMLEventObj *pIEventObj) {
    return This->lpVtbl->PostEditorEventNotify(This,inEvtDispId,pIEventObj);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLEditDesigner_PreHandleEvent_Proxy(
    IHTMLEditDesigner* This,
    DISPID inEvtDispId,
    IHTMLEventObj *pIEventObj);
void __RPC_STUB IHTMLEditDesigner_PreHandleEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEditDesigner_PostHandleEvent_Proxy(
    IHTMLEditDesigner* This,
    DISPID inEvtDispId,
    IHTMLEventObj *pIEventObj);
void __RPC_STUB IHTMLEditDesigner_PostHandleEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEditDesigner_TranslateAccelerator_Proxy(
    IHTMLEditDesigner* This,
    DISPID inEvtDispId,
    IHTMLEventObj *pIEventObj);
void __RPC_STUB IHTMLEditDesigner_TranslateAccelerator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEditDesigner_PostEditorEventNotify_Proxy(
    IHTMLEditDesigner* This,
    DISPID inEvtDispId,
    IHTMLEventObj *pIEventObj);
void __RPC_STUB IHTMLEditDesigner_PostEditorEventNotify_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLEditDesigner_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLEditServices interface
 */
#ifndef __IHTMLEditServices_INTERFACE_DEFINED__
#define __IHTMLEditServices_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLEditServices, 0x3050f663, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f663-98b5-11cf-bb82-00aa00bdce0b")
IHTMLEditServices : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AddDesigner(
        IHTMLEditDesigner *pIDesigner) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveDesigner(
        IHTMLEditDesigner *pIDesigner) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSelectionServices(
        IMarkupContainer *pIContainer,
        ISelectionServices **ppSelSvc) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveToSelectionAnchor(
        IMarkupPointer *pIStartAnchor) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveToSelectionEnd(
        IMarkupPointer *pIEndAnchor) = 0;

    virtual HRESULT STDMETHODCALLTYPE SelectRange(
        IMarkupPointer *pStart,
        IMarkupPointer *pEnd,
        SELECTION_TYPE eType) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLEditServices, 0x3050f663, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLEditServicesVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLEditServices* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLEditServices* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLEditServices* This);

    /*** IHTMLEditServices methods ***/
    HRESULT (STDMETHODCALLTYPE *AddDesigner)(
        IHTMLEditServices* This,
        IHTMLEditDesigner *pIDesigner);

    HRESULT (STDMETHODCALLTYPE *RemoveDesigner)(
        IHTMLEditServices* This,
        IHTMLEditDesigner *pIDesigner);

    HRESULT (STDMETHODCALLTYPE *GetSelectionServices)(
        IHTMLEditServices* This,
        IMarkupContainer *pIContainer,
        ISelectionServices **ppSelSvc);

    HRESULT (STDMETHODCALLTYPE *MoveToSelectionAnchor)(
        IHTMLEditServices* This,
        IMarkupPointer *pIStartAnchor);

    HRESULT (STDMETHODCALLTYPE *MoveToSelectionEnd)(
        IHTMLEditServices* This,
        IMarkupPointer *pIEndAnchor);

    HRESULT (STDMETHODCALLTYPE *SelectRange)(
        IHTMLEditServices* This,
        IMarkupPointer *pStart,
        IMarkupPointer *pEnd,
        SELECTION_TYPE eType);

    END_INTERFACE
} IHTMLEditServicesVtbl;
interface IHTMLEditServices {
    CONST_VTBL IHTMLEditServicesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLEditServices_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLEditServices_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLEditServices_Release(This) (This)->lpVtbl->Release(This)
/*** IHTMLEditServices methods ***/
#define IHTMLEditServices_AddDesigner(This,pIDesigner) (This)->lpVtbl->AddDesigner(This,pIDesigner)
#define IHTMLEditServices_RemoveDesigner(This,pIDesigner) (This)->lpVtbl->RemoveDesigner(This,pIDesigner)
#define IHTMLEditServices_GetSelectionServices(This,pIContainer,ppSelSvc) (This)->lpVtbl->GetSelectionServices(This,pIContainer,ppSelSvc)
#define IHTMLEditServices_MoveToSelectionAnchor(This,pIStartAnchor) (This)->lpVtbl->MoveToSelectionAnchor(This,pIStartAnchor)
#define IHTMLEditServices_MoveToSelectionEnd(This,pIEndAnchor) (This)->lpVtbl->MoveToSelectionEnd(This,pIEndAnchor)
#define IHTMLEditServices_SelectRange(This,pStart,pEnd,eType) (This)->lpVtbl->SelectRange(This,pStart,pEnd,eType)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLEditServices_QueryInterface(IHTMLEditServices* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLEditServices_AddRef(IHTMLEditServices* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLEditServices_Release(IHTMLEditServices* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLEditServices methods ***/
static FORCEINLINE HRESULT IHTMLEditServices_AddDesigner(IHTMLEditServices* This,IHTMLEditDesigner *pIDesigner) {
    return This->lpVtbl->AddDesigner(This,pIDesigner);
}
static FORCEINLINE HRESULT IHTMLEditServices_RemoveDesigner(IHTMLEditServices* This,IHTMLEditDesigner *pIDesigner) {
    return This->lpVtbl->RemoveDesigner(This,pIDesigner);
}
static FORCEINLINE HRESULT IHTMLEditServices_GetSelectionServices(IHTMLEditServices* This,IMarkupContainer *pIContainer,ISelectionServices **ppSelSvc) {
    return This->lpVtbl->GetSelectionServices(This,pIContainer,ppSelSvc);
}
static FORCEINLINE HRESULT IHTMLEditServices_MoveToSelectionAnchor(IHTMLEditServices* This,IMarkupPointer *pIStartAnchor) {
    return This->lpVtbl->MoveToSelectionAnchor(This,pIStartAnchor);
}
static FORCEINLINE HRESULT IHTMLEditServices_MoveToSelectionEnd(IHTMLEditServices* This,IMarkupPointer *pIEndAnchor) {
    return This->lpVtbl->MoveToSelectionEnd(This,pIEndAnchor);
}
static FORCEINLINE HRESULT IHTMLEditServices_SelectRange(IHTMLEditServices* This,IMarkupPointer *pStart,IMarkupPointer *pEnd,SELECTION_TYPE eType) {
    return This->lpVtbl->SelectRange(This,pStart,pEnd,eType);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLEditServices_AddDesigner_Proxy(
    IHTMLEditServices* This,
    IHTMLEditDesigner *pIDesigner);
void __RPC_STUB IHTMLEditServices_AddDesigner_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEditServices_RemoveDesigner_Proxy(
    IHTMLEditServices* This,
    IHTMLEditDesigner *pIDesigner);
void __RPC_STUB IHTMLEditServices_RemoveDesigner_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEditServices_GetSelectionServices_Proxy(
    IHTMLEditServices* This,
    IMarkupContainer *pIContainer,
    ISelectionServices **ppSelSvc);
void __RPC_STUB IHTMLEditServices_GetSelectionServices_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEditServices_MoveToSelectionAnchor_Proxy(
    IHTMLEditServices* This,
    IMarkupPointer *pIStartAnchor);
void __RPC_STUB IHTMLEditServices_MoveToSelectionAnchor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEditServices_MoveToSelectionEnd_Proxy(
    IHTMLEditServices* This,
    IMarkupPointer *pIEndAnchor);
void __RPC_STUB IHTMLEditServices_MoveToSelectionEnd_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEditServices_SelectRange_Proxy(
    IHTMLEditServices* This,
    IMarkupPointer *pStart,
    IMarkupPointer *pEnd,
    SELECTION_TYPE eType);
void __RPC_STUB IHTMLEditServices_SelectRange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLEditServices_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLEditServices2 interface
 */
#ifndef __IHTMLEditServices2_INTERFACE_DEFINED__
#define __IHTMLEditServices2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLEditServices2, 0x3050f812, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f812-98b5-11cf-bb82-00aa00bdce0b")
IHTMLEditServices2 : public IHTMLEditServices
{
    virtual HRESULT STDMETHODCALLTYPE MoveToSelectionAnchorEx(
        IDisplayPointer *pIStartAnchor) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveToSelectionEndEx(
        IDisplayPointer *pIEndAnchor) = 0;

    virtual HRESULT STDMETHODCALLTYPE FreezeVirtualCaretPos(
        WINBOOL fReCompute) = 0;

    virtual HRESULT STDMETHODCALLTYPE UnFreezeVirtualCaretPos(
        WINBOOL fReset) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLEditServices2, 0x3050f812, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLEditServices2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLEditServices2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLEditServices2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLEditServices2* This);

    /*** IHTMLEditServices methods ***/
    HRESULT (STDMETHODCALLTYPE *AddDesigner)(
        IHTMLEditServices2* This,
        IHTMLEditDesigner *pIDesigner);

    HRESULT (STDMETHODCALLTYPE *RemoveDesigner)(
        IHTMLEditServices2* This,
        IHTMLEditDesigner *pIDesigner);

    HRESULT (STDMETHODCALLTYPE *GetSelectionServices)(
        IHTMLEditServices2* This,
        IMarkupContainer *pIContainer,
        ISelectionServices **ppSelSvc);

    HRESULT (STDMETHODCALLTYPE *MoveToSelectionAnchor)(
        IHTMLEditServices2* This,
        IMarkupPointer *pIStartAnchor);

    HRESULT (STDMETHODCALLTYPE *MoveToSelectionEnd)(
        IHTMLEditServices2* This,
        IMarkupPointer *pIEndAnchor);

    HRESULT (STDMETHODCALLTYPE *SelectRange)(
        IHTMLEditServices2* This,
        IMarkupPointer *pStart,
        IMarkupPointer *pEnd,
        SELECTION_TYPE eType);

    /*** IHTMLEditServices2 methods ***/
    HRESULT (STDMETHODCALLTYPE *MoveToSelectionAnchorEx)(
        IHTMLEditServices2* This,
        IDisplayPointer *pIStartAnchor);

    HRESULT (STDMETHODCALLTYPE *MoveToSelectionEndEx)(
        IHTMLEditServices2* This,
        IDisplayPointer *pIEndAnchor);

    HRESULT (STDMETHODCALLTYPE *FreezeVirtualCaretPos)(
        IHTMLEditServices2* This,
        WINBOOL fReCompute);

    HRESULT (STDMETHODCALLTYPE *UnFreezeVirtualCaretPos)(
        IHTMLEditServices2* This,
        WINBOOL fReset);

    END_INTERFACE
} IHTMLEditServices2Vtbl;
interface IHTMLEditServices2 {
    CONST_VTBL IHTMLEditServices2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLEditServices2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLEditServices2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLEditServices2_Release(This) (This)->lpVtbl->Release(This)
/*** IHTMLEditServices methods ***/
#define IHTMLEditServices2_AddDesigner(This,pIDesigner) (This)->lpVtbl->AddDesigner(This,pIDesigner)
#define IHTMLEditServices2_RemoveDesigner(This,pIDesigner) (This)->lpVtbl->RemoveDesigner(This,pIDesigner)
#define IHTMLEditServices2_GetSelectionServices(This,pIContainer,ppSelSvc) (This)->lpVtbl->GetSelectionServices(This,pIContainer,ppSelSvc)
#define IHTMLEditServices2_MoveToSelectionAnchor(This,pIStartAnchor) (This)->lpVtbl->MoveToSelectionAnchor(This,pIStartAnchor)
#define IHTMLEditServices2_MoveToSelectionEnd(This,pIEndAnchor) (This)->lpVtbl->MoveToSelectionEnd(This,pIEndAnchor)
#define IHTMLEditServices2_SelectRange(This,pStart,pEnd,eType) (This)->lpVtbl->SelectRange(This,pStart,pEnd,eType)
/*** IHTMLEditServices2 methods ***/
#define IHTMLEditServices2_MoveToSelectionAnchorEx(This,pIStartAnchor) (This)->lpVtbl->MoveToSelectionAnchorEx(This,pIStartAnchor)
#define IHTMLEditServices2_MoveToSelectionEndEx(This,pIEndAnchor) (This)->lpVtbl->MoveToSelectionEndEx(This,pIEndAnchor)
#define IHTMLEditServices2_FreezeVirtualCaretPos(This,fReCompute) (This)->lpVtbl->FreezeVirtualCaretPos(This,fReCompute)
#define IHTMLEditServices2_UnFreezeVirtualCaretPos(This,fReset) (This)->lpVtbl->UnFreezeVirtualCaretPos(This,fReset)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLEditServices2_QueryInterface(IHTMLEditServices2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLEditServices2_AddRef(IHTMLEditServices2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLEditServices2_Release(IHTMLEditServices2* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLEditServices methods ***/
static FORCEINLINE HRESULT IHTMLEditServices2_AddDesigner(IHTMLEditServices2* This,IHTMLEditDesigner *pIDesigner) {
    return This->lpVtbl->AddDesigner(This,pIDesigner);
}
static FORCEINLINE HRESULT IHTMLEditServices2_RemoveDesigner(IHTMLEditServices2* This,IHTMLEditDesigner *pIDesigner) {
    return This->lpVtbl->RemoveDesigner(This,pIDesigner);
}
static FORCEINLINE HRESULT IHTMLEditServices2_GetSelectionServices(IHTMLEditServices2* This,IMarkupContainer *pIContainer,ISelectionServices **ppSelSvc) {
    return This->lpVtbl->GetSelectionServices(This,pIContainer,ppSelSvc);
}
static FORCEINLINE HRESULT IHTMLEditServices2_MoveToSelectionAnchor(IHTMLEditServices2* This,IMarkupPointer *pIStartAnchor) {
    return This->lpVtbl->MoveToSelectionAnchor(This,pIStartAnchor);
}
static FORCEINLINE HRESULT IHTMLEditServices2_MoveToSelectionEnd(IHTMLEditServices2* This,IMarkupPointer *pIEndAnchor) {
    return This->lpVtbl->MoveToSelectionEnd(This,pIEndAnchor);
}
static FORCEINLINE HRESULT IHTMLEditServices2_SelectRange(IHTMLEditServices2* This,IMarkupPointer *pStart,IMarkupPointer *pEnd,SELECTION_TYPE eType) {
    return This->lpVtbl->SelectRange(This,pStart,pEnd,eType);
}
/*** IHTMLEditServices2 methods ***/
static FORCEINLINE HRESULT IHTMLEditServices2_MoveToSelectionAnchorEx(IHTMLEditServices2* This,IDisplayPointer *pIStartAnchor) {
    return This->lpVtbl->MoveToSelectionAnchorEx(This,pIStartAnchor);
}
static FORCEINLINE HRESULT IHTMLEditServices2_MoveToSelectionEndEx(IHTMLEditServices2* This,IDisplayPointer *pIEndAnchor) {
    return This->lpVtbl->MoveToSelectionEndEx(This,pIEndAnchor);
}
static FORCEINLINE HRESULT IHTMLEditServices2_FreezeVirtualCaretPos(IHTMLEditServices2* This,WINBOOL fReCompute) {
    return This->lpVtbl->FreezeVirtualCaretPos(This,fReCompute);
}
static FORCEINLINE HRESULT IHTMLEditServices2_UnFreezeVirtualCaretPos(IHTMLEditServices2* This,WINBOOL fReset) {
    return This->lpVtbl->UnFreezeVirtualCaretPos(This,fReset);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLEditServices2_MoveToSelectionAnchorEx_Proxy(
    IHTMLEditServices2* This,
    IDisplayPointer *pIStartAnchor);
void __RPC_STUB IHTMLEditServices2_MoveToSelectionAnchorEx_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEditServices2_MoveToSelectionEndEx_Proxy(
    IHTMLEditServices2* This,
    IDisplayPointer *pIEndAnchor);
void __RPC_STUB IHTMLEditServices2_MoveToSelectionEndEx_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEditServices2_FreezeVirtualCaretPos_Proxy(
    IHTMLEditServices2* This,
    WINBOOL fReCompute);
void __RPC_STUB IHTMLEditServices2_FreezeVirtualCaretPos_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLEditServices2_UnFreezeVirtualCaretPos_Proxy(
    IHTMLEditServices2* This,
    WINBOOL fReset);
void __RPC_STUB IHTMLEditServices2_UnFreezeVirtualCaretPos_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLEditServices2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ILineInfo interface
 */
#ifndef __ILineInfo_INTERFACE_DEFINED__
#define __ILineInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_ILineInfo, 0x3050f7e2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f7e2-98b5-11cf-bb82-00aa00bdce0b")
ILineInfo : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_x(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_baseLine(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textDescent(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textHeight(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_lineDirection(
        LONG *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ILineInfo, 0x3050f7e2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ILineInfoVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ILineInfo* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ILineInfo* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ILineInfo* This);

    /*** ILineInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *get_x)(
        ILineInfo* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_baseLine)(
        ILineInfo* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_textDescent)(
        ILineInfo* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_textHeight)(
        ILineInfo* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_lineDirection)(
        ILineInfo* This,
        LONG *p);

    END_INTERFACE
} ILineInfoVtbl;
interface ILineInfo {
    CONST_VTBL ILineInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ILineInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ILineInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ILineInfo_Release(This) (This)->lpVtbl->Release(This)
/*** ILineInfo methods ***/
#define ILineInfo_get_x(This,p) (This)->lpVtbl->get_x(This,p)
#define ILineInfo_get_baseLine(This,p) (This)->lpVtbl->get_baseLine(This,p)
#define ILineInfo_get_textDescent(This,p) (This)->lpVtbl->get_textDescent(This,p)
#define ILineInfo_get_textHeight(This,p) (This)->lpVtbl->get_textHeight(This,p)
#define ILineInfo_get_lineDirection(This,p) (This)->lpVtbl->get_lineDirection(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ILineInfo_QueryInterface(ILineInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ILineInfo_AddRef(ILineInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ILineInfo_Release(ILineInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** ILineInfo methods ***/
static FORCEINLINE HRESULT ILineInfo_get_x(ILineInfo* This,LONG *p) {
    return This->lpVtbl->get_x(This,p);
}
static FORCEINLINE HRESULT ILineInfo_get_baseLine(ILineInfo* This,LONG *p) {
    return This->lpVtbl->get_baseLine(This,p);
}
static FORCEINLINE HRESULT ILineInfo_get_textDescent(ILineInfo* This,LONG *p) {
    return This->lpVtbl->get_textDescent(This,p);
}
static FORCEINLINE HRESULT ILineInfo_get_textHeight(ILineInfo* This,LONG *p) {
    return This->lpVtbl->get_textHeight(This,p);
}
static FORCEINLINE HRESULT ILineInfo_get_lineDirection(ILineInfo* This,LONG *p) {
    return This->lpVtbl->get_lineDirection(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ILineInfo_get_x_Proxy(
    ILineInfo* This,
    LONG *p);
void __RPC_STUB ILineInfo_get_x_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ILineInfo_get_baseLine_Proxy(
    ILineInfo* This,
    LONG *p);
void __RPC_STUB ILineInfo_get_baseLine_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ILineInfo_get_textDescent_Proxy(
    ILineInfo* This,
    LONG *p);
void __RPC_STUB ILineInfo_get_textDescent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ILineInfo_get_textHeight_Proxy(
    ILineInfo* This,
    LONG *p);
void __RPC_STUB ILineInfo_get_textHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ILineInfo_get_lineDirection_Proxy(
    ILineInfo* This,
    LONG *p);
void __RPC_STUB ILineInfo_get_lineDirection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ILineInfo_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLComputedStyle interface
 */
#ifndef __IHTMLComputedStyle_INTERFACE_DEFINED__
#define __IHTMLComputedStyle_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLComputedStyle, 0x3050f6c3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f6c3-98b5-11cf-bb82-00aa00bdce0b")
IHTMLComputedStyle : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_bold(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_italic(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_underline(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_overline(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_strikeOut(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_subScript(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_superScript(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_explicitFace(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fontWeight(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fontSize(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fontName(
        TCHAR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_hasBgColor(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_textColor(
        DWORD *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_backgroundColor(
        DWORD *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_preFormatted(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_direction(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_blockDirection(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_OL(
        VARIANT_BOOL *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsEqual(
        IHTMLComputedStyle *pComputedStyle,
        VARIANT_BOOL *pfEqual) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLComputedStyle, 0x3050f6c3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLComputedStyleVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLComputedStyle* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLComputedStyle* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLComputedStyle* This);

    /*** IHTMLComputedStyle methods ***/
    HRESULT (STDMETHODCALLTYPE *get_bold)(
        IHTMLComputedStyle* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_italic)(
        IHTMLComputedStyle* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_underline)(
        IHTMLComputedStyle* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_overline)(
        IHTMLComputedStyle* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_strikeOut)(
        IHTMLComputedStyle* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_subScript)(
        IHTMLComputedStyle* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_superScript)(
        IHTMLComputedStyle* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_explicitFace)(
        IHTMLComputedStyle* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_fontWeight)(
        IHTMLComputedStyle* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_fontSize)(
        IHTMLComputedStyle* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_fontName)(
        IHTMLComputedStyle* This,
        TCHAR *p);

    HRESULT (STDMETHODCALLTYPE *get_hasBgColor)(
        IHTMLComputedStyle* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_textColor)(
        IHTMLComputedStyle* This,
        DWORD *p);

    HRESULT (STDMETHODCALLTYPE *get_backgroundColor)(
        IHTMLComputedStyle* This,
        DWORD *p);

    HRESULT (STDMETHODCALLTYPE *get_preFormatted)(
        IHTMLComputedStyle* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_direction)(
        IHTMLComputedStyle* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_blockDirection)(
        IHTMLComputedStyle* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *get_OL)(
        IHTMLComputedStyle* This,
        VARIANT_BOOL *p);

    HRESULT (STDMETHODCALLTYPE *IsEqual)(
        IHTMLComputedStyle* This,
        IHTMLComputedStyle *pComputedStyle,
        VARIANT_BOOL *pfEqual);

    END_INTERFACE
} IHTMLComputedStyleVtbl;
interface IHTMLComputedStyle {
    CONST_VTBL IHTMLComputedStyleVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLComputedStyle_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLComputedStyle_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLComputedStyle_Release(This) (This)->lpVtbl->Release(This)
/*** IHTMLComputedStyle methods ***/
#define IHTMLComputedStyle_get_bold(This,p) (This)->lpVtbl->get_bold(This,p)
#define IHTMLComputedStyle_get_italic(This,p) (This)->lpVtbl->get_italic(This,p)
#define IHTMLComputedStyle_get_underline(This,p) (This)->lpVtbl->get_underline(This,p)
#define IHTMLComputedStyle_get_overline(This,p) (This)->lpVtbl->get_overline(This,p)
#define IHTMLComputedStyle_get_strikeOut(This,p) (This)->lpVtbl->get_strikeOut(This,p)
#define IHTMLComputedStyle_get_subScript(This,p) (This)->lpVtbl->get_subScript(This,p)
#define IHTMLComputedStyle_get_superScript(This,p) (This)->lpVtbl->get_superScript(This,p)
#define IHTMLComputedStyle_get_explicitFace(This,p) (This)->lpVtbl->get_explicitFace(This,p)
#define IHTMLComputedStyle_get_fontWeight(This,p) (This)->lpVtbl->get_fontWeight(This,p)
#define IHTMLComputedStyle_get_fontSize(This,p) (This)->lpVtbl->get_fontSize(This,p)
#define IHTMLComputedStyle_get_fontName(This,p) (This)->lpVtbl->get_fontName(This,p)
#define IHTMLComputedStyle_get_hasBgColor(This,p) (This)->lpVtbl->get_hasBgColor(This,p)
#define IHTMLComputedStyle_get_textColor(This,p) (This)->lpVtbl->get_textColor(This,p)
#define IHTMLComputedStyle_get_backgroundColor(This,p) (This)->lpVtbl->get_backgroundColor(This,p)
#define IHTMLComputedStyle_get_preFormatted(This,p) (This)->lpVtbl->get_preFormatted(This,p)
#define IHTMLComputedStyle_get_direction(This,p) (This)->lpVtbl->get_direction(This,p)
#define IHTMLComputedStyle_get_blockDirection(This,p) (This)->lpVtbl->get_blockDirection(This,p)
#define IHTMLComputedStyle_get_OL(This,p) (This)->lpVtbl->get_OL(This,p)
#define IHTMLComputedStyle_IsEqual(This,pComputedStyle,pfEqual) (This)->lpVtbl->IsEqual(This,pComputedStyle,pfEqual)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLComputedStyle_QueryInterface(IHTMLComputedStyle* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLComputedStyle_AddRef(IHTMLComputedStyle* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLComputedStyle_Release(IHTMLComputedStyle* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLComputedStyle methods ***/
static FORCEINLINE HRESULT IHTMLComputedStyle_get_bold(IHTMLComputedStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_bold(This,p);
}
static FORCEINLINE HRESULT IHTMLComputedStyle_get_italic(IHTMLComputedStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_italic(This,p);
}
static FORCEINLINE HRESULT IHTMLComputedStyle_get_underline(IHTMLComputedStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_underline(This,p);
}
static FORCEINLINE HRESULT IHTMLComputedStyle_get_overline(IHTMLComputedStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_overline(This,p);
}
static FORCEINLINE HRESULT IHTMLComputedStyle_get_strikeOut(IHTMLComputedStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_strikeOut(This,p);
}
static FORCEINLINE HRESULT IHTMLComputedStyle_get_subScript(IHTMLComputedStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_subScript(This,p);
}
static FORCEINLINE HRESULT IHTMLComputedStyle_get_superScript(IHTMLComputedStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_superScript(This,p);
}
static FORCEINLINE HRESULT IHTMLComputedStyle_get_explicitFace(IHTMLComputedStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_explicitFace(This,p);
}
static FORCEINLINE HRESULT IHTMLComputedStyle_get_fontWeight(IHTMLComputedStyle* This,LONG *p) {
    return This->lpVtbl->get_fontWeight(This,p);
}
static FORCEINLINE HRESULT IHTMLComputedStyle_get_fontSize(IHTMLComputedStyle* This,LONG *p) {
    return This->lpVtbl->get_fontSize(This,p);
}
static FORCEINLINE HRESULT IHTMLComputedStyle_get_fontName(IHTMLComputedStyle* This,TCHAR *p) {
    return This->lpVtbl->get_fontName(This,p);
}
static FORCEINLINE HRESULT IHTMLComputedStyle_get_hasBgColor(IHTMLComputedStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_hasBgColor(This,p);
}
static FORCEINLINE HRESULT IHTMLComputedStyle_get_textColor(IHTMLComputedStyle* This,DWORD *p) {
    return This->lpVtbl->get_textColor(This,p);
}
static FORCEINLINE HRESULT IHTMLComputedStyle_get_backgroundColor(IHTMLComputedStyle* This,DWORD *p) {
    return This->lpVtbl->get_backgroundColor(This,p);
}
static FORCEINLINE HRESULT IHTMLComputedStyle_get_preFormatted(IHTMLComputedStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_preFormatted(This,p);
}
static FORCEINLINE HRESULT IHTMLComputedStyle_get_direction(IHTMLComputedStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_direction(This,p);
}
static FORCEINLINE HRESULT IHTMLComputedStyle_get_blockDirection(IHTMLComputedStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_blockDirection(This,p);
}
static FORCEINLINE HRESULT IHTMLComputedStyle_get_OL(IHTMLComputedStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_OL(This,p);
}
static FORCEINLINE HRESULT IHTMLComputedStyle_IsEqual(IHTMLComputedStyle* This,IHTMLComputedStyle *pComputedStyle,VARIANT_BOOL *pfEqual) {
    return This->lpVtbl->IsEqual(This,pComputedStyle,pfEqual);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLComputedStyle_get_bold_Proxy(
    IHTMLComputedStyle* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLComputedStyle_get_bold_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLComputedStyle_get_italic_Proxy(
    IHTMLComputedStyle* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLComputedStyle_get_italic_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLComputedStyle_get_underline_Proxy(
    IHTMLComputedStyle* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLComputedStyle_get_underline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLComputedStyle_get_overline_Proxy(
    IHTMLComputedStyle* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLComputedStyle_get_overline_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLComputedStyle_get_strikeOut_Proxy(
    IHTMLComputedStyle* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLComputedStyle_get_strikeOut_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLComputedStyle_get_subScript_Proxy(
    IHTMLComputedStyle* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLComputedStyle_get_subScript_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLComputedStyle_get_superScript_Proxy(
    IHTMLComputedStyle* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLComputedStyle_get_superScript_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLComputedStyle_get_explicitFace_Proxy(
    IHTMLComputedStyle* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLComputedStyle_get_explicitFace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLComputedStyle_get_fontWeight_Proxy(
    IHTMLComputedStyle* This,
    LONG *p);
void __RPC_STUB IHTMLComputedStyle_get_fontWeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLComputedStyle_get_fontSize_Proxy(
    IHTMLComputedStyle* This,
    LONG *p);
void __RPC_STUB IHTMLComputedStyle_get_fontSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLComputedStyle_get_fontName_Proxy(
    IHTMLComputedStyle* This,
    TCHAR *p);
void __RPC_STUB IHTMLComputedStyle_get_fontName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLComputedStyle_get_hasBgColor_Proxy(
    IHTMLComputedStyle* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLComputedStyle_get_hasBgColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLComputedStyle_get_textColor_Proxy(
    IHTMLComputedStyle* This,
    DWORD *p);
void __RPC_STUB IHTMLComputedStyle_get_textColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLComputedStyle_get_backgroundColor_Proxy(
    IHTMLComputedStyle* This,
    DWORD *p);
void __RPC_STUB IHTMLComputedStyle_get_backgroundColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLComputedStyle_get_preFormatted_Proxy(
    IHTMLComputedStyle* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLComputedStyle_get_preFormatted_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLComputedStyle_get_direction_Proxy(
    IHTMLComputedStyle* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLComputedStyle_get_direction_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLComputedStyle_get_blockDirection_Proxy(
    IHTMLComputedStyle* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLComputedStyle_get_blockDirection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLComputedStyle_get_OL_Proxy(
    IHTMLComputedStyle* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLComputedStyle_get_OL_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLComputedStyle_IsEqual_Proxy(
    IHTMLComputedStyle* This,
    IHTMLComputedStyle *pComputedStyle,
    VARIANT_BOOL *pfEqual);
void __RPC_STUB IHTMLComputedStyle_IsEqual_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLComputedStyle_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDisplayPointer interface
 */
#ifndef __IDisplayPointer_INTERFACE_DEFINED__
#define __IDisplayPointer_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDisplayPointer, 0x3050f69e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f69e-98b5-11cf-bb82-00aa00bdce0b")
IDisplayPointer : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE MoveToPoint(
        POINT ptPoint,
        COORD_SYSTEM eCoordSystem,
        IHTMLElement *pElementContext,
        DWORD dwHitTestOptions,
        DWORD *pdwHitTestResults) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveUnit(
        DISPLAY_MOVEUNIT eMoveUnit,
        LONG lXPos) = 0;

    virtual HRESULT STDMETHODCALLTYPE PositionMarkupPointer(
        IMarkupPointer *pMarkupPointer) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveToPointer(
        IDisplayPointer *pDispPointer) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPointerGravity(
        POINTER_GRAVITY eGravity) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPointerGravity(
        POINTER_GRAVITY *peGravity) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDisplayGravity(
        DISPLAY_GRAVITY eGravity) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDisplayGravity(
        DISPLAY_GRAVITY *peGravity) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsPositioned(
        WINBOOL *pfPositioned) = 0;

    virtual HRESULT STDMETHODCALLTYPE Unposition(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsEqualTo(
        IDisplayPointer *pDispPointer,
        WINBOOL *pfIsEqual) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsLeftOf(
        IDisplayPointer *pDispPointer,
        WINBOOL *pfIsLeftOf) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsRightOf(
        IDisplayPointer *pDispPointer,
        WINBOOL *pfIsRightOf) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsAtBOL(
        WINBOOL *pfBOL) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveToMarkupPointer(
        IMarkupPointer *pPointer,
        IDisplayPointer *pDispLineContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE ScrollIntoView(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLineInfo(
        ILineInfo **ppLineInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFlowElement(
        IHTMLElement **ppLayoutElement) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueryBreaks(
        DWORD *pdwBreaks) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDisplayPointer, 0x3050f69e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDisplayPointerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDisplayPointer* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDisplayPointer* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDisplayPointer* This);

    /*** IDisplayPointer methods ***/
    HRESULT (STDMETHODCALLTYPE *MoveToPoint)(
        IDisplayPointer* This,
        POINT ptPoint,
        COORD_SYSTEM eCoordSystem,
        IHTMLElement *pElementContext,
        DWORD dwHitTestOptions,
        DWORD *pdwHitTestResults);

    HRESULT (STDMETHODCALLTYPE *MoveUnit)(
        IDisplayPointer* This,
        DISPLAY_MOVEUNIT eMoveUnit,
        LONG lXPos);

    HRESULT (STDMETHODCALLTYPE *PositionMarkupPointer)(
        IDisplayPointer* This,
        IMarkupPointer *pMarkupPointer);

    HRESULT (STDMETHODCALLTYPE *MoveToPointer)(
        IDisplayPointer* This,
        IDisplayPointer *pDispPointer);

    HRESULT (STDMETHODCALLTYPE *SetPointerGravity)(
        IDisplayPointer* This,
        POINTER_GRAVITY eGravity);

    HRESULT (STDMETHODCALLTYPE *GetPointerGravity)(
        IDisplayPointer* This,
        POINTER_GRAVITY *peGravity);

    HRESULT (STDMETHODCALLTYPE *SetDisplayGravity)(
        IDisplayPointer* This,
        DISPLAY_GRAVITY eGravity);

    HRESULT (STDMETHODCALLTYPE *GetDisplayGravity)(
        IDisplayPointer* This,
        DISPLAY_GRAVITY *peGravity);

    HRESULT (STDMETHODCALLTYPE *IsPositioned)(
        IDisplayPointer* This,
        WINBOOL *pfPositioned);

    HRESULT (STDMETHODCALLTYPE *Unposition)(
        IDisplayPointer* This);

    HRESULT (STDMETHODCALLTYPE *IsEqualTo)(
        IDisplayPointer* This,
        IDisplayPointer *pDispPointer,
        WINBOOL *pfIsEqual);

    HRESULT (STDMETHODCALLTYPE *IsLeftOf)(
        IDisplayPointer* This,
        IDisplayPointer *pDispPointer,
        WINBOOL *pfIsLeftOf);

    HRESULT (STDMETHODCALLTYPE *IsRightOf)(
        IDisplayPointer* This,
        IDisplayPointer *pDispPointer,
        WINBOOL *pfIsRightOf);

    HRESULT (STDMETHODCALLTYPE *IsAtBOL)(
        IDisplayPointer* This,
        WINBOOL *pfBOL);

    HRESULT (STDMETHODCALLTYPE *MoveToMarkupPointer)(
        IDisplayPointer* This,
        IMarkupPointer *pPointer,
        IDisplayPointer *pDispLineContext);

    HRESULT (STDMETHODCALLTYPE *ScrollIntoView)(
        IDisplayPointer* This);

    HRESULT (STDMETHODCALLTYPE *GetLineInfo)(
        IDisplayPointer* This,
        ILineInfo **ppLineInfo);

    HRESULT (STDMETHODCALLTYPE *GetFlowElement)(
        IDisplayPointer* This,
        IHTMLElement **ppLayoutElement);

    HRESULT (STDMETHODCALLTYPE *QueryBreaks)(
        IDisplayPointer* This,
        DWORD *pdwBreaks);

    END_INTERFACE
} IDisplayPointerVtbl;
interface IDisplayPointer {
    CONST_VTBL IDisplayPointerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDisplayPointer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDisplayPointer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDisplayPointer_Release(This) (This)->lpVtbl->Release(This)
/*** IDisplayPointer methods ***/
#define IDisplayPointer_MoveToPoint(This,ptPoint,eCoordSystem,pElementContext,dwHitTestOptions,pdwHitTestResults) (This)->lpVtbl->MoveToPoint(This,ptPoint,eCoordSystem,pElementContext,dwHitTestOptions,pdwHitTestResults)
#define IDisplayPointer_MoveUnit(This,eMoveUnit,lXPos) (This)->lpVtbl->MoveUnit(This,eMoveUnit,lXPos)
#define IDisplayPointer_PositionMarkupPointer(This,pMarkupPointer) (This)->lpVtbl->PositionMarkupPointer(This,pMarkupPointer)
#define IDisplayPointer_MoveToPointer(This,pDispPointer) (This)->lpVtbl->MoveToPointer(This,pDispPointer)
#define IDisplayPointer_SetPointerGravity(This,eGravity) (This)->lpVtbl->SetPointerGravity(This,eGravity)
#define IDisplayPointer_GetPointerGravity(This,peGravity) (This)->lpVtbl->GetPointerGravity(This,peGravity)
#define IDisplayPointer_SetDisplayGravity(This,eGravity) (This)->lpVtbl->SetDisplayGravity(This,eGravity)
#define IDisplayPointer_GetDisplayGravity(This,peGravity) (This)->lpVtbl->GetDisplayGravity(This,peGravity)
#define IDisplayPointer_IsPositioned(This,pfPositioned) (This)->lpVtbl->IsPositioned(This,pfPositioned)
#define IDisplayPointer_Unposition(This) (This)->lpVtbl->Unposition(This)
#define IDisplayPointer_IsEqualTo(This,pDispPointer,pfIsEqual) (This)->lpVtbl->IsEqualTo(This,pDispPointer,pfIsEqual)
#define IDisplayPointer_IsLeftOf(This,pDispPointer,pfIsLeftOf) (This)->lpVtbl->IsLeftOf(This,pDispPointer,pfIsLeftOf)
#define IDisplayPointer_IsRightOf(This,pDispPointer,pfIsRightOf) (This)->lpVtbl->IsRightOf(This,pDispPointer,pfIsRightOf)
#define IDisplayPointer_IsAtBOL(This,pfBOL) (This)->lpVtbl->IsAtBOL(This,pfBOL)
#define IDisplayPointer_MoveToMarkupPointer(This,pPointer,pDispLineContext) (This)->lpVtbl->MoveToMarkupPointer(This,pPointer,pDispLineContext)
#define IDisplayPointer_ScrollIntoView(This) (This)->lpVtbl->ScrollIntoView(This)
#define IDisplayPointer_GetLineInfo(This,ppLineInfo) (This)->lpVtbl->GetLineInfo(This,ppLineInfo)
#define IDisplayPointer_GetFlowElement(This,ppLayoutElement) (This)->lpVtbl->GetFlowElement(This,ppLayoutElement)
#define IDisplayPointer_QueryBreaks(This,pdwBreaks) (This)->lpVtbl->QueryBreaks(This,pdwBreaks)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDisplayPointer_QueryInterface(IDisplayPointer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDisplayPointer_AddRef(IDisplayPointer* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDisplayPointer_Release(IDisplayPointer* This) {
    return This->lpVtbl->Release(This);
}
/*** IDisplayPointer methods ***/
static FORCEINLINE HRESULT IDisplayPointer_MoveToPoint(IDisplayPointer* This,POINT ptPoint,COORD_SYSTEM eCoordSystem,IHTMLElement *pElementContext,DWORD dwHitTestOptions,DWORD *pdwHitTestResults) {
    return This->lpVtbl->MoveToPoint(This,ptPoint,eCoordSystem,pElementContext,dwHitTestOptions,pdwHitTestResults);
}
static FORCEINLINE HRESULT IDisplayPointer_MoveUnit(IDisplayPointer* This,DISPLAY_MOVEUNIT eMoveUnit,LONG lXPos) {
    return This->lpVtbl->MoveUnit(This,eMoveUnit,lXPos);
}
static FORCEINLINE HRESULT IDisplayPointer_PositionMarkupPointer(IDisplayPointer* This,IMarkupPointer *pMarkupPointer) {
    return This->lpVtbl->PositionMarkupPointer(This,pMarkupPointer);
}
static FORCEINLINE HRESULT IDisplayPointer_MoveToPointer(IDisplayPointer* This,IDisplayPointer *pDispPointer) {
    return This->lpVtbl->MoveToPointer(This,pDispPointer);
}
static FORCEINLINE HRESULT IDisplayPointer_SetPointerGravity(IDisplayPointer* This,POINTER_GRAVITY eGravity) {
    return This->lpVtbl->SetPointerGravity(This,eGravity);
}
static FORCEINLINE HRESULT IDisplayPointer_GetPointerGravity(IDisplayPointer* This,POINTER_GRAVITY *peGravity) {
    return This->lpVtbl->GetPointerGravity(This,peGravity);
}
static FORCEINLINE HRESULT IDisplayPointer_SetDisplayGravity(IDisplayPointer* This,DISPLAY_GRAVITY eGravity) {
    return This->lpVtbl->SetDisplayGravity(This,eGravity);
}
static FORCEINLINE HRESULT IDisplayPointer_GetDisplayGravity(IDisplayPointer* This,DISPLAY_GRAVITY *peGravity) {
    return This->lpVtbl->GetDisplayGravity(This,peGravity);
}
static FORCEINLINE HRESULT IDisplayPointer_IsPositioned(IDisplayPointer* This,WINBOOL *pfPositioned) {
    return This->lpVtbl->IsPositioned(This,pfPositioned);
}
static FORCEINLINE HRESULT IDisplayPointer_Unposition(IDisplayPointer* This) {
    return This->lpVtbl->Unposition(This);
}
static FORCEINLINE HRESULT IDisplayPointer_IsEqualTo(IDisplayPointer* This,IDisplayPointer *pDispPointer,WINBOOL *pfIsEqual) {
    return This->lpVtbl->IsEqualTo(This,pDispPointer,pfIsEqual);
}
static FORCEINLINE HRESULT IDisplayPointer_IsLeftOf(IDisplayPointer* This,IDisplayPointer *pDispPointer,WINBOOL *pfIsLeftOf) {
    return This->lpVtbl->IsLeftOf(This,pDispPointer,pfIsLeftOf);
}
static FORCEINLINE HRESULT IDisplayPointer_IsRightOf(IDisplayPointer* This,IDisplayPointer *pDispPointer,WINBOOL *pfIsRightOf) {
    return This->lpVtbl->IsRightOf(This,pDispPointer,pfIsRightOf);
}
static FORCEINLINE HRESULT IDisplayPointer_IsAtBOL(IDisplayPointer* This,WINBOOL *pfBOL) {
    return This->lpVtbl->IsAtBOL(This,pfBOL);
}
static FORCEINLINE HRESULT IDisplayPointer_MoveToMarkupPointer(IDisplayPointer* This,IMarkupPointer *pPointer,IDisplayPointer *pDispLineContext) {
    return This->lpVtbl->MoveToMarkupPointer(This,pPointer,pDispLineContext);
}
static FORCEINLINE HRESULT IDisplayPointer_ScrollIntoView(IDisplayPointer* This) {
    return This->lpVtbl->ScrollIntoView(This);
}
static FORCEINLINE HRESULT IDisplayPointer_GetLineInfo(IDisplayPointer* This,ILineInfo **ppLineInfo) {
    return This->lpVtbl->GetLineInfo(This,ppLineInfo);
}
static FORCEINLINE HRESULT IDisplayPointer_GetFlowElement(IDisplayPointer* This,IHTMLElement **ppLayoutElement) {
    return This->lpVtbl->GetFlowElement(This,ppLayoutElement);
}
static FORCEINLINE HRESULT IDisplayPointer_QueryBreaks(IDisplayPointer* This,DWORD *pdwBreaks) {
    return This->lpVtbl->QueryBreaks(This,pdwBreaks);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDisplayPointer_MoveToPoint_Proxy(
    IDisplayPointer* This,
    POINT ptPoint,
    COORD_SYSTEM eCoordSystem,
    IHTMLElement *pElementContext,
    DWORD dwHitTestOptions,
    DWORD *pdwHitTestResults);
void __RPC_STUB IDisplayPointer_MoveToPoint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDisplayPointer_MoveUnit_Proxy(
    IDisplayPointer* This,
    DISPLAY_MOVEUNIT eMoveUnit,
    LONG lXPos);
void __RPC_STUB IDisplayPointer_MoveUnit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDisplayPointer_PositionMarkupPointer_Proxy(
    IDisplayPointer* This,
    IMarkupPointer *pMarkupPointer);
void __RPC_STUB IDisplayPointer_PositionMarkupPointer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDisplayPointer_MoveToPointer_Proxy(
    IDisplayPointer* This,
    IDisplayPointer *pDispPointer);
void __RPC_STUB IDisplayPointer_MoveToPointer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDisplayPointer_SetPointerGravity_Proxy(
    IDisplayPointer* This,
    POINTER_GRAVITY eGravity);
void __RPC_STUB IDisplayPointer_SetPointerGravity_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDisplayPointer_GetPointerGravity_Proxy(
    IDisplayPointer* This,
    POINTER_GRAVITY *peGravity);
void __RPC_STUB IDisplayPointer_GetPointerGravity_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDisplayPointer_SetDisplayGravity_Proxy(
    IDisplayPointer* This,
    DISPLAY_GRAVITY eGravity);
void __RPC_STUB IDisplayPointer_SetDisplayGravity_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDisplayPointer_GetDisplayGravity_Proxy(
    IDisplayPointer* This,
    DISPLAY_GRAVITY *peGravity);
void __RPC_STUB IDisplayPointer_GetDisplayGravity_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDisplayPointer_IsPositioned_Proxy(
    IDisplayPointer* This,
    WINBOOL *pfPositioned);
void __RPC_STUB IDisplayPointer_IsPositioned_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDisplayPointer_Unposition_Proxy(
    IDisplayPointer* This);
void __RPC_STUB IDisplayPointer_Unposition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDisplayPointer_IsEqualTo_Proxy(
    IDisplayPointer* This,
    IDisplayPointer *pDispPointer,
    WINBOOL *pfIsEqual);
void __RPC_STUB IDisplayPointer_IsEqualTo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDisplayPointer_IsLeftOf_Proxy(
    IDisplayPointer* This,
    IDisplayPointer *pDispPointer,
    WINBOOL *pfIsLeftOf);
void __RPC_STUB IDisplayPointer_IsLeftOf_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDisplayPointer_IsRightOf_Proxy(
    IDisplayPointer* This,
    IDisplayPointer *pDispPointer,
    WINBOOL *pfIsRightOf);
void __RPC_STUB IDisplayPointer_IsRightOf_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDisplayPointer_IsAtBOL_Proxy(
    IDisplayPointer* This,
    WINBOOL *pfBOL);
void __RPC_STUB IDisplayPointer_IsAtBOL_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDisplayPointer_MoveToMarkupPointer_Proxy(
    IDisplayPointer* This,
    IMarkupPointer *pPointer,
    IDisplayPointer *pDispLineContext);
void __RPC_STUB IDisplayPointer_MoveToMarkupPointer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDisplayPointer_ScrollIntoView_Proxy(
    IDisplayPointer* This);
void __RPC_STUB IDisplayPointer_ScrollIntoView_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDisplayPointer_GetLineInfo_Proxy(
    IDisplayPointer* This,
    ILineInfo **ppLineInfo);
void __RPC_STUB IDisplayPointer_GetLineInfo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDisplayPointer_GetFlowElement_Proxy(
    IDisplayPointer* This,
    IHTMLElement **ppLayoutElement);
void __RPC_STUB IDisplayPointer_GetFlowElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDisplayPointer_QueryBreaks_Proxy(
    IDisplayPointer* This,
    DWORD *pdwBreaks);
void __RPC_STUB IDisplayPointer_QueryBreaks_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDisplayPointer_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDisplayServices interface
 */
#ifndef __IDisplayServices_INTERFACE_DEFINED__
#define __IDisplayServices_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDisplayServices, 0x3050f69d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f69d-98b5-11cf-bb82-00aa00bdce0b")
IDisplayServices : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateDisplayPointer(
        IDisplayPointer **ppDispPointer) = 0;

    virtual HRESULT STDMETHODCALLTYPE TransformRect(
        RECT *pRect,
        COORD_SYSTEM eSource,
        COORD_SYSTEM eDestination,
        IHTMLElement *pIElement) = 0;

    virtual HRESULT STDMETHODCALLTYPE TransformPoint(
        POINT *pPoint,
        COORD_SYSTEM eSource,
        COORD_SYSTEM eDestination,
        IHTMLElement *pIElement) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCaret(
        IHTMLCaret **ppCaret) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetComputedStyle(
        IMarkupPointer *pPointer,
        IHTMLComputedStyle **ppComputedStyle) = 0;

    virtual HRESULT STDMETHODCALLTYPE ScrollRectIntoView(
        IHTMLElement *pIElement,
        RECT rect) = 0;

    virtual HRESULT STDMETHODCALLTYPE HasFlowLayout(
        IHTMLElement *pIElement,
        WINBOOL *pfHasFlowLayout) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDisplayServices, 0x3050f69d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDisplayServicesVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDisplayServices* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDisplayServices* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDisplayServices* This);

    /*** IDisplayServices methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateDisplayPointer)(
        IDisplayServices* This,
        IDisplayPointer **ppDispPointer);

    HRESULT (STDMETHODCALLTYPE *TransformRect)(
        IDisplayServices* This,
        RECT *pRect,
        COORD_SYSTEM eSource,
        COORD_SYSTEM eDestination,
        IHTMLElement *pIElement);

    HRESULT (STDMETHODCALLTYPE *TransformPoint)(
        IDisplayServices* This,
        POINT *pPoint,
        COORD_SYSTEM eSource,
        COORD_SYSTEM eDestination,
        IHTMLElement *pIElement);

    HRESULT (STDMETHODCALLTYPE *GetCaret)(
        IDisplayServices* This,
        IHTMLCaret **ppCaret);

    HRESULT (STDMETHODCALLTYPE *GetComputedStyle)(
        IDisplayServices* This,
        IMarkupPointer *pPointer,
        IHTMLComputedStyle **ppComputedStyle);

    HRESULT (STDMETHODCALLTYPE *ScrollRectIntoView)(
        IDisplayServices* This,
        IHTMLElement *pIElement,
        RECT rect);

    HRESULT (STDMETHODCALLTYPE *HasFlowLayout)(
        IDisplayServices* This,
        IHTMLElement *pIElement,
        WINBOOL *pfHasFlowLayout);

    END_INTERFACE
} IDisplayServicesVtbl;
interface IDisplayServices {
    CONST_VTBL IDisplayServicesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDisplayServices_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDisplayServices_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDisplayServices_Release(This) (This)->lpVtbl->Release(This)
/*** IDisplayServices methods ***/
#define IDisplayServices_CreateDisplayPointer(This,ppDispPointer) (This)->lpVtbl->CreateDisplayPointer(This,ppDispPointer)
#define IDisplayServices_TransformRect(This,pRect,eSource,eDestination,pIElement) (This)->lpVtbl->TransformRect(This,pRect,eSource,eDestination,pIElement)
#define IDisplayServices_TransformPoint(This,pPoint,eSource,eDestination,pIElement) (This)->lpVtbl->TransformPoint(This,pPoint,eSource,eDestination,pIElement)
#define IDisplayServices_GetCaret(This,ppCaret) (This)->lpVtbl->GetCaret(This,ppCaret)
#define IDisplayServices_GetComputedStyle(This,pPointer,ppComputedStyle) (This)->lpVtbl->GetComputedStyle(This,pPointer,ppComputedStyle)
#define IDisplayServices_ScrollRectIntoView(This,pIElement,rect) (This)->lpVtbl->ScrollRectIntoView(This,pIElement,rect)
#define IDisplayServices_HasFlowLayout(This,pIElement,pfHasFlowLayout) (This)->lpVtbl->HasFlowLayout(This,pIElement,pfHasFlowLayout)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDisplayServices_QueryInterface(IDisplayServices* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDisplayServices_AddRef(IDisplayServices* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDisplayServices_Release(IDisplayServices* This) {
    return This->lpVtbl->Release(This);
}
/*** IDisplayServices methods ***/
static FORCEINLINE HRESULT IDisplayServices_CreateDisplayPointer(IDisplayServices* This,IDisplayPointer **ppDispPointer) {
    return This->lpVtbl->CreateDisplayPointer(This,ppDispPointer);
}
static FORCEINLINE HRESULT IDisplayServices_TransformRect(IDisplayServices* This,RECT *pRect,COORD_SYSTEM eSource,COORD_SYSTEM eDestination,IHTMLElement *pIElement) {
    return This->lpVtbl->TransformRect(This,pRect,eSource,eDestination,pIElement);
}
static FORCEINLINE HRESULT IDisplayServices_TransformPoint(IDisplayServices* This,POINT *pPoint,COORD_SYSTEM eSource,COORD_SYSTEM eDestination,IHTMLElement *pIElement) {
    return This->lpVtbl->TransformPoint(This,pPoint,eSource,eDestination,pIElement);
}
static FORCEINLINE HRESULT IDisplayServices_GetCaret(IDisplayServices* This,IHTMLCaret **ppCaret) {
    return This->lpVtbl->GetCaret(This,ppCaret);
}
static FORCEINLINE HRESULT IDisplayServices_GetComputedStyle(IDisplayServices* This,IMarkupPointer *pPointer,IHTMLComputedStyle **ppComputedStyle) {
    return This->lpVtbl->GetComputedStyle(This,pPointer,ppComputedStyle);
}
static FORCEINLINE HRESULT IDisplayServices_ScrollRectIntoView(IDisplayServices* This,IHTMLElement *pIElement,RECT rect) {
    return This->lpVtbl->ScrollRectIntoView(This,pIElement,rect);
}
static FORCEINLINE HRESULT IDisplayServices_HasFlowLayout(IDisplayServices* This,IHTMLElement *pIElement,WINBOOL *pfHasFlowLayout) {
    return This->lpVtbl->HasFlowLayout(This,pIElement,pfHasFlowLayout);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDisplayServices_CreateDisplayPointer_Proxy(
    IDisplayServices* This,
    IDisplayPointer **ppDispPointer);
void __RPC_STUB IDisplayServices_CreateDisplayPointer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDisplayServices_TransformRect_Proxy(
    IDisplayServices* This,
    RECT *pRect,
    COORD_SYSTEM eSource,
    COORD_SYSTEM eDestination,
    IHTMLElement *pIElement);
void __RPC_STUB IDisplayServices_TransformRect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDisplayServices_TransformPoint_Proxy(
    IDisplayServices* This,
    POINT *pPoint,
    COORD_SYSTEM eSource,
    COORD_SYSTEM eDestination,
    IHTMLElement *pIElement);
void __RPC_STUB IDisplayServices_TransformPoint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDisplayServices_GetCaret_Proxy(
    IDisplayServices* This,
    IHTMLCaret **ppCaret);
void __RPC_STUB IDisplayServices_GetCaret_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDisplayServices_GetComputedStyle_Proxy(
    IDisplayServices* This,
    IMarkupPointer *pPointer,
    IHTMLComputedStyle **ppComputedStyle);
void __RPC_STUB IDisplayServices_GetComputedStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDisplayServices_ScrollRectIntoView_Proxy(
    IDisplayServices* This,
    IHTMLElement *pIElement,
    RECT rect);
void __RPC_STUB IDisplayServices_ScrollRectIntoView_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDisplayServices_HasFlowLayout_Proxy(
    IDisplayServices* This,
    IHTMLElement *pIElement,
    WINBOOL *pfHasFlowLayout);
void __RPC_STUB IDisplayServices_HasFlowLayout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDisplayServices_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHtmlDlgSafeHelper interface
 */
#ifndef __IHtmlDlgSafeHelper_INTERFACE_DEFINED__
#define __IHtmlDlgSafeHelper_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHtmlDlgSafeHelper, 0x3050f81a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f81a-98b5-11cf-bb82-00aa00bdce0b")
IHtmlDlgSafeHelper : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE choosecolordlg(
        VARIANT initColor,
        VARIANT *rgbColor) = 0;

    virtual HRESULT STDMETHODCALLTYPE getCharset(
        BSTR fontName,
        VARIANT *charset) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Fonts(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_BlockFormats(
        IDispatch **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHtmlDlgSafeHelper, 0x3050f81a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHtmlDlgSafeHelperVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHtmlDlgSafeHelper* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHtmlDlgSafeHelper* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHtmlDlgSafeHelper* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHtmlDlgSafeHelper* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHtmlDlgSafeHelper* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHtmlDlgSafeHelper* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHtmlDlgSafeHelper* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHtmlDlgSafeHelper methods ***/
    HRESULT (STDMETHODCALLTYPE *choosecolordlg)(
        IHtmlDlgSafeHelper* This,
        VARIANT initColor,
        VARIANT *rgbColor);

    HRESULT (STDMETHODCALLTYPE *getCharset)(
        IHtmlDlgSafeHelper* This,
        BSTR fontName,
        VARIANT *charset);

    HRESULT (STDMETHODCALLTYPE *get_Fonts)(
        IHtmlDlgSafeHelper* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_BlockFormats)(
        IHtmlDlgSafeHelper* This,
        IDispatch **p);

    END_INTERFACE
} IHtmlDlgSafeHelperVtbl;
interface IHtmlDlgSafeHelper {
    CONST_VTBL IHtmlDlgSafeHelperVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHtmlDlgSafeHelper_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHtmlDlgSafeHelper_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHtmlDlgSafeHelper_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHtmlDlgSafeHelper_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHtmlDlgSafeHelper_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHtmlDlgSafeHelper_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHtmlDlgSafeHelper_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHtmlDlgSafeHelper methods ***/
#define IHtmlDlgSafeHelper_choosecolordlg(This,initColor,rgbColor) (This)->lpVtbl->choosecolordlg(This,initColor,rgbColor)
#define IHtmlDlgSafeHelper_getCharset(This,fontName,charset) (This)->lpVtbl->getCharset(This,fontName,charset)
#define IHtmlDlgSafeHelper_get_Fonts(This,p) (This)->lpVtbl->get_Fonts(This,p)
#define IHtmlDlgSafeHelper_get_BlockFormats(This,p) (This)->lpVtbl->get_BlockFormats(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHtmlDlgSafeHelper_QueryInterface(IHtmlDlgSafeHelper* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHtmlDlgSafeHelper_AddRef(IHtmlDlgSafeHelper* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHtmlDlgSafeHelper_Release(IHtmlDlgSafeHelper* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHtmlDlgSafeHelper_GetTypeInfoCount(IHtmlDlgSafeHelper* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHtmlDlgSafeHelper_GetTypeInfo(IHtmlDlgSafeHelper* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHtmlDlgSafeHelper_GetIDsOfNames(IHtmlDlgSafeHelper* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHtmlDlgSafeHelper_Invoke(IHtmlDlgSafeHelper* 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);
}
/*** IHtmlDlgSafeHelper methods ***/
static FORCEINLINE HRESULT IHtmlDlgSafeHelper_choosecolordlg(IHtmlDlgSafeHelper* This,VARIANT initColor,VARIANT *rgbColor) {
    return This->lpVtbl->choosecolordlg(This,initColor,rgbColor);
}
static FORCEINLINE HRESULT IHtmlDlgSafeHelper_getCharset(IHtmlDlgSafeHelper* This,BSTR fontName,VARIANT *charset) {
    return This->lpVtbl->getCharset(This,fontName,charset);
}
static FORCEINLINE HRESULT IHtmlDlgSafeHelper_get_Fonts(IHtmlDlgSafeHelper* This,IDispatch **p) {
    return This->lpVtbl->get_Fonts(This,p);
}
static FORCEINLINE HRESULT IHtmlDlgSafeHelper_get_BlockFormats(IHtmlDlgSafeHelper* This,IDispatch **p) {
    return This->lpVtbl->get_BlockFormats(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHtmlDlgSafeHelper_choosecolordlg_Proxy(
    IHtmlDlgSafeHelper* This,
    VARIANT initColor,
    VARIANT *rgbColor);
void __RPC_STUB IHtmlDlgSafeHelper_choosecolordlg_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHtmlDlgSafeHelper_getCharset_Proxy(
    IHtmlDlgSafeHelper* This,
    BSTR fontName,
    VARIANT *charset);
void __RPC_STUB IHtmlDlgSafeHelper_getCharset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHtmlDlgSafeHelper_get_Fonts_Proxy(
    IHtmlDlgSafeHelper* This,
    IDispatch **p);
void __RPC_STUB IHtmlDlgSafeHelper_get_Fonts_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHtmlDlgSafeHelper_get_BlockFormats_Proxy(
    IHtmlDlgSafeHelper* This,
    IDispatch **p);
void __RPC_STUB IHtmlDlgSafeHelper_get_BlockFormats_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHtmlDlgSafeHelper_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBlockFormats interface
 */
#ifndef __IBlockFormats_INTERFACE_DEFINED__
#define __IBlockFormats_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBlockFormats, 0x3050f830, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f830-98b5-11cf-bb82-00aa00bdce0b")
IBlockFormats : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE Item(
        VARIANT *pvarIndex,
        BSTR *pbstrBlockFormat) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBlockFormats, 0x3050f830, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IBlockFormatsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IBlockFormats* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IBlockFormats* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IBlockFormats* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IBlockFormats* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IBlockFormats* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IBlockFormats* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IBlockFormats* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IBlockFormats methods ***/
    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        IBlockFormats* This,
        IUnknown **p);

    HRESULT (STDMETHODCALLTYPE *get_Count)(
        IBlockFormats* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *Item)(
        IBlockFormats* This,
        VARIANT *pvarIndex,
        BSTR *pbstrBlockFormat);

    END_INTERFACE
} IBlockFormatsVtbl;
interface IBlockFormats {
    CONST_VTBL IBlockFormatsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBlockFormats_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBlockFormats_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBlockFormats_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IBlockFormats_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IBlockFormats_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IBlockFormats_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IBlockFormats_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IBlockFormats methods ***/
#define IBlockFormats_get__NewEnum(This,p) (This)->lpVtbl->get__NewEnum(This,p)
#define IBlockFormats_get_Count(This,p) (This)->lpVtbl->get_Count(This,p)
#define IBlockFormats_Item(This,pvarIndex,pbstrBlockFormat) (This)->lpVtbl->Item(This,pvarIndex,pbstrBlockFormat)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBlockFormats_QueryInterface(IBlockFormats* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBlockFormats_AddRef(IBlockFormats* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBlockFormats_Release(IBlockFormats* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IBlockFormats_GetTypeInfoCount(IBlockFormats* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IBlockFormats_GetTypeInfo(IBlockFormats* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IBlockFormats_GetIDsOfNames(IBlockFormats* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IBlockFormats_Invoke(IBlockFormats* 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);
}
/*** IBlockFormats methods ***/
static FORCEINLINE HRESULT IBlockFormats_get__NewEnum(IBlockFormats* This,IUnknown **p) {
    return This->lpVtbl->get__NewEnum(This,p);
}
static FORCEINLINE HRESULT IBlockFormats_get_Count(IBlockFormats* This,LONG *p) {
    return This->lpVtbl->get_Count(This,p);
}
static FORCEINLINE HRESULT IBlockFormats_Item(IBlockFormats* This,VARIANT *pvarIndex,BSTR *pbstrBlockFormat) {
    return This->lpVtbl->Item(This,pvarIndex,pbstrBlockFormat);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IBlockFormats_get__NewEnum_Proxy(
    IBlockFormats* This,
    IUnknown **p);
void __RPC_STUB IBlockFormats_get__NewEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IBlockFormats_get_Count_Proxy(
    IBlockFormats* This,
    LONG *p);
void __RPC_STUB IBlockFormats_get_Count_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IBlockFormats_Item_Proxy(
    IBlockFormats* This,
    VARIANT *pvarIndex,
    BSTR *pbstrBlockFormat);
void __RPC_STUB IBlockFormats_Item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IBlockFormats_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFontNames interface
 */
#ifndef __IFontNames_INTERFACE_DEFINED__
#define __IFontNames_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFontNames, 0x3050f839, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f839-98b5-11cf-bb82-00aa00bdce0b")
IFontNames : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE Item(
        VARIANT *pvarIndex,
        BSTR *pbstrFontName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFontNames, 0x3050f839, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IFontNamesVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFontNames* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFontNames* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFontNames* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IFontNames* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IFontNames* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IFontNames* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IFontNames* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IFontNames methods ***/
    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        IFontNames* This,
        IUnknown **p);

    HRESULT (STDMETHODCALLTYPE *get_Count)(
        IFontNames* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *Item)(
        IFontNames* This,
        VARIANT *pvarIndex,
        BSTR *pbstrFontName);

    END_INTERFACE
} IFontNamesVtbl;
interface IFontNames {
    CONST_VTBL IFontNamesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFontNames_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFontNames_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFontNames_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFontNames_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFontNames_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFontNames_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFontNames_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFontNames methods ***/
#define IFontNames_get__NewEnum(This,p) (This)->lpVtbl->get__NewEnum(This,p)
#define IFontNames_get_Count(This,p) (This)->lpVtbl->get_Count(This,p)
#define IFontNames_Item(This,pvarIndex,pbstrFontName) (This)->lpVtbl->Item(This,pvarIndex,pbstrFontName)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFontNames_QueryInterface(IFontNames* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFontNames_AddRef(IFontNames* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFontNames_Release(IFontNames* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IFontNames_GetTypeInfoCount(IFontNames* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IFontNames_GetTypeInfo(IFontNames* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IFontNames_GetIDsOfNames(IFontNames* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IFontNames_Invoke(IFontNames* 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);
}
/*** IFontNames methods ***/
static FORCEINLINE HRESULT IFontNames_get__NewEnum(IFontNames* This,IUnknown **p) {
    return This->lpVtbl->get__NewEnum(This,p);
}
static FORCEINLINE HRESULT IFontNames_get_Count(IFontNames* This,LONG *p) {
    return This->lpVtbl->get_Count(This,p);
}
static FORCEINLINE HRESULT IFontNames_Item(IFontNames* This,VARIANT *pvarIndex,BSTR *pbstrFontName) {
    return This->lpVtbl->Item(This,pvarIndex,pbstrFontName);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IFontNames_get__NewEnum_Proxy(
    IFontNames* This,
    IUnknown **p);
void __RPC_STUB IFontNames_get__NewEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFontNames_get_Count_Proxy(
    IFontNames* This,
    LONG *p);
void __RPC_STUB IFontNames_get_Count_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFontNames_Item_Proxy(
    IFontNames* This,
    VARIANT *pvarIndex,
    BSTR *pbstrFontName);
void __RPC_STUB IFontNames_Item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IFontNames_INTERFACE_DEFINED__ */

/*****************************************************************************
 * HtmlDlgSafeHelper coclass
 */

DEFINE_GUID(CLSID_HtmlDlgSafeHelper, 0x3050f819, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f819-98b5-11cf-bb82-00aa00bdce0b") HtmlDlgSafeHelper;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HtmlDlgSafeHelper, 0x3050f819, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

/*****************************************************************************
 * BlockFormats coclass
 */

DEFINE_GUID(CLSID_BlockFormats, 0x3050f831, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f831-98b5-11cf-bb82-00aa00bdce0b") BlockFormats;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(BlockFormats, 0x3050f831, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

/*****************************************************************************
 * FontNames coclass
 */

DEFINE_GUID(CLSID_FontNames, 0x3050f83a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f83a-98b5-11cf-bb82-00aa00bdce0b") FontNames;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(FontNames, 0x3050f83a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

/*****************************************************************************
 * IDeveloperConsoleMessageReceiver interface
 */
#ifndef __IDeveloperConsoleMessageReceiver_INTERFACE_DEFINED__
#define __IDeveloperConsoleMessageReceiver_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDeveloperConsoleMessageReceiver, 0x30510808, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510808-98b5-11cf-bb82-00aa00bdce0b")
IDeveloperConsoleMessageReceiver : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Write(
        LPCWSTR source,
        DEV_CONSOLE_MESSAGE_LEVEL level,
        int messageId,
        LPCWSTR messageText) = 0;

    virtual HRESULT STDMETHODCALLTYPE WriteWithUrl(
        LPCWSTR source,
        DEV_CONSOLE_MESSAGE_LEVEL level,
        int messageId,
        LPCWSTR messageText,
        LPCWSTR fileUrl) = 0;

    virtual HRESULT STDMETHODCALLTYPE WriteWithUrlAndLine(
        LPCWSTR source,
        DEV_CONSOLE_MESSAGE_LEVEL level,
        int messageId,
        LPCWSTR messageText,
        LPCWSTR fileUrl,
        ULONG line) = 0;

    virtual HRESULT STDMETHODCALLTYPE WriteWithUrlLineAndColumn(
        LPCWSTR source,
        DEV_CONSOLE_MESSAGE_LEVEL level,
        int messageId,
        LPCWSTR messageText,
        LPCWSTR fileUrl,
        ULONG line,
        ULONG column) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDeveloperConsoleMessageReceiver, 0x30510808, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDeveloperConsoleMessageReceiverVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDeveloperConsoleMessageReceiver* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDeveloperConsoleMessageReceiver* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDeveloperConsoleMessageReceiver* This);

    /*** IDeveloperConsoleMessageReceiver methods ***/
    HRESULT (STDMETHODCALLTYPE *Write)(
        IDeveloperConsoleMessageReceiver* This,
        LPCWSTR source,
        DEV_CONSOLE_MESSAGE_LEVEL level,
        int messageId,
        LPCWSTR messageText);

    HRESULT (STDMETHODCALLTYPE *WriteWithUrl)(
        IDeveloperConsoleMessageReceiver* This,
        LPCWSTR source,
        DEV_CONSOLE_MESSAGE_LEVEL level,
        int messageId,
        LPCWSTR messageText,
        LPCWSTR fileUrl);

    HRESULT (STDMETHODCALLTYPE *WriteWithUrlAndLine)(
        IDeveloperConsoleMessageReceiver* This,
        LPCWSTR source,
        DEV_CONSOLE_MESSAGE_LEVEL level,
        int messageId,
        LPCWSTR messageText,
        LPCWSTR fileUrl,
        ULONG line);

    HRESULT (STDMETHODCALLTYPE *WriteWithUrlLineAndColumn)(
        IDeveloperConsoleMessageReceiver* This,
        LPCWSTR source,
        DEV_CONSOLE_MESSAGE_LEVEL level,
        int messageId,
        LPCWSTR messageText,
        LPCWSTR fileUrl,
        ULONG line,
        ULONG column);

    END_INTERFACE
} IDeveloperConsoleMessageReceiverVtbl;
interface IDeveloperConsoleMessageReceiver {
    CONST_VTBL IDeveloperConsoleMessageReceiverVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDeveloperConsoleMessageReceiver_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDeveloperConsoleMessageReceiver_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDeveloperConsoleMessageReceiver_Release(This) (This)->lpVtbl->Release(This)
/*** IDeveloperConsoleMessageReceiver methods ***/
#define IDeveloperConsoleMessageReceiver_Write(This,source,level,messageId,messageText) (This)->lpVtbl->Write(This,source,level,messageId,messageText)
#define IDeveloperConsoleMessageReceiver_WriteWithUrl(This,source,level,messageId,messageText,fileUrl) (This)->lpVtbl->WriteWithUrl(This,source,level,messageId,messageText,fileUrl)
#define IDeveloperConsoleMessageReceiver_WriteWithUrlAndLine(This,source,level,messageId,messageText,fileUrl,line) (This)->lpVtbl->WriteWithUrlAndLine(This,source,level,messageId,messageText,fileUrl,line)
#define IDeveloperConsoleMessageReceiver_WriteWithUrlLineAndColumn(This,source,level,messageId,messageText,fileUrl,line,column) (This)->lpVtbl->WriteWithUrlLineAndColumn(This,source,level,messageId,messageText,fileUrl,line,column)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDeveloperConsoleMessageReceiver_QueryInterface(IDeveloperConsoleMessageReceiver* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDeveloperConsoleMessageReceiver_AddRef(IDeveloperConsoleMessageReceiver* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDeveloperConsoleMessageReceiver_Release(IDeveloperConsoleMessageReceiver* This) {
    return This->lpVtbl->Release(This);
}
/*** IDeveloperConsoleMessageReceiver methods ***/
static FORCEINLINE HRESULT IDeveloperConsoleMessageReceiver_Write(IDeveloperConsoleMessageReceiver* This,LPCWSTR source,DEV_CONSOLE_MESSAGE_LEVEL level,int messageId,LPCWSTR messageText) {
    return This->lpVtbl->Write(This,source,level,messageId,messageText);
}
static FORCEINLINE HRESULT IDeveloperConsoleMessageReceiver_WriteWithUrl(IDeveloperConsoleMessageReceiver* This,LPCWSTR source,DEV_CONSOLE_MESSAGE_LEVEL level,int messageId,LPCWSTR messageText,LPCWSTR fileUrl) {
    return This->lpVtbl->WriteWithUrl(This,source,level,messageId,messageText,fileUrl);
}
static FORCEINLINE HRESULT IDeveloperConsoleMessageReceiver_WriteWithUrlAndLine(IDeveloperConsoleMessageReceiver* This,LPCWSTR source,DEV_CONSOLE_MESSAGE_LEVEL level,int messageId,LPCWSTR messageText,LPCWSTR fileUrl,ULONG line) {
    return This->lpVtbl->WriteWithUrlAndLine(This,source,level,messageId,messageText,fileUrl,line);
}
static FORCEINLINE HRESULT IDeveloperConsoleMessageReceiver_WriteWithUrlLineAndColumn(IDeveloperConsoleMessageReceiver* This,LPCWSTR source,DEV_CONSOLE_MESSAGE_LEVEL level,int messageId,LPCWSTR messageText,LPCWSTR fileUrl,ULONG line,ULONG column) {
    return This->lpVtbl->WriteWithUrlLineAndColumn(This,source,level,messageId,messageText,fileUrl,line,column);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDeveloperConsoleMessageReceiver_Write_Proxy(
    IDeveloperConsoleMessageReceiver* This,
    LPCWSTR source,
    DEV_CONSOLE_MESSAGE_LEVEL level,
    int messageId,
    LPCWSTR messageText);
void __RPC_STUB IDeveloperConsoleMessageReceiver_Write_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDeveloperConsoleMessageReceiver_WriteWithUrl_Proxy(
    IDeveloperConsoleMessageReceiver* This,
    LPCWSTR source,
    DEV_CONSOLE_MESSAGE_LEVEL level,
    int messageId,
    LPCWSTR messageText,
    LPCWSTR fileUrl);
void __RPC_STUB IDeveloperConsoleMessageReceiver_WriteWithUrl_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDeveloperConsoleMessageReceiver_WriteWithUrlAndLine_Proxy(
    IDeveloperConsoleMessageReceiver* This,
    LPCWSTR source,
    DEV_CONSOLE_MESSAGE_LEVEL level,
    int messageId,
    LPCWSTR messageText,
    LPCWSTR fileUrl,
    ULONG line);
void __RPC_STUB IDeveloperConsoleMessageReceiver_WriteWithUrlAndLine_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDeveloperConsoleMessageReceiver_WriteWithUrlLineAndColumn_Proxy(
    IDeveloperConsoleMessageReceiver* This,
    LPCWSTR source,
    DEV_CONSOLE_MESSAGE_LEVEL level,
    int messageId,
    LPCWSTR messageText,
    LPCWSTR fileUrl,
    ULONG line,
    ULONG column);
void __RPC_STUB IDeveloperConsoleMessageReceiver_WriteWithUrlLineAndColumn_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDeveloperConsoleMessageReceiver_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebugCallbackNotificationHandler interface
 */
#ifndef __IDebugCallbackNotificationHandler_INTERFACE_DEFINED__
#define __IDebugCallbackNotificationHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugCallbackNotificationHandler, 0x30510842, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510842-98b5-11cf-bb82-00aa00bdce0b")
IDebugCallbackNotificationHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE RequestedCallbackTypes(
        DWORD *pCallbackMask) = 0;

    virtual HRESULT STDMETHODCALLTYPE BeforeDispatchEvent(
        IUnknown *pEvent) = 0;

    virtual HRESULT STDMETHODCALLTYPE DispatchEventComplete(
        IUnknown *pEvent,
        DWORD propagationStatus) = 0;

    virtual HRESULT STDMETHODCALLTYPE BeforeInvokeDomCallback(
        IUnknown *pEvent,
        IScriptEventHandler *pCallback,
        DOM_EVENT_PHASE eStage,
        DWORD propagationStatus) = 0;

    virtual HRESULT STDMETHODCALLTYPE InvokeDomCallbackComplete(
        IUnknown *pEvent,
        IScriptEventHandler *pCallback,
        DOM_EVENT_PHASE eStage,
        DWORD propagationStatus) = 0;

    virtual HRESULT STDMETHODCALLTYPE BeforeInvokeCallback(
        SCRIPT_TIMER_TYPE eCallbackType,
        DWORD callbackCookie,
        IDispatch *pDispHandler,
        ULONGLONG ullHandlerCookie,
        BSTR functionName,
        UINT32 line,
        UINT32 column,
        UINT32 cchLength,
        IUnknown *pDebugDocumentContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE InvokeCallbackComplete(
        SCRIPT_TIMER_TYPE eCallbackType,
        DWORD callbackCookie,
        IDispatch *pDispHandler,
        ULONGLONG ullHandlerCookie,
        BSTR functionName,
        UINT32 line,
        UINT32 column,
        UINT32 cchLength,
        IUnknown *pDebugDocumentContext) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugCallbackNotificationHandler, 0x30510842, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDebugCallbackNotificationHandlerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDebugCallbackNotificationHandler* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDebugCallbackNotificationHandler* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDebugCallbackNotificationHandler* This);

    /*** IDebugCallbackNotificationHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *RequestedCallbackTypes)(
        IDebugCallbackNotificationHandler* This,
        DWORD *pCallbackMask);

    HRESULT (STDMETHODCALLTYPE *BeforeDispatchEvent)(
        IDebugCallbackNotificationHandler* This,
        IUnknown *pEvent);

    HRESULT (STDMETHODCALLTYPE *DispatchEventComplete)(
        IDebugCallbackNotificationHandler* This,
        IUnknown *pEvent,
        DWORD propagationStatus);

    HRESULT (STDMETHODCALLTYPE *BeforeInvokeDomCallback)(
        IDebugCallbackNotificationHandler* This,
        IUnknown *pEvent,
        IScriptEventHandler *pCallback,
        DOM_EVENT_PHASE eStage,
        DWORD propagationStatus);

    HRESULT (STDMETHODCALLTYPE *InvokeDomCallbackComplete)(
        IDebugCallbackNotificationHandler* This,
        IUnknown *pEvent,
        IScriptEventHandler *pCallback,
        DOM_EVENT_PHASE eStage,
        DWORD propagationStatus);

    HRESULT (STDMETHODCALLTYPE *BeforeInvokeCallback)(
        IDebugCallbackNotificationHandler* This,
        SCRIPT_TIMER_TYPE eCallbackType,
        DWORD callbackCookie,
        IDispatch *pDispHandler,
        ULONGLONG ullHandlerCookie,
        BSTR functionName,
        UINT32 line,
        UINT32 column,
        UINT32 cchLength,
        IUnknown *pDebugDocumentContext);

    HRESULT (STDMETHODCALLTYPE *InvokeCallbackComplete)(
        IDebugCallbackNotificationHandler* This,
        SCRIPT_TIMER_TYPE eCallbackType,
        DWORD callbackCookie,
        IDispatch *pDispHandler,
        ULONGLONG ullHandlerCookie,
        BSTR functionName,
        UINT32 line,
        UINT32 column,
        UINT32 cchLength,
        IUnknown *pDebugDocumentContext);

    END_INTERFACE
} IDebugCallbackNotificationHandlerVtbl;
interface IDebugCallbackNotificationHandler {
    CONST_VTBL IDebugCallbackNotificationHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugCallbackNotificationHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugCallbackNotificationHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugCallbackNotificationHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugCallbackNotificationHandler methods ***/
#define IDebugCallbackNotificationHandler_RequestedCallbackTypes(This,pCallbackMask) (This)->lpVtbl->RequestedCallbackTypes(This,pCallbackMask)
#define IDebugCallbackNotificationHandler_BeforeDispatchEvent(This,pEvent) (This)->lpVtbl->BeforeDispatchEvent(This,pEvent)
#define IDebugCallbackNotificationHandler_DispatchEventComplete(This,pEvent,propagationStatus) (This)->lpVtbl->DispatchEventComplete(This,pEvent,propagationStatus)
#define IDebugCallbackNotificationHandler_BeforeInvokeDomCallback(This,pEvent,pCallback,eStage,propagationStatus) (This)->lpVtbl->BeforeInvokeDomCallback(This,pEvent,pCallback,eStage,propagationStatus)
#define IDebugCallbackNotificationHandler_InvokeDomCallbackComplete(This,pEvent,pCallback,eStage,propagationStatus) (This)->lpVtbl->InvokeDomCallbackComplete(This,pEvent,pCallback,eStage,propagationStatus)
#define IDebugCallbackNotificationHandler_BeforeInvokeCallback(This,eCallbackType,callbackCookie,pDispHandler,ullHandlerCookie,functionName,line,column,cchLength,pDebugDocumentContext) (This)->lpVtbl->BeforeInvokeCallback(This,eCallbackType,callbackCookie,pDispHandler,ullHandlerCookie,functionName,line,column,cchLength,pDebugDocumentContext)
#define IDebugCallbackNotificationHandler_InvokeCallbackComplete(This,eCallbackType,callbackCookie,pDispHandler,ullHandlerCookie,functionName,line,column,cchLength,pDebugDocumentContext) (This)->lpVtbl->InvokeCallbackComplete(This,eCallbackType,callbackCookie,pDispHandler,ullHandlerCookie,functionName,line,column,cchLength,pDebugDocumentContext)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugCallbackNotificationHandler_QueryInterface(IDebugCallbackNotificationHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugCallbackNotificationHandler_AddRef(IDebugCallbackNotificationHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugCallbackNotificationHandler_Release(IDebugCallbackNotificationHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugCallbackNotificationHandler methods ***/
static FORCEINLINE HRESULT IDebugCallbackNotificationHandler_RequestedCallbackTypes(IDebugCallbackNotificationHandler* This,DWORD *pCallbackMask) {
    return This->lpVtbl->RequestedCallbackTypes(This,pCallbackMask);
}
static FORCEINLINE HRESULT IDebugCallbackNotificationHandler_BeforeDispatchEvent(IDebugCallbackNotificationHandler* This,IUnknown *pEvent) {
    return This->lpVtbl->BeforeDispatchEvent(This,pEvent);
}
static FORCEINLINE HRESULT IDebugCallbackNotificationHandler_DispatchEventComplete(IDebugCallbackNotificationHandler* This,IUnknown *pEvent,DWORD propagationStatus) {
    return This->lpVtbl->DispatchEventComplete(This,pEvent,propagationStatus);
}
static FORCEINLINE HRESULT IDebugCallbackNotificationHandler_BeforeInvokeDomCallback(IDebugCallbackNotificationHandler* This,IUnknown *pEvent,IScriptEventHandler *pCallback,DOM_EVENT_PHASE eStage,DWORD propagationStatus) {
    return This->lpVtbl->BeforeInvokeDomCallback(This,pEvent,pCallback,eStage,propagationStatus);
}
static FORCEINLINE HRESULT IDebugCallbackNotificationHandler_InvokeDomCallbackComplete(IDebugCallbackNotificationHandler* This,IUnknown *pEvent,IScriptEventHandler *pCallback,DOM_EVENT_PHASE eStage,DWORD propagationStatus) {
    return This->lpVtbl->InvokeDomCallbackComplete(This,pEvent,pCallback,eStage,propagationStatus);
}
static FORCEINLINE HRESULT IDebugCallbackNotificationHandler_BeforeInvokeCallback(IDebugCallbackNotificationHandler* This,SCRIPT_TIMER_TYPE eCallbackType,DWORD callbackCookie,IDispatch *pDispHandler,ULONGLONG ullHandlerCookie,BSTR functionName,UINT32 line,UINT32 column,UINT32 cchLength,IUnknown *pDebugDocumentContext) {
    return This->lpVtbl->BeforeInvokeCallback(This,eCallbackType,callbackCookie,pDispHandler,ullHandlerCookie,functionName,line,column,cchLength,pDebugDocumentContext);
}
static FORCEINLINE HRESULT IDebugCallbackNotificationHandler_InvokeCallbackComplete(IDebugCallbackNotificationHandler* This,SCRIPT_TIMER_TYPE eCallbackType,DWORD callbackCookie,IDispatch *pDispHandler,ULONGLONG ullHandlerCookie,BSTR functionName,UINT32 line,UINT32 column,UINT32 cchLength,IUnknown *pDebugDocumentContext) {
    return This->lpVtbl->InvokeCallbackComplete(This,eCallbackType,callbackCookie,pDispHandler,ullHandlerCookie,functionName,line,column,cchLength,pDebugDocumentContext);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDebugCallbackNotificationHandler_RequestedCallbackTypes_Proxy(
    IDebugCallbackNotificationHandler* This,
    DWORD *pCallbackMask);
void __RPC_STUB IDebugCallbackNotificationHandler_RequestedCallbackTypes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDebugCallbackNotificationHandler_BeforeDispatchEvent_Proxy(
    IDebugCallbackNotificationHandler* This,
    IUnknown *pEvent);
void __RPC_STUB IDebugCallbackNotificationHandler_BeforeDispatchEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDebugCallbackNotificationHandler_DispatchEventComplete_Proxy(
    IDebugCallbackNotificationHandler* This,
    IUnknown *pEvent,
    DWORD propagationStatus);
void __RPC_STUB IDebugCallbackNotificationHandler_DispatchEventComplete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDebugCallbackNotificationHandler_BeforeInvokeDomCallback_Proxy(
    IDebugCallbackNotificationHandler* This,
    IUnknown *pEvent,
    IScriptEventHandler *pCallback,
    DOM_EVENT_PHASE eStage,
    DWORD propagationStatus);
void __RPC_STUB IDebugCallbackNotificationHandler_BeforeInvokeDomCallback_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDebugCallbackNotificationHandler_InvokeDomCallbackComplete_Proxy(
    IDebugCallbackNotificationHandler* This,
    IUnknown *pEvent,
    IScriptEventHandler *pCallback,
    DOM_EVENT_PHASE eStage,
    DWORD propagationStatus);
void __RPC_STUB IDebugCallbackNotificationHandler_InvokeDomCallbackComplete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDebugCallbackNotificationHandler_BeforeInvokeCallback_Proxy(
    IDebugCallbackNotificationHandler* This,
    SCRIPT_TIMER_TYPE eCallbackType,
    DWORD callbackCookie,
    IDispatch *pDispHandler,
    ULONGLONG ullHandlerCookie,
    BSTR functionName,
    UINT32 line,
    UINT32 column,
    UINT32 cchLength,
    IUnknown *pDebugDocumentContext);
void __RPC_STUB IDebugCallbackNotificationHandler_BeforeInvokeCallback_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDebugCallbackNotificationHandler_InvokeCallbackComplete_Proxy(
    IDebugCallbackNotificationHandler* This,
    SCRIPT_TIMER_TYPE eCallbackType,
    DWORD callbackCookie,
    IDispatch *pDispHandler,
    ULONGLONG ullHandlerCookie,
    BSTR functionName,
    UINT32 line,
    UINT32 column,
    UINT32 cchLength,
    IUnknown *pDebugDocumentContext);
void __RPC_STUB IDebugCallbackNotificationHandler_InvokeCallbackComplete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDebugCallbackNotificationHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IScriptEventHandler interface
 */
#ifndef __IScriptEventHandler_INTERFACE_DEFINED__
#define __IScriptEventHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IScriptEventHandler, 0x3051083a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051083a-98b5-11cf-bb82-00aa00bdce0b")
IScriptEventHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE FunctionName(
        BSTR *pbstrFunctionName) = 0;

    virtual HRESULT STDMETHODCALLTYPE DebugDocumentContext(
        IUnknown **ppDebugDocumentContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE EventHandlerDispatch(
        IDispatch **ppDispHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE UsesCapture(
        WINBOOL *pfUsesCapture) = 0;

    virtual HRESULT STDMETHODCALLTYPE Cookie(
        ULONGLONG *pullCookie) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IScriptEventHandler, 0x3051083a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IScriptEventHandlerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IScriptEventHandler* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IScriptEventHandler* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IScriptEventHandler* This);

    /*** IScriptEventHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *FunctionName)(
        IScriptEventHandler* This,
        BSTR *pbstrFunctionName);

    HRESULT (STDMETHODCALLTYPE *DebugDocumentContext)(
        IScriptEventHandler* This,
        IUnknown **ppDebugDocumentContext);

    HRESULT (STDMETHODCALLTYPE *EventHandlerDispatch)(
        IScriptEventHandler* This,
        IDispatch **ppDispHandler);

    HRESULT (STDMETHODCALLTYPE *UsesCapture)(
        IScriptEventHandler* This,
        WINBOOL *pfUsesCapture);

    HRESULT (STDMETHODCALLTYPE *Cookie)(
        IScriptEventHandler* This,
        ULONGLONG *pullCookie);

    END_INTERFACE
} IScriptEventHandlerVtbl;
interface IScriptEventHandler {
    CONST_VTBL IScriptEventHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IScriptEventHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IScriptEventHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IScriptEventHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IScriptEventHandler methods ***/
#define IScriptEventHandler_FunctionName(This,pbstrFunctionName) (This)->lpVtbl->FunctionName(This,pbstrFunctionName)
#define IScriptEventHandler_DebugDocumentContext(This,ppDebugDocumentContext) (This)->lpVtbl->DebugDocumentContext(This,ppDebugDocumentContext)
#define IScriptEventHandler_EventHandlerDispatch(This,ppDispHandler) (This)->lpVtbl->EventHandlerDispatch(This,ppDispHandler)
#define IScriptEventHandler_UsesCapture(This,pfUsesCapture) (This)->lpVtbl->UsesCapture(This,pfUsesCapture)
#define IScriptEventHandler_Cookie(This,pullCookie) (This)->lpVtbl->Cookie(This,pullCookie)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IScriptEventHandler_QueryInterface(IScriptEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IScriptEventHandler_AddRef(IScriptEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IScriptEventHandler_Release(IScriptEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IScriptEventHandler methods ***/
static FORCEINLINE HRESULT IScriptEventHandler_FunctionName(IScriptEventHandler* This,BSTR *pbstrFunctionName) {
    return This->lpVtbl->FunctionName(This,pbstrFunctionName);
}
static FORCEINLINE HRESULT IScriptEventHandler_DebugDocumentContext(IScriptEventHandler* This,IUnknown **ppDebugDocumentContext) {
    return This->lpVtbl->DebugDocumentContext(This,ppDebugDocumentContext);
}
static FORCEINLINE HRESULT IScriptEventHandler_EventHandlerDispatch(IScriptEventHandler* This,IDispatch **ppDispHandler) {
    return This->lpVtbl->EventHandlerDispatch(This,ppDispHandler);
}
static FORCEINLINE HRESULT IScriptEventHandler_UsesCapture(IScriptEventHandler* This,WINBOOL *pfUsesCapture) {
    return This->lpVtbl->UsesCapture(This,pfUsesCapture);
}
static FORCEINLINE HRESULT IScriptEventHandler_Cookie(IScriptEventHandler* This,ULONGLONG *pullCookie) {
    return This->lpVtbl->Cookie(This,pullCookie);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IScriptEventHandler_FunctionName_Proxy(
    IScriptEventHandler* This,
    BSTR *pbstrFunctionName);
void __RPC_STUB IScriptEventHandler_FunctionName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IScriptEventHandler_DebugDocumentContext_Proxy(
    IScriptEventHandler* This,
    IUnknown **ppDebugDocumentContext);
void __RPC_STUB IScriptEventHandler_DebugDocumentContext_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IScriptEventHandler_EventHandlerDispatch_Proxy(
    IScriptEventHandler* This,
    IDispatch **ppDispHandler);
void __RPC_STUB IScriptEventHandler_EventHandlerDispatch_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IScriptEventHandler_UsesCapture_Proxy(
    IScriptEventHandler* This,
    WINBOOL *pfUsesCapture);
void __RPC_STUB IScriptEventHandler_UsesCapture_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IScriptEventHandler_Cookie_Proxy(
    IScriptEventHandler* This,
    ULONGLONG *pullCookie);
void __RPC_STUB IScriptEventHandler_Cookie_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IScriptEventHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IScriptEventHandlerSourceInfo interface
 */
#ifndef __IScriptEventHandlerSourceInfo_INTERFACE_DEFINED__
#define __IScriptEventHandlerSourceInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_IScriptEventHandlerSourceInfo, 0x30510841, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510841-98b5-11cf-bb82-00aa00bdce0b")
IScriptEventHandlerSourceInfo : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSourceInfo(
        BSTR *pbstrFunctionName,
        UINT32 *line,
        UINT32 *column,
        UINT32 *cchLength) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IScriptEventHandlerSourceInfo, 0x30510841, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IScriptEventHandlerSourceInfoVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IScriptEventHandlerSourceInfo* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IScriptEventHandlerSourceInfo* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IScriptEventHandlerSourceInfo* This);

    /*** IScriptEventHandlerSourceInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSourceInfo)(
        IScriptEventHandlerSourceInfo* This,
        BSTR *pbstrFunctionName,
        UINT32 *line,
        UINT32 *column,
        UINT32 *cchLength);

    END_INTERFACE
} IScriptEventHandlerSourceInfoVtbl;
interface IScriptEventHandlerSourceInfo {
    CONST_VTBL IScriptEventHandlerSourceInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IScriptEventHandlerSourceInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IScriptEventHandlerSourceInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IScriptEventHandlerSourceInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IScriptEventHandlerSourceInfo methods ***/
#define IScriptEventHandlerSourceInfo_GetSourceInfo(This,pbstrFunctionName,line,column,cchLength) (This)->lpVtbl->GetSourceInfo(This,pbstrFunctionName,line,column,cchLength)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IScriptEventHandlerSourceInfo_QueryInterface(IScriptEventHandlerSourceInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IScriptEventHandlerSourceInfo_AddRef(IScriptEventHandlerSourceInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IScriptEventHandlerSourceInfo_Release(IScriptEventHandlerSourceInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IScriptEventHandlerSourceInfo methods ***/
static FORCEINLINE HRESULT IScriptEventHandlerSourceInfo_GetSourceInfo(IScriptEventHandlerSourceInfo* This,BSTR *pbstrFunctionName,UINT32 *line,UINT32 *column,UINT32 *cchLength) {
    return This->lpVtbl->GetSourceInfo(This,pbstrFunctionName,line,column,cchLength);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IScriptEventHandlerSourceInfo_GetSourceInfo_Proxy(
    IScriptEventHandlerSourceInfo* This,
    BSTR *pbstrFunctionName,
    UINT32 *line,
    UINT32 *column,
    UINT32 *cchLength);
void __RPC_STUB IScriptEventHandlerSourceInfo_GetSourceInfo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IScriptEventHandlerSourceInfo_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDOMEventRegistrationCallback interface
 */
#ifndef __IDOMEventRegistrationCallback_INTERFACE_DEFINED__
#define __IDOMEventRegistrationCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDOMEventRegistrationCallback, 0x3051083b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051083b-98b5-11cf-bb82-00aa00bdce0b")
IDOMEventRegistrationCallback : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnDOMEventListenerAdded(
        LPCWSTR pszEventType,
        IScriptEventHandler *pHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnDOMEventListenerRemoved(
        ULONGLONG ullCookie) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDOMEventRegistrationCallback, 0x3051083b, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IDOMEventRegistrationCallbackVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDOMEventRegistrationCallback* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDOMEventRegistrationCallback* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDOMEventRegistrationCallback* This);

    /*** IDOMEventRegistrationCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *OnDOMEventListenerAdded)(
        IDOMEventRegistrationCallback* This,
        LPCWSTR pszEventType,
        IScriptEventHandler *pHandler);

    HRESULT (STDMETHODCALLTYPE *OnDOMEventListenerRemoved)(
        IDOMEventRegistrationCallback* This,
        ULONGLONG ullCookie);

    END_INTERFACE
} IDOMEventRegistrationCallbackVtbl;
interface IDOMEventRegistrationCallback {
    CONST_VTBL IDOMEventRegistrationCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDOMEventRegistrationCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDOMEventRegistrationCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDOMEventRegistrationCallback_Release(This) (This)->lpVtbl->Release(This)
/*** IDOMEventRegistrationCallback methods ***/
#define IDOMEventRegistrationCallback_OnDOMEventListenerAdded(This,pszEventType,pHandler) (This)->lpVtbl->OnDOMEventListenerAdded(This,pszEventType,pHandler)
#define IDOMEventRegistrationCallback_OnDOMEventListenerRemoved(This,ullCookie) (This)->lpVtbl->OnDOMEventListenerRemoved(This,ullCookie)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDOMEventRegistrationCallback_QueryInterface(IDOMEventRegistrationCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDOMEventRegistrationCallback_AddRef(IDOMEventRegistrationCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDOMEventRegistrationCallback_Release(IDOMEventRegistrationCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IDOMEventRegistrationCallback methods ***/
static FORCEINLINE HRESULT IDOMEventRegistrationCallback_OnDOMEventListenerAdded(IDOMEventRegistrationCallback* This,LPCWSTR pszEventType,IScriptEventHandler *pHandler) {
    return This->lpVtbl->OnDOMEventListenerAdded(This,pszEventType,pHandler);
}
static FORCEINLINE HRESULT IDOMEventRegistrationCallback_OnDOMEventListenerRemoved(IDOMEventRegistrationCallback* This,ULONGLONG ullCookie) {
    return This->lpVtbl->OnDOMEventListenerRemoved(This,ullCookie);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDOMEventRegistrationCallback_OnDOMEventListenerAdded_Proxy(
    IDOMEventRegistrationCallback* This,
    LPCWSTR pszEventType,
    IScriptEventHandler *pHandler);
void __RPC_STUB IDOMEventRegistrationCallback_OnDOMEventListenerAdded_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDOMEventRegistrationCallback_OnDOMEventListenerRemoved_Proxy(
    IDOMEventRegistrationCallback* This,
    ULONGLONG ullCookie);
void __RPC_STUB IDOMEventRegistrationCallback_OnDOMEventListenerRemoved_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDOMEventRegistrationCallback_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IEventTarget2 interface
 */
#ifndef __IEventTarget2_INTERFACE_DEFINED__
#define __IEventTarget2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEventTarget2, 0x30510839, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510839-98b5-11cf-bb82-00aa00bdce0b")
IEventTarget2 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetRegisteredEventTypes(
        SAFEARRAY **ppEventTypeArray) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetListenersForType(
        LPCWSTR pszEventType,
        SAFEARRAY **ppEventHandlerArray) = 0;

    virtual HRESULT STDMETHODCALLTYPE RegisterForDOMEventListeners(
        IDOMEventRegistrationCallback *pCallback) = 0;

    virtual HRESULT STDMETHODCALLTYPE UnregisterForDOMEventListeners(
        IDOMEventRegistrationCallback *pCallback) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEventTarget2, 0x30510839, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IEventTarget2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IEventTarget2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IEventTarget2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IEventTarget2* This);

    /*** IEventTarget2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetRegisteredEventTypes)(
        IEventTarget2* This,
        SAFEARRAY **ppEventTypeArray);

    HRESULT (STDMETHODCALLTYPE *GetListenersForType)(
        IEventTarget2* This,
        LPCWSTR pszEventType,
        SAFEARRAY **ppEventHandlerArray);

    HRESULT (STDMETHODCALLTYPE *RegisterForDOMEventListeners)(
        IEventTarget2* This,
        IDOMEventRegistrationCallback *pCallback);

    HRESULT (STDMETHODCALLTYPE *UnregisterForDOMEventListeners)(
        IEventTarget2* This,
        IDOMEventRegistrationCallback *pCallback);

    END_INTERFACE
} IEventTarget2Vtbl;
interface IEventTarget2 {
    CONST_VTBL IEventTarget2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEventTarget2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEventTarget2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEventTarget2_Release(This) (This)->lpVtbl->Release(This)
/*** IEventTarget2 methods ***/
#define IEventTarget2_GetRegisteredEventTypes(This,ppEventTypeArray) (This)->lpVtbl->GetRegisteredEventTypes(This,ppEventTypeArray)
#define IEventTarget2_GetListenersForType(This,pszEventType,ppEventHandlerArray) (This)->lpVtbl->GetListenersForType(This,pszEventType,ppEventHandlerArray)
#define IEventTarget2_RegisterForDOMEventListeners(This,pCallback) (This)->lpVtbl->RegisterForDOMEventListeners(This,pCallback)
#define IEventTarget2_UnregisterForDOMEventListeners(This,pCallback) (This)->lpVtbl->UnregisterForDOMEventListeners(This,pCallback)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEventTarget2_QueryInterface(IEventTarget2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEventTarget2_AddRef(IEventTarget2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEventTarget2_Release(IEventTarget2* This) {
    return This->lpVtbl->Release(This);
}
/*** IEventTarget2 methods ***/
static FORCEINLINE HRESULT IEventTarget2_GetRegisteredEventTypes(IEventTarget2* This,SAFEARRAY **ppEventTypeArray) {
    return This->lpVtbl->GetRegisteredEventTypes(This,ppEventTypeArray);
}
static FORCEINLINE HRESULT IEventTarget2_GetListenersForType(IEventTarget2* This,LPCWSTR pszEventType,SAFEARRAY **ppEventHandlerArray) {
    return This->lpVtbl->GetListenersForType(This,pszEventType,ppEventHandlerArray);
}
static FORCEINLINE HRESULT IEventTarget2_RegisterForDOMEventListeners(IEventTarget2* This,IDOMEventRegistrationCallback *pCallback) {
    return This->lpVtbl->RegisterForDOMEventListeners(This,pCallback);
}
static FORCEINLINE HRESULT IEventTarget2_UnregisterForDOMEventListeners(IEventTarget2* This,IDOMEventRegistrationCallback *pCallback) {
    return This->lpVtbl->UnregisterForDOMEventListeners(This,pCallback);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IEventTarget2_GetRegisteredEventTypes_Proxy(
    IEventTarget2* This,
    SAFEARRAY **ppEventTypeArray);
void __RPC_STUB IEventTarget2_GetRegisteredEventTypes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IEventTarget2_GetListenersForType_Proxy(
    IEventTarget2* This,
    LPCWSTR pszEventType,
    SAFEARRAY **ppEventHandlerArray);
void __RPC_STUB IEventTarget2_GetListenersForType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IEventTarget2_RegisterForDOMEventListeners_Proxy(
    IEventTarget2* This,
    IDOMEventRegistrationCallback *pCallback);
void __RPC_STUB IEventTarget2_RegisterForDOMEventListeners_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IEventTarget2_UnregisterForDOMEventListeners_Proxy(
    IEventTarget2* This,
    IDOMEventRegistrationCallback *pCallback);
void __RPC_STUB IEventTarget2_UnregisterForDOMEventListeners_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IEventTarget2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLNamespaceEvents dispinterface
 */
#ifndef __HTMLNamespaceEvents_DISPINTERFACE_DEFINED__
#define __HTMLNamespaceEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_HTMLNamespaceEvents, 0x3050f6bd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f6bd-98b5-11cf-bb82-00aa00bdce0b")
HTMLNamespaceEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLNamespaceEvents, 0x3050f6bd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct HTMLNamespaceEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        HTMLNamespaceEvents* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        HTMLNamespaceEvents* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        HTMLNamespaceEvents* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        HTMLNamespaceEvents* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        HTMLNamespaceEvents* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        HTMLNamespaceEvents* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        HTMLNamespaceEvents* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} HTMLNamespaceEventsVtbl;
interface HTMLNamespaceEvents {
    CONST_VTBL HTMLNamespaceEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define HTMLNamespaceEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define HTMLNamespaceEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define HTMLNamespaceEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define HTMLNamespaceEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define HTMLNamespaceEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define HTMLNamespaceEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define HTMLNamespaceEvents_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 HTMLNamespaceEvents_QueryInterface(HTMLNamespaceEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG HTMLNamespaceEvents_AddRef(HTMLNamespaceEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG HTMLNamespaceEvents_Release(HTMLNamespaceEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT HTMLNamespaceEvents_GetTypeInfoCount(HTMLNamespaceEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT HTMLNamespaceEvents_GetTypeInfo(HTMLNamespaceEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT HTMLNamespaceEvents_GetIDsOfNames(HTMLNamespaceEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT HTMLNamespaceEvents_Invoke(HTMLNamespaceEvents* 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  /* __HTMLNamespaceEvents_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLNamespace interface
 */
#ifndef __IHTMLNamespace_INTERFACE_DEFINED__
#define __IHTMLNamespace_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLNamespace, 0x3050f6bb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f6bb-98b5-11cf-bb82-00aa00bdce0b")
IHTMLNamespace : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_urn(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_tagNames(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_readyState(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onreadystatechange(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_onreadystatechange(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE doImport(
        BSTR bstrImplementationUrl) = 0;

    virtual HRESULT STDMETHODCALLTYPE attachEvent(
        BSTR event,
        IDispatch *pDisp,
        VARIANT_BOOL *pfResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE detachEvent(
        BSTR event,
        IDispatch *pDisp) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLNamespace, 0x3050f6bb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLNamespaceVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLNamespace* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLNamespace* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLNamespace* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLNamespace* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLNamespace* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLNamespace* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLNamespace* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLNamespace methods ***/
    HRESULT (STDMETHODCALLTYPE *get_name)(
        IHTMLNamespace* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_urn)(
        IHTMLNamespace* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_tagNames)(
        IHTMLNamespace* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_readyState)(
        IHTMLNamespace* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_onreadystatechange)(
        IHTMLNamespace* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_onreadystatechange)(
        IHTMLNamespace* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *doImport)(
        IHTMLNamespace* This,
        BSTR bstrImplementationUrl);

    HRESULT (STDMETHODCALLTYPE *attachEvent)(
        IHTMLNamespace* This,
        BSTR event,
        IDispatch *pDisp,
        VARIANT_BOOL *pfResult);

    HRESULT (STDMETHODCALLTYPE *detachEvent)(
        IHTMLNamespace* This,
        BSTR event,
        IDispatch *pDisp);

    END_INTERFACE
} IHTMLNamespaceVtbl;
interface IHTMLNamespace {
    CONST_VTBL IHTMLNamespaceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLNamespace_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLNamespace_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLNamespace_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLNamespace_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLNamespace_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLNamespace_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLNamespace_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLNamespace methods ***/
#define IHTMLNamespace_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#define IHTMLNamespace_get_urn(This,p) (This)->lpVtbl->get_urn(This,p)
#define IHTMLNamespace_get_tagNames(This,p) (This)->lpVtbl->get_tagNames(This,p)
#define IHTMLNamespace_get_readyState(This,p) (This)->lpVtbl->get_readyState(This,p)
#define IHTMLNamespace_put_onreadystatechange(This,v) (This)->lpVtbl->put_onreadystatechange(This,v)
#define IHTMLNamespace_get_onreadystatechange(This,p) (This)->lpVtbl->get_onreadystatechange(This,p)
#define IHTMLNamespace_doImport(This,bstrImplementationUrl) (This)->lpVtbl->doImport(This,bstrImplementationUrl)
#define IHTMLNamespace_attachEvent(This,event,pDisp,pfResult) (This)->lpVtbl->attachEvent(This,event,pDisp,pfResult)
#define IHTMLNamespace_detachEvent(This,event,pDisp) (This)->lpVtbl->detachEvent(This,event,pDisp)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLNamespace_QueryInterface(IHTMLNamespace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLNamespace_AddRef(IHTMLNamespace* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLNamespace_Release(IHTMLNamespace* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLNamespace_GetTypeInfoCount(IHTMLNamespace* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLNamespace_GetTypeInfo(IHTMLNamespace* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLNamespace_GetIDsOfNames(IHTMLNamespace* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLNamespace_Invoke(IHTMLNamespace* 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);
}
/*** IHTMLNamespace methods ***/
static FORCEINLINE HRESULT IHTMLNamespace_get_name(IHTMLNamespace* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static FORCEINLINE HRESULT IHTMLNamespace_get_urn(IHTMLNamespace* This,BSTR *p) {
    return This->lpVtbl->get_urn(This,p);
}
static FORCEINLINE HRESULT IHTMLNamespace_get_tagNames(IHTMLNamespace* This,IDispatch **p) {
    return This->lpVtbl->get_tagNames(This,p);
}
static FORCEINLINE HRESULT IHTMLNamespace_get_readyState(IHTMLNamespace* This,VARIANT *p) {
    return This->lpVtbl->get_readyState(This,p);
}
static FORCEINLINE HRESULT IHTMLNamespace_put_onreadystatechange(IHTMLNamespace* This,VARIANT v) {
    return This->lpVtbl->put_onreadystatechange(This,v);
}
static FORCEINLINE HRESULT IHTMLNamespace_get_onreadystatechange(IHTMLNamespace* This,VARIANT *p) {
    return This->lpVtbl->get_onreadystatechange(This,p);
}
static FORCEINLINE HRESULT IHTMLNamespace_doImport(IHTMLNamespace* This,BSTR bstrImplementationUrl) {
    return This->lpVtbl->doImport(This,bstrImplementationUrl);
}
static FORCEINLINE HRESULT IHTMLNamespace_attachEvent(IHTMLNamespace* This,BSTR event,IDispatch *pDisp,VARIANT_BOOL *pfResult) {
    return This->lpVtbl->attachEvent(This,event,pDisp,pfResult);
}
static FORCEINLINE HRESULT IHTMLNamespace_detachEvent(IHTMLNamespace* This,BSTR event,IDispatch *pDisp) {
    return This->lpVtbl->detachEvent(This,event,pDisp);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLNamespace_get_name_Proxy(
    IHTMLNamespace* This,
    BSTR *p);
void __RPC_STUB IHTMLNamespace_get_name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLNamespace_get_urn_Proxy(
    IHTMLNamespace* This,
    BSTR *p);
void __RPC_STUB IHTMLNamespace_get_urn_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLNamespace_get_tagNames_Proxy(
    IHTMLNamespace* This,
    IDispatch **p);
void __RPC_STUB IHTMLNamespace_get_tagNames_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLNamespace_get_readyState_Proxy(
    IHTMLNamespace* This,
    VARIANT *p);
void __RPC_STUB IHTMLNamespace_get_readyState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLNamespace_put_onreadystatechange_Proxy(
    IHTMLNamespace* This,
    VARIANT v);
void __RPC_STUB IHTMLNamespace_put_onreadystatechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLNamespace_get_onreadystatechange_Proxy(
    IHTMLNamespace* This,
    VARIANT *p);
void __RPC_STUB IHTMLNamespace_get_onreadystatechange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLNamespace_doImport_Proxy(
    IHTMLNamespace* This,
    BSTR bstrImplementationUrl);
void __RPC_STUB IHTMLNamespace_doImport_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLNamespace_attachEvent_Proxy(
    IHTMLNamespace* This,
    BSTR event,
    IDispatch *pDisp,
    VARIANT_BOOL *pfResult);
void __RPC_STUB IHTMLNamespace_attachEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLNamespace_detachEvent_Proxy(
    IHTMLNamespace* This,
    BSTR event,
    IDispatch *pDisp);
void __RPC_STUB IHTMLNamespace_detachEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLNamespace_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLNamespaceCollection interface
 */
#ifndef __IHTMLNamespaceCollection_INTERFACE_DEFINED__
#define __IHTMLNamespaceCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLNamespaceCollection, 0x3050f6b8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f6b8-98b5-11cf-bb82-00aa00bdce0b")
IHTMLNamespaceCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE item(
        VARIANT index,
        IDispatch **ppNamespace) = 0;

    virtual HRESULT STDMETHODCALLTYPE add(
        BSTR bstrNamespace,
        BSTR bstrUrn,
        VARIANT implementationUrl,
        IDispatch **ppNamespace) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLNamespaceCollection, 0x3050f6b8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLNamespaceCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLNamespaceCollection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLNamespaceCollection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLNamespaceCollection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLNamespaceCollection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLNamespaceCollection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLNamespaceCollection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLNamespaceCollection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLNamespaceCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLNamespaceCollection* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLNamespaceCollection* This,
        VARIANT index,
        IDispatch **ppNamespace);

    HRESULT (STDMETHODCALLTYPE *add)(
        IHTMLNamespaceCollection* This,
        BSTR bstrNamespace,
        BSTR bstrUrn,
        VARIANT implementationUrl,
        IDispatch **ppNamespace);

    END_INTERFACE
} IHTMLNamespaceCollectionVtbl;
interface IHTMLNamespaceCollection {
    CONST_VTBL IHTMLNamespaceCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLNamespaceCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLNamespaceCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLNamespaceCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLNamespaceCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLNamespaceCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLNamespaceCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLNamespaceCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLNamespaceCollection methods ***/
#define IHTMLNamespaceCollection_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLNamespaceCollection_item(This,index,ppNamespace) (This)->lpVtbl->item(This,index,ppNamespace)
#define IHTMLNamespaceCollection_add(This,bstrNamespace,bstrUrn,implementationUrl,ppNamespace) (This)->lpVtbl->add(This,bstrNamespace,bstrUrn,implementationUrl,ppNamespace)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLNamespaceCollection_QueryInterface(IHTMLNamespaceCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLNamespaceCollection_AddRef(IHTMLNamespaceCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLNamespaceCollection_Release(IHTMLNamespaceCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLNamespaceCollection_GetTypeInfoCount(IHTMLNamespaceCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLNamespaceCollection_GetTypeInfo(IHTMLNamespaceCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLNamespaceCollection_GetIDsOfNames(IHTMLNamespaceCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLNamespaceCollection_Invoke(IHTMLNamespaceCollection* 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);
}
/*** IHTMLNamespaceCollection methods ***/
static FORCEINLINE HRESULT IHTMLNamespaceCollection_get_length(IHTMLNamespaceCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IHTMLNamespaceCollection_item(IHTMLNamespaceCollection* This,VARIANT index,IDispatch **ppNamespace) {
    return This->lpVtbl->item(This,index,ppNamespace);
}
static FORCEINLINE HRESULT IHTMLNamespaceCollection_add(IHTMLNamespaceCollection* This,BSTR bstrNamespace,BSTR bstrUrn,VARIANT implementationUrl,IDispatch **ppNamespace) {
    return This->lpVtbl->add(This,bstrNamespace,bstrUrn,implementationUrl,ppNamespace);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLNamespaceCollection_get_length_Proxy(
    IHTMLNamespaceCollection* This,
    LONG *p);
void __RPC_STUB IHTMLNamespaceCollection_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLNamespaceCollection_item_Proxy(
    IHTMLNamespaceCollection* This,
    VARIANT index,
    IDispatch **ppNamespace);
void __RPC_STUB IHTMLNamespaceCollection_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLNamespaceCollection_add_Proxy(
    IHTMLNamespaceCollection* This,
    BSTR bstrNamespace,
    BSTR bstrUrn,
    VARIANT implementationUrl,
    IDispatch **ppNamespace);
void __RPC_STUB IHTMLNamespaceCollection_add_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLNamespaceCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLNamespace dispinterface
 */
#ifndef __DispHTMLNamespace_DISPINTERFACE_DEFINED__
#define __DispHTMLNamespace_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLNamespace, 0x3050f54f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f54f-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLNamespace : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLNamespace, 0x3050f54f, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLNamespaceVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLNamespace* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLNamespace* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLNamespace* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLNamespace* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLNamespace* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLNamespace* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLNamespace* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLNamespaceVtbl;
interface DispHTMLNamespace {
    CONST_VTBL DispHTMLNamespaceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLNamespace_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLNamespace_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLNamespace_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLNamespace_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLNamespace_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLNamespace_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLNamespace_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 DispHTMLNamespace_QueryInterface(DispHTMLNamespace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLNamespace_AddRef(DispHTMLNamespace* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLNamespace_Release(DispHTMLNamespace* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLNamespace_GetTypeInfoCount(DispHTMLNamespace* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLNamespace_GetTypeInfo(DispHTMLNamespace* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLNamespace_GetIDsOfNames(DispHTMLNamespace* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLNamespace_Invoke(DispHTMLNamespace* 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  /* __DispHTMLNamespace_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLNamespace coclass
 */

DEFINE_GUID(CLSID_HTMLNamespace, 0x3050f6bc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f6bc-98b5-11cf-bb82-00aa00bdce0b") HTMLNamespace;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLNamespace, 0x3050f6bc, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

/*****************************************************************************
 * DispHTMLNamespaceCollection dispinterface
 */
#ifndef __DispHTMLNamespaceCollection_DISPINTERFACE_DEFINED__
#define __DispHTMLNamespaceCollection_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLNamespaceCollection, 0x3050f550, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f550-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLNamespaceCollection : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLNamespaceCollection, 0x3050f550, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLNamespaceCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLNamespaceCollection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLNamespaceCollection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLNamespaceCollection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLNamespaceCollection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLNamespaceCollection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLNamespaceCollection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLNamespaceCollection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLNamespaceCollectionVtbl;
interface DispHTMLNamespaceCollection {
    CONST_VTBL DispHTMLNamespaceCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLNamespaceCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLNamespaceCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLNamespaceCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLNamespaceCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLNamespaceCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLNamespaceCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLNamespaceCollection_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 DispHTMLNamespaceCollection_QueryInterface(DispHTMLNamespaceCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLNamespaceCollection_AddRef(DispHTMLNamespaceCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLNamespaceCollection_Release(DispHTMLNamespaceCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLNamespaceCollection_GetTypeInfoCount(DispHTMLNamespaceCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLNamespaceCollection_GetTypeInfo(DispHTMLNamespaceCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLNamespaceCollection_GetIDsOfNames(DispHTMLNamespaceCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLNamespaceCollection_Invoke(DispHTMLNamespaceCollection* 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  /* __DispHTMLNamespaceCollection_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLNamespaceCollection coclass
 */

DEFINE_GUID(CLSID_HTMLNamespaceCollection, 0x3050f6b9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f6b9-98b5-11cf-bb82-00aa00bdce0b") HTMLNamespaceCollection;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLNamespaceCollection, 0x3050f6b9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

/*****************************************************************************
 * IHTMLPainter interface
 */
#ifndef __IHTMLPainter_INTERFACE_DEFINED__
#define __IHTMLPainter_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLPainter, 0x3050f6a6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f6a6-98b5-11cf-bb82-00aa00bdce0b")
IHTMLPainter : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Draw(
        RECT rcBounds,
        RECT rcUpdate,
        LONG lDrawFlags,
        HDC hdc,
        LPVOID pvDrawObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnResize(
        SIZE size) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPainterInfo(
        HTML_PAINTER_INFO *pInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE HitTestPoint(
        POINT pt,
        WINBOOL *pbHit,
        LONG *plPartID) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLPainter, 0x3050f6a6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLPainterVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLPainter* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLPainter* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLPainter* This);

    /*** IHTMLPainter methods ***/
    HRESULT (STDMETHODCALLTYPE *Draw)(
        IHTMLPainter* This,
        RECT rcBounds,
        RECT rcUpdate,
        LONG lDrawFlags,
        HDC hdc,
        LPVOID pvDrawObject);

    HRESULT (STDMETHODCALLTYPE *OnResize)(
        IHTMLPainter* This,
        SIZE size);

    HRESULT (STDMETHODCALLTYPE *GetPainterInfo)(
        IHTMLPainter* This,
        HTML_PAINTER_INFO *pInfo);

    HRESULT (STDMETHODCALLTYPE *HitTestPoint)(
        IHTMLPainter* This,
        POINT pt,
        WINBOOL *pbHit,
        LONG *plPartID);

    END_INTERFACE
} IHTMLPainterVtbl;
interface IHTMLPainter {
    CONST_VTBL IHTMLPainterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLPainter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLPainter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLPainter_Release(This) (This)->lpVtbl->Release(This)
/*** IHTMLPainter methods ***/
#define IHTMLPainter_Draw(This,rcBounds,rcUpdate,lDrawFlags,hdc,pvDrawObject) (This)->lpVtbl->Draw(This,rcBounds,rcUpdate,lDrawFlags,hdc,pvDrawObject)
#define IHTMLPainter_OnResize(This,size) (This)->lpVtbl->OnResize(This,size)
#define IHTMLPainter_GetPainterInfo(This,pInfo) (This)->lpVtbl->GetPainterInfo(This,pInfo)
#define IHTMLPainter_HitTestPoint(This,pt,pbHit,plPartID) (This)->lpVtbl->HitTestPoint(This,pt,pbHit,plPartID)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLPainter_QueryInterface(IHTMLPainter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLPainter_AddRef(IHTMLPainter* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLPainter_Release(IHTMLPainter* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLPainter methods ***/
static FORCEINLINE HRESULT IHTMLPainter_Draw(IHTMLPainter* This,RECT rcBounds,RECT rcUpdate,LONG lDrawFlags,HDC hdc,LPVOID pvDrawObject) {
    return This->lpVtbl->Draw(This,rcBounds,rcUpdate,lDrawFlags,hdc,pvDrawObject);
}
static FORCEINLINE HRESULT IHTMLPainter_OnResize(IHTMLPainter* This,SIZE size) {
    return This->lpVtbl->OnResize(This,size);
}
static FORCEINLINE HRESULT IHTMLPainter_GetPainterInfo(IHTMLPainter* This,HTML_PAINTER_INFO *pInfo) {
    return This->lpVtbl->GetPainterInfo(This,pInfo);
}
static FORCEINLINE HRESULT IHTMLPainter_HitTestPoint(IHTMLPainter* This,POINT pt,WINBOOL *pbHit,LONG *plPartID) {
    return This->lpVtbl->HitTestPoint(This,pt,pbHit,plPartID);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLPainter_Draw_Proxy(
    IHTMLPainter* This,
    RECT rcBounds,
    RECT rcUpdate,
    LONG lDrawFlags,
    HDC hdc,
    LPVOID pvDrawObject);
void __RPC_STUB IHTMLPainter_Draw_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPainter_OnResize_Proxy(
    IHTMLPainter* This,
    SIZE size);
void __RPC_STUB IHTMLPainter_OnResize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPainter_GetPainterInfo_Proxy(
    IHTMLPainter* This,
    HTML_PAINTER_INFO *pInfo);
void __RPC_STUB IHTMLPainter_GetPainterInfo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPainter_HitTestPoint_Proxy(
    IHTMLPainter* This,
    POINT pt,
    WINBOOL *pbHit,
    LONG *plPartID);
void __RPC_STUB IHTMLPainter_HitTestPoint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLPainter_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLPainterEventInfo interface
 */
#ifndef __IHTMLPainterEventInfo_INTERFACE_DEFINED__
#define __IHTMLPainterEventInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLPainterEventInfo, 0x3050f6df, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f6df-98b5-11cf-bb82-00aa00bdce0b")
IHTMLPainterEventInfo : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetEventInfoFlags(
        LONG *plEventInfoFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEventTarget(
        IHTMLElement **ppElement) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCursor(
        LONG lPartID) = 0;

    virtual HRESULT STDMETHODCALLTYPE StringFromPartID(
        LONG lPartID,
        BSTR *pbstrPart) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLPainterEventInfo, 0x3050f6df, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLPainterEventInfoVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLPainterEventInfo* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLPainterEventInfo* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLPainterEventInfo* This);

    /*** IHTMLPainterEventInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetEventInfoFlags)(
        IHTMLPainterEventInfo* This,
        LONG *plEventInfoFlags);

    HRESULT (STDMETHODCALLTYPE *GetEventTarget)(
        IHTMLPainterEventInfo* This,
        IHTMLElement **ppElement);

    HRESULT (STDMETHODCALLTYPE *SetCursor)(
        IHTMLPainterEventInfo* This,
        LONG lPartID);

    HRESULT (STDMETHODCALLTYPE *StringFromPartID)(
        IHTMLPainterEventInfo* This,
        LONG lPartID,
        BSTR *pbstrPart);

    END_INTERFACE
} IHTMLPainterEventInfoVtbl;
interface IHTMLPainterEventInfo {
    CONST_VTBL IHTMLPainterEventInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLPainterEventInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLPainterEventInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLPainterEventInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IHTMLPainterEventInfo methods ***/
#define IHTMLPainterEventInfo_GetEventInfoFlags(This,plEventInfoFlags) (This)->lpVtbl->GetEventInfoFlags(This,plEventInfoFlags)
#define IHTMLPainterEventInfo_GetEventTarget(This,ppElement) (This)->lpVtbl->GetEventTarget(This,ppElement)
#define IHTMLPainterEventInfo_SetCursor(This,lPartID) (This)->lpVtbl->SetCursor(This,lPartID)
#define IHTMLPainterEventInfo_StringFromPartID(This,lPartID,pbstrPart) (This)->lpVtbl->StringFromPartID(This,lPartID,pbstrPart)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLPainterEventInfo_QueryInterface(IHTMLPainterEventInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLPainterEventInfo_AddRef(IHTMLPainterEventInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLPainterEventInfo_Release(IHTMLPainterEventInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLPainterEventInfo methods ***/
static FORCEINLINE HRESULT IHTMLPainterEventInfo_GetEventInfoFlags(IHTMLPainterEventInfo* This,LONG *plEventInfoFlags) {
    return This->lpVtbl->GetEventInfoFlags(This,plEventInfoFlags);
}
static FORCEINLINE HRESULT IHTMLPainterEventInfo_GetEventTarget(IHTMLPainterEventInfo* This,IHTMLElement **ppElement) {
    return This->lpVtbl->GetEventTarget(This,ppElement);
}
static FORCEINLINE HRESULT IHTMLPainterEventInfo_SetCursor(IHTMLPainterEventInfo* This,LONG lPartID) {
    return This->lpVtbl->SetCursor(This,lPartID);
}
static FORCEINLINE HRESULT IHTMLPainterEventInfo_StringFromPartID(IHTMLPainterEventInfo* This,LONG lPartID,BSTR *pbstrPart) {
    return This->lpVtbl->StringFromPartID(This,lPartID,pbstrPart);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLPainterEventInfo_GetEventInfoFlags_Proxy(
    IHTMLPainterEventInfo* This,
    LONG *plEventInfoFlags);
void __RPC_STUB IHTMLPainterEventInfo_GetEventInfoFlags_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPainterEventInfo_GetEventTarget_Proxy(
    IHTMLPainterEventInfo* This,
    IHTMLElement **ppElement);
void __RPC_STUB IHTMLPainterEventInfo_GetEventTarget_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPainterEventInfo_SetCursor_Proxy(
    IHTMLPainterEventInfo* This,
    LONG lPartID);
void __RPC_STUB IHTMLPainterEventInfo_SetCursor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPainterEventInfo_StringFromPartID_Proxy(
    IHTMLPainterEventInfo* This,
    LONG lPartID,
    BSTR *pbstrPart);
void __RPC_STUB IHTMLPainterEventInfo_StringFromPartID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLPainterEventInfo_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLPainterOverlay interface
 */
#ifndef __IHTMLPainterOverlay_INTERFACE_DEFINED__
#define __IHTMLPainterOverlay_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLPainterOverlay, 0x3050f7e3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f7e3-98b5-11cf-bb82-00aa00bdce0b")
IHTMLPainterOverlay : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnMove(
        RECT rcDevice) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLPainterOverlay, 0x3050f7e3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLPainterOverlayVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLPainterOverlay* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLPainterOverlay* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLPainterOverlay* This);

    /*** IHTMLPainterOverlay methods ***/
    HRESULT (STDMETHODCALLTYPE *OnMove)(
        IHTMLPainterOverlay* This,
        RECT rcDevice);

    END_INTERFACE
} IHTMLPainterOverlayVtbl;
interface IHTMLPainterOverlay {
    CONST_VTBL IHTMLPainterOverlayVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLPainterOverlay_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLPainterOverlay_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLPainterOverlay_Release(This) (This)->lpVtbl->Release(This)
/*** IHTMLPainterOverlay methods ***/
#define IHTMLPainterOverlay_OnMove(This,rcDevice) (This)->lpVtbl->OnMove(This,rcDevice)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLPainterOverlay_QueryInterface(IHTMLPainterOverlay* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLPainterOverlay_AddRef(IHTMLPainterOverlay* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLPainterOverlay_Release(IHTMLPainterOverlay* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLPainterOverlay methods ***/
static FORCEINLINE HRESULT IHTMLPainterOverlay_OnMove(IHTMLPainterOverlay* This,RECT rcDevice) {
    return This->lpVtbl->OnMove(This,rcDevice);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLPainterOverlay_OnMove_Proxy(
    IHTMLPainterOverlay* This,
    RECT rcDevice);
void __RPC_STUB IHTMLPainterOverlay_OnMove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLPainterOverlay_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLPaintSite interface
 */
#ifndef __IHTMLPaintSite_INTERFACE_DEFINED__
#define __IHTMLPaintSite_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLPaintSite, 0x3050f6a7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f6a7-98b5-11cf-bb82-00aa00bdce0b")
IHTMLPaintSite : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE InvalidatePainterInfo(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE InvalidateRect(
        RECT *prcInvalid) = 0;

    virtual HRESULT STDMETHODCALLTYPE InvalidateRegion(
        HRGN rgnInvalid) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDrawInfo(
        LONG lFlags,
        HTML_PAINT_DRAW_INFO *pDrawInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE TransformGlobalToLocal(
        POINT ptGlobal,
        POINT *pptLocal) = 0;

    virtual HRESULT STDMETHODCALLTYPE TransformLocalToGlobal(
        POINT ptLocal,
        POINT *pptGlobal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetHitTestCookie(
        LONG *plCookie) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLPaintSite, 0x3050f6a7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLPaintSiteVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLPaintSite* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLPaintSite* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLPaintSite* This);

    /*** IHTMLPaintSite methods ***/
    HRESULT (STDMETHODCALLTYPE *InvalidatePainterInfo)(
        IHTMLPaintSite* This);

    HRESULT (STDMETHODCALLTYPE *InvalidateRect)(
        IHTMLPaintSite* This,
        RECT *prcInvalid);

    HRESULT (STDMETHODCALLTYPE *InvalidateRegion)(
        IHTMLPaintSite* This,
        HRGN rgnInvalid);

    HRESULT (STDMETHODCALLTYPE *GetDrawInfo)(
        IHTMLPaintSite* This,
        LONG lFlags,
        HTML_PAINT_DRAW_INFO *pDrawInfo);

    HRESULT (STDMETHODCALLTYPE *TransformGlobalToLocal)(
        IHTMLPaintSite* This,
        POINT ptGlobal,
        POINT *pptLocal);

    HRESULT (STDMETHODCALLTYPE *TransformLocalToGlobal)(
        IHTMLPaintSite* This,
        POINT ptLocal,
        POINT *pptGlobal);

    HRESULT (STDMETHODCALLTYPE *GetHitTestCookie)(
        IHTMLPaintSite* This,
        LONG *plCookie);

    END_INTERFACE
} IHTMLPaintSiteVtbl;
interface IHTMLPaintSite {
    CONST_VTBL IHTMLPaintSiteVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLPaintSite_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLPaintSite_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLPaintSite_Release(This) (This)->lpVtbl->Release(This)
/*** IHTMLPaintSite methods ***/
#define IHTMLPaintSite_InvalidatePainterInfo(This) (This)->lpVtbl->InvalidatePainterInfo(This)
#define IHTMLPaintSite_InvalidateRect(This,prcInvalid) (This)->lpVtbl->InvalidateRect(This,prcInvalid)
#define IHTMLPaintSite_InvalidateRegion(This,rgnInvalid) (This)->lpVtbl->InvalidateRegion(This,rgnInvalid)
#define IHTMLPaintSite_GetDrawInfo(This,lFlags,pDrawInfo) (This)->lpVtbl->GetDrawInfo(This,lFlags,pDrawInfo)
#define IHTMLPaintSite_TransformGlobalToLocal(This,ptGlobal,pptLocal) (This)->lpVtbl->TransformGlobalToLocal(This,ptGlobal,pptLocal)
#define IHTMLPaintSite_TransformLocalToGlobal(This,ptLocal,pptGlobal) (This)->lpVtbl->TransformLocalToGlobal(This,ptLocal,pptGlobal)
#define IHTMLPaintSite_GetHitTestCookie(This,plCookie) (This)->lpVtbl->GetHitTestCookie(This,plCookie)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLPaintSite_QueryInterface(IHTMLPaintSite* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLPaintSite_AddRef(IHTMLPaintSite* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLPaintSite_Release(IHTMLPaintSite* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLPaintSite methods ***/
static FORCEINLINE HRESULT IHTMLPaintSite_InvalidatePainterInfo(IHTMLPaintSite* This) {
    return This->lpVtbl->InvalidatePainterInfo(This);
}
static FORCEINLINE HRESULT IHTMLPaintSite_InvalidateRect(IHTMLPaintSite* This,RECT *prcInvalid) {
    return This->lpVtbl->InvalidateRect(This,prcInvalid);
}
static FORCEINLINE HRESULT IHTMLPaintSite_InvalidateRegion(IHTMLPaintSite* This,HRGN rgnInvalid) {
    return This->lpVtbl->InvalidateRegion(This,rgnInvalid);
}
static FORCEINLINE HRESULT IHTMLPaintSite_GetDrawInfo(IHTMLPaintSite* This,LONG lFlags,HTML_PAINT_DRAW_INFO *pDrawInfo) {
    return This->lpVtbl->GetDrawInfo(This,lFlags,pDrawInfo);
}
static FORCEINLINE HRESULT IHTMLPaintSite_TransformGlobalToLocal(IHTMLPaintSite* This,POINT ptGlobal,POINT *pptLocal) {
    return This->lpVtbl->TransformGlobalToLocal(This,ptGlobal,pptLocal);
}
static FORCEINLINE HRESULT IHTMLPaintSite_TransformLocalToGlobal(IHTMLPaintSite* This,POINT ptLocal,POINT *pptGlobal) {
    return This->lpVtbl->TransformLocalToGlobal(This,ptLocal,pptGlobal);
}
static FORCEINLINE HRESULT IHTMLPaintSite_GetHitTestCookie(IHTMLPaintSite* This,LONG *plCookie) {
    return This->lpVtbl->GetHitTestCookie(This,plCookie);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLPaintSite_InvalidatePainterInfo_Proxy(
    IHTMLPaintSite* This);
void __RPC_STUB IHTMLPaintSite_InvalidatePainterInfo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPaintSite_InvalidateRect_Proxy(
    IHTMLPaintSite* This,
    RECT *prcInvalid);
void __RPC_STUB IHTMLPaintSite_InvalidateRect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPaintSite_InvalidateRegion_Proxy(
    IHTMLPaintSite* This,
    HRGN rgnInvalid);
void __RPC_STUB IHTMLPaintSite_InvalidateRegion_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPaintSite_GetDrawInfo_Proxy(
    IHTMLPaintSite* This,
    LONG lFlags,
    HTML_PAINT_DRAW_INFO *pDrawInfo);
void __RPC_STUB IHTMLPaintSite_GetDrawInfo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPaintSite_TransformGlobalToLocal_Proxy(
    IHTMLPaintSite* This,
    POINT ptGlobal,
    POINT *pptLocal);
void __RPC_STUB IHTMLPaintSite_TransformGlobalToLocal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPaintSite_TransformLocalToGlobal_Proxy(
    IHTMLPaintSite* This,
    POINT ptLocal,
    POINT *pptGlobal);
void __RPC_STUB IHTMLPaintSite_TransformLocalToGlobal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPaintSite_GetHitTestCookie_Proxy(
    IHTMLPaintSite* This,
    LONG *plCookie);
void __RPC_STUB IHTMLPaintSite_GetHitTestCookie_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLPaintSite_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLIPrintCollection interface
 */
#ifndef __IHTMLIPrintCollection_INTERFACE_DEFINED__
#define __IHTMLIPrintCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLIPrintCollection, 0x3050f6b5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f6b5-98b5-11cf-bb82-00aa00bdce0b")
IHTMLIPrintCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__newEnum(
        IUnknown **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE item(
        LONG index,
        IUnknown **ppIPrint) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLIPrintCollection, 0x3050f6b5, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLIPrintCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLIPrintCollection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLIPrintCollection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLIPrintCollection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLIPrintCollection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLIPrintCollection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLIPrintCollection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLIPrintCollection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLIPrintCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_length)(
        IHTMLIPrintCollection* This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get__newEnum)(
        IHTMLIPrintCollection* This,
        IUnknown **p);

    HRESULT (STDMETHODCALLTYPE *item)(
        IHTMLIPrintCollection* This,
        LONG index,
        IUnknown **ppIPrint);

    END_INTERFACE
} IHTMLIPrintCollectionVtbl;
interface IHTMLIPrintCollection {
    CONST_VTBL IHTMLIPrintCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLIPrintCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLIPrintCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLIPrintCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLIPrintCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLIPrintCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLIPrintCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLIPrintCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLIPrintCollection methods ***/
#define IHTMLIPrintCollection_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLIPrintCollection_get__newEnum(This,p) (This)->lpVtbl->get__newEnum(This,p)
#define IHTMLIPrintCollection_item(This,index,ppIPrint) (This)->lpVtbl->item(This,index,ppIPrint)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLIPrintCollection_QueryInterface(IHTMLIPrintCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLIPrintCollection_AddRef(IHTMLIPrintCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLIPrintCollection_Release(IHTMLIPrintCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLIPrintCollection_GetTypeInfoCount(IHTMLIPrintCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLIPrintCollection_GetTypeInfo(IHTMLIPrintCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLIPrintCollection_GetIDsOfNames(IHTMLIPrintCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLIPrintCollection_Invoke(IHTMLIPrintCollection* 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);
}
/*** IHTMLIPrintCollection methods ***/
static FORCEINLINE HRESULT IHTMLIPrintCollection_get_length(IHTMLIPrintCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static FORCEINLINE HRESULT IHTMLIPrintCollection_get__newEnum(IHTMLIPrintCollection* This,IUnknown **p) {
    return This->lpVtbl->get__newEnum(This,p);
}
static FORCEINLINE HRESULT IHTMLIPrintCollection_item(IHTMLIPrintCollection* This,LONG index,IUnknown **ppIPrint) {
    return This->lpVtbl->item(This,index,ppIPrint);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLIPrintCollection_get_length_Proxy(
    IHTMLIPrintCollection* This,
    LONG *p);
void __RPC_STUB IHTMLIPrintCollection_get_length_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLIPrintCollection_get__newEnum_Proxy(
    IHTMLIPrintCollection* This,
    IUnknown **p);
void __RPC_STUB IHTMLIPrintCollection_get__newEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLIPrintCollection_item_Proxy(
    IHTMLIPrintCollection* This,
    LONG index,
    IUnknown **ppIPrint);
void __RPC_STUB IHTMLIPrintCollection_item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLIPrintCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IEnumPrivacyRecords interface
 */
#ifndef __IEnumPrivacyRecords_INTERFACE_DEFINED__
#define __IEnumPrivacyRecords_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumPrivacyRecords, 0x3050f844, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f844-98b5-11cf-bb82-00aa00bdce0b")
IEnumPrivacyRecords : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSize(
        ULONG *pSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPrivacyImpacted(
        WINBOOL *pState) = 0;

    virtual HRESULT STDMETHODCALLTYPE Next(
        BSTR *pbstrUrl,
        BSTR *pbstrPolicyRef,
        LONG *pdwReserved,
        DWORD *pdwPrivacyFlags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEnumPrivacyRecords, 0x3050f844, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IEnumPrivacyRecordsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IEnumPrivacyRecords* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IEnumPrivacyRecords* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IEnumPrivacyRecords* This);

    /*** IEnumPrivacyRecords methods ***/
    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumPrivacyRecords* This);

    HRESULT (STDMETHODCALLTYPE *GetSize)(
        IEnumPrivacyRecords* This,
        ULONG *pSize);

    HRESULT (STDMETHODCALLTYPE *GetPrivacyImpacted)(
        IEnumPrivacyRecords* This,
        WINBOOL *pState);

    HRESULT (STDMETHODCALLTYPE *Next)(
        IEnumPrivacyRecords* This,
        BSTR *pbstrUrl,
        BSTR *pbstrPolicyRef,
        LONG *pdwReserved,
        DWORD *pdwPrivacyFlags);

    END_INTERFACE
} IEnumPrivacyRecordsVtbl;
interface IEnumPrivacyRecords {
    CONST_VTBL IEnumPrivacyRecordsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumPrivacyRecords_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumPrivacyRecords_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumPrivacyRecords_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumPrivacyRecords methods ***/
#define IEnumPrivacyRecords_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumPrivacyRecords_GetSize(This,pSize) (This)->lpVtbl->GetSize(This,pSize)
#define IEnumPrivacyRecords_GetPrivacyImpacted(This,pState) (This)->lpVtbl->GetPrivacyImpacted(This,pState)
#define IEnumPrivacyRecords_Next(This,pbstrUrl,pbstrPolicyRef,pdwReserved,pdwPrivacyFlags) (This)->lpVtbl->Next(This,pbstrUrl,pbstrPolicyRef,pdwReserved,pdwPrivacyFlags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEnumPrivacyRecords_QueryInterface(IEnumPrivacyRecords* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEnumPrivacyRecords_AddRef(IEnumPrivacyRecords* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEnumPrivacyRecords_Release(IEnumPrivacyRecords* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumPrivacyRecords methods ***/
static FORCEINLINE HRESULT IEnumPrivacyRecords_Reset(IEnumPrivacyRecords* This) {
    return This->lpVtbl->Reset(This);
}
static FORCEINLINE HRESULT IEnumPrivacyRecords_GetSize(IEnumPrivacyRecords* This,ULONG *pSize) {
    return This->lpVtbl->GetSize(This,pSize);
}
static FORCEINLINE HRESULT IEnumPrivacyRecords_GetPrivacyImpacted(IEnumPrivacyRecords* This,WINBOOL *pState) {
    return This->lpVtbl->GetPrivacyImpacted(This,pState);
}
static FORCEINLINE HRESULT IEnumPrivacyRecords_Next(IEnumPrivacyRecords* This,BSTR *pbstrUrl,BSTR *pbstrPolicyRef,LONG *pdwReserved,DWORD *pdwPrivacyFlags) {
    return This->lpVtbl->Next(This,pbstrUrl,pbstrPolicyRef,pdwReserved,pdwPrivacyFlags);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IEnumPrivacyRecords_Reset_Proxy(
    IEnumPrivacyRecords* This);
void __RPC_STUB IEnumPrivacyRecords_Reset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IEnumPrivacyRecords_GetSize_Proxy(
    IEnumPrivacyRecords* This,
    ULONG *pSize);
void __RPC_STUB IEnumPrivacyRecords_GetSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IEnumPrivacyRecords_GetPrivacyImpacted_Proxy(
    IEnumPrivacyRecords* This,
    WINBOOL *pState);
void __RPC_STUB IEnumPrivacyRecords_GetPrivacyImpacted_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IEnumPrivacyRecords_Next_Proxy(
    IEnumPrivacyRecords* This,
    BSTR *pbstrUrl,
    BSTR *pbstrPolicyRef,
    LONG *pdwReserved,
    DWORD *pdwPrivacyFlags);
void __RPC_STUB IEnumPrivacyRecords_Next_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IEnumPrivacyRecords_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWPCBlockedUrls interface
 */
#ifndef __IWPCBlockedUrls_INTERFACE_DEFINED__
#define __IWPCBlockedUrls_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWPCBlockedUrls, 0x30510413, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510413-98b5-11cf-bb82-00aa00bdce0b")
IWPCBlockedUrls : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCount(
        DWORD *pdwCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetUrl(
        DWORD dwIdx,
        BSTR *pbstrUrl) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWPCBlockedUrls, 0x30510413, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IWPCBlockedUrlsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWPCBlockedUrls* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWPCBlockedUrls* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWPCBlockedUrls* This);

    /*** IWPCBlockedUrls methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCount)(
        IWPCBlockedUrls* This,
        DWORD *pdwCount);

    HRESULT (STDMETHODCALLTYPE *GetUrl)(
        IWPCBlockedUrls* This,
        DWORD dwIdx,
        BSTR *pbstrUrl);

    END_INTERFACE
} IWPCBlockedUrlsVtbl;
interface IWPCBlockedUrls {
    CONST_VTBL IWPCBlockedUrlsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWPCBlockedUrls_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWPCBlockedUrls_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWPCBlockedUrls_Release(This) (This)->lpVtbl->Release(This)
/*** IWPCBlockedUrls methods ***/
#define IWPCBlockedUrls_GetCount(This,pdwCount) (This)->lpVtbl->GetCount(This,pdwCount)
#define IWPCBlockedUrls_GetUrl(This,dwIdx,pbstrUrl) (This)->lpVtbl->GetUrl(This,dwIdx,pbstrUrl)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWPCBlockedUrls_QueryInterface(IWPCBlockedUrls* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWPCBlockedUrls_AddRef(IWPCBlockedUrls* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWPCBlockedUrls_Release(IWPCBlockedUrls* This) {
    return This->lpVtbl->Release(This);
}
/*** IWPCBlockedUrls methods ***/
static FORCEINLINE HRESULT IWPCBlockedUrls_GetCount(IWPCBlockedUrls* This,DWORD *pdwCount) {
    return This->lpVtbl->GetCount(This,pdwCount);
}
static FORCEINLINE HRESULT IWPCBlockedUrls_GetUrl(IWPCBlockedUrls* This,DWORD dwIdx,BSTR *pbstrUrl) {
    return This->lpVtbl->GetUrl(This,dwIdx,pbstrUrl);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWPCBlockedUrls_GetCount_Proxy(
    IWPCBlockedUrls* This,
    DWORD *pdwCount);
void __RPC_STUB IWPCBlockedUrls_GetCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWPCBlockedUrls_GetUrl_Proxy(
    IWPCBlockedUrls* This,
    DWORD dwIdx,
    BSTR *pbstrUrl);
void __RPC_STUB IWPCBlockedUrls_GetUrl_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWPCBlockedUrls_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLDOMConstructorCollection interface
 */
#ifndef __IHTMLDOMConstructorCollection_INTERFACE_DEFINED__
#define __IHTMLDOMConstructorCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDOMConstructorCollection, 0x3051049c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3051049c-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDOMConstructorCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Attr(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_BehaviorUrnsCollection(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_BookmarkCollection(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CompatibleInfo(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CompatibleInfoCollection(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ControlRangeCollection(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CSSCurrentStyleDeclaration(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CSSRuleList(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CSSRuleStyleDeclaration(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CSSStyleDeclaration(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CSSStyleRule(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CSSStyleSheet(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DataTransfer(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DOMImplementation(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Element(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Event(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_History(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTCElementBehaviorDefaults(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLAnchorElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLAreaElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLAreasCollection(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLBaseElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLBaseFontElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLBGSoundElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLBlockElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLBodyElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLBRElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLButtonElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLCollection(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLCommentElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLDDElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLDivElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLDocument(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLDListElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLDTElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLEmbedElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLFieldSetElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLFontElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLFormElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLFrameElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLFrameSetElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLGenericElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLHeadElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLHeadingElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLHRElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLHtmlElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLIFrameElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLImageElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLInputElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLIsIndexElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLLabelElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLLegendElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLLIElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLLinkElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLMapElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLMarqueeElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLMetaElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLModelessDialog(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLNamespaceInfo(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLNamespaceInfoCollection(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLNextIdElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLNoShowElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLObjectElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLOListElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLOptionElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLParagraphElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLParamElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLPhraseElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLPluginsCollection(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLPopup(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLScriptElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLSelectElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLSpanElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLStyleElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLTableCaptionElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLTableCellElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLTableColElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLTableElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLTableRowElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLTableSectionElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLTextAreaElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLTextElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLTitleElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLUListElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HTMLUnknownElement(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Image(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Location(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_NamedNodeMap(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Navigator(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_NodeList(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Option(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Screen(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Selection(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_StaticNodeList(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Storage(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_StyleSheetList(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_StyleSheetPage(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_StyleSheetPageList(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Text(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_TextRange(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_TextRangeCollection(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_TextRectangle(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_TextRectangleList(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Window(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_XDomainRequest(
        IDispatch **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_XMLHttpRequest(
        IDispatch **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDOMConstructorCollection, 0x3051049c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDOMConstructorCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLDOMConstructorCollection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLDOMConstructorCollection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLDOMConstructorCollection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLDOMConstructorCollection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLDOMConstructorCollection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLDOMConstructorCollection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLDOMConstructorCollection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLDOMConstructorCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Attr)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_BehaviorUrnsCollection)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_BookmarkCollection)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_CompatibleInfo)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_CompatibleInfoCollection)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_ControlRangeCollection)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_CSSCurrentStyleDeclaration)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_CSSRuleList)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_CSSRuleStyleDeclaration)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_CSSStyleDeclaration)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_CSSStyleRule)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_CSSStyleSheet)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_DataTransfer)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_DOMImplementation)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_Element)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_Event)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_History)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTCElementBehaviorDefaults)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLAnchorElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLAreaElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLAreasCollection)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLBaseElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLBaseFontElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLBGSoundElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLBlockElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLBodyElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLBRElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLButtonElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLCollection)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLCommentElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLDDElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLDivElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLDocument)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLDListElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLDTElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLEmbedElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLFieldSetElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLFontElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLFormElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLFrameElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLFrameSetElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLGenericElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLHeadElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLHeadingElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLHRElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLHtmlElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLIFrameElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLImageElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLInputElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLIsIndexElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLLabelElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLLegendElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLLIElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLLinkElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLMapElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLMarqueeElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLMetaElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLModelessDialog)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLNamespaceInfo)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLNamespaceInfoCollection)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLNextIdElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLNoShowElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLObjectElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLOListElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLOptionElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLParagraphElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLParamElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLPhraseElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLPluginsCollection)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLPopup)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLScriptElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLSelectElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLSpanElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLStyleElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLTableCaptionElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLTableCellElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLTableColElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLTableElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLTableRowElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLTableSectionElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLTextAreaElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLTextElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLTitleElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLUListElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_HTMLUnknownElement)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_Image)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_Location)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_NamedNodeMap)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_Navigator)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_NodeList)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_Option)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_Screen)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_Selection)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_StaticNodeList)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_Storage)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_StyleSheetList)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_StyleSheetPage)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_StyleSheetPageList)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_Text)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_TextRange)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_TextRangeCollection)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_TextRectangle)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_TextRectangleList)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_Window)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_XDomainRequest)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    HRESULT (STDMETHODCALLTYPE *get_XMLHttpRequest)(
        IHTMLDOMConstructorCollection* This,
        IDispatch **p);

    END_INTERFACE
} IHTMLDOMConstructorCollectionVtbl;
interface IHTMLDOMConstructorCollection {
    CONST_VTBL IHTMLDOMConstructorCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDOMConstructorCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDOMConstructorCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDOMConstructorCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDOMConstructorCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDOMConstructorCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDOMConstructorCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDOMConstructorCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDOMConstructorCollection methods ***/
#define IHTMLDOMConstructorCollection_get_Attr(This,p) (This)->lpVtbl->get_Attr(This,p)
#define IHTMLDOMConstructorCollection_get_BehaviorUrnsCollection(This,p) (This)->lpVtbl->get_BehaviorUrnsCollection(This,p)
#define IHTMLDOMConstructorCollection_get_BookmarkCollection(This,p) (This)->lpVtbl->get_BookmarkCollection(This,p)
#define IHTMLDOMConstructorCollection_get_CompatibleInfo(This,p) (This)->lpVtbl->get_CompatibleInfo(This,p)
#define IHTMLDOMConstructorCollection_get_CompatibleInfoCollection(This,p) (This)->lpVtbl->get_CompatibleInfoCollection(This,p)
#define IHTMLDOMConstructorCollection_get_ControlRangeCollection(This,p) (This)->lpVtbl->get_ControlRangeCollection(This,p)
#define IHTMLDOMConstructorCollection_get_CSSCurrentStyleDeclaration(This,p) (This)->lpVtbl->get_CSSCurrentStyleDeclaration(This,p)
#define IHTMLDOMConstructorCollection_get_CSSRuleList(This,p) (This)->lpVtbl->get_CSSRuleList(This,p)
#define IHTMLDOMConstructorCollection_get_CSSRuleStyleDeclaration(This,p) (This)->lpVtbl->get_CSSRuleStyleDeclaration(This,p)
#define IHTMLDOMConstructorCollection_get_CSSStyleDeclaration(This,p) (This)->lpVtbl->get_CSSStyleDeclaration(This,p)
#define IHTMLDOMConstructorCollection_get_CSSStyleRule(This,p) (This)->lpVtbl->get_CSSStyleRule(This,p)
#define IHTMLDOMConstructorCollection_get_CSSStyleSheet(This,p) (This)->lpVtbl->get_CSSStyleSheet(This,p)
#define IHTMLDOMConstructorCollection_get_DataTransfer(This,p) (This)->lpVtbl->get_DataTransfer(This,p)
#define IHTMLDOMConstructorCollection_get_DOMImplementation(This,p) (This)->lpVtbl->get_DOMImplementation(This,p)
#define IHTMLDOMConstructorCollection_get_Element(This,p) (This)->lpVtbl->get_Element(This,p)
#define IHTMLDOMConstructorCollection_get_Event(This,p) (This)->lpVtbl->get_Event(This,p)
#define IHTMLDOMConstructorCollection_get_History(This,p) (This)->lpVtbl->get_History(This,p)
#define IHTMLDOMConstructorCollection_get_HTCElementBehaviorDefaults(This,p) (This)->lpVtbl->get_HTCElementBehaviorDefaults(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLAnchorElement(This,p) (This)->lpVtbl->get_HTMLAnchorElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLAreaElement(This,p) (This)->lpVtbl->get_HTMLAreaElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLAreasCollection(This,p) (This)->lpVtbl->get_HTMLAreasCollection(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLBaseElement(This,p) (This)->lpVtbl->get_HTMLBaseElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLBaseFontElement(This,p) (This)->lpVtbl->get_HTMLBaseFontElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLBGSoundElement(This,p) (This)->lpVtbl->get_HTMLBGSoundElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLBlockElement(This,p) (This)->lpVtbl->get_HTMLBlockElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLBodyElement(This,p) (This)->lpVtbl->get_HTMLBodyElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLBRElement(This,p) (This)->lpVtbl->get_HTMLBRElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLButtonElement(This,p) (This)->lpVtbl->get_HTMLButtonElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLCollection(This,p) (This)->lpVtbl->get_HTMLCollection(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLCommentElement(This,p) (This)->lpVtbl->get_HTMLCommentElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLDDElement(This,p) (This)->lpVtbl->get_HTMLDDElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLDivElement(This,p) (This)->lpVtbl->get_HTMLDivElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLDocument(This,p) (This)->lpVtbl->get_HTMLDocument(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLDListElement(This,p) (This)->lpVtbl->get_HTMLDListElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLDTElement(This,p) (This)->lpVtbl->get_HTMLDTElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLEmbedElement(This,p) (This)->lpVtbl->get_HTMLEmbedElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLFieldSetElement(This,p) (This)->lpVtbl->get_HTMLFieldSetElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLFontElement(This,p) (This)->lpVtbl->get_HTMLFontElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLFormElement(This,p) (This)->lpVtbl->get_HTMLFormElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLFrameElement(This,p) (This)->lpVtbl->get_HTMLFrameElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLFrameSetElement(This,p) (This)->lpVtbl->get_HTMLFrameSetElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLGenericElement(This,p) (This)->lpVtbl->get_HTMLGenericElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLHeadElement(This,p) (This)->lpVtbl->get_HTMLHeadElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLHeadingElement(This,p) (This)->lpVtbl->get_HTMLHeadingElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLHRElement(This,p) (This)->lpVtbl->get_HTMLHRElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLHtmlElement(This,p) (This)->lpVtbl->get_HTMLHtmlElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLIFrameElement(This,p) (This)->lpVtbl->get_HTMLIFrameElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLImageElement(This,p) (This)->lpVtbl->get_HTMLImageElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLInputElement(This,p) (This)->lpVtbl->get_HTMLInputElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLIsIndexElement(This,p) (This)->lpVtbl->get_HTMLIsIndexElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLLabelElement(This,p) (This)->lpVtbl->get_HTMLLabelElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLLegendElement(This,p) (This)->lpVtbl->get_HTMLLegendElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLLIElement(This,p) (This)->lpVtbl->get_HTMLLIElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLLinkElement(This,p) (This)->lpVtbl->get_HTMLLinkElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLMapElement(This,p) (This)->lpVtbl->get_HTMLMapElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLMarqueeElement(This,p) (This)->lpVtbl->get_HTMLMarqueeElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLMetaElement(This,p) (This)->lpVtbl->get_HTMLMetaElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLModelessDialog(This,p) (This)->lpVtbl->get_HTMLModelessDialog(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLNamespaceInfo(This,p) (This)->lpVtbl->get_HTMLNamespaceInfo(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLNamespaceInfoCollection(This,p) (This)->lpVtbl->get_HTMLNamespaceInfoCollection(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLNextIdElement(This,p) (This)->lpVtbl->get_HTMLNextIdElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLNoShowElement(This,p) (This)->lpVtbl->get_HTMLNoShowElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLObjectElement(This,p) (This)->lpVtbl->get_HTMLObjectElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLOListElement(This,p) (This)->lpVtbl->get_HTMLOListElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLOptionElement(This,p) (This)->lpVtbl->get_HTMLOptionElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLParagraphElement(This,p) (This)->lpVtbl->get_HTMLParagraphElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLParamElement(This,p) (This)->lpVtbl->get_HTMLParamElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLPhraseElement(This,p) (This)->lpVtbl->get_HTMLPhraseElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLPluginsCollection(This,p) (This)->lpVtbl->get_HTMLPluginsCollection(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLPopup(This,p) (This)->lpVtbl->get_HTMLPopup(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLScriptElement(This,p) (This)->lpVtbl->get_HTMLScriptElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLSelectElement(This,p) (This)->lpVtbl->get_HTMLSelectElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLSpanElement(This,p) (This)->lpVtbl->get_HTMLSpanElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLStyleElement(This,p) (This)->lpVtbl->get_HTMLStyleElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLTableCaptionElement(This,p) (This)->lpVtbl->get_HTMLTableCaptionElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLTableCellElement(This,p) (This)->lpVtbl->get_HTMLTableCellElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLTableColElement(This,p) (This)->lpVtbl->get_HTMLTableColElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLTableElement(This,p) (This)->lpVtbl->get_HTMLTableElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLTableRowElement(This,p) (This)->lpVtbl->get_HTMLTableRowElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLTableSectionElement(This,p) (This)->lpVtbl->get_HTMLTableSectionElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLTextAreaElement(This,p) (This)->lpVtbl->get_HTMLTextAreaElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLTextElement(This,p) (This)->lpVtbl->get_HTMLTextElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLTitleElement(This,p) (This)->lpVtbl->get_HTMLTitleElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLUListElement(This,p) (This)->lpVtbl->get_HTMLUListElement(This,p)
#define IHTMLDOMConstructorCollection_get_HTMLUnknownElement(This,p) (This)->lpVtbl->get_HTMLUnknownElement(This,p)
#define IHTMLDOMConstructorCollection_get_Image(This,p) (This)->lpVtbl->get_Image(This,p)
#define IHTMLDOMConstructorCollection_get_Location(This,p) (This)->lpVtbl->get_Location(This,p)
#define IHTMLDOMConstructorCollection_get_NamedNodeMap(This,p) (This)->lpVtbl->get_NamedNodeMap(This,p)
#define IHTMLDOMConstructorCollection_get_Navigator(This,p) (This)->lpVtbl->get_Navigator(This,p)
#define IHTMLDOMConstructorCollection_get_NodeList(This,p) (This)->lpVtbl->get_NodeList(This,p)
#define IHTMLDOMConstructorCollection_get_Option(This,p) (This)->lpVtbl->get_Option(This,p)
#define IHTMLDOMConstructorCollection_get_Screen(This,p) (This)->lpVtbl->get_Screen(This,p)
#define IHTMLDOMConstructorCollection_get_Selection(This,p) (This)->lpVtbl->get_Selection(This,p)
#define IHTMLDOMConstructorCollection_get_StaticNodeList(This,p) (This)->lpVtbl->get_StaticNodeList(This,p)
#define IHTMLDOMConstructorCollection_get_Storage(This,p) (This)->lpVtbl->get_Storage(This,p)
#define IHTMLDOMConstructorCollection_get_StyleSheetList(This,p) (This)->lpVtbl->get_StyleSheetList(This,p)
#define IHTMLDOMConstructorCollection_get_StyleSheetPage(This,p) (This)->lpVtbl->get_StyleSheetPage(This,p)
#define IHTMLDOMConstructorCollection_get_StyleSheetPageList(This,p) (This)->lpVtbl->get_StyleSheetPageList(This,p)
#define IHTMLDOMConstructorCollection_get_Text(This,p) (This)->lpVtbl->get_Text(This,p)
#define IHTMLDOMConstructorCollection_get_TextRange(This,p) (This)->lpVtbl->get_TextRange(This,p)
#define IHTMLDOMConstructorCollection_get_TextRangeCollection(This,p) (This)->lpVtbl->get_TextRangeCollection(This,p)
#define IHTMLDOMConstructorCollection_get_TextRectangle(This,p) (This)->lpVtbl->get_TextRectangle(This,p)
#define IHTMLDOMConstructorCollection_get_TextRectangleList(This,p) (This)->lpVtbl->get_TextRectangleList(This,p)
#define IHTMLDOMConstructorCollection_get_Window(This,p) (This)->lpVtbl->get_Window(This,p)
#define IHTMLDOMConstructorCollection_get_XDomainRequest(This,p) (This)->lpVtbl->get_XDomainRequest(This,p)
#define IHTMLDOMConstructorCollection_get_XMLHttpRequest(This,p) (This)->lpVtbl->get_XMLHttpRequest(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_QueryInterface(IHTMLDOMConstructorCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDOMConstructorCollection_AddRef(IHTMLDOMConstructorCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDOMConstructorCollection_Release(IHTMLDOMConstructorCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_GetTypeInfoCount(IHTMLDOMConstructorCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_GetTypeInfo(IHTMLDOMConstructorCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_GetIDsOfNames(IHTMLDOMConstructorCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_Invoke(IHTMLDOMConstructorCollection* 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);
}
/*** IHTMLDOMConstructorCollection methods ***/
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_Attr(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_Attr(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_BehaviorUrnsCollection(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_BehaviorUrnsCollection(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_BookmarkCollection(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_BookmarkCollection(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_CompatibleInfo(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_CompatibleInfo(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_CompatibleInfoCollection(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_CompatibleInfoCollection(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_ControlRangeCollection(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_ControlRangeCollection(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_CSSCurrentStyleDeclaration(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_CSSCurrentStyleDeclaration(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_CSSRuleList(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_CSSRuleList(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_CSSRuleStyleDeclaration(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_CSSRuleStyleDeclaration(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_CSSStyleDeclaration(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_CSSStyleDeclaration(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_CSSStyleRule(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_CSSStyleRule(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_CSSStyleSheet(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_CSSStyleSheet(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_DataTransfer(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_DataTransfer(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_DOMImplementation(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_DOMImplementation(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_Element(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_Element(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_Event(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_Event(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_History(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_History(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTCElementBehaviorDefaults(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTCElementBehaviorDefaults(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLAnchorElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLAnchorElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLAreaElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLAreaElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLAreasCollection(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLAreasCollection(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLBaseElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLBaseElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLBaseFontElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLBaseFontElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLBGSoundElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLBGSoundElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLBlockElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLBlockElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLBodyElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLBodyElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLBRElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLBRElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLButtonElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLButtonElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLCollection(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLCollection(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLCommentElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLCommentElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLDDElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLDDElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLDivElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLDivElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLDocument(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLDocument(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLDListElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLDListElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLDTElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLDTElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLEmbedElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLEmbedElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLFieldSetElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLFieldSetElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLFontElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLFontElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLFormElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLFormElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLFrameElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLFrameElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLFrameSetElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLFrameSetElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLGenericElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLGenericElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLHeadElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLHeadElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLHeadingElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLHeadingElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLHRElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLHRElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLHtmlElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLHtmlElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLIFrameElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLIFrameElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLImageElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLImageElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLInputElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLInputElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLIsIndexElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLIsIndexElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLLabelElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLLabelElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLLegendElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLLegendElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLLIElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLLIElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLLinkElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLLinkElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLMapElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLMapElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLMarqueeElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLMarqueeElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLMetaElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLMetaElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLModelessDialog(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLModelessDialog(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLNamespaceInfo(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLNamespaceInfo(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLNamespaceInfoCollection(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLNamespaceInfoCollection(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLNextIdElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLNextIdElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLNoShowElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLNoShowElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLObjectElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLObjectElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLOListElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLOListElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLOptionElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLOptionElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLParagraphElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLParagraphElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLParamElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLParamElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLPhraseElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLPhraseElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLPluginsCollection(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLPluginsCollection(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLPopup(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLPopup(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLScriptElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLScriptElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLSelectElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLSelectElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLSpanElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLSpanElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLStyleElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLStyleElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLTableCaptionElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLTableCaptionElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLTableCellElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLTableCellElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLTableColElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLTableColElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLTableElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLTableElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLTableRowElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLTableRowElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLTableSectionElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLTableSectionElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLTextAreaElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLTextAreaElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLTextElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLTextElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLTitleElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLTitleElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLUListElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLUListElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLUnknownElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLUnknownElement(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_Image(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_Image(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_Location(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_Location(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_NamedNodeMap(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_NamedNodeMap(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_Navigator(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_Navigator(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_NodeList(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_NodeList(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_Option(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_Option(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_Screen(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_Screen(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_Selection(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_Selection(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_StaticNodeList(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_StaticNodeList(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_Storage(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_Storage(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_StyleSheetList(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_StyleSheetList(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_StyleSheetPage(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_StyleSheetPage(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_StyleSheetPageList(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_StyleSheetPageList(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_Text(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_Text(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_TextRange(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_TextRange(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_TextRangeCollection(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_TextRangeCollection(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_TextRectangle(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_TextRectangle(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_TextRectangleList(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_TextRectangleList(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_Window(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_Window(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_XDomainRequest(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_XDomainRequest(This,p);
}
static FORCEINLINE HRESULT IHTMLDOMConstructorCollection_get_XMLHttpRequest(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_XMLHttpRequest(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_Attr_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_Attr_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_BehaviorUrnsCollection_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_BehaviorUrnsCollection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_BookmarkCollection_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_BookmarkCollection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_CompatibleInfo_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_CompatibleInfo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_CompatibleInfoCollection_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_CompatibleInfoCollection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_ControlRangeCollection_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_ControlRangeCollection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_CSSCurrentStyleDeclaration_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_CSSCurrentStyleDeclaration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_CSSRuleList_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_CSSRuleList_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_CSSRuleStyleDeclaration_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_CSSRuleStyleDeclaration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_CSSStyleDeclaration_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_CSSStyleDeclaration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_CSSStyleRule_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_CSSStyleRule_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_CSSStyleSheet_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_CSSStyleSheet_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_DataTransfer_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_DataTransfer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_DOMImplementation_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_DOMImplementation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_Element_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_Element_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_Event_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_Event_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_History_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_History_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTCElementBehaviorDefaults_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTCElementBehaviorDefaults_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLAnchorElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLAnchorElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLAreaElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLAreaElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLAreasCollection_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLAreasCollection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLBaseElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLBaseElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLBaseFontElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLBaseFontElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLBGSoundElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLBGSoundElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLBlockElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLBlockElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLBodyElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLBodyElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLBRElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLBRElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLButtonElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLButtonElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLCollection_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLCollection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLCommentElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLCommentElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLDDElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLDDElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLDivElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLDivElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLDocument_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLDocument_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLDListElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLDListElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLDTElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLDTElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLEmbedElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLEmbedElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLFieldSetElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLFieldSetElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLFontElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLFontElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLFormElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLFormElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLFrameElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLFrameElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLFrameSetElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLFrameSetElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLGenericElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLGenericElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLHeadElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLHeadElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLHeadingElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLHeadingElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLHRElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLHRElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLHtmlElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLHtmlElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLIFrameElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLIFrameElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLImageElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLImageElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLInputElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLInputElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLIsIndexElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLIsIndexElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLLabelElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLLabelElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLLegendElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLLegendElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLLIElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLLIElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLLinkElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLLinkElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLMapElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLMapElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLMarqueeElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLMarqueeElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLMetaElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLMetaElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLModelessDialog_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLModelessDialog_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLNamespaceInfo_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLNamespaceInfo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLNamespaceInfoCollection_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLNamespaceInfoCollection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLNextIdElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLNextIdElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLNoShowElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLNoShowElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLObjectElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLObjectElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLOListElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLOListElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLOptionElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLOptionElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLParagraphElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLParagraphElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLParamElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLParamElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLPhraseElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLPhraseElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLPluginsCollection_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLPluginsCollection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLPopup_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLPopup_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLScriptElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLScriptElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLSelectElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLSelectElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLSpanElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLSpanElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLStyleElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLStyleElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLTableCaptionElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLTableCaptionElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLTableCellElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLTableCellElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLTableColElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLTableColElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLTableElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLTableElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLTableRowElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLTableRowElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLTableSectionElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLTableSectionElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLTextAreaElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLTextAreaElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLTextElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLTextElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLTitleElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLTitleElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLUListElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLUListElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_HTMLUnknownElement_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_HTMLUnknownElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_Image_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_Image_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_Location_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_Location_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_NamedNodeMap_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_NamedNodeMap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_Navigator_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_Navigator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_NodeList_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_NodeList_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_Option_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_Option_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_Screen_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_Screen_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_Selection_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_Selection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_StaticNodeList_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_StaticNodeList_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_Storage_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_Storage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_StyleSheetList_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_StyleSheetList_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_StyleSheetPage_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_StyleSheetPage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_StyleSheetPageList_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_StyleSheetPageList_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_Text_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_Text_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_TextRange_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_TextRange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_TextRangeCollection_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_TextRangeCollection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_TextRectangle_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_TextRectangle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_TextRectangleList_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_TextRectangleList_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_Window_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_Window_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_XDomainRequest_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_XDomainRequest_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDOMConstructorCollection_get_XMLHttpRequest_Proxy(
    IHTMLDOMConstructorCollection* This,
    IDispatch **p);
void __RPC_STUB IHTMLDOMConstructorCollection_get_XMLHttpRequest_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDOMConstructorCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLDialog interface
 */
#ifndef __IHTMLDialog_INTERFACE_DEFINED__
#define __IHTMLDialog_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDialog, 0x3050f216, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f216-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDialog : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_dialogTop(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_dialogTop(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_dialogLeft(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_dialogLeft(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_dialogWidth(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_dialogWidth(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_dialogHeight(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_dialogHeight(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_dialogArguments(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_menuArguments(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_returnValue(
        VARIANT v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_returnValue(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE close(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE toString(
        BSTR *String) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDialog, 0x3050f216, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDialogVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLDialog* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLDialog* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLDialog* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLDialog* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLDialog* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLDialog* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLDialog* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLDialog methods ***/
    HRESULT (STDMETHODCALLTYPE *put_dialogTop)(
        IHTMLDialog* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_dialogTop)(
        IHTMLDialog* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_dialogLeft)(
        IHTMLDialog* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_dialogLeft)(
        IHTMLDialog* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_dialogWidth)(
        IHTMLDialog* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_dialogWidth)(
        IHTMLDialog* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_dialogHeight)(
        IHTMLDialog* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_dialogHeight)(
        IHTMLDialog* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_dialogArguments)(
        IHTMLDialog* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_menuArguments)(
        IHTMLDialog* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *put_returnValue)(
        IHTMLDialog* This,
        VARIANT v);

    HRESULT (STDMETHODCALLTYPE *get_returnValue)(
        IHTMLDialog* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *close)(
        IHTMLDialog* This);

    HRESULT (STDMETHODCALLTYPE *toString)(
        IHTMLDialog* This,
        BSTR *String);

    END_INTERFACE
} IHTMLDialogVtbl;
interface IHTMLDialog {
    CONST_VTBL IHTMLDialogVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDialog_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDialog_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDialog_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDialog_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDialog_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDialog_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDialog_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDialog methods ***/
#define IHTMLDialog_put_dialogTop(This,v) (This)->lpVtbl->put_dialogTop(This,v)
#define IHTMLDialog_get_dialogTop(This,p) (This)->lpVtbl->get_dialogTop(This,p)
#define IHTMLDialog_put_dialogLeft(This,v) (This)->lpVtbl->put_dialogLeft(This,v)
#define IHTMLDialog_get_dialogLeft(This,p) (This)->lpVtbl->get_dialogLeft(This,p)
#define IHTMLDialog_put_dialogWidth(This,v) (This)->lpVtbl->put_dialogWidth(This,v)
#define IHTMLDialog_get_dialogWidth(This,p) (This)->lpVtbl->get_dialogWidth(This,p)
#define IHTMLDialog_put_dialogHeight(This,v) (This)->lpVtbl->put_dialogHeight(This,v)
#define IHTMLDialog_get_dialogHeight(This,p) (This)->lpVtbl->get_dialogHeight(This,p)
#define IHTMLDialog_get_dialogArguments(This,p) (This)->lpVtbl->get_dialogArguments(This,p)
#define IHTMLDialog_get_menuArguments(This,p) (This)->lpVtbl->get_menuArguments(This,p)
#define IHTMLDialog_put_returnValue(This,v) (This)->lpVtbl->put_returnValue(This,v)
#define IHTMLDialog_get_returnValue(This,p) (This)->lpVtbl->get_returnValue(This,p)
#define IHTMLDialog_close(This) (This)->lpVtbl->close(This)
#define IHTMLDialog_toString(This,String) (This)->lpVtbl->toString(This,String)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDialog_QueryInterface(IHTMLDialog* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDialog_AddRef(IHTMLDialog* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDialog_Release(IHTMLDialog* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDialog_GetTypeInfoCount(IHTMLDialog* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDialog_GetTypeInfo(IHTMLDialog* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDialog_GetIDsOfNames(IHTMLDialog* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDialog_Invoke(IHTMLDialog* 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);
}
/*** IHTMLDialog methods ***/
static FORCEINLINE HRESULT IHTMLDialog_put_dialogTop(IHTMLDialog* This,VARIANT v) {
    return This->lpVtbl->put_dialogTop(This,v);
}
static FORCEINLINE HRESULT IHTMLDialog_get_dialogTop(IHTMLDialog* This,VARIANT *p) {
    return This->lpVtbl->get_dialogTop(This,p);
}
static FORCEINLINE HRESULT IHTMLDialog_put_dialogLeft(IHTMLDialog* This,VARIANT v) {
    return This->lpVtbl->put_dialogLeft(This,v);
}
static FORCEINLINE HRESULT IHTMLDialog_get_dialogLeft(IHTMLDialog* This,VARIANT *p) {
    return This->lpVtbl->get_dialogLeft(This,p);
}
static FORCEINLINE HRESULT IHTMLDialog_put_dialogWidth(IHTMLDialog* This,VARIANT v) {
    return This->lpVtbl->put_dialogWidth(This,v);
}
static FORCEINLINE HRESULT IHTMLDialog_get_dialogWidth(IHTMLDialog* This,VARIANT *p) {
    return This->lpVtbl->get_dialogWidth(This,p);
}
static FORCEINLINE HRESULT IHTMLDialog_put_dialogHeight(IHTMLDialog* This,VARIANT v) {
    return This->lpVtbl->put_dialogHeight(This,v);
}
static FORCEINLINE HRESULT IHTMLDialog_get_dialogHeight(IHTMLDialog* This,VARIANT *p) {
    return This->lpVtbl->get_dialogHeight(This,p);
}
static FORCEINLINE HRESULT IHTMLDialog_get_dialogArguments(IHTMLDialog* This,VARIANT *p) {
    return This->lpVtbl->get_dialogArguments(This,p);
}
static FORCEINLINE HRESULT IHTMLDialog_get_menuArguments(IHTMLDialog* This,VARIANT *p) {
    return This->lpVtbl->get_menuArguments(This,p);
}
static FORCEINLINE HRESULT IHTMLDialog_put_returnValue(IHTMLDialog* This,VARIANT v) {
    return This->lpVtbl->put_returnValue(This,v);
}
static FORCEINLINE HRESULT IHTMLDialog_get_returnValue(IHTMLDialog* This,VARIANT *p) {
    return This->lpVtbl->get_returnValue(This,p);
}
static FORCEINLINE HRESULT IHTMLDialog_close(IHTMLDialog* This) {
    return This->lpVtbl->close(This);
}
static FORCEINLINE HRESULT IHTMLDialog_toString(IHTMLDialog* This,BSTR *String) {
    return This->lpVtbl->toString(This,String);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDialog_put_dialogTop_Proxy(
    IHTMLDialog* This,
    VARIANT v);
void __RPC_STUB IHTMLDialog_put_dialogTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDialog_get_dialogTop_Proxy(
    IHTMLDialog* This,
    VARIANT *p);
void __RPC_STUB IHTMLDialog_get_dialogTop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDialog_put_dialogLeft_Proxy(
    IHTMLDialog* This,
    VARIANT v);
void __RPC_STUB IHTMLDialog_put_dialogLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDialog_get_dialogLeft_Proxy(
    IHTMLDialog* This,
    VARIANT *p);
void __RPC_STUB IHTMLDialog_get_dialogLeft_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDialog_put_dialogWidth_Proxy(
    IHTMLDialog* This,
    VARIANT v);
void __RPC_STUB IHTMLDialog_put_dialogWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDialog_get_dialogWidth_Proxy(
    IHTMLDialog* This,
    VARIANT *p);
void __RPC_STUB IHTMLDialog_get_dialogWidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDialog_put_dialogHeight_Proxy(
    IHTMLDialog* This,
    VARIANT v);
void __RPC_STUB IHTMLDialog_put_dialogHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDialog_get_dialogHeight_Proxy(
    IHTMLDialog* This,
    VARIANT *p);
void __RPC_STUB IHTMLDialog_get_dialogHeight_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDialog_get_dialogArguments_Proxy(
    IHTMLDialog* This,
    VARIANT *p);
void __RPC_STUB IHTMLDialog_get_dialogArguments_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDialog_get_menuArguments_Proxy(
    IHTMLDialog* This,
    VARIANT *p);
void __RPC_STUB IHTMLDialog_get_menuArguments_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDialog_put_returnValue_Proxy(
    IHTMLDialog* This,
    VARIANT v);
void __RPC_STUB IHTMLDialog_put_returnValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDialog_get_returnValue_Proxy(
    IHTMLDialog* This,
    VARIANT *p);
void __RPC_STUB IHTMLDialog_get_returnValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDialog_close_Proxy(
    IHTMLDialog* This);
void __RPC_STUB IHTMLDialog_close_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDialog_toString_Proxy(
    IHTMLDialog* This,
    BSTR *String);
void __RPC_STUB IHTMLDialog_toString_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDialog_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLDialog2 interface
 */
#ifndef __IHTMLDialog2_INTERFACE_DEFINED__
#define __IHTMLDialog2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDialog2, 0x3050f5e0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f5e0-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDialog2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_status(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_status(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_resizable(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_resizable(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDialog2, 0x3050f5e0, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDialog2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLDialog2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLDialog2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLDialog2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLDialog2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLDialog2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLDialog2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLDialog2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLDialog2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_status)(
        IHTMLDialog2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_status)(
        IHTMLDialog2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_resizable)(
        IHTMLDialog2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_resizable)(
        IHTMLDialog2* This,
        BSTR *p);

    END_INTERFACE
} IHTMLDialog2Vtbl;
interface IHTMLDialog2 {
    CONST_VTBL IHTMLDialog2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDialog2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDialog2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDialog2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDialog2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDialog2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDialog2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDialog2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDialog2 methods ***/
#define IHTMLDialog2_put_status(This,v) (This)->lpVtbl->put_status(This,v)
#define IHTMLDialog2_get_status(This,p) (This)->lpVtbl->get_status(This,p)
#define IHTMLDialog2_put_resizable(This,v) (This)->lpVtbl->put_resizable(This,v)
#define IHTMLDialog2_get_resizable(This,p) (This)->lpVtbl->get_resizable(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDialog2_QueryInterface(IHTMLDialog2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDialog2_AddRef(IHTMLDialog2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDialog2_Release(IHTMLDialog2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDialog2_GetTypeInfoCount(IHTMLDialog2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDialog2_GetTypeInfo(IHTMLDialog2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDialog2_GetIDsOfNames(IHTMLDialog2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDialog2_Invoke(IHTMLDialog2* 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);
}
/*** IHTMLDialog2 methods ***/
static FORCEINLINE HRESULT IHTMLDialog2_put_status(IHTMLDialog2* This,BSTR v) {
    return This->lpVtbl->put_status(This,v);
}
static FORCEINLINE HRESULT IHTMLDialog2_get_status(IHTMLDialog2* This,BSTR *p) {
    return This->lpVtbl->get_status(This,p);
}
static FORCEINLINE HRESULT IHTMLDialog2_put_resizable(IHTMLDialog2* This,BSTR v) {
    return This->lpVtbl->put_resizable(This,v);
}
static FORCEINLINE HRESULT IHTMLDialog2_get_resizable(IHTMLDialog2* This,BSTR *p) {
    return This->lpVtbl->get_resizable(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDialog2_put_status_Proxy(
    IHTMLDialog2* This,
    BSTR v);
void __RPC_STUB IHTMLDialog2_put_status_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDialog2_get_status_Proxy(
    IHTMLDialog2* This,
    BSTR *p);
void __RPC_STUB IHTMLDialog2_get_status_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDialog2_put_resizable_Proxy(
    IHTMLDialog2* This,
    BSTR v);
void __RPC_STUB IHTMLDialog2_put_resizable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDialog2_get_resizable_Proxy(
    IHTMLDialog2* This,
    BSTR *p);
void __RPC_STUB IHTMLDialog2_get_resizable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDialog2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLDialog3 interface
 */
#ifndef __IHTMLDialog3_INTERFACE_DEFINED__
#define __IHTMLDialog3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLDialog3, 0x3050f388, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f388-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDialog3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_unadorned(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_unadorned(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_dialogHide(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_dialogHide(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLDialog3, 0x3050f388, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLDialog3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLDialog3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLDialog3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLDialog3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLDialog3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLDialog3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLDialog3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLDialog3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLDialog3 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_unadorned)(
        IHTMLDialog3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_unadorned)(
        IHTMLDialog3* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_dialogHide)(
        IHTMLDialog3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_dialogHide)(
        IHTMLDialog3* This,
        BSTR *p);

    END_INTERFACE
} IHTMLDialog3Vtbl;
interface IHTMLDialog3 {
    CONST_VTBL IHTMLDialog3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLDialog3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLDialog3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLDialog3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLDialog3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLDialog3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLDialog3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLDialog3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLDialog3 methods ***/
#define IHTMLDialog3_put_unadorned(This,v) (This)->lpVtbl->put_unadorned(This,v)
#define IHTMLDialog3_get_unadorned(This,p) (This)->lpVtbl->get_unadorned(This,p)
#define IHTMLDialog3_put_dialogHide(This,v) (This)->lpVtbl->put_dialogHide(This,v)
#define IHTMLDialog3_get_dialogHide(This,p) (This)->lpVtbl->get_dialogHide(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLDialog3_QueryInterface(IHTMLDialog3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLDialog3_AddRef(IHTMLDialog3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLDialog3_Release(IHTMLDialog3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLDialog3_GetTypeInfoCount(IHTMLDialog3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLDialog3_GetTypeInfo(IHTMLDialog3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLDialog3_GetIDsOfNames(IHTMLDialog3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLDialog3_Invoke(IHTMLDialog3* 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);
}
/*** IHTMLDialog3 methods ***/
static FORCEINLINE HRESULT IHTMLDialog3_put_unadorned(IHTMLDialog3* This,BSTR v) {
    return This->lpVtbl->put_unadorned(This,v);
}
static FORCEINLINE HRESULT IHTMLDialog3_get_unadorned(IHTMLDialog3* This,BSTR *p) {
    return This->lpVtbl->get_unadorned(This,p);
}
static FORCEINLINE HRESULT IHTMLDialog3_put_dialogHide(IHTMLDialog3* This,BSTR v) {
    return This->lpVtbl->put_dialogHide(This,v);
}
static FORCEINLINE HRESULT IHTMLDialog3_get_dialogHide(IHTMLDialog3* This,BSTR *p) {
    return This->lpVtbl->get_dialogHide(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLDialog3_put_unadorned_Proxy(
    IHTMLDialog3* This,
    BSTR v);
void __RPC_STUB IHTMLDialog3_put_unadorned_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDialog3_get_unadorned_Proxy(
    IHTMLDialog3* This,
    BSTR *p);
void __RPC_STUB IHTMLDialog3_get_unadorned_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDialog3_put_dialogHide_Proxy(
    IHTMLDialog3* This,
    BSTR v);
void __RPC_STUB IHTMLDialog3_put_dialogHide_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLDialog3_get_dialogHide_Proxy(
    IHTMLDialog3* This,
    BSTR *p);
void __RPC_STUB IHTMLDialog3_get_dialogHide_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLDialog3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLModelessInit interface
 */
#ifndef __IHTMLModelessInit_INTERFACE_DEFINED__
#define __IHTMLModelessInit_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLModelessInit, 0x3050f5e4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f5e4-98b5-11cf-bb82-00aa00bdce0b")
IHTMLModelessInit : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_parameters(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_optionString(
        VARIANT *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_moniker(
        IUnknown **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_document(
        IUnknown **p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLModelessInit, 0x3050f5e4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLModelessInitVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLModelessInit* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLModelessInit* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLModelessInit* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLModelessInit* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLModelessInit* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLModelessInit* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLModelessInit* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLModelessInit methods ***/
    HRESULT (STDMETHODCALLTYPE *get_parameters)(
        IHTMLModelessInit* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_optionString)(
        IHTMLModelessInit* This,
        VARIANT *p);

    HRESULT (STDMETHODCALLTYPE *get_moniker)(
        IHTMLModelessInit* This,
        IUnknown **p);

    HRESULT (STDMETHODCALLTYPE *get_document)(
        IHTMLModelessInit* This,
        IUnknown **p);

    END_INTERFACE
} IHTMLModelessInitVtbl;
interface IHTMLModelessInit {
    CONST_VTBL IHTMLModelessInitVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLModelessInit_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLModelessInit_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLModelessInit_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLModelessInit_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLModelessInit_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLModelessInit_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLModelessInit_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLModelessInit methods ***/
#define IHTMLModelessInit_get_parameters(This,p) (This)->lpVtbl->get_parameters(This,p)
#define IHTMLModelessInit_get_optionString(This,p) (This)->lpVtbl->get_optionString(This,p)
#define IHTMLModelessInit_get_moniker(This,p) (This)->lpVtbl->get_moniker(This,p)
#define IHTMLModelessInit_get_document(This,p) (This)->lpVtbl->get_document(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLModelessInit_QueryInterface(IHTMLModelessInit* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLModelessInit_AddRef(IHTMLModelessInit* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLModelessInit_Release(IHTMLModelessInit* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLModelessInit_GetTypeInfoCount(IHTMLModelessInit* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLModelessInit_GetTypeInfo(IHTMLModelessInit* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLModelessInit_GetIDsOfNames(IHTMLModelessInit* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLModelessInit_Invoke(IHTMLModelessInit* 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);
}
/*** IHTMLModelessInit methods ***/
static FORCEINLINE HRESULT IHTMLModelessInit_get_parameters(IHTMLModelessInit* This,VARIANT *p) {
    return This->lpVtbl->get_parameters(This,p);
}
static FORCEINLINE HRESULT IHTMLModelessInit_get_optionString(IHTMLModelessInit* This,VARIANT *p) {
    return This->lpVtbl->get_optionString(This,p);
}
static FORCEINLINE HRESULT IHTMLModelessInit_get_moniker(IHTMLModelessInit* This,IUnknown **p) {
    return This->lpVtbl->get_moniker(This,p);
}
static FORCEINLINE HRESULT IHTMLModelessInit_get_document(IHTMLModelessInit* This,IUnknown **p) {
    return This->lpVtbl->get_document(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLModelessInit_get_parameters_Proxy(
    IHTMLModelessInit* This,
    VARIANT *p);
void __RPC_STUB IHTMLModelessInit_get_parameters_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLModelessInit_get_optionString_Proxy(
    IHTMLModelessInit* This,
    VARIANT *p);
void __RPC_STUB IHTMLModelessInit_get_optionString_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLModelessInit_get_moniker_Proxy(
    IHTMLModelessInit* This,
    IUnknown **p);
void __RPC_STUB IHTMLModelessInit_get_moniker_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLModelessInit_get_document_Proxy(
    IHTMLModelessInit* This,
    IUnknown **p);
void __RPC_STUB IHTMLModelessInit_get_document_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLModelessInit_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ThreadDialogProcParam coclass
 */

DEFINE_GUID(CLSID_ThreadDialogProcParam, 0x3050f5eb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f5eb-98b5-11cf-bb82-00aa00bdce0b") ThreadDialogProcParam;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ThreadDialogProcParam, 0x3050f5eb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

/*****************************************************************************
 * HTMLDialog coclass
 */

DEFINE_GUID(CLSID_HTMLDialog, 0x3050f28a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f28a-98b5-11cf-bb82-00aa00bdce0b") HTMLDialog;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLDialog, 0x3050f28a, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

/*****************************************************************************
 * IHTMLPopup interface
 */
#ifndef __IHTMLPopup_INTERFACE_DEFINED__
#define __IHTMLPopup_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLPopup, 0x3050f666, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f666-98b5-11cf-bb82-00aa00bdce0b")
IHTMLPopup : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE show(
        LONG x,
        LONG y,
        LONG w,
        LONG h,
        VARIANT *pElement) = 0;

    virtual HRESULT STDMETHODCALLTYPE hide(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_document(
        IHTMLDocument **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_isOpen(
        VARIANT_BOOL *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLPopup, 0x3050f666, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLPopupVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLPopup* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLPopup* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLPopup* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLPopup* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLPopup* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLPopup* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLPopup* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLPopup methods ***/
    HRESULT (STDMETHODCALLTYPE *show)(
        IHTMLPopup* This,
        LONG x,
        LONG y,
        LONG w,
        LONG h,
        VARIANT *pElement);

    HRESULT (STDMETHODCALLTYPE *hide)(
        IHTMLPopup* This);

    HRESULT (STDMETHODCALLTYPE *get_document)(
        IHTMLPopup* This,
        IHTMLDocument **p);

    HRESULT (STDMETHODCALLTYPE *get_isOpen)(
        IHTMLPopup* This,
        VARIANT_BOOL *p);

    END_INTERFACE
} IHTMLPopupVtbl;
interface IHTMLPopup {
    CONST_VTBL IHTMLPopupVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLPopup_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLPopup_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLPopup_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLPopup_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLPopup_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLPopup_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLPopup_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLPopup methods ***/
#define IHTMLPopup_show(This,x,y,w,h,pElement) (This)->lpVtbl->show(This,x,y,w,h,pElement)
#define IHTMLPopup_hide(This) (This)->lpVtbl->hide(This)
#define IHTMLPopup_get_document(This,p) (This)->lpVtbl->get_document(This,p)
#define IHTMLPopup_get_isOpen(This,p) (This)->lpVtbl->get_isOpen(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLPopup_QueryInterface(IHTMLPopup* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLPopup_AddRef(IHTMLPopup* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLPopup_Release(IHTMLPopup* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLPopup_GetTypeInfoCount(IHTMLPopup* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLPopup_GetTypeInfo(IHTMLPopup* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLPopup_GetIDsOfNames(IHTMLPopup* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLPopup_Invoke(IHTMLPopup* 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);
}
/*** IHTMLPopup methods ***/
static FORCEINLINE HRESULT IHTMLPopup_show(IHTMLPopup* This,LONG x,LONG y,LONG w,LONG h,VARIANT *pElement) {
    return This->lpVtbl->show(This,x,y,w,h,pElement);
}
static FORCEINLINE HRESULT IHTMLPopup_hide(IHTMLPopup* This) {
    return This->lpVtbl->hide(This);
}
static FORCEINLINE HRESULT IHTMLPopup_get_document(IHTMLPopup* This,IHTMLDocument **p) {
    return This->lpVtbl->get_document(This,p);
}
static FORCEINLINE HRESULT IHTMLPopup_get_isOpen(IHTMLPopup* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_isOpen(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLPopup_show_Proxy(
    IHTMLPopup* This,
    LONG x,
    LONG y,
    LONG w,
    LONG h,
    VARIANT *pElement);
void __RPC_STUB IHTMLPopup_show_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPopup_hide_Proxy(
    IHTMLPopup* This);
void __RPC_STUB IHTMLPopup_hide_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPopup_get_document_Proxy(
    IHTMLPopup* This,
    IHTMLDocument **p);
void __RPC_STUB IHTMLPopup_get_document_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLPopup_get_isOpen_Proxy(
    IHTMLPopup* This,
    VARIANT_BOOL *p);
void __RPC_STUB IHTMLPopup_get_isOpen_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLPopup_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLPopup dispinterface
 */
#ifndef __DispHTMLPopup_DISPINTERFACE_DEFINED__
#define __DispHTMLPopup_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLPopup, 0x3050f589, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f589-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLPopup : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLPopup, 0x3050f589, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLPopupVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLPopup* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLPopup* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLPopup* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLPopup* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLPopup* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLPopup* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLPopup* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLPopupVtbl;
interface DispHTMLPopup {
    CONST_VTBL DispHTMLPopupVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLPopup_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLPopup_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLPopup_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLPopup_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLPopup_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLPopup_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLPopup_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 DispHTMLPopup_QueryInterface(DispHTMLPopup* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLPopup_AddRef(DispHTMLPopup* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLPopup_Release(DispHTMLPopup* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLPopup_GetTypeInfoCount(DispHTMLPopup* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLPopup_GetTypeInfo(DispHTMLPopup* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLPopup_GetIDsOfNames(DispHTMLPopup* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLPopup_Invoke(DispHTMLPopup* 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  /* __DispHTMLPopup_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLPopup coclass
 */

DEFINE_GUID(CLSID_HTMLPopup, 0x3050f667, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f667-98b5-11cf-bb82-00aa00bdce0b") HTMLPopup;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLPopup, 0x3050f667, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

/*****************************************************************************
 * IHTMLAppBehavior interface
 */
#ifndef __IHTMLAppBehavior_INTERFACE_DEFINED__
#define __IHTMLAppBehavior_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLAppBehavior, 0x3050f5ca, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f5ca-98b5-11cf-bb82-00aa00bdce0b")
IHTMLAppBehavior : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_applicationName(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_applicationName(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_version(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_version(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_icon(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_icon(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_singleInstance(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_singleInstance(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_minimizeButton(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_minimizeButton(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_maximizeButton(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_maximizeButton(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_border(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_border(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_borderStyle(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_borderStyle(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_sysMenu(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_sysMenu(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_caption(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_caption(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_windowState(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_windowState(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_showInTaskBar(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_showInTaskBar(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_commandLine(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLAppBehavior, 0x3050f5ca, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLAppBehaviorVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLAppBehavior* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLAppBehavior* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLAppBehavior* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLAppBehavior* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLAppBehavior* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLAppBehavior* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLAppBehavior* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLAppBehavior methods ***/
    HRESULT (STDMETHODCALLTYPE *put_applicationName)(
        IHTMLAppBehavior* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_applicationName)(
        IHTMLAppBehavior* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_version)(
        IHTMLAppBehavior* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_version)(
        IHTMLAppBehavior* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_icon)(
        IHTMLAppBehavior* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_icon)(
        IHTMLAppBehavior* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_singleInstance)(
        IHTMLAppBehavior* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_singleInstance)(
        IHTMLAppBehavior* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_minimizeButton)(
        IHTMLAppBehavior* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_minimizeButton)(
        IHTMLAppBehavior* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_maximizeButton)(
        IHTMLAppBehavior* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_maximizeButton)(
        IHTMLAppBehavior* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_border)(
        IHTMLAppBehavior* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_border)(
        IHTMLAppBehavior* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_borderStyle)(
        IHTMLAppBehavior* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_borderStyle)(
        IHTMLAppBehavior* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_sysMenu)(
        IHTMLAppBehavior* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_sysMenu)(
        IHTMLAppBehavior* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_caption)(
        IHTMLAppBehavior* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_caption)(
        IHTMLAppBehavior* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_windowState)(
        IHTMLAppBehavior* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_windowState)(
        IHTMLAppBehavior* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_showInTaskBar)(
        IHTMLAppBehavior* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_showInTaskBar)(
        IHTMLAppBehavior* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_commandLine)(
        IHTMLAppBehavior* This,
        BSTR *p);

    END_INTERFACE
} IHTMLAppBehaviorVtbl;
interface IHTMLAppBehavior {
    CONST_VTBL IHTMLAppBehaviorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLAppBehavior_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLAppBehavior_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLAppBehavior_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLAppBehavior_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLAppBehavior_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLAppBehavior_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLAppBehavior_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLAppBehavior methods ***/
#define IHTMLAppBehavior_put_applicationName(This,v) (This)->lpVtbl->put_applicationName(This,v)
#define IHTMLAppBehavior_get_applicationName(This,p) (This)->lpVtbl->get_applicationName(This,p)
#define IHTMLAppBehavior_put_version(This,v) (This)->lpVtbl->put_version(This,v)
#define IHTMLAppBehavior_get_version(This,p) (This)->lpVtbl->get_version(This,p)
#define IHTMLAppBehavior_put_icon(This,v) (This)->lpVtbl->put_icon(This,v)
#define IHTMLAppBehavior_get_icon(This,p) (This)->lpVtbl->get_icon(This,p)
#define IHTMLAppBehavior_put_singleInstance(This,v) (This)->lpVtbl->put_singleInstance(This,v)
#define IHTMLAppBehavior_get_singleInstance(This,p) (This)->lpVtbl->get_singleInstance(This,p)
#define IHTMLAppBehavior_put_minimizeButton(This,v) (This)->lpVtbl->put_minimizeButton(This,v)
#define IHTMLAppBehavior_get_minimizeButton(This,p) (This)->lpVtbl->get_minimizeButton(This,p)
#define IHTMLAppBehavior_put_maximizeButton(This,v) (This)->lpVtbl->put_maximizeButton(This,v)
#define IHTMLAppBehavior_get_maximizeButton(This,p) (This)->lpVtbl->get_maximizeButton(This,p)
#define IHTMLAppBehavior_put_border(This,v) (This)->lpVtbl->put_border(This,v)
#define IHTMLAppBehavior_get_border(This,p) (This)->lpVtbl->get_border(This,p)
#define IHTMLAppBehavior_put_borderStyle(This,v) (This)->lpVtbl->put_borderStyle(This,v)
#define IHTMLAppBehavior_get_borderStyle(This,p) (This)->lpVtbl->get_borderStyle(This,p)
#define IHTMLAppBehavior_put_sysMenu(This,v) (This)->lpVtbl->put_sysMenu(This,v)
#define IHTMLAppBehavior_get_sysMenu(This,p) (This)->lpVtbl->get_sysMenu(This,p)
#define IHTMLAppBehavior_put_caption(This,v) (This)->lpVtbl->put_caption(This,v)
#define IHTMLAppBehavior_get_caption(This,p) (This)->lpVtbl->get_caption(This,p)
#define IHTMLAppBehavior_put_windowState(This,v) (This)->lpVtbl->put_windowState(This,v)
#define IHTMLAppBehavior_get_windowState(This,p) (This)->lpVtbl->get_windowState(This,p)
#define IHTMLAppBehavior_put_showInTaskBar(This,v) (This)->lpVtbl->put_showInTaskBar(This,v)
#define IHTMLAppBehavior_get_showInTaskBar(This,p) (This)->lpVtbl->get_showInTaskBar(This,p)
#define IHTMLAppBehavior_get_commandLine(This,p) (This)->lpVtbl->get_commandLine(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLAppBehavior_QueryInterface(IHTMLAppBehavior* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLAppBehavior_AddRef(IHTMLAppBehavior* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLAppBehavior_Release(IHTMLAppBehavior* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLAppBehavior_GetTypeInfoCount(IHTMLAppBehavior* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLAppBehavior_GetTypeInfo(IHTMLAppBehavior* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLAppBehavior_GetIDsOfNames(IHTMLAppBehavior* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLAppBehavior_Invoke(IHTMLAppBehavior* 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);
}
/*** IHTMLAppBehavior methods ***/
static FORCEINLINE HRESULT IHTMLAppBehavior_put_applicationName(IHTMLAppBehavior* This,BSTR v) {
    return This->lpVtbl->put_applicationName(This,v);
}
static FORCEINLINE HRESULT IHTMLAppBehavior_get_applicationName(IHTMLAppBehavior* This,BSTR *p) {
    return This->lpVtbl->get_applicationName(This,p);
}
static FORCEINLINE HRESULT IHTMLAppBehavior_put_version(IHTMLAppBehavior* This,BSTR v) {
    return This->lpVtbl->put_version(This,v);
}
static FORCEINLINE HRESULT IHTMLAppBehavior_get_version(IHTMLAppBehavior* This,BSTR *p) {
    return This->lpVtbl->get_version(This,p);
}
static FORCEINLINE HRESULT IHTMLAppBehavior_put_icon(IHTMLAppBehavior* This,BSTR v) {
    return This->lpVtbl->put_icon(This,v);
}
static FORCEINLINE HRESULT IHTMLAppBehavior_get_icon(IHTMLAppBehavior* This,BSTR *p) {
    return This->lpVtbl->get_icon(This,p);
}
static FORCEINLINE HRESULT IHTMLAppBehavior_put_singleInstance(IHTMLAppBehavior* This,BSTR v) {
    return This->lpVtbl->put_singleInstance(This,v);
}
static FORCEINLINE HRESULT IHTMLAppBehavior_get_singleInstance(IHTMLAppBehavior* This,BSTR *p) {
    return This->lpVtbl->get_singleInstance(This,p);
}
static FORCEINLINE HRESULT IHTMLAppBehavior_put_minimizeButton(IHTMLAppBehavior* This,BSTR v) {
    return This->lpVtbl->put_minimizeButton(This,v);
}
static FORCEINLINE HRESULT IHTMLAppBehavior_get_minimizeButton(IHTMLAppBehavior* This,BSTR *p) {
    return This->lpVtbl->get_minimizeButton(This,p);
}
static FORCEINLINE HRESULT IHTMLAppBehavior_put_maximizeButton(IHTMLAppBehavior* This,BSTR v) {
    return This->lpVtbl->put_maximizeButton(This,v);
}
static FORCEINLINE HRESULT IHTMLAppBehavior_get_maximizeButton(IHTMLAppBehavior* This,BSTR *p) {
    return This->lpVtbl->get_maximizeButton(This,p);
}
static FORCEINLINE HRESULT IHTMLAppBehavior_put_border(IHTMLAppBehavior* This,BSTR v) {
    return This->lpVtbl->put_border(This,v);
}
static FORCEINLINE HRESULT IHTMLAppBehavior_get_border(IHTMLAppBehavior* This,BSTR *p) {
    return This->lpVtbl->get_border(This,p);
}
static FORCEINLINE HRESULT IHTMLAppBehavior_put_borderStyle(IHTMLAppBehavior* This,BSTR v) {
    return This->lpVtbl->put_borderStyle(This,v);
}
static FORCEINLINE HRESULT IHTMLAppBehavior_get_borderStyle(IHTMLAppBehavior* This,BSTR *p) {
    return This->lpVtbl->get_borderStyle(This,p);
}
static FORCEINLINE HRESULT IHTMLAppBehavior_put_sysMenu(IHTMLAppBehavior* This,BSTR v) {
    return This->lpVtbl->put_sysMenu(This,v);
}
static FORCEINLINE HRESULT IHTMLAppBehavior_get_sysMenu(IHTMLAppBehavior* This,BSTR *p) {
    return This->lpVtbl->get_sysMenu(This,p);
}
static FORCEINLINE HRESULT IHTMLAppBehavior_put_caption(IHTMLAppBehavior* This,BSTR v) {
    return This->lpVtbl->put_caption(This,v);
}
static FORCEINLINE HRESULT IHTMLAppBehavior_get_caption(IHTMLAppBehavior* This,BSTR *p) {
    return This->lpVtbl->get_caption(This,p);
}
static FORCEINLINE HRESULT IHTMLAppBehavior_put_windowState(IHTMLAppBehavior* This,BSTR v) {
    return This->lpVtbl->put_windowState(This,v);
}
static FORCEINLINE HRESULT IHTMLAppBehavior_get_windowState(IHTMLAppBehavior* This,BSTR *p) {
    return This->lpVtbl->get_windowState(This,p);
}
static FORCEINLINE HRESULT IHTMLAppBehavior_put_showInTaskBar(IHTMLAppBehavior* This,BSTR v) {
    return This->lpVtbl->put_showInTaskBar(This,v);
}
static FORCEINLINE HRESULT IHTMLAppBehavior_get_showInTaskBar(IHTMLAppBehavior* This,BSTR *p) {
    return This->lpVtbl->get_showInTaskBar(This,p);
}
static FORCEINLINE HRESULT IHTMLAppBehavior_get_commandLine(IHTMLAppBehavior* This,BSTR *p) {
    return This->lpVtbl->get_commandLine(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLAppBehavior_put_applicationName_Proxy(
    IHTMLAppBehavior* This,
    BSTR v);
void __RPC_STUB IHTMLAppBehavior_put_applicationName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior_get_applicationName_Proxy(
    IHTMLAppBehavior* This,
    BSTR *p);
void __RPC_STUB IHTMLAppBehavior_get_applicationName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior_put_version_Proxy(
    IHTMLAppBehavior* This,
    BSTR v);
void __RPC_STUB IHTMLAppBehavior_put_version_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior_get_version_Proxy(
    IHTMLAppBehavior* This,
    BSTR *p);
void __RPC_STUB IHTMLAppBehavior_get_version_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior_put_icon_Proxy(
    IHTMLAppBehavior* This,
    BSTR v);
void __RPC_STUB IHTMLAppBehavior_put_icon_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior_get_icon_Proxy(
    IHTMLAppBehavior* This,
    BSTR *p);
void __RPC_STUB IHTMLAppBehavior_get_icon_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior_put_singleInstance_Proxy(
    IHTMLAppBehavior* This,
    BSTR v);
void __RPC_STUB IHTMLAppBehavior_put_singleInstance_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior_get_singleInstance_Proxy(
    IHTMLAppBehavior* This,
    BSTR *p);
void __RPC_STUB IHTMLAppBehavior_get_singleInstance_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior_put_minimizeButton_Proxy(
    IHTMLAppBehavior* This,
    BSTR v);
void __RPC_STUB IHTMLAppBehavior_put_minimizeButton_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior_get_minimizeButton_Proxy(
    IHTMLAppBehavior* This,
    BSTR *p);
void __RPC_STUB IHTMLAppBehavior_get_minimizeButton_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior_put_maximizeButton_Proxy(
    IHTMLAppBehavior* This,
    BSTR v);
void __RPC_STUB IHTMLAppBehavior_put_maximizeButton_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior_get_maximizeButton_Proxy(
    IHTMLAppBehavior* This,
    BSTR *p);
void __RPC_STUB IHTMLAppBehavior_get_maximizeButton_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior_put_border_Proxy(
    IHTMLAppBehavior* This,
    BSTR v);
void __RPC_STUB IHTMLAppBehavior_put_border_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior_get_border_Proxy(
    IHTMLAppBehavior* This,
    BSTR *p);
void __RPC_STUB IHTMLAppBehavior_get_border_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior_put_borderStyle_Proxy(
    IHTMLAppBehavior* This,
    BSTR v);
void __RPC_STUB IHTMLAppBehavior_put_borderStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior_get_borderStyle_Proxy(
    IHTMLAppBehavior* This,
    BSTR *p);
void __RPC_STUB IHTMLAppBehavior_get_borderStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior_put_sysMenu_Proxy(
    IHTMLAppBehavior* This,
    BSTR v);
void __RPC_STUB IHTMLAppBehavior_put_sysMenu_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior_get_sysMenu_Proxy(
    IHTMLAppBehavior* This,
    BSTR *p);
void __RPC_STUB IHTMLAppBehavior_get_sysMenu_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior_put_caption_Proxy(
    IHTMLAppBehavior* This,
    BSTR v);
void __RPC_STUB IHTMLAppBehavior_put_caption_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior_get_caption_Proxy(
    IHTMLAppBehavior* This,
    BSTR *p);
void __RPC_STUB IHTMLAppBehavior_get_caption_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior_put_windowState_Proxy(
    IHTMLAppBehavior* This,
    BSTR v);
void __RPC_STUB IHTMLAppBehavior_put_windowState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior_get_windowState_Proxy(
    IHTMLAppBehavior* This,
    BSTR *p);
void __RPC_STUB IHTMLAppBehavior_get_windowState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior_put_showInTaskBar_Proxy(
    IHTMLAppBehavior* This,
    BSTR v);
void __RPC_STUB IHTMLAppBehavior_put_showInTaskBar_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior_get_showInTaskBar_Proxy(
    IHTMLAppBehavior* This,
    BSTR *p);
void __RPC_STUB IHTMLAppBehavior_get_showInTaskBar_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior_get_commandLine_Proxy(
    IHTMLAppBehavior* This,
    BSTR *p);
void __RPC_STUB IHTMLAppBehavior_get_commandLine_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLAppBehavior_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLAppBehavior2 interface
 */
#ifndef __IHTMLAppBehavior2_INTERFACE_DEFINED__
#define __IHTMLAppBehavior2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLAppBehavior2, 0x3050f5c9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f5c9-98b5-11cf-bb82-00aa00bdce0b")
IHTMLAppBehavior2 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_contextMenu(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_contextMenu(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_innerBorder(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_innerBorder(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scroll(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scroll(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_scrollFlat(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scrollFlat(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_selection(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_selection(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLAppBehavior2, 0x3050f5c9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLAppBehavior2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLAppBehavior2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLAppBehavior2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLAppBehavior2* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLAppBehavior2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLAppBehavior2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLAppBehavior2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLAppBehavior2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLAppBehavior2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_contextMenu)(
        IHTMLAppBehavior2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_contextMenu)(
        IHTMLAppBehavior2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_innerBorder)(
        IHTMLAppBehavior2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_innerBorder)(
        IHTMLAppBehavior2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_scroll)(
        IHTMLAppBehavior2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_scroll)(
        IHTMLAppBehavior2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_scrollFlat)(
        IHTMLAppBehavior2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_scrollFlat)(
        IHTMLAppBehavior2* This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_selection)(
        IHTMLAppBehavior2* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_selection)(
        IHTMLAppBehavior2* This,
        BSTR *p);

    END_INTERFACE
} IHTMLAppBehavior2Vtbl;
interface IHTMLAppBehavior2 {
    CONST_VTBL IHTMLAppBehavior2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLAppBehavior2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLAppBehavior2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLAppBehavior2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLAppBehavior2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLAppBehavior2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLAppBehavior2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLAppBehavior2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLAppBehavior2 methods ***/
#define IHTMLAppBehavior2_put_contextMenu(This,v) (This)->lpVtbl->put_contextMenu(This,v)
#define IHTMLAppBehavior2_get_contextMenu(This,p) (This)->lpVtbl->get_contextMenu(This,p)
#define IHTMLAppBehavior2_put_innerBorder(This,v) (This)->lpVtbl->put_innerBorder(This,v)
#define IHTMLAppBehavior2_get_innerBorder(This,p) (This)->lpVtbl->get_innerBorder(This,p)
#define IHTMLAppBehavior2_put_scroll(This,v) (This)->lpVtbl->put_scroll(This,v)
#define IHTMLAppBehavior2_get_scroll(This,p) (This)->lpVtbl->get_scroll(This,p)
#define IHTMLAppBehavior2_put_scrollFlat(This,v) (This)->lpVtbl->put_scrollFlat(This,v)
#define IHTMLAppBehavior2_get_scrollFlat(This,p) (This)->lpVtbl->get_scrollFlat(This,p)
#define IHTMLAppBehavior2_put_selection(This,v) (This)->lpVtbl->put_selection(This,v)
#define IHTMLAppBehavior2_get_selection(This,p) (This)->lpVtbl->get_selection(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLAppBehavior2_QueryInterface(IHTMLAppBehavior2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLAppBehavior2_AddRef(IHTMLAppBehavior2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLAppBehavior2_Release(IHTMLAppBehavior2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLAppBehavior2_GetTypeInfoCount(IHTMLAppBehavior2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLAppBehavior2_GetTypeInfo(IHTMLAppBehavior2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLAppBehavior2_GetIDsOfNames(IHTMLAppBehavior2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLAppBehavior2_Invoke(IHTMLAppBehavior2* 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);
}
/*** IHTMLAppBehavior2 methods ***/
static FORCEINLINE HRESULT IHTMLAppBehavior2_put_contextMenu(IHTMLAppBehavior2* This,BSTR v) {
    return This->lpVtbl->put_contextMenu(This,v);
}
static FORCEINLINE HRESULT IHTMLAppBehavior2_get_contextMenu(IHTMLAppBehavior2* This,BSTR *p) {
    return This->lpVtbl->get_contextMenu(This,p);
}
static FORCEINLINE HRESULT IHTMLAppBehavior2_put_innerBorder(IHTMLAppBehavior2* This,BSTR v) {
    return This->lpVtbl->put_innerBorder(This,v);
}
static FORCEINLINE HRESULT IHTMLAppBehavior2_get_innerBorder(IHTMLAppBehavior2* This,BSTR *p) {
    return This->lpVtbl->get_innerBorder(This,p);
}
static FORCEINLINE HRESULT IHTMLAppBehavior2_put_scroll(IHTMLAppBehavior2* This,BSTR v) {
    return This->lpVtbl->put_scroll(This,v);
}
static FORCEINLINE HRESULT IHTMLAppBehavior2_get_scroll(IHTMLAppBehavior2* This,BSTR *p) {
    return This->lpVtbl->get_scroll(This,p);
}
static FORCEINLINE HRESULT IHTMLAppBehavior2_put_scrollFlat(IHTMLAppBehavior2* This,BSTR v) {
    return This->lpVtbl->put_scrollFlat(This,v);
}
static FORCEINLINE HRESULT IHTMLAppBehavior2_get_scrollFlat(IHTMLAppBehavior2* This,BSTR *p) {
    return This->lpVtbl->get_scrollFlat(This,p);
}
static FORCEINLINE HRESULT IHTMLAppBehavior2_put_selection(IHTMLAppBehavior2* This,BSTR v) {
    return This->lpVtbl->put_selection(This,v);
}
static FORCEINLINE HRESULT IHTMLAppBehavior2_get_selection(IHTMLAppBehavior2* This,BSTR *p) {
    return This->lpVtbl->get_selection(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLAppBehavior2_put_contextMenu_Proxy(
    IHTMLAppBehavior2* This,
    BSTR v);
void __RPC_STUB IHTMLAppBehavior2_put_contextMenu_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior2_get_contextMenu_Proxy(
    IHTMLAppBehavior2* This,
    BSTR *p);
void __RPC_STUB IHTMLAppBehavior2_get_contextMenu_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior2_put_innerBorder_Proxy(
    IHTMLAppBehavior2* This,
    BSTR v);
void __RPC_STUB IHTMLAppBehavior2_put_innerBorder_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior2_get_innerBorder_Proxy(
    IHTMLAppBehavior2* This,
    BSTR *p);
void __RPC_STUB IHTMLAppBehavior2_get_innerBorder_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior2_put_scroll_Proxy(
    IHTMLAppBehavior2* This,
    BSTR v);
void __RPC_STUB IHTMLAppBehavior2_put_scroll_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior2_get_scroll_Proxy(
    IHTMLAppBehavior2* This,
    BSTR *p);
void __RPC_STUB IHTMLAppBehavior2_get_scroll_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior2_put_scrollFlat_Proxy(
    IHTMLAppBehavior2* This,
    BSTR v);
void __RPC_STUB IHTMLAppBehavior2_put_scrollFlat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior2_get_scrollFlat_Proxy(
    IHTMLAppBehavior2* This,
    BSTR *p);
void __RPC_STUB IHTMLAppBehavior2_get_scrollFlat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior2_put_selection_Proxy(
    IHTMLAppBehavior2* This,
    BSTR v);
void __RPC_STUB IHTMLAppBehavior2_put_selection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior2_get_selection_Proxy(
    IHTMLAppBehavior2* This,
    BSTR *p);
void __RPC_STUB IHTMLAppBehavior2_get_selection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLAppBehavior2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHTMLAppBehavior3 interface
 */
#ifndef __IHTMLAppBehavior3_INTERFACE_DEFINED__
#define __IHTMLAppBehavior3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHTMLAppBehavior3, 0x3050f5cd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f5cd-98b5-11cf-bb82-00aa00bdce0b")
IHTMLAppBehavior3 : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_navigable(
        BSTR v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_navigable(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHTMLAppBehavior3, 0x3050f5cd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHTMLAppBehavior3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHTMLAppBehavior3* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHTMLAppBehavior3* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHTMLAppBehavior3* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IHTMLAppBehavior3* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IHTMLAppBehavior3* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IHTMLAppBehavior3* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IHTMLAppBehavior3* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IHTMLAppBehavior3 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_navigable)(
        IHTMLAppBehavior3* This,
        BSTR v);

    HRESULT (STDMETHODCALLTYPE *get_navigable)(
        IHTMLAppBehavior3* This,
        BSTR *p);

    END_INTERFACE
} IHTMLAppBehavior3Vtbl;
interface IHTMLAppBehavior3 {
    CONST_VTBL IHTMLAppBehavior3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHTMLAppBehavior3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHTMLAppBehavior3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHTMLAppBehavior3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IHTMLAppBehavior3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IHTMLAppBehavior3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IHTMLAppBehavior3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IHTMLAppBehavior3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IHTMLAppBehavior3 methods ***/
#define IHTMLAppBehavior3_put_navigable(This,v) (This)->lpVtbl->put_navigable(This,v)
#define IHTMLAppBehavior3_get_navigable(This,p) (This)->lpVtbl->get_navigable(This,p)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHTMLAppBehavior3_QueryInterface(IHTMLAppBehavior3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHTMLAppBehavior3_AddRef(IHTMLAppBehavior3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHTMLAppBehavior3_Release(IHTMLAppBehavior3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IHTMLAppBehavior3_GetTypeInfoCount(IHTMLAppBehavior3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IHTMLAppBehavior3_GetTypeInfo(IHTMLAppBehavior3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IHTMLAppBehavior3_GetIDsOfNames(IHTMLAppBehavior3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IHTMLAppBehavior3_Invoke(IHTMLAppBehavior3* 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);
}
/*** IHTMLAppBehavior3 methods ***/
static FORCEINLINE HRESULT IHTMLAppBehavior3_put_navigable(IHTMLAppBehavior3* This,BSTR v) {
    return This->lpVtbl->put_navigable(This,v);
}
static FORCEINLINE HRESULT IHTMLAppBehavior3_get_navigable(IHTMLAppBehavior3* This,BSTR *p) {
    return This->lpVtbl->get_navigable(This,p);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHTMLAppBehavior3_put_navigable_Proxy(
    IHTMLAppBehavior3* This,
    BSTR v);
void __RPC_STUB IHTMLAppBehavior3_put_navigable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHTMLAppBehavior3_get_navigable_Proxy(
    IHTMLAppBehavior3* This,
    BSTR *p);
void __RPC_STUB IHTMLAppBehavior3_get_navigable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHTMLAppBehavior3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DispHTMLAppBehavior dispinterface
 */
#ifndef __DispHTMLAppBehavior_DISPINTERFACE_DEFINED__
#define __DispHTMLAppBehavior_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispHTMLAppBehavior, 0x3050f57c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f57c-98b5-11cf-bb82-00aa00bdce0b")
DispHTMLAppBehavior : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispHTMLAppBehavior, 0x3050f57c, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispHTMLAppBehaviorVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispHTMLAppBehavior* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispHTMLAppBehavior* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispHTMLAppBehavior* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispHTMLAppBehavior* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispHTMLAppBehavior* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispHTMLAppBehavior* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispHTMLAppBehavior* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispHTMLAppBehaviorVtbl;
interface DispHTMLAppBehavior {
    CONST_VTBL DispHTMLAppBehaviorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispHTMLAppBehavior_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispHTMLAppBehavior_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispHTMLAppBehavior_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispHTMLAppBehavior_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispHTMLAppBehavior_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispHTMLAppBehavior_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispHTMLAppBehavior_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 DispHTMLAppBehavior_QueryInterface(DispHTMLAppBehavior* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispHTMLAppBehavior_AddRef(DispHTMLAppBehavior* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispHTMLAppBehavior_Release(DispHTMLAppBehavior* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispHTMLAppBehavior_GetTypeInfoCount(DispHTMLAppBehavior* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispHTMLAppBehavior_GetTypeInfo(DispHTMLAppBehavior* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispHTMLAppBehavior_GetIDsOfNames(DispHTMLAppBehavior* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispHTMLAppBehavior_Invoke(DispHTMLAppBehavior* 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  /* __DispHTMLAppBehavior_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLAppBehavior coclass
 */

DEFINE_GUID(CLSID_HTMLAppBehavior, 0x3050f5cb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f5cb-98b5-11cf-bb82-00aa00bdce0b") HTMLAppBehavior;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLAppBehavior, 0x3050f5cb, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

/*****************************************************************************
 * OldHTMLDocument coclass
 */

DEFINE_GUID(CLSID_OldHTMLDocument, 0xd48a6ec9, 0x6a4a, 0x11cf, 0x94,0xa7, 0x44,0x45,0x53,0x54,0x00,0x00);

#ifdef __cplusplus
class DECLSPEC_UUID("d48a6ec9-6a4a-11cf-94a7-444553540000") OldHTMLDocument;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(OldHTMLDocument, 0xd48a6ec9, 0x6a4a, 0x11cf, 0x94,0xa7, 0x44,0x45,0x53,0x54,0x00,0x00)
#endif
#endif

/*****************************************************************************
 * OldHTMLFormElement coclass
 */

DEFINE_GUID(CLSID_OldHTMLFormElement, 0x0d04d285, 0x6bec, 0x11cf, 0x8b,0x97, 0x00,0xaa,0x00,0x47,0x6d,0xa6);

#ifdef __cplusplus
class DECLSPEC_UUID("0d04d285-6bec-11cf-8b97-00aa00476da6") OldHTMLFormElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(OldHTMLFormElement, 0x0d04d285, 0x6bec, 0x11cf, 0x8b,0x97, 0x00,0xaa,0x00,0x47,0x6d,0xa6)
#endif
#endif

/*****************************************************************************
 * DispIHTMLInputButtonElement dispinterface
 */
#ifndef __DispIHTMLInputButtonElement_DISPINTERFACE_DEFINED__
#define __DispIHTMLInputButtonElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispIHTMLInputButtonElement, 0x3050f51e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f51e-98b5-11cf-bb82-00aa00bdce0b")
DispIHTMLInputButtonElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispIHTMLInputButtonElement, 0x3050f51e, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispIHTMLInputButtonElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispIHTMLInputButtonElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispIHTMLInputButtonElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispIHTMLInputButtonElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispIHTMLInputButtonElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispIHTMLInputButtonElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispIHTMLInputButtonElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispIHTMLInputButtonElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispIHTMLInputButtonElementVtbl;
interface DispIHTMLInputButtonElement {
    CONST_VTBL DispIHTMLInputButtonElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispIHTMLInputButtonElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispIHTMLInputButtonElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispIHTMLInputButtonElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispIHTMLInputButtonElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispIHTMLInputButtonElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispIHTMLInputButtonElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispIHTMLInputButtonElement_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 DispIHTMLInputButtonElement_QueryInterface(DispIHTMLInputButtonElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispIHTMLInputButtonElement_AddRef(DispIHTMLInputButtonElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispIHTMLInputButtonElement_Release(DispIHTMLInputButtonElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispIHTMLInputButtonElement_GetTypeInfoCount(DispIHTMLInputButtonElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispIHTMLInputButtonElement_GetTypeInfo(DispIHTMLInputButtonElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispIHTMLInputButtonElement_GetIDsOfNames(DispIHTMLInputButtonElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispIHTMLInputButtonElement_Invoke(DispIHTMLInputButtonElement* 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  /* __DispIHTMLInputButtonElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLInputButtonElement coclass
 */

DEFINE_GUID(CLSID_HTMLInputButtonElement, 0x3050f2b4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f2b4-98b5-11cf-bb82-00aa00bdce0b") HTMLInputButtonElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLInputButtonElement, 0x3050f2b4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

/*****************************************************************************
 * DispIHTMLInputTextElement dispinterface
 */
#ifndef __DispIHTMLInputTextElement_DISPINTERFACE_DEFINED__
#define __DispIHTMLInputTextElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispIHTMLInputTextElement, 0x3050f520, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f520-98b5-11cf-bb82-00aa00bdce0b")
DispIHTMLInputTextElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispIHTMLInputTextElement, 0x3050f520, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispIHTMLInputTextElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispIHTMLInputTextElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispIHTMLInputTextElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispIHTMLInputTextElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispIHTMLInputTextElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispIHTMLInputTextElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispIHTMLInputTextElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispIHTMLInputTextElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispIHTMLInputTextElementVtbl;
interface DispIHTMLInputTextElement {
    CONST_VTBL DispIHTMLInputTextElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispIHTMLInputTextElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispIHTMLInputTextElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispIHTMLInputTextElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispIHTMLInputTextElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispIHTMLInputTextElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispIHTMLInputTextElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispIHTMLInputTextElement_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 DispIHTMLInputTextElement_QueryInterface(DispIHTMLInputTextElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispIHTMLInputTextElement_AddRef(DispIHTMLInputTextElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispIHTMLInputTextElement_Release(DispIHTMLInputTextElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispIHTMLInputTextElement_GetTypeInfoCount(DispIHTMLInputTextElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispIHTMLInputTextElement_GetTypeInfo(DispIHTMLInputTextElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispIHTMLInputTextElement_GetIDsOfNames(DispIHTMLInputTextElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispIHTMLInputTextElement_Invoke(DispIHTMLInputTextElement* 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  /* __DispIHTMLInputTextElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLInputTextElement coclass
 */

DEFINE_GUID(CLSID_HTMLInputTextElement, 0x3050f2ab, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f2ab-98b5-11cf-bb82-00aa00bdce0b") HTMLInputTextElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLInputTextElement, 0x3050f2ab, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

/*****************************************************************************
 * DispIHTMLInputFileElement dispinterface
 */
#ifndef __DispIHTMLInputFileElement_DISPINTERFACE_DEFINED__
#define __DispIHTMLInputFileElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispIHTMLInputFileElement, 0x3050f542, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f542-98b5-11cf-bb82-00aa00bdce0b")
DispIHTMLInputFileElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispIHTMLInputFileElement, 0x3050f542, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispIHTMLInputFileElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispIHTMLInputFileElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispIHTMLInputFileElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispIHTMLInputFileElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispIHTMLInputFileElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispIHTMLInputFileElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispIHTMLInputFileElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispIHTMLInputFileElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispIHTMLInputFileElementVtbl;
interface DispIHTMLInputFileElement {
    CONST_VTBL DispIHTMLInputFileElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispIHTMLInputFileElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispIHTMLInputFileElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispIHTMLInputFileElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispIHTMLInputFileElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispIHTMLInputFileElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispIHTMLInputFileElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispIHTMLInputFileElement_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 DispIHTMLInputFileElement_QueryInterface(DispIHTMLInputFileElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispIHTMLInputFileElement_AddRef(DispIHTMLInputFileElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispIHTMLInputFileElement_Release(DispIHTMLInputFileElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispIHTMLInputFileElement_GetTypeInfoCount(DispIHTMLInputFileElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispIHTMLInputFileElement_GetTypeInfo(DispIHTMLInputFileElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispIHTMLInputFileElement_GetIDsOfNames(DispIHTMLInputFileElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispIHTMLInputFileElement_Invoke(DispIHTMLInputFileElement* 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  /* __DispIHTMLInputFileElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLInputFileElement coclass
 */

DEFINE_GUID(CLSID_HTMLInputFileElement, 0x3050f2ae, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f2ae-98b5-11cf-bb82-00aa00bdce0b") HTMLInputFileElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLInputFileElement, 0x3050f2ae, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

/*****************************************************************************
 * DispIHTMLOptionButtonElement dispinterface
 */
#ifndef __DispIHTMLOptionButtonElement_DISPINTERFACE_DEFINED__
#define __DispIHTMLOptionButtonElement_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispIHTMLOptionButtonElement, 0x3050f509, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f509-98b5-11cf-bb82-00aa00bdce0b")
DispIHTMLOptionButtonElement : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispIHTMLOptionButtonElement, 0x3050f509, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispIHTMLOptionButtonElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispIHTMLOptionButtonElement* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispIHTMLOptionButtonElement* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispIHTMLOptionButtonElement* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispIHTMLOptionButtonElement* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispIHTMLOptionButtonElement* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispIHTMLOptionButtonElement* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispIHTMLOptionButtonElement* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispIHTMLOptionButtonElementVtbl;
interface DispIHTMLOptionButtonElement {
    CONST_VTBL DispIHTMLOptionButtonElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispIHTMLOptionButtonElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispIHTMLOptionButtonElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispIHTMLOptionButtonElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispIHTMLOptionButtonElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispIHTMLOptionButtonElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispIHTMLOptionButtonElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispIHTMLOptionButtonElement_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 DispIHTMLOptionButtonElement_QueryInterface(DispIHTMLOptionButtonElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispIHTMLOptionButtonElement_AddRef(DispIHTMLOptionButtonElement* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispIHTMLOptionButtonElement_Release(DispIHTMLOptionButtonElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispIHTMLOptionButtonElement_GetTypeInfoCount(DispIHTMLOptionButtonElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispIHTMLOptionButtonElement_GetTypeInfo(DispIHTMLOptionButtonElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispIHTMLOptionButtonElement_GetIDsOfNames(DispIHTMLOptionButtonElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispIHTMLOptionButtonElement_Invoke(DispIHTMLOptionButtonElement* 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  /* __DispIHTMLOptionButtonElement_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLOptionButtonElement coclass
 */

DEFINE_GUID(CLSID_HTMLOptionButtonElement, 0x3050f2be, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f2be-98b5-11cf-bb82-00aa00bdce0b") HTMLOptionButtonElement;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLOptionButtonElement, 0x3050f2be, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

/*****************************************************************************
 * DispIHTMLInputImage dispinterface
 */
#ifndef __DispIHTMLInputImage_DISPINTERFACE_DEFINED__
#define __DispIHTMLInputImage_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DispIHTMLInputImage, 0x3050f51d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f51d-98b5-11cf-bb82-00aa00bdce0b")
DispIHTMLInputImage : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DispIHTMLInputImage, 0x3050f51d, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct DispIHTMLInputImageVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        DispIHTMLInputImage* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        DispIHTMLInputImage* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        DispIHTMLInputImage* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        DispIHTMLInputImage* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        DispIHTMLInputImage* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        DispIHTMLInputImage* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        DispIHTMLInputImage* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} DispIHTMLInputImageVtbl;
interface DispIHTMLInputImage {
    CONST_VTBL DispIHTMLInputImageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DispIHTMLInputImage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DispIHTMLInputImage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DispIHTMLInputImage_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DispIHTMLInputImage_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DispIHTMLInputImage_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DispIHTMLInputImage_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DispIHTMLInputImage_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 DispIHTMLInputImage_QueryInterface(DispIHTMLInputImage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG DispIHTMLInputImage_AddRef(DispIHTMLInputImage* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG DispIHTMLInputImage_Release(DispIHTMLInputImage* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT DispIHTMLInputImage_GetTypeInfoCount(DispIHTMLInputImage* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT DispIHTMLInputImage_GetTypeInfo(DispIHTMLInputImage* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT DispIHTMLInputImage_GetIDsOfNames(DispIHTMLInputImage* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT DispIHTMLInputImage_Invoke(DispIHTMLInputImage* 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  /* __DispIHTMLInputImage_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * HTMLInputImage coclass
 */

DEFINE_GUID(CLSID_HTMLInputImage, 0x3050f2c4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);

#ifdef __cplusplus
class DECLSPEC_UUID("3050f2c4-98b5-11cf-bb82-00aa00bdce0b") HTMLInputImage;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HTMLInputImage, 0x3050f2c4, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#endif

/*****************************************************************************
 * IElementBehaviorFactory interface
 */
#ifndef __IElementBehaviorFactory_INTERFACE_DEFINED__
#define __IElementBehaviorFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID_IElementBehaviorFactory, 0x3050f429, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f429-98b5-11cf-bb82-00aa00bdce0b")
IElementBehaviorFactory : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE FindBehavior(
        BSTR bstrBehavior,
        BSTR bstrBehaviorUrl,
        IElementBehaviorSite *pSite,
        IElementBehavior **ppBehavior) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IElementBehaviorFactory, 0x3050f429, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IElementBehaviorFactoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IElementBehaviorFactory* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IElementBehaviorFactory* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IElementBehaviorFactory* This);

    /*** IElementBehaviorFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *FindBehavior)(
        IElementBehaviorFactory* This,
        BSTR bstrBehavior,
        BSTR bstrBehaviorUrl,
        IElementBehaviorSite *pSite,
        IElementBehavior **ppBehavior);

    END_INTERFACE
} IElementBehaviorFactoryVtbl;
interface IElementBehaviorFactory {
    CONST_VTBL IElementBehaviorFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IElementBehaviorFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IElementBehaviorFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IElementBehaviorFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IElementBehaviorFactory methods ***/
#define IElementBehaviorFactory_FindBehavior(This,bstrBehavior,bstrBehaviorUrl,pSite,ppBehavior) (This)->lpVtbl->FindBehavior(This,bstrBehavior,bstrBehaviorUrl,pSite,ppBehavior)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IElementBehaviorFactory_QueryInterface(IElementBehaviorFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IElementBehaviorFactory_AddRef(IElementBehaviorFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IElementBehaviorFactory_Release(IElementBehaviorFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementBehaviorFactory methods ***/
static FORCEINLINE HRESULT IElementBehaviorFactory_FindBehavior(IElementBehaviorFactory* This,BSTR bstrBehavior,BSTR bstrBehaviorUrl,IElementBehaviorSite *pSite,IElementBehavior **ppBehavior) {
    return This->lpVtbl->FindBehavior(This,bstrBehavior,bstrBehaviorUrl,pSite,ppBehavior);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IElementBehaviorFactory_FindBehavior_Proxy(
    IElementBehaviorFactory* This,
    BSTR bstrBehavior,
    BSTR bstrBehaviorUrl,
    IElementBehaviorSite *pSite,
    IElementBehavior **ppBehavior);
void __RPC_STUB IElementBehaviorFactory_FindBehavior_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IElementBehaviorFactory_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IElementNamespace interface
 */
#ifndef __IElementNamespace_INTERFACE_DEFINED__
#define __IElementNamespace_INTERFACE_DEFINED__

DEFINE_GUID(IID_IElementNamespace, 0x3050f671, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f671-98b5-11cf-bb82-00aa00bdce0b")
IElementNamespace : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AddTag(
        BSTR bstrTagName,
        LONG lFlags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IElementNamespace, 0x3050f671, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IElementNamespaceVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IElementNamespace* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IElementNamespace* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IElementNamespace* This);

    /*** IElementNamespace methods ***/
    HRESULT (STDMETHODCALLTYPE *AddTag)(
        IElementNamespace* This,
        BSTR bstrTagName,
        LONG lFlags);

    END_INTERFACE
} IElementNamespaceVtbl;
interface IElementNamespace {
    CONST_VTBL IElementNamespaceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IElementNamespace_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IElementNamespace_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IElementNamespace_Release(This) (This)->lpVtbl->Release(This)
/*** IElementNamespace methods ***/
#define IElementNamespace_AddTag(This,bstrTagName,lFlags) (This)->lpVtbl->AddTag(This,bstrTagName,lFlags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IElementNamespace_QueryInterface(IElementNamespace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IElementNamespace_AddRef(IElementNamespace* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IElementNamespace_Release(IElementNamespace* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementNamespace methods ***/
static FORCEINLINE HRESULT IElementNamespace_AddTag(IElementNamespace* This,BSTR bstrTagName,LONG lFlags) {
    return This->lpVtbl->AddTag(This,bstrTagName,lFlags);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IElementNamespace_AddTag_Proxy(
    IElementNamespace* This,
    BSTR bstrTagName,
    LONG lFlags);
void __RPC_STUB IElementNamespace_AddTag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IElementNamespace_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IElementNamespaceTable interface
 */
#ifndef __IElementNamespaceTable_INTERFACE_DEFINED__
#define __IElementNamespaceTable_INTERFACE_DEFINED__

DEFINE_GUID(IID_IElementNamespaceTable, 0x3050f670, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f670-98b5-11cf-bb82-00aa00bdce0b")
IElementNamespaceTable : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AddNamespace(
        BSTR bstrNamespace,
        BSTR bstrUrn,
        LONG lFlags,
        VARIANT *pvarFactory) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IElementNamespaceTable, 0x3050f670, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IElementNamespaceTableVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IElementNamespaceTable* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IElementNamespaceTable* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IElementNamespaceTable* This);

    /*** IElementNamespaceTable methods ***/
    HRESULT (STDMETHODCALLTYPE *AddNamespace)(
        IElementNamespaceTable* This,
        BSTR bstrNamespace,
        BSTR bstrUrn,
        LONG lFlags,
        VARIANT *pvarFactory);

    END_INTERFACE
} IElementNamespaceTableVtbl;
interface IElementNamespaceTable {
    CONST_VTBL IElementNamespaceTableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IElementNamespaceTable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IElementNamespaceTable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IElementNamespaceTable_Release(This) (This)->lpVtbl->Release(This)
/*** IElementNamespaceTable methods ***/
#define IElementNamespaceTable_AddNamespace(This,bstrNamespace,bstrUrn,lFlags,pvarFactory) (This)->lpVtbl->AddNamespace(This,bstrNamespace,bstrUrn,lFlags,pvarFactory)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IElementNamespaceTable_QueryInterface(IElementNamespaceTable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IElementNamespaceTable_AddRef(IElementNamespaceTable* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IElementNamespaceTable_Release(IElementNamespaceTable* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementNamespaceTable methods ***/
static FORCEINLINE HRESULT IElementNamespaceTable_AddNamespace(IElementNamespaceTable* This,BSTR bstrNamespace,BSTR bstrUrn,LONG lFlags,VARIANT *pvarFactory) {
    return This->lpVtbl->AddNamespace(This,bstrNamespace,bstrUrn,lFlags,pvarFactory);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IElementNamespaceTable_AddNamespace_Proxy(
    IElementNamespaceTable* This,
    BSTR bstrNamespace,
    BSTR bstrUrn,
    LONG lFlags,
    VARIANT *pvarFactory);
void __RPC_STUB IElementNamespaceTable_AddNamespace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IElementNamespaceTable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IElementNamespaceFactory interface
 */
#ifndef __IElementNamespaceFactory_INTERFACE_DEFINED__
#define __IElementNamespaceFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID_IElementNamespaceFactory, 0x3050f672, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f672-98b5-11cf-bb82-00aa00bdce0b")
IElementNamespaceFactory : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Create(
        IElementNamespace *pNamespace) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IElementNamespaceFactory, 0x3050f672, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IElementNamespaceFactoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IElementNamespaceFactory* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IElementNamespaceFactory* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IElementNamespaceFactory* This);

    /*** IElementNamespaceFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *Create)(
        IElementNamespaceFactory* This,
        IElementNamespace *pNamespace);

    END_INTERFACE
} IElementNamespaceFactoryVtbl;
interface IElementNamespaceFactory {
    CONST_VTBL IElementNamespaceFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IElementNamespaceFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IElementNamespaceFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IElementNamespaceFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IElementNamespaceFactory methods ***/
#define IElementNamespaceFactory_Create(This,pNamespace) (This)->lpVtbl->Create(This,pNamespace)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IElementNamespaceFactory_QueryInterface(IElementNamespaceFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IElementNamespaceFactory_AddRef(IElementNamespaceFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IElementNamespaceFactory_Release(IElementNamespaceFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementNamespaceFactory methods ***/
static FORCEINLINE HRESULT IElementNamespaceFactory_Create(IElementNamespaceFactory* This,IElementNamespace *pNamespace) {
    return This->lpVtbl->Create(This,pNamespace);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IElementNamespaceFactory_Create_Proxy(
    IElementNamespaceFactory* This,
    IElementNamespace *pNamespace);
void __RPC_STUB IElementNamespaceFactory_Create_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IElementNamespaceFactory_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IElementNamespaceFactory2 interface
 */
#ifndef __IElementNamespaceFactory2_INTERFACE_DEFINED__
#define __IElementNamespaceFactory2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IElementNamespaceFactory2, 0x3050f805, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f805-98b5-11cf-bb82-00aa00bdce0b")
IElementNamespaceFactory2 : public IElementNamespaceFactory
{
    virtual HRESULT STDMETHODCALLTYPE CreateWithImplementation(
        IElementNamespace *pNamespace,
        BSTR bstrImplementation) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IElementNamespaceFactory2, 0x3050f805, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IElementNamespaceFactory2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IElementNamespaceFactory2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IElementNamespaceFactory2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IElementNamespaceFactory2* This);

    /*** IElementNamespaceFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *Create)(
        IElementNamespaceFactory2* This,
        IElementNamespace *pNamespace);

    /*** IElementNamespaceFactory2 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateWithImplementation)(
        IElementNamespaceFactory2* This,
        IElementNamespace *pNamespace,
        BSTR bstrImplementation);

    END_INTERFACE
} IElementNamespaceFactory2Vtbl;
interface IElementNamespaceFactory2 {
    CONST_VTBL IElementNamespaceFactory2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IElementNamespaceFactory2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IElementNamespaceFactory2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IElementNamespaceFactory2_Release(This) (This)->lpVtbl->Release(This)
/*** IElementNamespaceFactory methods ***/
#define IElementNamespaceFactory2_Create(This,pNamespace) (This)->lpVtbl->Create(This,pNamespace)
/*** IElementNamespaceFactory2 methods ***/
#define IElementNamespaceFactory2_CreateWithImplementation(This,pNamespace,bstrImplementation) (This)->lpVtbl->CreateWithImplementation(This,pNamespace,bstrImplementation)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IElementNamespaceFactory2_QueryInterface(IElementNamespaceFactory2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IElementNamespaceFactory2_AddRef(IElementNamespaceFactory2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IElementNamespaceFactory2_Release(IElementNamespaceFactory2* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementNamespaceFactory methods ***/
static FORCEINLINE HRESULT IElementNamespaceFactory2_Create(IElementNamespaceFactory2* This,IElementNamespace *pNamespace) {
    return This->lpVtbl->Create(This,pNamespace);
}
/*** IElementNamespaceFactory2 methods ***/
static FORCEINLINE HRESULT IElementNamespaceFactory2_CreateWithImplementation(IElementNamespaceFactory2* This,IElementNamespace *pNamespace,BSTR bstrImplementation) {
    return This->lpVtbl->CreateWithImplementation(This,pNamespace,bstrImplementation);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IElementNamespaceFactory2_CreateWithImplementation_Proxy(
    IElementNamespaceFactory2* This,
    IElementNamespace *pNamespace,
    BSTR bstrImplementation);
void __RPC_STUB IElementNamespaceFactory2_CreateWithImplementation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IElementNamespaceFactory2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IElementNamespaceFactoryCallback interface
 */
#ifndef __IElementNamespaceFactoryCallback_INTERFACE_DEFINED__
#define __IElementNamespaceFactoryCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID_IElementNamespaceFactoryCallback, 0x3050f7fd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f7fd-98b5-11cf-bb82-00aa00bdce0b")
IElementNamespaceFactoryCallback : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Resolve(
        BSTR bstrNamespace,
        BSTR bstrTagName,
        BSTR bstrAttrs,
        IElementNamespace *pNamespace) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IElementNamespaceFactoryCallback, 0x3050f7fd, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IElementNamespaceFactoryCallbackVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IElementNamespaceFactoryCallback* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IElementNamespaceFactoryCallback* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IElementNamespaceFactoryCallback* This);

    /*** IElementNamespaceFactoryCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *Resolve)(
        IElementNamespaceFactoryCallback* This,
        BSTR bstrNamespace,
        BSTR bstrTagName,
        BSTR bstrAttrs,
        IElementNamespace *pNamespace);

    END_INTERFACE
} IElementNamespaceFactoryCallbackVtbl;
interface IElementNamespaceFactoryCallback {
    CONST_VTBL IElementNamespaceFactoryCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IElementNamespaceFactoryCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IElementNamespaceFactoryCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IElementNamespaceFactoryCallback_Release(This) (This)->lpVtbl->Release(This)
/*** IElementNamespaceFactoryCallback methods ***/
#define IElementNamespaceFactoryCallback_Resolve(This,bstrNamespace,bstrTagName,bstrAttrs,pNamespace) (This)->lpVtbl->Resolve(This,bstrNamespace,bstrTagName,bstrAttrs,pNamespace)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IElementNamespaceFactoryCallback_QueryInterface(IElementNamespaceFactoryCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IElementNamespaceFactoryCallback_AddRef(IElementNamespaceFactoryCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IElementNamespaceFactoryCallback_Release(IElementNamespaceFactoryCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementNamespaceFactoryCallback methods ***/
static FORCEINLINE HRESULT IElementNamespaceFactoryCallback_Resolve(IElementNamespaceFactoryCallback* This,BSTR bstrNamespace,BSTR bstrTagName,BSTR bstrAttrs,IElementNamespace *pNamespace) {
    return This->lpVtbl->Resolve(This,bstrNamespace,bstrTagName,bstrAttrs,pNamespace);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IElementNamespaceFactoryCallback_Resolve_Proxy(
    IElementNamespaceFactoryCallback* This,
    BSTR bstrNamespace,
    BSTR bstrTagName,
    BSTR bstrAttrs,
    IElementNamespace *pNamespace);
void __RPC_STUB IElementNamespaceFactoryCallback_Resolve_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IElementNamespaceFactoryCallback_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IElementBehavior interface
 */
#ifndef __IElementBehavior_INTERFACE_DEFINED__
#define __IElementBehavior_INTERFACE_DEFINED__

DEFINE_GUID(IID_IElementBehavior, 0x3050f425, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f425-98b5-11cf-bb82-00aa00bdce0b")
IElementBehavior : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Init(
        IElementBehaviorSite *pBehaviorSite) = 0;

    virtual HRESULT STDMETHODCALLTYPE Notify(
        LONG lEvent,
        VARIANT *pVar) = 0;

    virtual HRESULT STDMETHODCALLTYPE Detach(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IElementBehavior, 0x3050f425, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IElementBehaviorVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IElementBehavior* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IElementBehavior* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IElementBehavior* This);

    /*** IElementBehavior methods ***/
    HRESULT (STDMETHODCALLTYPE *Init)(
        IElementBehavior* This,
        IElementBehaviorSite *pBehaviorSite);

    HRESULT (STDMETHODCALLTYPE *Notify)(
        IElementBehavior* This,
        LONG lEvent,
        VARIANT *pVar);

    HRESULT (STDMETHODCALLTYPE *Detach)(
        IElementBehavior* This);

    END_INTERFACE
} IElementBehaviorVtbl;
interface IElementBehavior {
    CONST_VTBL IElementBehaviorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IElementBehavior_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IElementBehavior_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IElementBehavior_Release(This) (This)->lpVtbl->Release(This)
/*** IElementBehavior methods ***/
#define IElementBehavior_Init(This,pBehaviorSite) (This)->lpVtbl->Init(This,pBehaviorSite)
#define IElementBehavior_Notify(This,lEvent,pVar) (This)->lpVtbl->Notify(This,lEvent,pVar)
#define IElementBehavior_Detach(This) (This)->lpVtbl->Detach(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IElementBehavior_QueryInterface(IElementBehavior* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IElementBehavior_AddRef(IElementBehavior* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IElementBehavior_Release(IElementBehavior* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementBehavior methods ***/
static FORCEINLINE HRESULT IElementBehavior_Init(IElementBehavior* This,IElementBehaviorSite *pBehaviorSite) {
    return This->lpVtbl->Init(This,pBehaviorSite);
}
static FORCEINLINE HRESULT IElementBehavior_Notify(IElementBehavior* This,LONG lEvent,VARIANT *pVar) {
    return This->lpVtbl->Notify(This,lEvent,pVar);
}
static FORCEINLINE HRESULT IElementBehavior_Detach(IElementBehavior* This) {
    return This->lpVtbl->Detach(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IElementBehavior_Init_Proxy(
    IElementBehavior* This,
    IElementBehaviorSite *pBehaviorSite);
void __RPC_STUB IElementBehavior_Init_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IElementBehavior_Notify_Proxy(
    IElementBehavior* This,
    LONG lEvent,
    VARIANT *pVar);
void __RPC_STUB IElementBehavior_Notify_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IElementBehavior_Detach_Proxy(
    IElementBehavior* This);
void __RPC_STUB IElementBehavior_Detach_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IElementBehavior_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IElementBehaviorSite interface
 */
#ifndef __IElementBehaviorSite_INTERFACE_DEFINED__
#define __IElementBehaviorSite_INTERFACE_DEFINED__

DEFINE_GUID(IID_IElementBehaviorSite, 0x3050f427, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f427-98b5-11cf-bb82-00aa00bdce0b")
IElementBehaviorSite : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetElement(
        IHTMLElement **ppElement) = 0;

    virtual HRESULT STDMETHODCALLTYPE RegisterNotification(
        LONG lEvent) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IElementBehaviorSite, 0x3050f427, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IElementBehaviorSiteVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IElementBehaviorSite* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IElementBehaviorSite* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IElementBehaviorSite* This);

    /*** IElementBehaviorSite methods ***/
    HRESULT (STDMETHODCALLTYPE *GetElement)(
        IElementBehaviorSite* This,
        IHTMLElement **ppElement);

    HRESULT (STDMETHODCALLTYPE *RegisterNotification)(
        IElementBehaviorSite* This,
        LONG lEvent);

    END_INTERFACE
} IElementBehaviorSiteVtbl;
interface IElementBehaviorSite {
    CONST_VTBL IElementBehaviorSiteVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IElementBehaviorSite_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IElementBehaviorSite_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IElementBehaviorSite_Release(This) (This)->lpVtbl->Release(This)
/*** IElementBehaviorSite methods ***/
#define IElementBehaviorSite_GetElement(This,ppElement) (This)->lpVtbl->GetElement(This,ppElement)
#define IElementBehaviorSite_RegisterNotification(This,lEvent) (This)->lpVtbl->RegisterNotification(This,lEvent)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IElementBehaviorSite_QueryInterface(IElementBehaviorSite* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IElementBehaviorSite_AddRef(IElementBehaviorSite* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IElementBehaviorSite_Release(IElementBehaviorSite* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementBehaviorSite methods ***/
static FORCEINLINE HRESULT IElementBehaviorSite_GetElement(IElementBehaviorSite* This,IHTMLElement **ppElement) {
    return This->lpVtbl->GetElement(This,ppElement);
}
static FORCEINLINE HRESULT IElementBehaviorSite_RegisterNotification(IElementBehaviorSite* This,LONG lEvent) {
    return This->lpVtbl->RegisterNotification(This,lEvent);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IElementBehaviorSite_GetElement_Proxy(
    IElementBehaviorSite* This,
    IHTMLElement **ppElement);
void __RPC_STUB IElementBehaviorSite_GetElement_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IElementBehaviorSite_RegisterNotification_Proxy(
    IElementBehaviorSite* This,
    LONG lEvent);
void __RPC_STUB IElementBehaviorSite_RegisterNotification_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IElementBehaviorSite_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IElementBehaviorSiteOM interface
 */
#ifndef __IElementBehaviorSiteOM_INTERFACE_DEFINED__
#define __IElementBehaviorSiteOM_INTERFACE_DEFINED__

DEFINE_GUID(IID_IElementBehaviorSiteOM, 0x3050f489, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f489-98b5-11cf-bb82-00aa00bdce0b")
IElementBehaviorSiteOM : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE RegisterEvent(
        LPOLESTR pchEvent,
        LONG lFlags,
        LONG *plCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEventCookie(
        LPOLESTR pchEvent,
        LONG *plCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE FireEvent(
        LONG lCookie,
        IHTMLEventObj *pEventObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateEventObject(
        IHTMLEventObj **ppEventObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE RegisterName(
        LPOLESTR pchName) = 0;

    virtual HRESULT STDMETHODCALLTYPE RegisterUrn(
        LPOLESTR pchUrn) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IElementBehaviorSiteOM, 0x3050f489, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IElementBehaviorSiteOMVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IElementBehaviorSiteOM* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IElementBehaviorSiteOM* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IElementBehaviorSiteOM* This);

    /*** IElementBehaviorSiteOM methods ***/
    HRESULT (STDMETHODCALLTYPE *RegisterEvent)(
        IElementBehaviorSiteOM* This,
        LPOLESTR pchEvent,
        LONG lFlags,
        LONG *plCookie);

    HRESULT (STDMETHODCALLTYPE *GetEventCookie)(
        IElementBehaviorSiteOM* This,
        LPOLESTR pchEvent,
        LONG *plCookie);

    HRESULT (STDMETHODCALLTYPE *FireEvent)(
        IElementBehaviorSiteOM* This,
        LONG lCookie,
        IHTMLEventObj *pEventObject);

    HRESULT (STDMETHODCALLTYPE *CreateEventObject)(
        IElementBehaviorSiteOM* This,
        IHTMLEventObj **ppEventObject);

    HRESULT (STDMETHODCALLTYPE *RegisterName)(
        IElementBehaviorSiteOM* This,
        LPOLESTR pchName);

    HRESULT (STDMETHODCALLTYPE *RegisterUrn)(
        IElementBehaviorSiteOM* This,
        LPOLESTR pchUrn);

    END_INTERFACE
} IElementBehaviorSiteOMVtbl;
interface IElementBehaviorSiteOM {
    CONST_VTBL IElementBehaviorSiteOMVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IElementBehaviorSiteOM_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IElementBehaviorSiteOM_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IElementBehaviorSiteOM_Release(This) (This)->lpVtbl->Release(This)
/*** IElementBehaviorSiteOM methods ***/
#define IElementBehaviorSiteOM_RegisterEvent(This,pchEvent,lFlags,plCookie) (This)->lpVtbl->RegisterEvent(This,pchEvent,lFlags,plCookie)
#define IElementBehaviorSiteOM_GetEventCookie(This,pchEvent,plCookie) (This)->lpVtbl->GetEventCookie(This,pchEvent,plCookie)
#define IElementBehaviorSiteOM_FireEvent(This,lCookie,pEventObject) (This)->lpVtbl->FireEvent(This,lCookie,pEventObject)
#define IElementBehaviorSiteOM_CreateEventObject(This,ppEventObject) (This)->lpVtbl->CreateEventObject(This,ppEventObject)
#define IElementBehaviorSiteOM_RegisterName(This,pchName) (This)->lpVtbl->RegisterName(This,pchName)
#define IElementBehaviorSiteOM_RegisterUrn(This,pchUrn) (This)->lpVtbl->RegisterUrn(This,pchUrn)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IElementBehaviorSiteOM_QueryInterface(IElementBehaviorSiteOM* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IElementBehaviorSiteOM_AddRef(IElementBehaviorSiteOM* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IElementBehaviorSiteOM_Release(IElementBehaviorSiteOM* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementBehaviorSiteOM methods ***/
static FORCEINLINE HRESULT IElementBehaviorSiteOM_RegisterEvent(IElementBehaviorSiteOM* This,LPOLESTR pchEvent,LONG lFlags,LONG *plCookie) {
    return This->lpVtbl->RegisterEvent(This,pchEvent,lFlags,plCookie);
}
static FORCEINLINE HRESULT IElementBehaviorSiteOM_GetEventCookie(IElementBehaviorSiteOM* This,LPOLESTR pchEvent,LONG *plCookie) {
    return This->lpVtbl->GetEventCookie(This,pchEvent,plCookie);
}
static FORCEINLINE HRESULT IElementBehaviorSiteOM_FireEvent(IElementBehaviorSiteOM* This,LONG lCookie,IHTMLEventObj *pEventObject) {
    return This->lpVtbl->FireEvent(This,lCookie,pEventObject);
}
static FORCEINLINE HRESULT IElementBehaviorSiteOM_CreateEventObject(IElementBehaviorSiteOM* This,IHTMLEventObj **ppEventObject) {
    return This->lpVtbl->CreateEventObject(This,ppEventObject);
}
static FORCEINLINE HRESULT IElementBehaviorSiteOM_RegisterName(IElementBehaviorSiteOM* This,LPOLESTR pchName) {
    return This->lpVtbl->RegisterName(This,pchName);
}
static FORCEINLINE HRESULT IElementBehaviorSiteOM_RegisterUrn(IElementBehaviorSiteOM* This,LPOLESTR pchUrn) {
    return This->lpVtbl->RegisterUrn(This,pchUrn);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IElementBehaviorSiteOM_RegisterEvent_Proxy(
    IElementBehaviorSiteOM* This,
    LPOLESTR pchEvent,
    LONG lFlags,
    LONG *plCookie);
void __RPC_STUB IElementBehaviorSiteOM_RegisterEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IElementBehaviorSiteOM_GetEventCookie_Proxy(
    IElementBehaviorSiteOM* This,
    LPOLESTR pchEvent,
    LONG *plCookie);
void __RPC_STUB IElementBehaviorSiteOM_GetEventCookie_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IElementBehaviorSiteOM_FireEvent_Proxy(
    IElementBehaviorSiteOM* This,
    LONG lCookie,
    IHTMLEventObj *pEventObject);
void __RPC_STUB IElementBehaviorSiteOM_FireEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IElementBehaviorSiteOM_CreateEventObject_Proxy(
    IElementBehaviorSiteOM* This,
    IHTMLEventObj **ppEventObject);
void __RPC_STUB IElementBehaviorSiteOM_CreateEventObject_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IElementBehaviorSiteOM_RegisterName_Proxy(
    IElementBehaviorSiteOM* This,
    LPOLESTR pchName);
void __RPC_STUB IElementBehaviorSiteOM_RegisterName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IElementBehaviorSiteOM_RegisterUrn_Proxy(
    IElementBehaviorSiteOM* This,
    LPOLESTR pchUrn);
void __RPC_STUB IElementBehaviorSiteOM_RegisterUrn_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IElementBehaviorSiteOM_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IElementBehaviorSiteOM2 interface
 */
#ifndef __IElementBehaviorSiteOM2_INTERFACE_DEFINED__
#define __IElementBehaviorSiteOM2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IElementBehaviorSiteOM2, 0x3050f659, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f659-98b5-11cf-bb82-00aa00bdce0b")
IElementBehaviorSiteOM2 : public IElementBehaviorSiteOM
{
    virtual HRESULT STDMETHODCALLTYPE GetDefaults(
        IHTMLElementDefaults **ppDefaults) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IElementBehaviorSiteOM2, 0x3050f659, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IElementBehaviorSiteOM2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IElementBehaviorSiteOM2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IElementBehaviorSiteOM2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IElementBehaviorSiteOM2* This);

    /*** IElementBehaviorSiteOM methods ***/
    HRESULT (STDMETHODCALLTYPE *RegisterEvent)(
        IElementBehaviorSiteOM2* This,
        LPOLESTR pchEvent,
        LONG lFlags,
        LONG *plCookie);

    HRESULT (STDMETHODCALLTYPE *GetEventCookie)(
        IElementBehaviorSiteOM2* This,
        LPOLESTR pchEvent,
        LONG *plCookie);

    HRESULT (STDMETHODCALLTYPE *FireEvent)(
        IElementBehaviorSiteOM2* This,
        LONG lCookie,
        IHTMLEventObj *pEventObject);

    HRESULT (STDMETHODCALLTYPE *CreateEventObject)(
        IElementBehaviorSiteOM2* This,
        IHTMLEventObj **ppEventObject);

    HRESULT (STDMETHODCALLTYPE *RegisterName)(
        IElementBehaviorSiteOM2* This,
        LPOLESTR pchName);

    HRESULT (STDMETHODCALLTYPE *RegisterUrn)(
        IElementBehaviorSiteOM2* This,
        LPOLESTR pchUrn);

    /*** IElementBehaviorSiteOM2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDefaults)(
        IElementBehaviorSiteOM2* This,
        IHTMLElementDefaults **ppDefaults);

    END_INTERFACE
} IElementBehaviorSiteOM2Vtbl;
interface IElementBehaviorSiteOM2 {
    CONST_VTBL IElementBehaviorSiteOM2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IElementBehaviorSiteOM2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IElementBehaviorSiteOM2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IElementBehaviorSiteOM2_Release(This) (This)->lpVtbl->Release(This)
/*** IElementBehaviorSiteOM methods ***/
#define IElementBehaviorSiteOM2_RegisterEvent(This,pchEvent,lFlags,plCookie) (This)->lpVtbl->RegisterEvent(This,pchEvent,lFlags,plCookie)
#define IElementBehaviorSiteOM2_GetEventCookie(This,pchEvent,plCookie) (This)->lpVtbl->GetEventCookie(This,pchEvent,plCookie)
#define IElementBehaviorSiteOM2_FireEvent(This,lCookie,pEventObject) (This)->lpVtbl->FireEvent(This,lCookie,pEventObject)
#define IElementBehaviorSiteOM2_CreateEventObject(This,ppEventObject) (This)->lpVtbl->CreateEventObject(This,ppEventObject)
#define IElementBehaviorSiteOM2_RegisterName(This,pchName) (This)->lpVtbl->RegisterName(This,pchName)
#define IElementBehaviorSiteOM2_RegisterUrn(This,pchUrn) (This)->lpVtbl->RegisterUrn(This,pchUrn)
/*** IElementBehaviorSiteOM2 methods ***/
#define IElementBehaviorSiteOM2_GetDefaults(This,ppDefaults) (This)->lpVtbl->GetDefaults(This,ppDefaults)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IElementBehaviorSiteOM2_QueryInterface(IElementBehaviorSiteOM2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IElementBehaviorSiteOM2_AddRef(IElementBehaviorSiteOM2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IElementBehaviorSiteOM2_Release(IElementBehaviorSiteOM2* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementBehaviorSiteOM methods ***/
static FORCEINLINE HRESULT IElementBehaviorSiteOM2_RegisterEvent(IElementBehaviorSiteOM2* This,LPOLESTR pchEvent,LONG lFlags,LONG *plCookie) {
    return This->lpVtbl->RegisterEvent(This,pchEvent,lFlags,plCookie);
}
static FORCEINLINE HRESULT IElementBehaviorSiteOM2_GetEventCookie(IElementBehaviorSiteOM2* This,LPOLESTR pchEvent,LONG *plCookie) {
    return This->lpVtbl->GetEventCookie(This,pchEvent,plCookie);
}
static FORCEINLINE HRESULT IElementBehaviorSiteOM2_FireEvent(IElementBehaviorSiteOM2* This,LONG lCookie,IHTMLEventObj *pEventObject) {
    return This->lpVtbl->FireEvent(This,lCookie,pEventObject);
}
static FORCEINLINE HRESULT IElementBehaviorSiteOM2_CreateEventObject(IElementBehaviorSiteOM2* This,IHTMLEventObj **ppEventObject) {
    return This->lpVtbl->CreateEventObject(This,ppEventObject);
}
static FORCEINLINE HRESULT IElementBehaviorSiteOM2_RegisterName(IElementBehaviorSiteOM2* This,LPOLESTR pchName) {
    return This->lpVtbl->RegisterName(This,pchName);
}
static FORCEINLINE HRESULT IElementBehaviorSiteOM2_RegisterUrn(IElementBehaviorSiteOM2* This,LPOLESTR pchUrn) {
    return This->lpVtbl->RegisterUrn(This,pchUrn);
}
/*** IElementBehaviorSiteOM2 methods ***/
static FORCEINLINE HRESULT IElementBehaviorSiteOM2_GetDefaults(IElementBehaviorSiteOM2* This,IHTMLElementDefaults **ppDefaults) {
    return This->lpVtbl->GetDefaults(This,ppDefaults);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IElementBehaviorSiteOM2_GetDefaults_Proxy(
    IElementBehaviorSiteOM2* This,
    IHTMLElementDefaults **ppDefaults);
void __RPC_STUB IElementBehaviorSiteOM2_GetDefaults_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IElementBehaviorSiteOM2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IElementBehaviorRender interface
 */
#ifndef __IElementBehaviorRender_INTERFACE_DEFINED__
#define __IElementBehaviorRender_INTERFACE_DEFINED__

DEFINE_GUID(IID_IElementBehaviorRender, 0x3050f4aa, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f4aa-98b5-11cf-bb82-00aa00bdce0b")
IElementBehaviorRender : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Draw(
        HDC hdc,
        LONG lLayer,
        RECT *pRect,
        IUnknown *pReserved) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRenderInfo(
        LONG *plRenderInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE HitTestPoint(
        POINT *pPoint,
        IUnknown *pReserved,
        WINBOOL *pbHit) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IElementBehaviorRender, 0x3050f4aa, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IElementBehaviorRenderVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IElementBehaviorRender* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IElementBehaviorRender* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IElementBehaviorRender* This);

    /*** IElementBehaviorRender methods ***/
    HRESULT (STDMETHODCALLTYPE *Draw)(
        IElementBehaviorRender* This,
        HDC hdc,
        LONG lLayer,
        RECT *pRect,
        IUnknown *pReserved);

    HRESULT (STDMETHODCALLTYPE *GetRenderInfo)(
        IElementBehaviorRender* This,
        LONG *plRenderInfo);

    HRESULT (STDMETHODCALLTYPE *HitTestPoint)(
        IElementBehaviorRender* This,
        POINT *pPoint,
        IUnknown *pReserved,
        WINBOOL *pbHit);

    END_INTERFACE
} IElementBehaviorRenderVtbl;
interface IElementBehaviorRender {
    CONST_VTBL IElementBehaviorRenderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IElementBehaviorRender_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IElementBehaviorRender_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IElementBehaviorRender_Release(This) (This)->lpVtbl->Release(This)
/*** IElementBehaviorRender methods ***/
#define IElementBehaviorRender_Draw(This,hdc,lLayer,pRect,pReserved) (This)->lpVtbl->Draw(This,hdc,lLayer,pRect,pReserved)
#define IElementBehaviorRender_GetRenderInfo(This,plRenderInfo) (This)->lpVtbl->GetRenderInfo(This,plRenderInfo)
#define IElementBehaviorRender_HitTestPoint(This,pPoint,pReserved,pbHit) (This)->lpVtbl->HitTestPoint(This,pPoint,pReserved,pbHit)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IElementBehaviorRender_QueryInterface(IElementBehaviorRender* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IElementBehaviorRender_AddRef(IElementBehaviorRender* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IElementBehaviorRender_Release(IElementBehaviorRender* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementBehaviorRender methods ***/
static FORCEINLINE HRESULT IElementBehaviorRender_Draw(IElementBehaviorRender* This,HDC hdc,LONG lLayer,RECT *pRect,IUnknown *pReserved) {
    return This->lpVtbl->Draw(This,hdc,lLayer,pRect,pReserved);
}
static FORCEINLINE HRESULT IElementBehaviorRender_GetRenderInfo(IElementBehaviorRender* This,LONG *plRenderInfo) {
    return This->lpVtbl->GetRenderInfo(This,plRenderInfo);
}
static FORCEINLINE HRESULT IElementBehaviorRender_HitTestPoint(IElementBehaviorRender* This,POINT *pPoint,IUnknown *pReserved,WINBOOL *pbHit) {
    return This->lpVtbl->HitTestPoint(This,pPoint,pReserved,pbHit);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IElementBehaviorRender_Draw_Proxy(
    IElementBehaviorRender* This,
    HDC hdc,
    LONG lLayer,
    RECT *pRect,
    IUnknown *pReserved);
void __RPC_STUB IElementBehaviorRender_Draw_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IElementBehaviorRender_GetRenderInfo_Proxy(
    IElementBehaviorRender* This,
    LONG *plRenderInfo);
void __RPC_STUB IElementBehaviorRender_GetRenderInfo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IElementBehaviorRender_HitTestPoint_Proxy(
    IElementBehaviorRender* This,
    POINT *pPoint,
    IUnknown *pReserved,
    WINBOOL *pbHit);
void __RPC_STUB IElementBehaviorRender_HitTestPoint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IElementBehaviorRender_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IElementBehaviorSiteRender interface
 */
#ifndef __IElementBehaviorSiteRender_INTERFACE_DEFINED__
#define __IElementBehaviorSiteRender_INTERFACE_DEFINED__

DEFINE_GUID(IID_IElementBehaviorSiteRender, 0x3050f4a7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f4a7-98b5-11cf-bb82-00aa00bdce0b")
IElementBehaviorSiteRender : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Invalidate(
        RECT *pRect) = 0;

    virtual HRESULT STDMETHODCALLTYPE InvalidateRenderInfo(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE InvalidateStyle(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IElementBehaviorSiteRender, 0x3050f4a7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IElementBehaviorSiteRenderVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IElementBehaviorSiteRender* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IElementBehaviorSiteRender* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IElementBehaviorSiteRender* This);

    /*** IElementBehaviorSiteRender methods ***/
    HRESULT (STDMETHODCALLTYPE *Invalidate)(
        IElementBehaviorSiteRender* This,
        RECT *pRect);

    HRESULT (STDMETHODCALLTYPE *InvalidateRenderInfo)(
        IElementBehaviorSiteRender* This);

    HRESULT (STDMETHODCALLTYPE *InvalidateStyle)(
        IElementBehaviorSiteRender* This);

    END_INTERFACE
} IElementBehaviorSiteRenderVtbl;
interface IElementBehaviorSiteRender {
    CONST_VTBL IElementBehaviorSiteRenderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IElementBehaviorSiteRender_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IElementBehaviorSiteRender_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IElementBehaviorSiteRender_Release(This) (This)->lpVtbl->Release(This)
/*** IElementBehaviorSiteRender methods ***/
#define IElementBehaviorSiteRender_Invalidate(This,pRect) (This)->lpVtbl->Invalidate(This,pRect)
#define IElementBehaviorSiteRender_InvalidateRenderInfo(This) (This)->lpVtbl->InvalidateRenderInfo(This)
#define IElementBehaviorSiteRender_InvalidateStyle(This) (This)->lpVtbl->InvalidateStyle(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IElementBehaviorSiteRender_QueryInterface(IElementBehaviorSiteRender* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IElementBehaviorSiteRender_AddRef(IElementBehaviorSiteRender* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IElementBehaviorSiteRender_Release(IElementBehaviorSiteRender* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementBehaviorSiteRender methods ***/
static FORCEINLINE HRESULT IElementBehaviorSiteRender_Invalidate(IElementBehaviorSiteRender* This,RECT *pRect) {
    return This->lpVtbl->Invalidate(This,pRect);
}
static FORCEINLINE HRESULT IElementBehaviorSiteRender_InvalidateRenderInfo(IElementBehaviorSiteRender* This) {
    return This->lpVtbl->InvalidateRenderInfo(This);
}
static FORCEINLINE HRESULT IElementBehaviorSiteRender_InvalidateStyle(IElementBehaviorSiteRender* This) {
    return This->lpVtbl->InvalidateStyle(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IElementBehaviorSiteRender_Invalidate_Proxy(
    IElementBehaviorSiteRender* This,
    RECT *pRect);
void __RPC_STUB IElementBehaviorSiteRender_Invalidate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IElementBehaviorSiteRender_InvalidateRenderInfo_Proxy(
    IElementBehaviorSiteRender* This);
void __RPC_STUB IElementBehaviorSiteRender_InvalidateRenderInfo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IElementBehaviorSiteRender_InvalidateStyle_Proxy(
    IElementBehaviorSiteRender* This);
void __RPC_STUB IElementBehaviorSiteRender_InvalidateStyle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IElementBehaviorSiteRender_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IElementBehaviorCategory interface
 */
#ifndef __IElementBehaviorCategory_INTERFACE_DEFINED__
#define __IElementBehaviorCategory_INTERFACE_DEFINED__

DEFINE_GUID(IID_IElementBehaviorCategory, 0x3050f4ed, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f4ed-98b5-11cf-bb82-00aa00bdce0b")
IElementBehaviorCategory : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCategory(
        LPOLESTR *ppchCategory) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IElementBehaviorCategory, 0x3050f4ed, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IElementBehaviorCategoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IElementBehaviorCategory* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IElementBehaviorCategory* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IElementBehaviorCategory* This);

    /*** IElementBehaviorCategory methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCategory)(
        IElementBehaviorCategory* This,
        LPOLESTR *ppchCategory);

    END_INTERFACE
} IElementBehaviorCategoryVtbl;
interface IElementBehaviorCategory {
    CONST_VTBL IElementBehaviorCategoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IElementBehaviorCategory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IElementBehaviorCategory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IElementBehaviorCategory_Release(This) (This)->lpVtbl->Release(This)
/*** IElementBehaviorCategory methods ***/
#define IElementBehaviorCategory_GetCategory(This,ppchCategory) (This)->lpVtbl->GetCategory(This,ppchCategory)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IElementBehaviorCategory_QueryInterface(IElementBehaviorCategory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IElementBehaviorCategory_AddRef(IElementBehaviorCategory* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IElementBehaviorCategory_Release(IElementBehaviorCategory* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementBehaviorCategory methods ***/
static FORCEINLINE HRESULT IElementBehaviorCategory_GetCategory(IElementBehaviorCategory* This,LPOLESTR *ppchCategory) {
    return This->lpVtbl->GetCategory(This,ppchCategory);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IElementBehaviorCategory_GetCategory_Proxy(
    IElementBehaviorCategory* This,
    LPOLESTR *ppchCategory);
void __RPC_STUB IElementBehaviorCategory_GetCategory_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IElementBehaviorCategory_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IElementBehaviorSiteCategory interface
 */
#ifndef __IElementBehaviorSiteCategory_INTERFACE_DEFINED__
#define __IElementBehaviorSiteCategory_INTERFACE_DEFINED__

DEFINE_GUID(IID_IElementBehaviorSiteCategory, 0x3050f4ee, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f4ee-98b5-11cf-bb82-00aa00bdce0b")
IElementBehaviorSiteCategory : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetRelatedBehaviors(
        LONG lDirection,
        LPOLESTR pchCategory,
        IEnumUnknown **ppEnumerator) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IElementBehaviorSiteCategory, 0x3050f4ee, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IElementBehaviorSiteCategoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IElementBehaviorSiteCategory* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IElementBehaviorSiteCategory* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IElementBehaviorSiteCategory* This);

    /*** IElementBehaviorSiteCategory methods ***/
    HRESULT (STDMETHODCALLTYPE *GetRelatedBehaviors)(
        IElementBehaviorSiteCategory* This,
        LONG lDirection,
        LPOLESTR pchCategory,
        IEnumUnknown **ppEnumerator);

    END_INTERFACE
} IElementBehaviorSiteCategoryVtbl;
interface IElementBehaviorSiteCategory {
    CONST_VTBL IElementBehaviorSiteCategoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IElementBehaviorSiteCategory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IElementBehaviorSiteCategory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IElementBehaviorSiteCategory_Release(This) (This)->lpVtbl->Release(This)
/*** IElementBehaviorSiteCategory methods ***/
#define IElementBehaviorSiteCategory_GetRelatedBehaviors(This,lDirection,pchCategory,ppEnumerator) (This)->lpVtbl->GetRelatedBehaviors(This,lDirection,pchCategory,ppEnumerator)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IElementBehaviorSiteCategory_QueryInterface(IElementBehaviorSiteCategory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IElementBehaviorSiteCategory_AddRef(IElementBehaviorSiteCategory* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IElementBehaviorSiteCategory_Release(IElementBehaviorSiteCategory* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementBehaviorSiteCategory methods ***/
static FORCEINLINE HRESULT IElementBehaviorSiteCategory_GetRelatedBehaviors(IElementBehaviorSiteCategory* This,LONG lDirection,LPOLESTR pchCategory,IEnumUnknown **ppEnumerator) {
    return This->lpVtbl->GetRelatedBehaviors(This,lDirection,pchCategory,ppEnumerator);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IElementBehaviorSiteCategory_GetRelatedBehaviors_Proxy(
    IElementBehaviorSiteCategory* This,
    LONG lDirection,
    LPOLESTR pchCategory,
    IEnumUnknown **ppEnumerator);
void __RPC_STUB IElementBehaviorSiteCategory_GetRelatedBehaviors_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IElementBehaviorSiteCategory_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IElementBehaviorSubmit interface
 */
#ifndef __IElementBehaviorSubmit_INTERFACE_DEFINED__
#define __IElementBehaviorSubmit_INTERFACE_DEFINED__

DEFINE_GUID(IID_IElementBehaviorSubmit, 0x3050f646, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f646-98b5-11cf-bb82-00aa00bdce0b")
IElementBehaviorSubmit : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSubmitInfo(
        IHTMLSubmitData *pSubmitData) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IElementBehaviorSubmit, 0x3050f646, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IElementBehaviorSubmitVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IElementBehaviorSubmit* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IElementBehaviorSubmit* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IElementBehaviorSubmit* This);

    /*** IElementBehaviorSubmit methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSubmitInfo)(
        IElementBehaviorSubmit* This,
        IHTMLSubmitData *pSubmitData);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IElementBehaviorSubmit* This);

    END_INTERFACE
} IElementBehaviorSubmitVtbl;
interface IElementBehaviorSubmit {
    CONST_VTBL IElementBehaviorSubmitVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IElementBehaviorSubmit_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IElementBehaviorSubmit_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IElementBehaviorSubmit_Release(This) (This)->lpVtbl->Release(This)
/*** IElementBehaviorSubmit methods ***/
#define IElementBehaviorSubmit_GetSubmitInfo(This,pSubmitData) (This)->lpVtbl->GetSubmitInfo(This,pSubmitData)
#define IElementBehaviorSubmit_Reset(This) (This)->lpVtbl->Reset(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IElementBehaviorSubmit_QueryInterface(IElementBehaviorSubmit* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IElementBehaviorSubmit_AddRef(IElementBehaviorSubmit* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IElementBehaviorSubmit_Release(IElementBehaviorSubmit* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementBehaviorSubmit methods ***/
static FORCEINLINE HRESULT IElementBehaviorSubmit_GetSubmitInfo(IElementBehaviorSubmit* This,IHTMLSubmitData *pSubmitData) {
    return This->lpVtbl->GetSubmitInfo(This,pSubmitData);
}
static FORCEINLINE HRESULT IElementBehaviorSubmit_Reset(IElementBehaviorSubmit* This) {
    return This->lpVtbl->Reset(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IElementBehaviorSubmit_GetSubmitInfo_Proxy(
    IElementBehaviorSubmit* This,
    IHTMLSubmitData *pSubmitData);
void __RPC_STUB IElementBehaviorSubmit_GetSubmitInfo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IElementBehaviorSubmit_Reset_Proxy(
    IElementBehaviorSubmit* This);
void __RPC_STUB IElementBehaviorSubmit_Reset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IElementBehaviorSubmit_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IElementBehaviorFocus interface
 */
#ifndef __IElementBehaviorFocus_INTERFACE_DEFINED__
#define __IElementBehaviorFocus_INTERFACE_DEFINED__

DEFINE_GUID(IID_IElementBehaviorFocus, 0x3050f6b6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f6b6-98b5-11cf-bb82-00aa00bdce0b")
IElementBehaviorFocus : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetFocusRect(
        RECT *pRect) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IElementBehaviorFocus, 0x3050f6b6, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IElementBehaviorFocusVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IElementBehaviorFocus* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IElementBehaviorFocus* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IElementBehaviorFocus* This);

    /*** IElementBehaviorFocus methods ***/
    HRESULT (STDMETHODCALLTYPE *GetFocusRect)(
        IElementBehaviorFocus* This,
        RECT *pRect);

    END_INTERFACE
} IElementBehaviorFocusVtbl;
interface IElementBehaviorFocus {
    CONST_VTBL IElementBehaviorFocusVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IElementBehaviorFocus_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IElementBehaviorFocus_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IElementBehaviorFocus_Release(This) (This)->lpVtbl->Release(This)
/*** IElementBehaviorFocus methods ***/
#define IElementBehaviorFocus_GetFocusRect(This,pRect) (This)->lpVtbl->GetFocusRect(This,pRect)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IElementBehaviorFocus_QueryInterface(IElementBehaviorFocus* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IElementBehaviorFocus_AddRef(IElementBehaviorFocus* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IElementBehaviorFocus_Release(IElementBehaviorFocus* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementBehaviorFocus methods ***/
static FORCEINLINE HRESULT IElementBehaviorFocus_GetFocusRect(IElementBehaviorFocus* This,RECT *pRect) {
    return This->lpVtbl->GetFocusRect(This,pRect);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IElementBehaviorFocus_GetFocusRect_Proxy(
    IElementBehaviorFocus* This,
    RECT *pRect);
void __RPC_STUB IElementBehaviorFocus_GetFocusRect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IElementBehaviorFocus_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IElementBehaviorLayout interface
 */
#ifndef __IElementBehaviorLayout_INTERFACE_DEFINED__
#define __IElementBehaviorLayout_INTERFACE_DEFINED__

DEFINE_GUID(IID_IElementBehaviorLayout, 0x3050f6ba, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f6ba-98b5-11cf-bb82-00aa00bdce0b")
IElementBehaviorLayout : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSize(
        LONG dwFlags,
        SIZE sizeContent,
        POINT *pptTranslateBy,
        POINT *pptTopLeft,
        SIZE *psizeProposed) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLayoutInfo(
        LONG *plLayoutInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPosition(
        LONG lFlags,
        POINT *pptTopLeft) = 0;

    virtual HRESULT STDMETHODCALLTYPE MapSize(
        SIZE *psizeIn,
        RECT *prcOut) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IElementBehaviorLayout, 0x3050f6ba, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IElementBehaviorLayoutVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IElementBehaviorLayout* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IElementBehaviorLayout* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IElementBehaviorLayout* This);

    /*** IElementBehaviorLayout methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSize)(
        IElementBehaviorLayout* This,
        LONG dwFlags,
        SIZE sizeContent,
        POINT *pptTranslateBy,
        POINT *pptTopLeft,
        SIZE *psizeProposed);

    HRESULT (STDMETHODCALLTYPE *GetLayoutInfo)(
        IElementBehaviorLayout* This,
        LONG *plLayoutInfo);

    HRESULT (STDMETHODCALLTYPE *GetPosition)(
        IElementBehaviorLayout* This,
        LONG lFlags,
        POINT *pptTopLeft);

    HRESULT (STDMETHODCALLTYPE *MapSize)(
        IElementBehaviorLayout* This,
        SIZE *psizeIn,
        RECT *prcOut);

    END_INTERFACE
} IElementBehaviorLayoutVtbl;
interface IElementBehaviorLayout {
    CONST_VTBL IElementBehaviorLayoutVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IElementBehaviorLayout_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IElementBehaviorLayout_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IElementBehaviorLayout_Release(This) (This)->lpVtbl->Release(This)
/*** IElementBehaviorLayout methods ***/
#define IElementBehaviorLayout_GetSize(This,dwFlags,sizeContent,pptTranslateBy,pptTopLeft,psizeProposed) (This)->lpVtbl->GetSize(This,dwFlags,sizeContent,pptTranslateBy,pptTopLeft,psizeProposed)
#define IElementBehaviorLayout_GetLayoutInfo(This,plLayoutInfo) (This)->lpVtbl->GetLayoutInfo(This,plLayoutInfo)
#define IElementBehaviorLayout_GetPosition(This,lFlags,pptTopLeft) (This)->lpVtbl->GetPosition(This,lFlags,pptTopLeft)
#define IElementBehaviorLayout_MapSize(This,psizeIn,prcOut) (This)->lpVtbl->MapSize(This,psizeIn,prcOut)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IElementBehaviorLayout_QueryInterface(IElementBehaviorLayout* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IElementBehaviorLayout_AddRef(IElementBehaviorLayout* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IElementBehaviorLayout_Release(IElementBehaviorLayout* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementBehaviorLayout methods ***/
static FORCEINLINE HRESULT IElementBehaviorLayout_GetSize(IElementBehaviorLayout* This,LONG dwFlags,SIZE sizeContent,POINT *pptTranslateBy,POINT *pptTopLeft,SIZE *psizeProposed) {
    return This->lpVtbl->GetSize(This,dwFlags,sizeContent,pptTranslateBy,pptTopLeft,psizeProposed);
}
static FORCEINLINE HRESULT IElementBehaviorLayout_GetLayoutInfo(IElementBehaviorLayout* This,LONG *plLayoutInfo) {
    return This->lpVtbl->GetLayoutInfo(This,plLayoutInfo);
}
static FORCEINLINE HRESULT IElementBehaviorLayout_GetPosition(IElementBehaviorLayout* This,LONG lFlags,POINT *pptTopLeft) {
    return This->lpVtbl->GetPosition(This,lFlags,pptTopLeft);
}
static FORCEINLINE HRESULT IElementBehaviorLayout_MapSize(IElementBehaviorLayout* This,SIZE *psizeIn,RECT *prcOut) {
    return This->lpVtbl->MapSize(This,psizeIn,prcOut);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IElementBehaviorLayout_GetSize_Proxy(
    IElementBehaviorLayout* This,
    LONG dwFlags,
    SIZE sizeContent,
    POINT *pptTranslateBy,
    POINT *pptTopLeft,
    SIZE *psizeProposed);
void __RPC_STUB IElementBehaviorLayout_GetSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IElementBehaviorLayout_GetLayoutInfo_Proxy(
    IElementBehaviorLayout* This,
    LONG *plLayoutInfo);
void __RPC_STUB IElementBehaviorLayout_GetLayoutInfo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IElementBehaviorLayout_GetPosition_Proxy(
    IElementBehaviorLayout* This,
    LONG lFlags,
    POINT *pptTopLeft);
void __RPC_STUB IElementBehaviorLayout_GetPosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IElementBehaviorLayout_MapSize_Proxy(
    IElementBehaviorLayout* This,
    SIZE *psizeIn,
    RECT *prcOut);
void __RPC_STUB IElementBehaviorLayout_MapSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IElementBehaviorLayout_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IElementBehaviorLayout2 interface
 */
#ifndef __IElementBehaviorLayout2_INTERFACE_DEFINED__
#define __IElementBehaviorLayout2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IElementBehaviorLayout2, 0x3050f846, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f846-98b5-11cf-bb82-00aa00bdce0b")
IElementBehaviorLayout2 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetTextDescent(
        LONG *plDescent) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IElementBehaviorLayout2, 0x3050f846, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IElementBehaviorLayout2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IElementBehaviorLayout2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IElementBehaviorLayout2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IElementBehaviorLayout2* This);

    /*** IElementBehaviorLayout2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTextDescent)(
        IElementBehaviorLayout2* This,
        LONG *plDescent);

    END_INTERFACE
} IElementBehaviorLayout2Vtbl;
interface IElementBehaviorLayout2 {
    CONST_VTBL IElementBehaviorLayout2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IElementBehaviorLayout2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IElementBehaviorLayout2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IElementBehaviorLayout2_Release(This) (This)->lpVtbl->Release(This)
/*** IElementBehaviorLayout2 methods ***/
#define IElementBehaviorLayout2_GetTextDescent(This,plDescent) (This)->lpVtbl->GetTextDescent(This,plDescent)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IElementBehaviorLayout2_QueryInterface(IElementBehaviorLayout2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IElementBehaviorLayout2_AddRef(IElementBehaviorLayout2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IElementBehaviorLayout2_Release(IElementBehaviorLayout2* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementBehaviorLayout2 methods ***/
static FORCEINLINE HRESULT IElementBehaviorLayout2_GetTextDescent(IElementBehaviorLayout2* This,LONG *plDescent) {
    return This->lpVtbl->GetTextDescent(This,plDescent);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IElementBehaviorLayout2_GetTextDescent_Proxy(
    IElementBehaviorLayout2* This,
    LONG *plDescent);
void __RPC_STUB IElementBehaviorLayout2_GetTextDescent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IElementBehaviorLayout2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IElementBehaviorSiteLayout interface
 */
#ifndef __IElementBehaviorSiteLayout_INTERFACE_DEFINED__
#define __IElementBehaviorSiteLayout_INTERFACE_DEFINED__

DEFINE_GUID(IID_IElementBehaviorSiteLayout, 0x3050f6b7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f6b7-98b5-11cf-bb82-00aa00bdce0b")
IElementBehaviorSiteLayout : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE InvalidateLayoutInfo(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE InvalidateSize(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMediaResolution(
        SIZE *psizeResolution) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IElementBehaviorSiteLayout, 0x3050f6b7, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IElementBehaviorSiteLayoutVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IElementBehaviorSiteLayout* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IElementBehaviorSiteLayout* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IElementBehaviorSiteLayout* This);

    /*** IElementBehaviorSiteLayout methods ***/
    HRESULT (STDMETHODCALLTYPE *InvalidateLayoutInfo)(
        IElementBehaviorSiteLayout* This);

    HRESULT (STDMETHODCALLTYPE *InvalidateSize)(
        IElementBehaviorSiteLayout* This);

    HRESULT (STDMETHODCALLTYPE *GetMediaResolution)(
        IElementBehaviorSiteLayout* This,
        SIZE *psizeResolution);

    END_INTERFACE
} IElementBehaviorSiteLayoutVtbl;
interface IElementBehaviorSiteLayout {
    CONST_VTBL IElementBehaviorSiteLayoutVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IElementBehaviorSiteLayout_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IElementBehaviorSiteLayout_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IElementBehaviorSiteLayout_Release(This) (This)->lpVtbl->Release(This)
/*** IElementBehaviorSiteLayout methods ***/
#define IElementBehaviorSiteLayout_InvalidateLayoutInfo(This) (This)->lpVtbl->InvalidateLayoutInfo(This)
#define IElementBehaviorSiteLayout_InvalidateSize(This) (This)->lpVtbl->InvalidateSize(This)
#define IElementBehaviorSiteLayout_GetMediaResolution(This,psizeResolution) (This)->lpVtbl->GetMediaResolution(This,psizeResolution)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IElementBehaviorSiteLayout_QueryInterface(IElementBehaviorSiteLayout* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IElementBehaviorSiteLayout_AddRef(IElementBehaviorSiteLayout* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IElementBehaviorSiteLayout_Release(IElementBehaviorSiteLayout* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementBehaviorSiteLayout methods ***/
static FORCEINLINE HRESULT IElementBehaviorSiteLayout_InvalidateLayoutInfo(IElementBehaviorSiteLayout* This) {
    return This->lpVtbl->InvalidateLayoutInfo(This);
}
static FORCEINLINE HRESULT IElementBehaviorSiteLayout_InvalidateSize(IElementBehaviorSiteLayout* This) {
    return This->lpVtbl->InvalidateSize(This);
}
static FORCEINLINE HRESULT IElementBehaviorSiteLayout_GetMediaResolution(IElementBehaviorSiteLayout* This,SIZE *psizeResolution) {
    return This->lpVtbl->GetMediaResolution(This,psizeResolution);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IElementBehaviorSiteLayout_InvalidateLayoutInfo_Proxy(
    IElementBehaviorSiteLayout* This);
void __RPC_STUB IElementBehaviorSiteLayout_InvalidateLayoutInfo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IElementBehaviorSiteLayout_InvalidateSize_Proxy(
    IElementBehaviorSiteLayout* This);
void __RPC_STUB IElementBehaviorSiteLayout_InvalidateSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IElementBehaviorSiteLayout_GetMediaResolution_Proxy(
    IElementBehaviorSiteLayout* This,
    SIZE *psizeResolution);
void __RPC_STUB IElementBehaviorSiteLayout_GetMediaResolution_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IElementBehaviorSiteLayout_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IElementBehaviorSiteLayout2 interface
 */
#ifndef __IElementBehaviorSiteLayout2_INTERFACE_DEFINED__
#define __IElementBehaviorSiteLayout2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IElementBehaviorSiteLayout2, 0x3050f847, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f847-98b5-11cf-bb82-00aa00bdce0b")
IElementBehaviorSiteLayout2 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetFontInfo(
        LOGFONTW *plf) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IElementBehaviorSiteLayout2, 0x3050f847, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IElementBehaviorSiteLayout2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IElementBehaviorSiteLayout2* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IElementBehaviorSiteLayout2* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IElementBehaviorSiteLayout2* This);

    /*** IElementBehaviorSiteLayout2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetFontInfo)(
        IElementBehaviorSiteLayout2* This,
        LOGFONTW *plf);

    END_INTERFACE
} IElementBehaviorSiteLayout2Vtbl;
interface IElementBehaviorSiteLayout2 {
    CONST_VTBL IElementBehaviorSiteLayout2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IElementBehaviorSiteLayout2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IElementBehaviorSiteLayout2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IElementBehaviorSiteLayout2_Release(This) (This)->lpVtbl->Release(This)
/*** IElementBehaviorSiteLayout2 methods ***/
#define IElementBehaviorSiteLayout2_GetFontInfo(This,plf) (This)->lpVtbl->GetFontInfo(This,plf)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IElementBehaviorSiteLayout2_QueryInterface(IElementBehaviorSiteLayout2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IElementBehaviorSiteLayout2_AddRef(IElementBehaviorSiteLayout2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IElementBehaviorSiteLayout2_Release(IElementBehaviorSiteLayout2* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementBehaviorSiteLayout2 methods ***/
static FORCEINLINE HRESULT IElementBehaviorSiteLayout2_GetFontInfo(IElementBehaviorSiteLayout2* This,LOGFONTW *plf) {
    return This->lpVtbl->GetFontInfo(This,plf);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IElementBehaviorSiteLayout2_GetFontInfo_Proxy(
    IElementBehaviorSiteLayout2* This,
    LOGFONTW *plf);
void __RPC_STUB IElementBehaviorSiteLayout2_GetFontInfo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IElementBehaviorSiteLayout2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHostBehaviorInit interface
 */
#ifndef __IHostBehaviorInit_INTERFACE_DEFINED__
#define __IHostBehaviorInit_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHostBehaviorInit, 0x3050f842, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3050f842-98b5-11cf-bb82-00aa00bdce0b")
IHostBehaviorInit : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE PopulateNamespaceTable(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHostBehaviorInit, 0x3050f842, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IHostBehaviorInitVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHostBehaviorInit* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHostBehaviorInit* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHostBehaviorInit* This);

    /*** IHostBehaviorInit methods ***/
    HRESULT (STDMETHODCALLTYPE *PopulateNamespaceTable)(
        IHostBehaviorInit* This);

    END_INTERFACE
} IHostBehaviorInitVtbl;
interface IHostBehaviorInit {
    CONST_VTBL IHostBehaviorInitVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHostBehaviorInit_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHostBehaviorInit_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHostBehaviorInit_Release(This) (This)->lpVtbl->Release(This)
/*** IHostBehaviorInit methods ***/
#define IHostBehaviorInit_PopulateNamespaceTable(This) (This)->lpVtbl->PopulateNamespaceTable(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHostBehaviorInit_QueryInterface(IHostBehaviorInit* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHostBehaviorInit_AddRef(IHostBehaviorInit* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHostBehaviorInit_Release(IHostBehaviorInit* This) {
    return This->lpVtbl->Release(This);
}
/*** IHostBehaviorInit methods ***/
static FORCEINLINE HRESULT IHostBehaviorInit_PopulateNamespaceTable(IHostBehaviorInit* This) {
    return This->lpVtbl->PopulateNamespaceTable(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHostBehaviorInit_PopulateNamespaceTable_Proxy(
    IHostBehaviorInit* This);
void __RPC_STUB IHostBehaviorInit_PopulateNamespaceTable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHostBehaviorInit_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IViewObjectPresentSite interface
 */
#ifndef __IViewObjectPresentSite_INTERFACE_DEFINED__
#define __IViewObjectPresentSite_INTERFACE_DEFINED__

DEFINE_GUID(IID_IViewObjectPresentSite, 0x305106e1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106e1-98b5-11cf-bb82-00aa00bdce0b")
IViewObjectPresentSite : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateSurfacePresenter(
        IUnknown *pDevice,
        UINT width,
        UINT height,
        UINT backBufferCount,
        DXGI_FORMAT format,
        VIEW_OBJECT_ALPHA_MODE mode,
        ISurfacePresenter **ppQueue) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsHardwareComposition(
        WINBOOL *pIsHardwareComposition) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCompositionMode(
        VIEW_OBJECT_COMPOSITION_MODE mode) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IViewObjectPresentSite, 0x305106e1, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IViewObjectPresentSiteVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IViewObjectPresentSite* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IViewObjectPresentSite* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IViewObjectPresentSite* This);

    /*** IViewObjectPresentSite methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateSurfacePresenter)(
        IViewObjectPresentSite* This,
        IUnknown *pDevice,
        UINT width,
        UINT height,
        UINT backBufferCount,
        DXGI_FORMAT format,
        VIEW_OBJECT_ALPHA_MODE mode,
        ISurfacePresenter **ppQueue);

    HRESULT (STDMETHODCALLTYPE *IsHardwareComposition)(
        IViewObjectPresentSite* This,
        WINBOOL *pIsHardwareComposition);

    HRESULT (STDMETHODCALLTYPE *SetCompositionMode)(
        IViewObjectPresentSite* This,
        VIEW_OBJECT_COMPOSITION_MODE mode);

    END_INTERFACE
} IViewObjectPresentSiteVtbl;
interface IViewObjectPresentSite {
    CONST_VTBL IViewObjectPresentSiteVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IViewObjectPresentSite_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IViewObjectPresentSite_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IViewObjectPresentSite_Release(This) (This)->lpVtbl->Release(This)
/*** IViewObjectPresentSite methods ***/
#define IViewObjectPresentSite_CreateSurfacePresenter(This,pDevice,width,height,backBufferCount,format,mode,ppQueue) (This)->lpVtbl->CreateSurfacePresenter(This,pDevice,width,height,backBufferCount,format,mode,ppQueue)
#define IViewObjectPresentSite_IsHardwareComposition(This,pIsHardwareComposition) (This)->lpVtbl->IsHardwareComposition(This,pIsHardwareComposition)
#define IViewObjectPresentSite_SetCompositionMode(This,mode) (This)->lpVtbl->SetCompositionMode(This,mode)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IViewObjectPresentSite_QueryInterface(IViewObjectPresentSite* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IViewObjectPresentSite_AddRef(IViewObjectPresentSite* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IViewObjectPresentSite_Release(IViewObjectPresentSite* This) {
    return This->lpVtbl->Release(This);
}
/*** IViewObjectPresentSite methods ***/
static FORCEINLINE HRESULT IViewObjectPresentSite_CreateSurfacePresenter(IViewObjectPresentSite* This,IUnknown *pDevice,UINT width,UINT height,UINT backBufferCount,DXGI_FORMAT format,VIEW_OBJECT_ALPHA_MODE mode,ISurfacePresenter **ppQueue) {
    return This->lpVtbl->CreateSurfacePresenter(This,pDevice,width,height,backBufferCount,format,mode,ppQueue);
}
static FORCEINLINE HRESULT IViewObjectPresentSite_IsHardwareComposition(IViewObjectPresentSite* This,WINBOOL *pIsHardwareComposition) {
    return This->lpVtbl->IsHardwareComposition(This,pIsHardwareComposition);
}
static FORCEINLINE HRESULT IViewObjectPresentSite_SetCompositionMode(IViewObjectPresentSite* This,VIEW_OBJECT_COMPOSITION_MODE mode) {
    return This->lpVtbl->SetCompositionMode(This,mode);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IViewObjectPresentSite_CreateSurfacePresenter_Proxy(
    IViewObjectPresentSite* This,
    IUnknown *pDevice,
    UINT width,
    UINT height,
    UINT backBufferCount,
    DXGI_FORMAT format,
    VIEW_OBJECT_ALPHA_MODE mode,
    ISurfacePresenter **ppQueue);
void __RPC_STUB IViewObjectPresentSite_CreateSurfacePresenter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IViewObjectPresentSite_IsHardwareComposition_Proxy(
    IViewObjectPresentSite* This,
    WINBOOL *pIsHardwareComposition);
void __RPC_STUB IViewObjectPresentSite_IsHardwareComposition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IViewObjectPresentSite_SetCompositionMode_Proxy(
    IViewObjectPresentSite* This,
    VIEW_OBJECT_COMPOSITION_MODE mode);
void __RPC_STUB IViewObjectPresentSite_SetCompositionMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IViewObjectPresentSite_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISurfacePresenter interface
 */
#ifndef __ISurfacePresenter_INTERFACE_DEFINED__
#define __ISurfacePresenter_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISurfacePresenter, 0x305106e2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106e2-98b5-11cf-bb82-00aa00bdce0b")
ISurfacePresenter : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Present(
        UINT uBuffer,
        RECT *pDirty) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBuffer(
        UINT backBufferIndex,
        REFIID riid,
        void **ppBuffer) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsCurrent(
        WINBOOL *pIsCurrent) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISurfacePresenter, 0x305106e2, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ISurfacePresenterVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISurfacePresenter* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISurfacePresenter* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISurfacePresenter* This);

    /*** ISurfacePresenter methods ***/
    HRESULT (STDMETHODCALLTYPE *Present)(
        ISurfacePresenter* This,
        UINT uBuffer,
        RECT *pDirty);

    HRESULT (STDMETHODCALLTYPE *GetBuffer)(
        ISurfacePresenter* This,
        UINT backBufferIndex,
        REFIID riid,
        void **ppBuffer);

    HRESULT (STDMETHODCALLTYPE *IsCurrent)(
        ISurfacePresenter* This,
        WINBOOL *pIsCurrent);

    END_INTERFACE
} ISurfacePresenterVtbl;
interface ISurfacePresenter {
    CONST_VTBL ISurfacePresenterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISurfacePresenter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISurfacePresenter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISurfacePresenter_Release(This) (This)->lpVtbl->Release(This)
/*** ISurfacePresenter methods ***/
#define ISurfacePresenter_Present(This,uBuffer,pDirty) (This)->lpVtbl->Present(This,uBuffer,pDirty)
#define ISurfacePresenter_GetBuffer(This,backBufferIndex,riid,ppBuffer) (This)->lpVtbl->GetBuffer(This,backBufferIndex,riid,ppBuffer)
#define ISurfacePresenter_IsCurrent(This,pIsCurrent) (This)->lpVtbl->IsCurrent(This,pIsCurrent)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISurfacePresenter_QueryInterface(ISurfacePresenter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISurfacePresenter_AddRef(ISurfacePresenter* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISurfacePresenter_Release(ISurfacePresenter* This) {
    return This->lpVtbl->Release(This);
}
/*** ISurfacePresenter methods ***/
static FORCEINLINE HRESULT ISurfacePresenter_Present(ISurfacePresenter* This,UINT uBuffer,RECT *pDirty) {
    return This->lpVtbl->Present(This,uBuffer,pDirty);
}
static FORCEINLINE HRESULT ISurfacePresenter_GetBuffer(ISurfacePresenter* This,UINT backBufferIndex,REFIID riid,void **ppBuffer) {
    return This->lpVtbl->GetBuffer(This,backBufferIndex,riid,ppBuffer);
}
static FORCEINLINE HRESULT ISurfacePresenter_IsCurrent(ISurfacePresenter* This,WINBOOL *pIsCurrent) {
    return This->lpVtbl->IsCurrent(This,pIsCurrent);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISurfacePresenter_Present_Proxy(
    ISurfacePresenter* This,
    UINT uBuffer,
    RECT *pDirty);
void __RPC_STUB ISurfacePresenter_Present_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISurfacePresenter_GetBuffer_Proxy(
    ISurfacePresenter* This,
    UINT backBufferIndex,
    REFIID riid,
    void **ppBuffer);
void __RPC_STUB ISurfacePresenter_GetBuffer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISurfacePresenter_IsCurrent_Proxy(
    ISurfacePresenter* This,
    WINBOOL *pIsCurrent);
void __RPC_STUB ISurfacePresenter_IsCurrent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISurfacePresenter_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ICanvasPixelArrayData interface
 */
#ifndef __ICanvasPixelArrayData_INTERFACE_DEFINED__
#define __ICanvasPixelArrayData_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICanvasPixelArrayData, 0x305107f9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305107f9-98b5-11cf-bb82-00aa00bdce0b")
ICanvasPixelArrayData : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetBufferPointer(
        BYTE **ppBuffer,
        ULONG *pBufferLength) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICanvasPixelArrayData, 0x305107f9, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ICanvasPixelArrayDataVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICanvasPixelArrayData* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICanvasPixelArrayData* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICanvasPixelArrayData* This);

    /*** ICanvasPixelArrayData methods ***/
    HRESULT (STDMETHODCALLTYPE *GetBufferPointer)(
        ICanvasPixelArrayData* This,
        BYTE **ppBuffer,
        ULONG *pBufferLength);

    END_INTERFACE
} ICanvasPixelArrayDataVtbl;
interface ICanvasPixelArrayData {
    CONST_VTBL ICanvasPixelArrayDataVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICanvasPixelArrayData_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICanvasPixelArrayData_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICanvasPixelArrayData_Release(This) (This)->lpVtbl->Release(This)
/*** ICanvasPixelArrayData methods ***/
#define ICanvasPixelArrayData_GetBufferPointer(This,ppBuffer,pBufferLength) (This)->lpVtbl->GetBufferPointer(This,ppBuffer,pBufferLength)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ICanvasPixelArrayData_QueryInterface(ICanvasPixelArrayData* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ICanvasPixelArrayData_AddRef(ICanvasPixelArrayData* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ICanvasPixelArrayData_Release(ICanvasPixelArrayData* This) {
    return This->lpVtbl->Release(This);
}
/*** ICanvasPixelArrayData methods ***/
static FORCEINLINE HRESULT ICanvasPixelArrayData_GetBufferPointer(ICanvasPixelArrayData* This,BYTE **ppBuffer,ULONG *pBufferLength) {
    return This->lpVtbl->GetBufferPointer(This,ppBuffer,pBufferLength);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ICanvasPixelArrayData_GetBufferPointer_Proxy(
    ICanvasPixelArrayData* This,
    BYTE **ppBuffer,
    ULONG *pBufferLength);
void __RPC_STUB ICanvasPixelArrayData_GetBufferPointer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ICanvasPixelArrayData_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IViewObjectPrint interface
 */
#ifndef __IViewObjectPrint_INTERFACE_DEFINED__
#define __IViewObjectPrint_INTERFACE_DEFINED__

DEFINE_GUID(IID_IViewObjectPrint, 0x305106e3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305106e3-98b5-11cf-bb82-00aa00bdce0b")
IViewObjectPrint : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetPrintBitmap(
        IUnknown **ppPrintBitmap) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IViewObjectPrint, 0x305106e3, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IViewObjectPrintVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IViewObjectPrint* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IViewObjectPrint* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IViewObjectPrint* This);

    /*** IViewObjectPrint methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPrintBitmap)(
        IViewObjectPrint* This,
        IUnknown **ppPrintBitmap);

    END_INTERFACE
} IViewObjectPrintVtbl;
interface IViewObjectPrint {
    CONST_VTBL IViewObjectPrintVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IViewObjectPrint_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IViewObjectPrint_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IViewObjectPrint_Release(This) (This)->lpVtbl->Release(This)
/*** IViewObjectPrint methods ***/
#define IViewObjectPrint_GetPrintBitmap(This,ppPrintBitmap) (This)->lpVtbl->GetPrintBitmap(This,ppPrintBitmap)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IViewObjectPrint_QueryInterface(IViewObjectPrint* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IViewObjectPrint_AddRef(IViewObjectPrint* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IViewObjectPrint_Release(IViewObjectPrint* This) {
    return This->lpVtbl->Release(This);
}
/*** IViewObjectPrint methods ***/
static FORCEINLINE HRESULT IViewObjectPrint_GetPrintBitmap(IViewObjectPrint* This,IUnknown **ppPrintBitmap) {
    return This->lpVtbl->GetPrintBitmap(This,ppPrintBitmap);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IViewObjectPrint_GetPrintBitmap_Proxy(
    IViewObjectPrint* This,
    IUnknown **ppPrintBitmap);
void __RPC_STUB IViewObjectPrint_GetPrintBitmap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IViewObjectPrint_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IViewObjectPresentNotifySite interface
 */
#ifndef __IViewObjectPresentNotifySite_INTERFACE_DEFINED__
#define __IViewObjectPresentNotifySite_INTERFACE_DEFINED__

DEFINE_GUID(IID_IViewObjectPresentNotifySite, 0x305107fa, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305107fa-98b5-11cf-bb82-00aa00bdce0b")
IViewObjectPresentNotifySite : public IViewObjectPresentSite
{
    virtual HRESULT STDMETHODCALLTYPE RequestFrame(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IViewObjectPresentNotifySite, 0x305107fa, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IViewObjectPresentNotifySiteVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IViewObjectPresentNotifySite* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IViewObjectPresentNotifySite* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IViewObjectPresentNotifySite* This);

    /*** IViewObjectPresentSite methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateSurfacePresenter)(
        IViewObjectPresentNotifySite* This,
        IUnknown *pDevice,
        UINT width,
        UINT height,
        UINT backBufferCount,
        DXGI_FORMAT format,
        VIEW_OBJECT_ALPHA_MODE mode,
        ISurfacePresenter **ppQueue);

    HRESULT (STDMETHODCALLTYPE *IsHardwareComposition)(
        IViewObjectPresentNotifySite* This,
        WINBOOL *pIsHardwareComposition);

    HRESULT (STDMETHODCALLTYPE *SetCompositionMode)(
        IViewObjectPresentNotifySite* This,
        VIEW_OBJECT_COMPOSITION_MODE mode);

    /*** IViewObjectPresentNotifySite methods ***/
    HRESULT (STDMETHODCALLTYPE *RequestFrame)(
        IViewObjectPresentNotifySite* This);

    END_INTERFACE
} IViewObjectPresentNotifySiteVtbl;
interface IViewObjectPresentNotifySite {
    CONST_VTBL IViewObjectPresentNotifySiteVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IViewObjectPresentNotifySite_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IViewObjectPresentNotifySite_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IViewObjectPresentNotifySite_Release(This) (This)->lpVtbl->Release(This)
/*** IViewObjectPresentSite methods ***/
#define IViewObjectPresentNotifySite_CreateSurfacePresenter(This,pDevice,width,height,backBufferCount,format,mode,ppQueue) (This)->lpVtbl->CreateSurfacePresenter(This,pDevice,width,height,backBufferCount,format,mode,ppQueue)
#define IViewObjectPresentNotifySite_IsHardwareComposition(This,pIsHardwareComposition) (This)->lpVtbl->IsHardwareComposition(This,pIsHardwareComposition)
#define IViewObjectPresentNotifySite_SetCompositionMode(This,mode) (This)->lpVtbl->SetCompositionMode(This,mode)
/*** IViewObjectPresentNotifySite methods ***/
#define IViewObjectPresentNotifySite_RequestFrame(This) (This)->lpVtbl->RequestFrame(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IViewObjectPresentNotifySite_QueryInterface(IViewObjectPresentNotifySite* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IViewObjectPresentNotifySite_AddRef(IViewObjectPresentNotifySite* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IViewObjectPresentNotifySite_Release(IViewObjectPresentNotifySite* This) {
    return This->lpVtbl->Release(This);
}
/*** IViewObjectPresentSite methods ***/
static FORCEINLINE HRESULT IViewObjectPresentNotifySite_CreateSurfacePresenter(IViewObjectPresentNotifySite* This,IUnknown *pDevice,UINT width,UINT height,UINT backBufferCount,DXGI_FORMAT format,VIEW_OBJECT_ALPHA_MODE mode,ISurfacePresenter **ppQueue) {
    return This->lpVtbl->CreateSurfacePresenter(This,pDevice,width,height,backBufferCount,format,mode,ppQueue);
}
static FORCEINLINE HRESULT IViewObjectPresentNotifySite_IsHardwareComposition(IViewObjectPresentNotifySite* This,WINBOOL *pIsHardwareComposition) {
    return This->lpVtbl->IsHardwareComposition(This,pIsHardwareComposition);
}
static FORCEINLINE HRESULT IViewObjectPresentNotifySite_SetCompositionMode(IViewObjectPresentNotifySite* This,VIEW_OBJECT_COMPOSITION_MODE mode) {
    return This->lpVtbl->SetCompositionMode(This,mode);
}
/*** IViewObjectPresentNotifySite methods ***/
static FORCEINLINE HRESULT IViewObjectPresentNotifySite_RequestFrame(IViewObjectPresentNotifySite* This) {
    return This->lpVtbl->RequestFrame(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IViewObjectPresentNotifySite_RequestFrame_Proxy(
    IViewObjectPresentNotifySite* This);
void __RPC_STUB IViewObjectPresentNotifySite_RequestFrame_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IViewObjectPresentNotifySite_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IViewObjectPresentNotify interface
 */
#ifndef __IViewObjectPresentNotify_INTERFACE_DEFINED__
#define __IViewObjectPresentNotify_INTERFACE_DEFINED__

DEFINE_GUID(IID_IViewObjectPresentNotify, 0x305107f8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("305107f8-98b5-11cf-bb82-00aa00bdce0b")
IViewObjectPresentNotify : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnPreRender(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IViewObjectPresentNotify, 0x305107f8, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct IViewObjectPresentNotifyVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IViewObjectPresentNotify* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IViewObjectPresentNotify* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IViewObjectPresentNotify* This);

    /*** IViewObjectPresentNotify methods ***/
    HRESULT (STDMETHODCALLTYPE *OnPreRender)(
        IViewObjectPresentNotify* This);

    END_INTERFACE
} IViewObjectPresentNotifyVtbl;
interface IViewObjectPresentNotify {
    CONST_VTBL IViewObjectPresentNotifyVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IViewObjectPresentNotify_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IViewObjectPresentNotify_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IViewObjectPresentNotify_Release(This) (This)->lpVtbl->Release(This)
/*** IViewObjectPresentNotify methods ***/
#define IViewObjectPresentNotify_OnPreRender(This) (This)->lpVtbl->OnPreRender(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IViewObjectPresentNotify_QueryInterface(IViewObjectPresentNotify* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IViewObjectPresentNotify_AddRef(IViewObjectPresentNotify* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IViewObjectPresentNotify_Release(IViewObjectPresentNotify* This) {
    return This->lpVtbl->Release(This);
}
/*** IViewObjectPresentNotify methods ***/
static FORCEINLINE HRESULT IViewObjectPresentNotify_OnPreRender(IViewObjectPresentNotify* This) {
    return This->lpVtbl->OnPreRender(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IViewObjectPresentNotify_OnPreRender_Proxy(
    IViewObjectPresentNotify* This);
void __RPC_STUB IViewObjectPresentNotify_OnPreRender_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IViewObjectPresentNotify_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITrackingProtection interface
 */
#ifndef __ITrackingProtection_INTERFACE_DEFINED__
#define __ITrackingProtection_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITrackingProtection, 0x30510803, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30510803-98b5-11cf-bb82-00aa00bdce0b")
ITrackingProtection : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE EvaluateUrl(
        BSTR bstrUrl,
        WINBOOL *pfAllowed) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEnabled(
        WINBOOL *pfEnabled) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITrackingProtection, 0x30510803, 0x98b5, 0x11cf, 0xbb,0x82, 0x00,0xaa,0x00,0xbd,0xce,0x0b)
#endif
#else
typedef struct ITrackingProtectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ITrackingProtection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ITrackingProtection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ITrackingProtection* This);

    /*** ITrackingProtection methods ***/
    HRESULT (STDMETHODCALLTYPE *EvaluateUrl)(
        ITrackingProtection* This,
        BSTR bstrUrl,
        WINBOOL *pfAllowed);

    HRESULT (STDMETHODCALLTYPE *GetEnabled)(
        ITrackingProtection* This,
        WINBOOL *pfEnabled);

    END_INTERFACE
} ITrackingProtectionVtbl;
interface ITrackingProtection {
    CONST_VTBL ITrackingProtectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITrackingProtection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITrackingProtection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITrackingProtection_Release(This) (This)->lpVtbl->Release(This)
/*** ITrackingProtection methods ***/
#define ITrackingProtection_EvaluateUrl(This,bstrUrl,pfAllowed) (This)->lpVtbl->EvaluateUrl(This,bstrUrl,pfAllowed)
#define ITrackingProtection_GetEnabled(This,pfEnabled) (This)->lpVtbl->GetEnabled(This,pfEnabled)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ITrackingProtection_QueryInterface(ITrackingProtection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ITrackingProtection_AddRef(ITrackingProtection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ITrackingProtection_Release(ITrackingProtection* This) {
    return This->lpVtbl->Release(This);
}
/*** ITrackingProtection methods ***/
static FORCEINLINE HRESULT ITrackingProtection_EvaluateUrl(ITrackingProtection* This,BSTR bstrUrl,WINBOOL *pfAllowed) {
    return This->lpVtbl->EvaluateUrl(This,bstrUrl,pfAllowed);
}
static FORCEINLINE HRESULT ITrackingProtection_GetEnabled(ITrackingProtection* This,WINBOOL *pfEnabled) {
    return This->lpVtbl->GetEnabled(This,pfEnabled);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ITrackingProtection_EvaluateUrl_Proxy(
    ITrackingProtection* This,
    BSTR bstrUrl,
    WINBOOL *pfAllowed);
void __RPC_STUB ITrackingProtection_EvaluateUrl_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITrackingProtection_GetEnabled_Proxy(
    ITrackingProtection* This,
    WINBOOL *pfEnabled);
void __RPC_STUB ITrackingProtection_GetEnabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ITrackingProtection_INTERFACE_DEFINED__ */

#endif
/* Begin additional prototypes for all interfaces */

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 *);
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 HDC_UserSize     (ULONG *, ULONG, HDC *);
unsigned char * __RPC_USER HDC_UserMarshal  (ULONG *, unsigned char *, HDC *);
unsigned char * __RPC_USER HDC_UserUnmarshal(ULONG *, unsigned char *, HDC *);
void            __RPC_USER HDC_UserFree     (ULONG *, HDC *);
ULONG           __RPC_USER HGLOBAL_UserSize     (ULONG *, ULONG, HGLOBAL *);
unsigned char * __RPC_USER HGLOBAL_UserMarshal  (ULONG *, unsigned char *, HGLOBAL *);
unsigned char * __RPC_USER HGLOBAL_UserUnmarshal(ULONG *, unsigned char *, HGLOBAL *);
void            __RPC_USER HGLOBAL_UserFree     (ULONG *, HGLOBAL *);
ULONG           __RPC_USER HRGN_UserSize     (ULONG *, ULONG, HRGN *);
unsigned char * __RPC_USER HRGN_UserMarshal  (ULONG *, unsigned char *, HRGN *);
unsigned char * __RPC_USER HRGN_UserUnmarshal(ULONG *, unsigned char *, HRGN *);
void            __RPC_USER HRGN_UserFree     (ULONG *, HRGN *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __mshtml_h__ */
