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

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

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

#ifndef __mshtml_h__
#define __mshtml_h__

/* Forward declarations */

#ifndef __IHTMLFiltersCollection_FWD_DEFINED__
#define __IHTMLFiltersCollection_FWD_DEFINED__
typedef interface IHTMLFiltersCollection IHTMLFiltersCollection;
#ifdef __cplusplus
interface IHTMLFiltersCollection;
#endif /* __cplusplus */
#endif

#ifndef __IIE70DispatchEx_FWD_DEFINED__
#define __IIE70DispatchEx_FWD_DEFINED__
typedef interface IIE70DispatchEx IIE70DispatchEx;
#ifdef __cplusplus
interface IIE70DispatchEx;
#endif /* __cplusplus */
#endif

#ifndef __IIE80DispatchEx_FWD_DEFINED__
#define __IIE80DispatchEx_FWD_DEFINED__
typedef interface IIE80DispatchEx IIE80DispatchEx;
#ifdef __cplusplus
interface IIE80DispatchEx;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDOMConstructor_FWD_DEFINED__
#define __IHTMLDOMConstructor_FWD_DEFINED__
typedef interface IHTMLDOMConstructor IHTMLDOMConstructor;
#ifdef __cplusplus
interface IHTMLDOMConstructor;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLCSSStyleDeclaration_FWD_DEFINED__
#define __IHTMLCSSStyleDeclaration_FWD_DEFINED__
typedef interface IHTMLCSSStyleDeclaration IHTMLCSSStyleDeclaration;
#ifdef __cplusplus
interface IHTMLCSSStyleDeclaration;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLCSSStyleDeclaration2_FWD_DEFINED__
#define __IHTMLCSSStyleDeclaration2_FWD_DEFINED__
typedef interface IHTMLCSSStyleDeclaration2 IHTMLCSSStyleDeclaration2;
#ifdef __cplusplus
interface IHTMLCSSStyleDeclaration2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLStyleEnabled_FWD_DEFINED__
#define __IHTMLStyleEnabled_FWD_DEFINED__
typedef interface IHTMLStyleEnabled IHTMLStyleEnabled;
#ifdef __cplusplus
interface IHTMLStyleEnabled;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLCSSStyleDeclaration_FWD_DEFINED__
#define __DispHTMLCSSStyleDeclaration_FWD_DEFINED__
typedef interface DispHTMLCSSStyleDeclaration DispHTMLCSSStyleDeclaration;
#ifdef __cplusplus
interface DispHTMLCSSStyleDeclaration;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLStyle;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLStyle2_FWD_DEFINED__
#define __IHTMLStyle2_FWD_DEFINED__
typedef interface IHTMLStyle2 IHTMLStyle2;
#ifdef __cplusplus
interface IHTMLStyle2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLStyle3_FWD_DEFINED__
#define __IHTMLStyle3_FWD_DEFINED__
typedef interface IHTMLStyle3 IHTMLStyle3;
#ifdef __cplusplus
interface IHTMLStyle3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLStyle4_FWD_DEFINED__
#define __IHTMLStyle4_FWD_DEFINED__
typedef interface IHTMLStyle4 IHTMLStyle4;
#ifdef __cplusplus
interface IHTMLStyle4;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLStyle5_FWD_DEFINED__
#define __IHTMLStyle5_FWD_DEFINED__
typedef interface IHTMLStyle5 IHTMLStyle5;
#ifdef __cplusplus
interface IHTMLStyle5;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLStyle6_FWD_DEFINED__
#define __IHTMLStyle6_FWD_DEFINED__
typedef interface IHTMLStyle6 IHTMLStyle6;
#ifdef __cplusplus
interface IHTMLStyle6;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLRuleStyle_FWD_DEFINED__
#define __IHTMLRuleStyle_FWD_DEFINED__
typedef interface IHTMLRuleStyle IHTMLRuleStyle;
#ifdef __cplusplus
interface IHTMLRuleStyle;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLRuleStyle2_FWD_DEFINED__
#define __IHTMLRuleStyle2_FWD_DEFINED__
typedef interface IHTMLRuleStyle2 IHTMLRuleStyle2;
#ifdef __cplusplus
interface IHTMLRuleStyle2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLRuleStyle3_FWD_DEFINED__
#define __IHTMLRuleStyle3_FWD_DEFINED__
typedef interface IHTMLRuleStyle3 IHTMLRuleStyle3;
#ifdef __cplusplus
interface IHTMLRuleStyle3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLRuleStyle4_FWD_DEFINED__
#define __IHTMLRuleStyle4_FWD_DEFINED__
typedef interface IHTMLRuleStyle4 IHTMLRuleStyle4;
#ifdef __cplusplus
interface IHTMLRuleStyle4;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLRuleStyle5_FWD_DEFINED__
#define __IHTMLRuleStyle5_FWD_DEFINED__
typedef interface IHTMLRuleStyle5 IHTMLRuleStyle5;
#ifdef __cplusplus
interface IHTMLRuleStyle5;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLRuleStyle6_FWD_DEFINED__
#define __IHTMLRuleStyle6_FWD_DEFINED__
typedef interface IHTMLRuleStyle6 IHTMLRuleStyle6;
#ifdef __cplusplus
interface IHTMLRuleStyle6;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLStyle_FWD_DEFINED__
#define __DispHTMLStyle_FWD_DEFINED__
typedef interface DispHTMLStyle DispHTMLStyle;
#ifdef __cplusplus
interface DispHTMLStyle;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLRuleStyle;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLCSSRule;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLCSSImportRule_FWD_DEFINED__
#define __IHTMLCSSImportRule_FWD_DEFINED__
typedef interface IHTMLCSSImportRule IHTMLCSSImportRule;
#ifdef __cplusplus
interface IHTMLCSSImportRule;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLCSSMediaRule_FWD_DEFINED__
#define __IHTMLCSSMediaRule_FWD_DEFINED__
typedef interface IHTMLCSSMediaRule IHTMLCSSMediaRule;
#ifdef __cplusplus
interface IHTMLCSSMediaRule;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLCSSMediaList_FWD_DEFINED__
#define __IHTMLCSSMediaList_FWD_DEFINED__
typedef interface IHTMLCSSMediaList IHTMLCSSMediaList;
#ifdef __cplusplus
interface IHTMLCSSMediaList;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLCSSNamespaceRule_FWD_DEFINED__
#define __IHTMLCSSNamespaceRule_FWD_DEFINED__
typedef interface IHTMLCSSNamespaceRule IHTMLCSSNamespaceRule;
#ifdef __cplusplus
interface IHTMLCSSNamespaceRule;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLMSCSSKeyframeRule_FWD_DEFINED__
#define __IHTMLMSCSSKeyframeRule_FWD_DEFINED__
typedef interface IHTMLMSCSSKeyframeRule IHTMLMSCSSKeyframeRule;
#ifdef __cplusplus
interface IHTMLMSCSSKeyframeRule;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLMSCSSKeyframesRule_FWD_DEFINED__
#define __IHTMLMSCSSKeyframesRule_FWD_DEFINED__
typedef interface IHTMLMSCSSKeyframesRule IHTMLMSCSSKeyframesRule;
#ifdef __cplusplus
interface IHTMLMSCSSKeyframesRule;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLCSSRule_FWD_DEFINED__
#define __DispHTMLCSSRule_FWD_DEFINED__
typedef interface DispHTMLCSSRule DispHTMLCSSRule;
#ifdef __cplusplus
interface DispHTMLCSSRule;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLCSSImportRule;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLCSSMediaRule;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLCSSMediaList;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLCSSNamespaceRule;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLMSCSSKeyframeRule;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLMSCSSKeyframesRule;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLRenderStyle;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLRenderStyle_FWD_DEFINED__
#define __DispHTMLRenderStyle_FWD_DEFINED__
typedef interface DispHTMLRenderStyle DispHTMLRenderStyle;
#ifdef __cplusplus
interface DispHTMLRenderStyle;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLCurrentStyle;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLCurrentStyle2_FWD_DEFINED__
#define __IHTMLCurrentStyle2_FWD_DEFINED__
typedef interface IHTMLCurrentStyle2 IHTMLCurrentStyle2;
#ifdef __cplusplus
interface IHTMLCurrentStyle2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLCurrentStyle3_FWD_DEFINED__
#define __IHTMLCurrentStyle3_FWD_DEFINED__
typedef interface IHTMLCurrentStyle3 IHTMLCurrentStyle3;
#ifdef __cplusplus
interface IHTMLCurrentStyle3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLCurrentStyle4_FWD_DEFINED__
#define __IHTMLCurrentStyle4_FWD_DEFINED__
typedef interface IHTMLCurrentStyle4 IHTMLCurrentStyle4;
#ifdef __cplusplus
interface IHTMLCurrentStyle4;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLCurrentStyle5_FWD_DEFINED__
#define __IHTMLCurrentStyle5_FWD_DEFINED__
typedef interface IHTMLCurrentStyle5 IHTMLCurrentStyle5;
#ifdef __cplusplus
interface IHTMLCurrentStyle5;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLCurrentStyle_FWD_DEFINED__
#define __DispHTMLCurrentStyle_FWD_DEFINED__
typedef interface DispHTMLCurrentStyle DispHTMLCurrentStyle;
#ifdef __cplusplus
interface DispHTMLCurrentStyle;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLRect;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLRect2_FWD_DEFINED__
#define __IHTMLRect2_FWD_DEFINED__
typedef interface IHTMLRect2 IHTMLRect2;
#ifdef __cplusplus
interface IHTMLRect2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLRectCollection_FWD_DEFINED__
#define __IHTMLRectCollection_FWD_DEFINED__
typedef interface IHTMLRectCollection IHTMLRectCollection;
#ifdef __cplusplus
interface IHTMLRectCollection;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDOMNode_FWD_DEFINED__
#define __IHTMLDOMNode_FWD_DEFINED__
typedef interface IHTMLDOMNode IHTMLDOMNode;
#ifdef __cplusplus
interface IHTMLDOMNode;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDOMNode2_FWD_DEFINED__
#define __IHTMLDOMNode2_FWD_DEFINED__
typedef interface IHTMLDOMNode2 IHTMLDOMNode2;
#ifdef __cplusplus
interface IHTMLDOMNode2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDOMNode3_FWD_DEFINED__
#define __IHTMLDOMNode3_FWD_DEFINED__
typedef interface IHTMLDOMNode3 IHTMLDOMNode3;
#ifdef __cplusplus
interface IHTMLDOMNode3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDOMAttribute_FWD_DEFINED__
#define __IHTMLDOMAttribute_FWD_DEFINED__
typedef interface IHTMLDOMAttribute IHTMLDOMAttribute;
#ifdef __cplusplus
interface IHTMLDOMAttribute;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDOMAttribute2_FWD_DEFINED__
#define __IHTMLDOMAttribute2_FWD_DEFINED__
typedef interface IHTMLDOMAttribute2 IHTMLDOMAttribute2;
#ifdef __cplusplus
interface IHTMLDOMAttribute2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDOMAttribute3_FWD_DEFINED__
#define __IHTMLDOMAttribute3_FWD_DEFINED__
typedef interface IHTMLDOMAttribute3 IHTMLDOMAttribute3;
#ifdef __cplusplus
interface IHTMLDOMAttribute3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDOMAttribute4_FWD_DEFINED__
#define __IHTMLDOMAttribute4_FWD_DEFINED__
typedef interface IHTMLDOMAttribute4 IHTMLDOMAttribute4;
#ifdef __cplusplus
interface IHTMLDOMAttribute4;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDOMTextNode_FWD_DEFINED__
#define __IHTMLDOMTextNode_FWD_DEFINED__
typedef interface IHTMLDOMTextNode IHTMLDOMTextNode;
#ifdef __cplusplus
interface IHTMLDOMTextNode;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDOMTextNode2_FWD_DEFINED__
#define __IHTMLDOMTextNode2_FWD_DEFINED__
typedef interface IHTMLDOMTextNode2 IHTMLDOMTextNode2;
#ifdef __cplusplus
interface IHTMLDOMTextNode2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDOMTextNode3_FWD_DEFINED__
#define __IHTMLDOMTextNode3_FWD_DEFINED__
typedef interface IHTMLDOMTextNode3 IHTMLDOMTextNode3;
#ifdef __cplusplus
interface IHTMLDOMTextNode3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDOMImplementation_FWD_DEFINED__
#define __IHTMLDOMImplementation_FWD_DEFINED__
typedef interface IHTMLDOMImplementation IHTMLDOMImplementation;
#ifdef __cplusplus
interface IHTMLDOMImplementation;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDOMImplementation2_FWD_DEFINED__
#define __IHTMLDOMImplementation2_FWD_DEFINED__
typedef interface IHTMLDOMImplementation2 IHTMLDOMImplementation2;
#ifdef __cplusplus
interface IHTMLDOMImplementation2;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLDOMAttribute_FWD_DEFINED__
#define __DispHTMLDOMAttribute_FWD_DEFINED__
typedef interface DispHTMLDOMAttribute DispHTMLDOMAttribute;
#ifdef __cplusplus
interface DispHTMLDOMAttribute;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLDOMTextNode;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLDOMImplementation;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLAttributeCollection;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLAttributeCollection2_FWD_DEFINED__
#define __IHTMLAttributeCollection2_FWD_DEFINED__
typedef interface IHTMLAttributeCollection2 IHTMLAttributeCollection2;
#ifdef __cplusplus
interface IHTMLAttributeCollection2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLAttributeCollection3_FWD_DEFINED__
#define __IHTMLAttributeCollection3_FWD_DEFINED__
typedef interface IHTMLAttributeCollection3 IHTMLAttributeCollection3;
#ifdef __cplusplus
interface IHTMLAttributeCollection3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLAttributeCollection4_FWD_DEFINED__
#define __IHTMLAttributeCollection4_FWD_DEFINED__
typedef interface IHTMLAttributeCollection4 IHTMLAttributeCollection4;
#ifdef __cplusplus
interface IHTMLAttributeCollection4;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDOMChildrenCollection_FWD_DEFINED__
#define __IHTMLDOMChildrenCollection_FWD_DEFINED__
typedef interface IHTMLDOMChildrenCollection IHTMLDOMChildrenCollection;
#ifdef __cplusplus
interface IHTMLDOMChildrenCollection;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDOMChildrenCollection2_FWD_DEFINED__
#define __IHTMLDOMChildrenCollection2_FWD_DEFINED__
typedef interface IHTMLDOMChildrenCollection2 IHTMLDOMChildrenCollection2;
#ifdef __cplusplus
interface IHTMLDOMChildrenCollection2;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLAttributeCollection_FWD_DEFINED__
#define __DispHTMLAttributeCollection_FWD_DEFINED__
typedef interface DispHTMLAttributeCollection DispHTMLAttributeCollection;
#ifdef __cplusplus
interface DispHTMLAttributeCollection;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispStaticNodeList;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispDOMChildrenCollection;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface HTMLElementEvents4;
#endif /* __cplusplus */
#endif

#ifndef __HTMLElementEvents3_FWD_DEFINED__
#define __HTMLElementEvents3_FWD_DEFINED__
typedef interface HTMLElementEvents3 HTMLElementEvents3;
#ifdef __cplusplus
interface HTMLElementEvents3;
#endif /* __cplusplus */
#endif

#ifndef __HTMLElementEvents2_FWD_DEFINED__
#define __HTMLElementEvents2_FWD_DEFINED__
typedef interface HTMLElementEvents2 HTMLElementEvents2;
#ifdef __cplusplus
interface HTMLElementEvents2;
#endif /* __cplusplus */
#endif

#ifndef __HTMLElementEvents_FWD_DEFINED__
#define __HTMLElementEvents_FWD_DEFINED__
typedef interface HTMLElementEvents HTMLElementEvents;
#ifdef __cplusplus
interface HTMLElementEvents;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLElement_FWD_DEFINED__
#define __IHTMLElement_FWD_DEFINED__
typedef interface IHTMLElement IHTMLElement;
#ifdef __cplusplus
interface IHTMLElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLElement2_FWD_DEFINED__
#define __IHTMLElement2_FWD_DEFINED__
typedef interface IHTMLElement2 IHTMLElement2;
#ifdef __cplusplus
interface IHTMLElement2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLElement3_FWD_DEFINED__
#define __IHTMLElement3_FWD_DEFINED__
typedef interface IHTMLElement3 IHTMLElement3;
#ifdef __cplusplus
interface IHTMLElement3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLElement4_FWD_DEFINED__
#define __IHTMLElement4_FWD_DEFINED__
typedef interface IHTMLElement4 IHTMLElement4;
#ifdef __cplusplus
interface IHTMLElement4;
#endif /* __cplusplus */
#endif

#ifndef __IElementSelector_FWD_DEFINED__
#define __IElementSelector_FWD_DEFINED__
typedef interface IElementSelector IElementSelector;
#ifdef __cplusplus
interface IElementSelector;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLElementRender_FWD_DEFINED__
#define __IHTMLElementRender_FWD_DEFINED__
typedef interface IHTMLElementRender IHTMLElementRender;
#ifdef __cplusplus
interface IHTMLElementRender;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLUniqueName_FWD_DEFINED__
#define __IHTMLUniqueName_FWD_DEFINED__
typedef interface IHTMLUniqueName IHTMLUniqueName;
#ifdef __cplusplus
interface IHTMLUniqueName;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLElement5_FWD_DEFINED__
#define __IHTMLElement5_FWD_DEFINED__
typedef interface IHTMLElement5 IHTMLElement5;
#ifdef __cplusplus
interface IHTMLElement5;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLElement6_FWD_DEFINED__
#define __IHTMLElement6_FWD_DEFINED__
typedef interface IHTMLElement6 IHTMLElement6;
#ifdef __cplusplus
interface IHTMLElement6;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLElement7_FWD_DEFINED__
#define __IHTMLElement7_FWD_DEFINED__
typedef interface IHTMLElement7 IHTMLElement7;
#ifdef __cplusplus
interface IHTMLElement7;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLElementAppliedStyles_FWD_DEFINED__
#define __IHTMLElementAppliedStyles_FWD_DEFINED__
typedef interface IHTMLElementAppliedStyles IHTMLElementAppliedStyles;
#ifdef __cplusplus
interface IHTMLElementAppliedStyles;
#endif /* __cplusplus */
#endif

#ifndef __IElementTraversal_FWD_DEFINED__
#define __IElementTraversal_FWD_DEFINED__
typedef interface IElementTraversal IElementTraversal;
#ifdef __cplusplus
interface IElementTraversal;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDatabinding_FWD_DEFINED__
#define __IHTMLDatabinding_FWD_DEFINED__
typedef interface IHTMLDatabinding IHTMLDatabinding;
#ifdef __cplusplus
interface IHTMLDatabinding;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLElementDefaults_FWD_DEFINED__
#define __IHTMLElementDefaults_FWD_DEFINED__
typedef interface IHTMLElementDefaults IHTMLElementDefaults;
#ifdef __cplusplus
interface IHTMLElementDefaults;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLDefaults_FWD_DEFINED__
#define __DispHTMLDefaults_FWD_DEFINED__
typedef interface DispHTMLDefaults DispHTMLDefaults;
#ifdef __cplusplus
interface DispHTMLDefaults;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTCDefaultDispatch;
#endif /* __cplusplus */
#endif

#ifndef __IHTCPropertyBehavior_FWD_DEFINED__
#define __IHTCPropertyBehavior_FWD_DEFINED__
typedef interface IHTCPropertyBehavior IHTCPropertyBehavior;
#ifdef __cplusplus
interface IHTCPropertyBehavior;
#endif /* __cplusplus */
#endif

#ifndef __IHTCMethodBehavior_FWD_DEFINED__
#define __IHTCMethodBehavior_FWD_DEFINED__
typedef interface IHTCMethodBehavior IHTCMethodBehavior;
#ifdef __cplusplus
interface IHTCMethodBehavior;
#endif /* __cplusplus */
#endif

#ifndef __IHTCEventBehavior_FWD_DEFINED__
#define __IHTCEventBehavior_FWD_DEFINED__
typedef interface IHTCEventBehavior IHTCEventBehavior;
#ifdef __cplusplus
interface IHTCEventBehavior;
#endif /* __cplusplus */
#endif

#ifndef __IHTCAttachBehavior_FWD_DEFINED__
#define __IHTCAttachBehavior_FWD_DEFINED__
typedef interface IHTCAttachBehavior IHTCAttachBehavior;
#ifdef __cplusplus
interface IHTCAttachBehavior;
#endif /* __cplusplus */
#endif

#ifndef __IHTCAttachBehavior2_FWD_DEFINED__
#define __IHTCAttachBehavior2_FWD_DEFINED__
typedef interface IHTCAttachBehavior2 IHTCAttachBehavior2;
#ifdef __cplusplus
interface IHTCAttachBehavior2;
#endif /* __cplusplus */
#endif

#ifndef __IHTCDescBehavior_FWD_DEFINED__
#define __IHTCDescBehavior_FWD_DEFINED__
typedef interface IHTCDescBehavior IHTCDescBehavior;
#ifdef __cplusplus
interface IHTCDescBehavior;
#endif /* __cplusplus */
#endif

#ifndef __DispHTCDefaultDispatch_FWD_DEFINED__
#define __DispHTCDefaultDispatch_FWD_DEFINED__
typedef interface DispHTCDefaultDispatch DispHTCDefaultDispatch;
#ifdef __cplusplus
interface DispHTCDefaultDispatch;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTCPropertyBehavior;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTCMethodBehavior;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTCEventBehavior;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTCAttachBehavior;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTCDescBehavior;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLUrnCollection;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLUrnCollection_FWD_DEFINED__
#define __DispHTMLUrnCollection_FWD_DEFINED__
typedef interface DispHTMLUrnCollection DispHTMLUrnCollection;
#ifdef __cplusplus
interface DispHTMLUrnCollection;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLGenericElement;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLGenericElement_FWD_DEFINED__
#define __DispHTMLGenericElement_FWD_DEFINED__
typedef interface DispHTMLGenericElement DispHTMLGenericElement;
#ifdef __cplusplus
interface DispHTMLGenericElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLStyleSheetRule;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLStyleSheetRuleApplied_FWD_DEFINED__
#define __IHTMLStyleSheetRuleApplied_FWD_DEFINED__
typedef interface IHTMLStyleSheetRuleApplied IHTMLStyleSheetRuleApplied;
#ifdef __cplusplus
interface IHTMLStyleSheetRuleApplied;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLStyleSheetRule2_FWD_DEFINED__
#define __IHTMLStyleSheetRule2_FWD_DEFINED__
typedef interface IHTMLStyleSheetRule2 IHTMLStyleSheetRule2;
#ifdef __cplusplus
interface IHTMLStyleSheetRule2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLStyleSheetRulesCollection_FWD_DEFINED__
#define __IHTMLStyleSheetRulesCollection_FWD_DEFINED__
typedef interface IHTMLStyleSheetRulesCollection IHTMLStyleSheetRulesCollection;
#ifdef __cplusplus
interface IHTMLStyleSheetRulesCollection;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLStyleSheetRulesCollection2_FWD_DEFINED__
#define __IHTMLStyleSheetRulesCollection2_FWD_DEFINED__
typedef interface IHTMLStyleSheetRulesCollection2 IHTMLStyleSheetRulesCollection2;
#ifdef __cplusplus
interface IHTMLStyleSheetRulesCollection2;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLStyleSheetRule_FWD_DEFINED__
#define __DispHTMLStyleSheetRule_FWD_DEFINED__
typedef interface DispHTMLStyleSheetRule DispHTMLStyleSheetRule;
#ifdef __cplusplus
interface DispHTMLStyleSheetRule;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLStyleSheetRulesCollection;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLStyleSheetPage;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLStyleSheetPage2_FWD_DEFINED__
#define __IHTMLStyleSheetPage2_FWD_DEFINED__
typedef interface IHTMLStyleSheetPage2 IHTMLStyleSheetPage2;
#ifdef __cplusplus
interface IHTMLStyleSheetPage2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLStyleSheetPagesCollection_FWD_DEFINED__
#define __IHTMLStyleSheetPagesCollection_FWD_DEFINED__
typedef interface IHTMLStyleSheetPagesCollection IHTMLStyleSheetPagesCollection;
#ifdef __cplusplus
interface IHTMLStyleSheetPagesCollection;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLStyleSheetPage_FWD_DEFINED__
#define __DispHTMLStyleSheetPage_FWD_DEFINED__
typedef interface DispHTMLStyleSheetPage DispHTMLStyleSheetPage;
#ifdef __cplusplus
interface DispHTMLStyleSheetPage;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLStyleSheetPagesCollection;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLStyleSheet;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLStyleSheet2_FWD_DEFINED__
#define __IHTMLStyleSheet2_FWD_DEFINED__
typedef interface IHTMLStyleSheet2 IHTMLStyleSheet2;
#ifdef __cplusplus
interface IHTMLStyleSheet2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLStyleSheet3_FWD_DEFINED__
#define __IHTMLStyleSheet3_FWD_DEFINED__
typedef interface IHTMLStyleSheet3 IHTMLStyleSheet3;
#ifdef __cplusplus
interface IHTMLStyleSheet3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLStyleSheet4_FWD_DEFINED__
#define __IHTMLStyleSheet4_FWD_DEFINED__
typedef interface IHTMLStyleSheet4 IHTMLStyleSheet4;
#ifdef __cplusplus
interface IHTMLStyleSheet4;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLStyleSheet_FWD_DEFINED__
#define __DispHTMLStyleSheet_FWD_DEFINED__
typedef interface DispHTMLStyleSheet DispHTMLStyleSheet;
#ifdef __cplusplus
interface DispHTMLStyleSheet;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLStyleSheetsCollection;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLStyleSheetsCollection2_FWD_DEFINED__
#define __IHTMLStyleSheetsCollection2_FWD_DEFINED__
typedef interface IHTMLStyleSheetsCollection2 IHTMLStyleSheetsCollection2;
#ifdef __cplusplus
interface IHTMLStyleSheetsCollection2;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLStyleSheetsCollection_FWD_DEFINED__
#define __DispHTMLStyleSheetsCollection_FWD_DEFINED__
typedef interface DispHTMLStyleSheetsCollection DispHTMLStyleSheetsCollection;
#ifdef __cplusplus
interface DispHTMLStyleSheetsCollection;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface HTMLLinkElementEvents2;
#endif /* __cplusplus */
#endif

#ifndef __HTMLLinkElementEvents_FWD_DEFINED__
#define __HTMLLinkElementEvents_FWD_DEFINED__
typedef interface HTMLLinkElementEvents HTMLLinkElementEvents;
#ifdef __cplusplus
interface HTMLLinkElementEvents;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLLinkElement_FWD_DEFINED__
#define __IHTMLLinkElement_FWD_DEFINED__
typedef interface IHTMLLinkElement IHTMLLinkElement;
#ifdef __cplusplus
interface IHTMLLinkElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLLinkElement2_FWD_DEFINED__
#define __IHTMLLinkElement2_FWD_DEFINED__
typedef interface IHTMLLinkElement2 IHTMLLinkElement2;
#ifdef __cplusplus
interface IHTMLLinkElement2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLLinkElement3_FWD_DEFINED__
#define __IHTMLLinkElement3_FWD_DEFINED__
typedef interface IHTMLLinkElement3 IHTMLLinkElement3;
#ifdef __cplusplus
interface IHTMLLinkElement3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLLinkElement4_FWD_DEFINED__
#define __IHTMLLinkElement4_FWD_DEFINED__
typedef interface IHTMLLinkElement4 IHTMLLinkElement4;
#ifdef __cplusplus
interface IHTMLLinkElement4;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLLinkElement5_FWD_DEFINED__
#define __IHTMLLinkElement5_FWD_DEFINED__
typedef interface IHTMLLinkElement5 IHTMLLinkElement5;
#ifdef __cplusplus
interface IHTMLLinkElement5;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLLinkElement_FWD_DEFINED__
#define __DispHTMLLinkElement_FWD_DEFINED__
typedef interface DispHTMLLinkElement DispHTMLLinkElement;
#ifdef __cplusplus
interface DispHTMLLinkElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLTxtRange;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLTextRangeMetrics_FWD_DEFINED__
#define __IHTMLTextRangeMetrics_FWD_DEFINED__
typedef interface IHTMLTextRangeMetrics IHTMLTextRangeMetrics;
#ifdef __cplusplus
interface IHTMLTextRangeMetrics;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLTextRangeMetrics2_FWD_DEFINED__
#define __IHTMLTextRangeMetrics2_FWD_DEFINED__
typedef interface IHTMLTextRangeMetrics2 IHTMLTextRangeMetrics2;
#ifdef __cplusplus
interface IHTMLTextRangeMetrics2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLTxtRangeCollection_FWD_DEFINED__
#define __IHTMLTxtRangeCollection_FWD_DEFINED__
typedef interface IHTMLTxtRangeCollection IHTMLTxtRangeCollection;
#ifdef __cplusplus
interface IHTMLTxtRangeCollection;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDOMRange_FWD_DEFINED__
#define __IHTMLDOMRange_FWD_DEFINED__
typedef interface IHTMLDOMRange IHTMLDOMRange;
#ifdef __cplusplus
interface IHTMLDOMRange;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLDOMRange_FWD_DEFINED__
#define __DispHTMLDOMRange_FWD_DEFINED__
typedef interface DispHTMLDOMRange DispHTMLDOMRange;
#ifdef __cplusplus
interface DispHTMLDOMRange;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface HTMLFormElementEvents2;
#endif /* __cplusplus */
#endif

#ifndef __HTMLFormElementEvents_FWD_DEFINED__
#define __HTMLFormElementEvents_FWD_DEFINED__
typedef interface HTMLFormElementEvents HTMLFormElementEvents;
#ifdef __cplusplus
interface HTMLFormElementEvents;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLFormElement_FWD_DEFINED__
#define __IHTMLFormElement_FWD_DEFINED__
typedef interface IHTMLFormElement IHTMLFormElement;
#ifdef __cplusplus
interface IHTMLFormElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLFormElement2_FWD_DEFINED__
#define __IHTMLFormElement2_FWD_DEFINED__
typedef interface IHTMLFormElement2 IHTMLFormElement2;
#ifdef __cplusplus
interface IHTMLFormElement2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLFormElement3_FWD_DEFINED__
#define __IHTMLFormElement3_FWD_DEFINED__
typedef interface IHTMLFormElement3 IHTMLFormElement3;
#ifdef __cplusplus
interface IHTMLFormElement3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLSubmitData_FWD_DEFINED__
#define __IHTMLSubmitData_FWD_DEFINED__
typedef interface IHTMLSubmitData IHTMLSubmitData;
#ifdef __cplusplus
interface IHTMLSubmitData;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLFormElement4_FWD_DEFINED__
#define __IHTMLFormElement4_FWD_DEFINED__
typedef interface IHTMLFormElement4 IHTMLFormElement4;
#ifdef __cplusplus
interface IHTMLFormElement4;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLFormElement_FWD_DEFINED__
#define __DispHTMLFormElement_FWD_DEFINED__
typedef interface DispHTMLFormElement DispHTMLFormElement;
#ifdef __cplusplus
interface DispHTMLFormElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface HTMLControlElementEvents2;
#endif /* __cplusplus */
#endif

#ifndef __HTMLControlElementEvents_FWD_DEFINED__
#define __HTMLControlElementEvents_FWD_DEFINED__
typedef interface HTMLControlElementEvents HTMLControlElementEvents;
#ifdef __cplusplus
interface HTMLControlElementEvents;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLControlElement_FWD_DEFINED__
#define __IHTMLControlElement_FWD_DEFINED__
typedef interface IHTMLControlElement IHTMLControlElement;
#ifdef __cplusplus
interface IHTMLControlElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLTextElement_FWD_DEFINED__
#define __IHTMLTextElement_FWD_DEFINED__
typedef interface IHTMLTextElement IHTMLTextElement;
#ifdef __cplusplus
interface IHTMLTextElement;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLTextElement_FWD_DEFINED__
#define __DispHTMLTextElement_FWD_DEFINED__
typedef interface DispHTMLTextElement DispHTMLTextElement;
#ifdef __cplusplus
interface DispHTMLTextElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface HTMLTextContainerEvents2;
#endif /* __cplusplus */
#endif

#ifndef __HTMLTextContainerEvents_FWD_DEFINED__
#define __HTMLTextContainerEvents_FWD_DEFINED__
typedef interface HTMLTextContainerEvents HTMLTextContainerEvents;
#ifdef __cplusplus
interface HTMLTextContainerEvents;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLTextContainer_FWD_DEFINED__
#define __IHTMLTextContainer_FWD_DEFINED__
typedef interface IHTMLTextContainer IHTMLTextContainer;
#ifdef __cplusplus
interface IHTMLTextContainer;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLControlRange_FWD_DEFINED__
#define __IHTMLControlRange_FWD_DEFINED__
typedef interface IHTMLControlRange IHTMLControlRange;
#ifdef __cplusplus
interface IHTMLControlRange;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLControlRange2_FWD_DEFINED__
#define __IHTMLControlRange2_FWD_DEFINED__
typedef interface IHTMLControlRange2 IHTMLControlRange2;
#ifdef __cplusplus
interface IHTMLControlRange2;
#endif /* __cplusplus */
#endif

#ifndef __HTMLImgEvents2_FWD_DEFINED__
#define __HTMLImgEvents2_FWD_DEFINED__
typedef interface HTMLImgEvents2 HTMLImgEvents2;
#ifdef __cplusplus
interface HTMLImgEvents2;
#endif /* __cplusplus */
#endif

#ifndef __HTMLImgEvents_FWD_DEFINED__
#define __HTMLImgEvents_FWD_DEFINED__
typedef interface HTMLImgEvents HTMLImgEvents;
#ifdef __cplusplus
interface HTMLImgEvents;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLImgElement_FWD_DEFINED__
#define __IHTMLImgElement_FWD_DEFINED__
typedef interface IHTMLImgElement IHTMLImgElement;
#ifdef __cplusplus
interface IHTMLImgElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLImgElement2_FWD_DEFINED__
#define __IHTMLImgElement2_FWD_DEFINED__
typedef interface IHTMLImgElement2 IHTMLImgElement2;
#ifdef __cplusplus
interface IHTMLImgElement2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLImgElement3_FWD_DEFINED__
#define __IHTMLImgElement3_FWD_DEFINED__
typedef interface IHTMLImgElement3 IHTMLImgElement3;
#ifdef __cplusplus
interface IHTMLImgElement3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLImgElement4_FWD_DEFINED__
#define __IHTMLImgElement4_FWD_DEFINED__
typedef interface IHTMLImgElement4 IHTMLImgElement4;
#ifdef __cplusplus
interface IHTMLImgElement4;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLMSImgElement_FWD_DEFINED__
#define __IHTMLMSImgElement_FWD_DEFINED__
typedef interface IHTMLMSImgElement IHTMLMSImgElement;
#ifdef __cplusplus
interface IHTMLMSImgElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLImageElementFactory_FWD_DEFINED__
#define __IHTMLImageElementFactory_FWD_DEFINED__
typedef interface IHTMLImageElementFactory IHTMLImageElementFactory;
#ifdef __cplusplus
interface IHTMLImageElementFactory;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLImg_FWD_DEFINED__
#define __DispHTMLImg_FWD_DEFINED__
typedef interface DispHTMLImg DispHTMLImg;
#ifdef __cplusplus
interface DispHTMLImg;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLBodyElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLBodyElement2_FWD_DEFINED__
#define __IHTMLBodyElement2_FWD_DEFINED__
typedef interface IHTMLBodyElement2 IHTMLBodyElement2;
#ifdef __cplusplus
interface IHTMLBodyElement2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLBodyElement3_FWD_DEFINED__
#define __IHTMLBodyElement3_FWD_DEFINED__
typedef interface IHTMLBodyElement3 IHTMLBodyElement3;
#ifdef __cplusplus
interface IHTMLBodyElement3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLBodyElement4_FWD_DEFINED__
#define __IHTMLBodyElement4_FWD_DEFINED__
typedef interface IHTMLBodyElement4 IHTMLBodyElement4;
#ifdef __cplusplus
interface IHTMLBodyElement4;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLBodyElement5_FWD_DEFINED__
#define __IHTMLBodyElement5_FWD_DEFINED__
typedef interface IHTMLBodyElement5 IHTMLBodyElement5;
#ifdef __cplusplus
interface IHTMLBodyElement5;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLBody_FWD_DEFINED__
#define __DispHTMLBody_FWD_DEFINED__
typedef interface DispHTMLBody DispHTMLBody;
#ifdef __cplusplus
interface DispHTMLBody;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLFontElement;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLFontElement_FWD_DEFINED__
#define __DispHTMLFontElement_FWD_DEFINED__
typedef interface DispHTMLFontElement DispHTMLFontElement;
#ifdef __cplusplus
interface DispHTMLFontElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface HTMLAnchorEvents2;
#endif /* __cplusplus */
#endif

#ifndef __HTMLAnchorEvents_FWD_DEFINED__
#define __HTMLAnchorEvents_FWD_DEFINED__
typedef interface HTMLAnchorEvents HTMLAnchorEvents;
#ifdef __cplusplus
interface HTMLAnchorEvents;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLAnchorElement_FWD_DEFINED__
#define __IHTMLAnchorElement_FWD_DEFINED__
typedef interface IHTMLAnchorElement IHTMLAnchorElement;
#ifdef __cplusplus
interface IHTMLAnchorElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLAnchorElement2_FWD_DEFINED__
#define __IHTMLAnchorElement2_FWD_DEFINED__
typedef interface IHTMLAnchorElement2 IHTMLAnchorElement2;
#ifdef __cplusplus
interface IHTMLAnchorElement2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLAnchorElement3_FWD_DEFINED__
#define __IHTMLAnchorElement3_FWD_DEFINED__
typedef interface IHTMLAnchorElement3 IHTMLAnchorElement3;
#ifdef __cplusplus
interface IHTMLAnchorElement3;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLAnchorElement_FWD_DEFINED__
#define __DispHTMLAnchorElement_FWD_DEFINED__
typedef interface DispHTMLAnchorElement DispHTMLAnchorElement;
#ifdef __cplusplus
interface DispHTMLAnchorElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface HTMLLabelEvents2;
#endif /* __cplusplus */
#endif

#ifndef __HTMLLabelEvents_FWD_DEFINED__
#define __HTMLLabelEvents_FWD_DEFINED__
typedef interface HTMLLabelEvents HTMLLabelEvents;
#ifdef __cplusplus
interface HTMLLabelEvents;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLLabelElement_FWD_DEFINED__
#define __IHTMLLabelElement_FWD_DEFINED__
typedef interface IHTMLLabelElement IHTMLLabelElement;
#ifdef __cplusplus
interface IHTMLLabelElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLLabelElement2_FWD_DEFINED__
#define __IHTMLLabelElement2_FWD_DEFINED__
typedef interface IHTMLLabelElement2 IHTMLLabelElement2;
#ifdef __cplusplus
interface IHTMLLabelElement2;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLLabelElement_FWD_DEFINED__
#define __DispHTMLLabelElement_FWD_DEFINED__
typedef interface DispHTMLLabelElement DispHTMLLabelElement;
#ifdef __cplusplus
interface DispHTMLLabelElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLListElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLListElement2_FWD_DEFINED__
#define __IHTMLListElement2_FWD_DEFINED__
typedef interface IHTMLListElement2 IHTMLListElement2;
#ifdef __cplusplus
interface IHTMLListElement2;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLListElement_FWD_DEFINED__
#define __DispHTMLListElement_FWD_DEFINED__
typedef interface DispHTMLListElement DispHTMLListElement;
#ifdef __cplusplus
interface DispHTMLListElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLUListElement;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLUListElement_FWD_DEFINED__
#define __DispHTMLUListElement_FWD_DEFINED__
typedef interface DispHTMLUListElement DispHTMLUListElement;
#ifdef __cplusplus
interface DispHTMLUListElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLOListElement;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLOListElement_FWD_DEFINED__
#define __DispHTMLOListElement_FWD_DEFINED__
typedef interface DispHTMLOListElement DispHTMLOListElement;
#ifdef __cplusplus
interface DispHTMLOListElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLLIElement;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLLIElement_FWD_DEFINED__
#define __DispHTMLLIElement_FWD_DEFINED__
typedef interface DispHTMLLIElement DispHTMLLIElement;
#ifdef __cplusplus
interface DispHTMLLIElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLBlockElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLBlockElement2_FWD_DEFINED__
#define __IHTMLBlockElement2_FWD_DEFINED__
typedef interface IHTMLBlockElement2 IHTMLBlockElement2;
#ifdef __cplusplus
interface IHTMLBlockElement2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLBlockElement3_FWD_DEFINED__
#define __IHTMLBlockElement3_FWD_DEFINED__
typedef interface IHTMLBlockElement3 IHTMLBlockElement3;
#ifdef __cplusplus
interface IHTMLBlockElement3;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLBlockElement_FWD_DEFINED__
#define __DispHTMLBlockElement_FWD_DEFINED__
typedef interface DispHTMLBlockElement DispHTMLBlockElement;
#ifdef __cplusplus
interface DispHTMLBlockElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLDivElement;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLDivElement_FWD_DEFINED__
#define __DispHTMLDivElement_FWD_DEFINED__
typedef interface DispHTMLDivElement DispHTMLDivElement;
#ifdef __cplusplus
interface DispHTMLDivElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLDDElement;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLDDElement_FWD_DEFINED__
#define __DispHTMLDDElement_FWD_DEFINED__
typedef interface DispHTMLDDElement DispHTMLDDElement;
#ifdef __cplusplus
interface DispHTMLDDElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLDTElement;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLDTElement_FWD_DEFINED__
#define __DispHTMLDTElement_FWD_DEFINED__
typedef interface DispHTMLDTElement DispHTMLDTElement;
#ifdef __cplusplus
interface DispHTMLDTElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLBRElement;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLBRElement_FWD_DEFINED__
#define __DispHTMLBRElement_FWD_DEFINED__
typedef interface DispHTMLBRElement DispHTMLBRElement;
#ifdef __cplusplus
interface DispHTMLBRElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLDListElement;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLDListElement_FWD_DEFINED__
#define __DispHTMLDListElement_FWD_DEFINED__
typedef interface DispHTMLDListElement DispHTMLDListElement;
#ifdef __cplusplus
interface DispHTMLDListElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLHRElement;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLHRElement_FWD_DEFINED__
#define __DispHTMLHRElement_FWD_DEFINED__
typedef interface DispHTMLHRElement DispHTMLHRElement;
#ifdef __cplusplus
interface DispHTMLHRElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLParaElement;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLParaElement_FWD_DEFINED__
#define __DispHTMLParaElement_FWD_DEFINED__
typedef interface DispHTMLParaElement DispHTMLParaElement;
#ifdef __cplusplus
interface DispHTMLParaElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLElementCollection;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLElementCollection2_FWD_DEFINED__
#define __IHTMLElementCollection2_FWD_DEFINED__
typedef interface IHTMLElementCollection2 IHTMLElementCollection2;
#ifdef __cplusplus
interface IHTMLElementCollection2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLElementCollection3_FWD_DEFINED__
#define __IHTMLElementCollection3_FWD_DEFINED__
typedef interface IHTMLElementCollection3 IHTMLElementCollection3;
#ifdef __cplusplus
interface IHTMLElementCollection3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLElementCollection4_FWD_DEFINED__
#define __IHTMLElementCollection4_FWD_DEFINED__
typedef interface IHTMLElementCollection4 IHTMLElementCollection4;
#ifdef __cplusplus
interface IHTMLElementCollection4;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLElementCollection_FWD_DEFINED__
#define __DispHTMLElementCollection_FWD_DEFINED__
typedef interface DispHTMLElementCollection DispHTMLElementCollection;
#ifdef __cplusplus
interface DispHTMLElementCollection;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLHeaderElement;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLHeaderElement_FWD_DEFINED__
#define __DispHTMLHeaderElement_FWD_DEFINED__
typedef interface DispHTMLHeaderElement DispHTMLHeaderElement;
#ifdef __cplusplus
interface DispHTMLHeaderElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface HTMLSelectElementEvents2;
#endif /* __cplusplus */
#endif

#ifndef __HTMLSelectElementEvents_FWD_DEFINED__
#define __HTMLSelectElementEvents_FWD_DEFINED__
typedef interface HTMLSelectElementEvents HTMLSelectElementEvents;
#ifdef __cplusplus
interface HTMLSelectElementEvents;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLSelectElementEx_FWD_DEFINED__
#define __IHTMLSelectElementEx_FWD_DEFINED__
typedef interface IHTMLSelectElementEx IHTMLSelectElementEx;
#ifdef __cplusplus
interface IHTMLSelectElementEx;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLSelectElement_FWD_DEFINED__
#define __IHTMLSelectElement_FWD_DEFINED__
typedef interface IHTMLSelectElement IHTMLSelectElement;
#ifdef __cplusplus
interface IHTMLSelectElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLSelectElement2_FWD_DEFINED__
#define __IHTMLSelectElement2_FWD_DEFINED__
typedef interface IHTMLSelectElement2 IHTMLSelectElement2;
#ifdef __cplusplus
interface IHTMLSelectElement2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLSelectElement4_FWD_DEFINED__
#define __IHTMLSelectElement4_FWD_DEFINED__
typedef interface IHTMLSelectElement4 IHTMLSelectElement4;
#ifdef __cplusplus
interface IHTMLSelectElement4;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLSelectElement5_FWD_DEFINED__
#define __IHTMLSelectElement5_FWD_DEFINED__
typedef interface IHTMLSelectElement5 IHTMLSelectElement5;
#ifdef __cplusplus
interface IHTMLSelectElement5;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLSelectElement6_FWD_DEFINED__
#define __IHTMLSelectElement6_FWD_DEFINED__
typedef interface IHTMLSelectElement6 IHTMLSelectElement6;
#ifdef __cplusplus
interface IHTMLSelectElement6;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLSelectElement_FWD_DEFINED__
#define __DispHTMLSelectElement_FWD_DEFINED__
typedef interface DispHTMLSelectElement DispHTMLSelectElement;
#ifdef __cplusplus
interface DispHTMLSelectElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLWndSelectElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLSelectionObject;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLSelectionObject2_FWD_DEFINED__
#define __IHTMLSelectionObject2_FWD_DEFINED__
typedef interface IHTMLSelectionObject2 IHTMLSelectionObject2;
#ifdef __cplusplus
interface IHTMLSelectionObject2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLSelection_FWD_DEFINED__
#define __IHTMLSelection_FWD_DEFINED__
typedef interface IHTMLSelection IHTMLSelection;
#ifdef __cplusplus
interface IHTMLSelection;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLOptionElement_FWD_DEFINED__
#define __IHTMLOptionElement_FWD_DEFINED__
typedef interface IHTMLOptionElement IHTMLOptionElement;
#ifdef __cplusplus
interface IHTMLOptionElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLOptionElement3_FWD_DEFINED__
#define __IHTMLOptionElement3_FWD_DEFINED__
typedef interface IHTMLOptionElement3 IHTMLOptionElement3;
#ifdef __cplusplus
interface IHTMLOptionElement3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLOptionElement4_FWD_DEFINED__
#define __IHTMLOptionElement4_FWD_DEFINED__
typedef interface IHTMLOptionElement4 IHTMLOptionElement4;
#ifdef __cplusplus
interface IHTMLOptionElement4;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLOptionElementFactory_FWD_DEFINED__
#define __IHTMLOptionElementFactory_FWD_DEFINED__
typedef interface IHTMLOptionElementFactory IHTMLOptionElementFactory;
#ifdef __cplusplus
interface IHTMLOptionElementFactory;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLOptionElement_FWD_DEFINED__
#define __DispHTMLOptionElement_FWD_DEFINED__
typedef interface DispHTMLOptionElement DispHTMLOptionElement;
#ifdef __cplusplus
interface DispHTMLOptionElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLWndOptionElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface HTMLButtonElementEvents2;
#endif /* __cplusplus */
#endif

#ifndef __HTMLButtonElementEvents_FWD_DEFINED__
#define __HTMLButtonElementEvents_FWD_DEFINED__
typedef interface HTMLButtonElementEvents HTMLButtonElementEvents;
#ifdef __cplusplus
interface HTMLButtonElementEvents;
#endif /* __cplusplus */
#endif

#ifndef __HTMLInputTextElementEvents2_FWD_DEFINED__
#define __HTMLInputTextElementEvents2_FWD_DEFINED__
typedef interface HTMLInputTextElementEvents2 HTMLInputTextElementEvents2;
#ifdef __cplusplus
interface HTMLInputTextElementEvents2;
#endif /* __cplusplus */
#endif

#ifndef __HTMLOptionButtonElementEvents2_FWD_DEFINED__
#define __HTMLOptionButtonElementEvents2_FWD_DEFINED__
typedef interface HTMLOptionButtonElementEvents2 HTMLOptionButtonElementEvents2;
#ifdef __cplusplus
interface HTMLOptionButtonElementEvents2;
#endif /* __cplusplus */
#endif

#ifndef __HTMLInputFileElementEvents2_FWD_DEFINED__
#define __HTMLInputFileElementEvents2_FWD_DEFINED__
typedef interface HTMLInputFileElementEvents2 HTMLInputFileElementEvents2;
#ifdef __cplusplus
interface HTMLInputFileElementEvents2;
#endif /* __cplusplus */
#endif

#ifndef __HTMLInputImageEvents2_FWD_DEFINED__
#define __HTMLInputImageEvents2_FWD_DEFINED__
typedef interface HTMLInputImageEvents2 HTMLInputImageEvents2;
#ifdef __cplusplus
interface HTMLInputImageEvents2;
#endif /* __cplusplus */
#endif

#ifndef __HTMLInputTextElementEvents_FWD_DEFINED__
#define __HTMLInputTextElementEvents_FWD_DEFINED__
typedef interface HTMLInputTextElementEvents HTMLInputTextElementEvents;
#ifdef __cplusplus
interface HTMLInputTextElementEvents;
#endif /* __cplusplus */
#endif

#ifndef __HTMLOptionButtonElementEvents_FWD_DEFINED__
#define __HTMLOptionButtonElementEvents_FWD_DEFINED__
typedef interface HTMLOptionButtonElementEvents HTMLOptionButtonElementEvents;
#ifdef __cplusplus
interface HTMLOptionButtonElementEvents;
#endif /* __cplusplus */
#endif

#ifndef __HTMLInputFileElementEvents_FWD_DEFINED__
#define __HTMLInputFileElementEvents_FWD_DEFINED__
typedef interface HTMLInputFileElementEvents HTMLInputFileElementEvents;
#ifdef __cplusplus
interface HTMLInputFileElementEvents;
#endif /* __cplusplus */
#endif

#ifndef __HTMLInputImageEvents_FWD_DEFINED__
#define __HTMLInputImageEvents_FWD_DEFINED__
typedef interface HTMLInputImageEvents HTMLInputImageEvents;
#ifdef __cplusplus
interface HTMLInputImageEvents;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLInputElement_FWD_DEFINED__
#define __IHTMLInputElement_FWD_DEFINED__
typedef interface IHTMLInputElement IHTMLInputElement;
#ifdef __cplusplus
interface IHTMLInputElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLInputElement2_FWD_DEFINED__
#define __IHTMLInputElement2_FWD_DEFINED__
typedef interface IHTMLInputElement2 IHTMLInputElement2;
#ifdef __cplusplus
interface IHTMLInputElement2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLInputElement3_FWD_DEFINED__
#define __IHTMLInputElement3_FWD_DEFINED__
typedef interface IHTMLInputElement3 IHTMLInputElement3;
#ifdef __cplusplus
interface IHTMLInputElement3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLInputButtonElement_FWD_DEFINED__
#define __IHTMLInputButtonElement_FWD_DEFINED__
typedef interface IHTMLInputButtonElement IHTMLInputButtonElement;
#ifdef __cplusplus
interface IHTMLInputButtonElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLInputHiddenElement_FWD_DEFINED__
#define __IHTMLInputHiddenElement_FWD_DEFINED__
typedef interface IHTMLInputHiddenElement IHTMLInputHiddenElement;
#ifdef __cplusplus
interface IHTMLInputHiddenElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLInputTextElement_FWD_DEFINED__
#define __IHTMLInputTextElement_FWD_DEFINED__
typedef interface IHTMLInputTextElement IHTMLInputTextElement;
#ifdef __cplusplus
interface IHTMLInputTextElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLInputTextElement2_FWD_DEFINED__
#define __IHTMLInputTextElement2_FWD_DEFINED__
typedef interface IHTMLInputTextElement2 IHTMLInputTextElement2;
#ifdef __cplusplus
interface IHTMLInputTextElement2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLInputFileElement_FWD_DEFINED__
#define __IHTMLInputFileElement_FWD_DEFINED__
typedef interface IHTMLInputFileElement IHTMLInputFileElement;
#ifdef __cplusplus
interface IHTMLInputFileElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLOptionButtonElement_FWD_DEFINED__
#define __IHTMLOptionButtonElement_FWD_DEFINED__
typedef interface IHTMLOptionButtonElement IHTMLOptionButtonElement;
#ifdef __cplusplus
interface IHTMLOptionButtonElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLInputImage_FWD_DEFINED__
#define __IHTMLInputImage_FWD_DEFINED__
typedef interface IHTMLInputImage IHTMLInputImage;
#ifdef __cplusplus
interface IHTMLInputImage;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLInputRangeElement_FWD_DEFINED__
#define __IHTMLInputRangeElement_FWD_DEFINED__
typedef interface IHTMLInputRangeElement IHTMLInputRangeElement;
#ifdef __cplusplus
interface IHTMLInputRangeElement;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLInputElement_FWD_DEFINED__
#define __DispHTMLInputElement_FWD_DEFINED__
typedef interface DispHTMLInputElement DispHTMLInputElement;
#ifdef __cplusplus
interface DispHTMLInputElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLTextAreaElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLTextAreaElement2_FWD_DEFINED__
#define __IHTMLTextAreaElement2_FWD_DEFINED__
typedef interface IHTMLTextAreaElement2 IHTMLTextAreaElement2;
#ifdef __cplusplus
interface IHTMLTextAreaElement2;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLTextAreaElement_FWD_DEFINED__
#define __DispHTMLTextAreaElement_FWD_DEFINED__
typedef interface DispHTMLTextAreaElement DispHTMLTextAreaElement;
#ifdef __cplusplus
interface DispHTMLTextAreaElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLRichtextElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLButtonElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLButtonElement2_FWD_DEFINED__
#define __IHTMLButtonElement2_FWD_DEFINED__
typedef interface IHTMLButtonElement2 IHTMLButtonElement2;
#ifdef __cplusplus
interface IHTMLButtonElement2;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLButtonElement_FWD_DEFINED__
#define __DispHTMLButtonElement_FWD_DEFINED__
typedef interface DispHTMLButtonElement DispHTMLButtonElement;
#ifdef __cplusplus
interface DispHTMLButtonElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface HTMLMarqueeElementEvents2;
#endif /* __cplusplus */
#endif

#ifndef __HTMLMarqueeElementEvents_FWD_DEFINED__
#define __HTMLMarqueeElementEvents_FWD_DEFINED__
typedef interface HTMLMarqueeElementEvents HTMLMarqueeElementEvents;
#ifdef __cplusplus
interface HTMLMarqueeElementEvents;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLMarqueeElement_FWD_DEFINED__
#define __IHTMLMarqueeElement_FWD_DEFINED__
typedef interface IHTMLMarqueeElement IHTMLMarqueeElement;
#ifdef __cplusplus
interface IHTMLMarqueeElement;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLMarqueeElement_FWD_DEFINED__
#define __DispHTMLMarqueeElement_FWD_DEFINED__
typedef interface DispHTMLMarqueeElement DispHTMLMarqueeElement;
#ifdef __cplusplus
interface DispHTMLMarqueeElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLHtmlElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLHeadElement_FWD_DEFINED__
#define __IHTMLHeadElement_FWD_DEFINED__
typedef interface IHTMLHeadElement IHTMLHeadElement;
#ifdef __cplusplus
interface IHTMLHeadElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLHeadElement2_FWD_DEFINED__
#define __IHTMLHeadElement2_FWD_DEFINED__
typedef interface IHTMLHeadElement2 IHTMLHeadElement2;
#ifdef __cplusplus
interface IHTMLHeadElement2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLTitleElement_FWD_DEFINED__
#define __IHTMLTitleElement_FWD_DEFINED__
typedef interface IHTMLTitleElement IHTMLTitleElement;
#ifdef __cplusplus
interface IHTMLTitleElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLMetaElement_FWD_DEFINED__
#define __IHTMLMetaElement_FWD_DEFINED__
typedef interface IHTMLMetaElement IHTMLMetaElement;
#ifdef __cplusplus
interface IHTMLMetaElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLMetaElement2_FWD_DEFINED__
#define __IHTMLMetaElement2_FWD_DEFINED__
typedef interface IHTMLMetaElement2 IHTMLMetaElement2;
#ifdef __cplusplus
interface IHTMLMetaElement2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLMetaElement3_FWD_DEFINED__
#define __IHTMLMetaElement3_FWD_DEFINED__
typedef interface IHTMLMetaElement3 IHTMLMetaElement3;
#ifdef __cplusplus
interface IHTMLMetaElement3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLBaseElement_FWD_DEFINED__
#define __IHTMLBaseElement_FWD_DEFINED__
typedef interface IHTMLBaseElement IHTMLBaseElement;
#ifdef __cplusplus
interface IHTMLBaseElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLBaseElement2_FWD_DEFINED__
#define __IHTMLBaseElement2_FWD_DEFINED__
typedef interface IHTMLBaseElement2 IHTMLBaseElement2;
#ifdef __cplusplus
interface IHTMLBaseElement2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLIsIndexElement_FWD_DEFINED__
#define __IHTMLIsIndexElement_FWD_DEFINED__
typedef interface IHTMLIsIndexElement IHTMLIsIndexElement;
#ifdef __cplusplus
interface IHTMLIsIndexElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLIsIndexElement2_FWD_DEFINED__
#define __IHTMLIsIndexElement2_FWD_DEFINED__
typedef interface IHTMLIsIndexElement2 IHTMLIsIndexElement2;
#ifdef __cplusplus
interface IHTMLIsIndexElement2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLNextIdElement_FWD_DEFINED__
#define __IHTMLNextIdElement_FWD_DEFINED__
typedef interface IHTMLNextIdElement IHTMLNextIdElement;
#ifdef __cplusplus
interface IHTMLNextIdElement;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLHtmlElement_FWD_DEFINED__
#define __DispHTMLHtmlElement_FWD_DEFINED__
typedef interface DispHTMLHtmlElement DispHTMLHtmlElement;
#ifdef __cplusplus
interface DispHTMLHtmlElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLHeadElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLTitleElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLMetaElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLBaseElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLIsIndexElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLNextIdElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLBaseFontElement;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLBaseFontElement_FWD_DEFINED__
#define __DispHTMLBaseFontElement_FWD_DEFINED__
typedef interface DispHTMLBaseFontElement DispHTMLBaseFontElement;
#ifdef __cplusplus
interface DispHTMLBaseFontElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLUnknownElement;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLUnknownElement_FWD_DEFINED__
#define __DispHTMLUnknownElement_FWD_DEFINED__
typedef interface DispHTMLUnknownElement DispHTMLUnknownElement;
#ifdef __cplusplus
interface DispHTMLUnknownElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IOmHistory;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLMimeTypesCollection_FWD_DEFINED__
#define __IHTMLMimeTypesCollection_FWD_DEFINED__
typedef interface IHTMLMimeTypesCollection IHTMLMimeTypesCollection;
#ifdef __cplusplus
interface IHTMLMimeTypesCollection;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLPluginsCollection_FWD_DEFINED__
#define __IHTMLPluginsCollection_FWD_DEFINED__
typedef interface IHTMLPluginsCollection IHTMLPluginsCollection;
#ifdef __cplusplus
interface IHTMLPluginsCollection;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLOpsProfile_FWD_DEFINED__
#define __IHTMLOpsProfile_FWD_DEFINED__
typedef interface IHTMLOpsProfile IHTMLOpsProfile;
#ifdef __cplusplus
interface IHTMLOpsProfile;
#endif /* __cplusplus */
#endif

#ifndef __IOmNavigator_FWD_DEFINED__
#define __IOmNavigator_FWD_DEFINED__
typedef interface IOmNavigator IOmNavigator;
#ifdef __cplusplus
interface IOmNavigator;
#endif /* __cplusplus */
#endif

#ifndef __INavigatorGeolocation_FWD_DEFINED__
#define __INavigatorGeolocation_FWD_DEFINED__
typedef interface INavigatorGeolocation INavigatorGeolocation;
#ifdef __cplusplus
interface INavigatorGeolocation;
#endif /* __cplusplus */
#endif

#ifndef __INavigatorDoNotTrack_FWD_DEFINED__
#define __INavigatorDoNotTrack_FWD_DEFINED__
typedef interface INavigatorDoNotTrack INavigatorDoNotTrack;
#ifdef __cplusplus
interface INavigatorDoNotTrack;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLLocation_FWD_DEFINED__
#define __IHTMLLocation_FWD_DEFINED__
typedef interface IHTMLLocation IHTMLLocation;
#ifdef __cplusplus
interface IHTMLLocation;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLHistory_FWD_DEFINED__
#define __DispHTMLHistory_FWD_DEFINED__
typedef interface DispHTMLHistory DispHTMLHistory;
#ifdef __cplusplus
interface DispHTMLHistory;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispCPlugins;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLNavigator;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLLocation;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLBookmarkCollection;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDataTransfer_FWD_DEFINED__
#define __IHTMLDataTransfer_FWD_DEFINED__
typedef interface IHTMLDataTransfer IHTMLDataTransfer;
#ifdef __cplusplus
interface IHTMLDataTransfer;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLEventObj_FWD_DEFINED__
#define __IHTMLEventObj_FWD_DEFINED__
typedef interface IHTMLEventObj IHTMLEventObj;
#ifdef __cplusplus
interface IHTMLEventObj;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLEventObj2_FWD_DEFINED__
#define __IHTMLEventObj2_FWD_DEFINED__
typedef interface IHTMLEventObj2 IHTMLEventObj2;
#ifdef __cplusplus
interface IHTMLEventObj2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLEventObj3_FWD_DEFINED__
#define __IHTMLEventObj3_FWD_DEFINED__
typedef interface IHTMLEventObj3 IHTMLEventObj3;
#ifdef __cplusplus
interface IHTMLEventObj3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLEventObj4_FWD_DEFINED__
#define __IHTMLEventObj4_FWD_DEFINED__
typedef interface IHTMLEventObj4 IHTMLEventObj4;
#ifdef __cplusplus
interface IHTMLEventObj4;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLEventObj5_FWD_DEFINED__
#define __IHTMLEventObj5_FWD_DEFINED__
typedef interface IHTMLEventObj5 IHTMLEventObj5;
#ifdef __cplusplus
interface IHTMLEventObj5;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLEventObj6_FWD_DEFINED__
#define __IHTMLEventObj6_FWD_DEFINED__
typedef interface IHTMLEventObj6 IHTMLEventObj6;
#ifdef __cplusplus
interface IHTMLEventObj6;
#endif /* __cplusplus */
#endif

#ifndef __DispCEventObj_FWD_DEFINED__
#define __DispCEventObj_FWD_DEFINED__
typedef interface DispCEventObj DispCEventObj;
#ifdef __cplusplus
interface DispCEventObj;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLStyleMedia;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLStyleMedia_FWD_DEFINED__
#define __DispHTMLStyleMedia_FWD_DEFINED__
typedef interface DispHTMLStyleMedia DispHTMLStyleMedia;
#ifdef __cplusplus
interface DispHTMLStyleMedia;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface HTMLWindowEvents3;
#endif /* __cplusplus */
#endif

#ifndef __HTMLWindowEvents2_FWD_DEFINED__
#define __HTMLWindowEvents2_FWD_DEFINED__
typedef interface HTMLWindowEvents2 HTMLWindowEvents2;
#ifdef __cplusplus
interface HTMLWindowEvents2;
#endif /* __cplusplus */
#endif

#ifndef __HTMLWindowEvents_FWD_DEFINED__
#define __HTMLWindowEvents_FWD_DEFINED__
typedef interface HTMLWindowEvents HTMLWindowEvents;
#ifdef __cplusplus
interface HTMLWindowEvents;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLFramesCollection2_FWD_DEFINED__
#define __IHTMLFramesCollection2_FWD_DEFINED__
typedef interface IHTMLFramesCollection2 IHTMLFramesCollection2;
#ifdef __cplusplus
interface IHTMLFramesCollection2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLScreen_FWD_DEFINED__
#define __IHTMLScreen_FWD_DEFINED__
typedef interface IHTMLScreen IHTMLScreen;
#ifdef __cplusplus
interface IHTMLScreen;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLScreen2_FWD_DEFINED__
#define __IHTMLScreen2_FWD_DEFINED__
typedef interface IHTMLScreen2 IHTMLScreen2;
#ifdef __cplusplus
interface IHTMLScreen2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLScreen3_FWD_DEFINED__
#define __IHTMLScreen3_FWD_DEFINED__
typedef interface IHTMLScreen3 IHTMLScreen3;
#ifdef __cplusplus
interface IHTMLScreen3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLScreen4_FWD_DEFINED__
#define __IHTMLScreen4_FWD_DEFINED__
typedef interface IHTMLScreen4 IHTMLScreen4;
#ifdef __cplusplus
interface IHTMLScreen4;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLWindow2_FWD_DEFINED__
#define __IHTMLWindow2_FWD_DEFINED__
typedef interface IHTMLWindow2 IHTMLWindow2;
#ifdef __cplusplus
interface IHTMLWindow2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLWindow3_FWD_DEFINED__
#define __IHTMLWindow3_FWD_DEFINED__
typedef interface IHTMLWindow3 IHTMLWindow3;
#ifdef __cplusplus
interface IHTMLWindow3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLWindow4_FWD_DEFINED__
#define __IHTMLWindow4_FWD_DEFINED__
typedef interface IHTMLWindow4 IHTMLWindow4;
#ifdef __cplusplus
interface IHTMLWindow4;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLWindow5_FWD_DEFINED__
#define __IHTMLWindow5_FWD_DEFINED__
typedef interface IHTMLWindow5 IHTMLWindow5;
#ifdef __cplusplus
interface IHTMLWindow5;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLWindow6_FWD_DEFINED__
#define __IHTMLWindow6_FWD_DEFINED__
typedef interface IHTMLWindow6 IHTMLWindow6;
#ifdef __cplusplus
interface IHTMLWindow6;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLWindow7_FWD_DEFINED__
#define __IHTMLWindow7_FWD_DEFINED__
typedef interface IHTMLWindow7 IHTMLWindow7;
#ifdef __cplusplus
interface IHTMLWindow7;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLWindow8_FWD_DEFINED__
#define __IHTMLWindow8_FWD_DEFINED__
typedef interface IHTMLWindow8 IHTMLWindow8;
#ifdef __cplusplus
interface IHTMLWindow8;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLScreen;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLWindow2;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLWindowProxy;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLDocumentCompatibleInfo;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDocumentCompatibleInfoCollection_FWD_DEFINED__
#define __IHTMLDocumentCompatibleInfoCollection_FWD_DEFINED__
typedef interface IHTMLDocumentCompatibleInfoCollection IHTMLDocumentCompatibleInfoCollection;
#ifdef __cplusplus
interface IHTMLDocumentCompatibleInfoCollection;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLDocumentCompatibleInfo_FWD_DEFINED__
#define __DispHTMLDocumentCompatibleInfo_FWD_DEFINED__
typedef interface DispHTMLDocumentCompatibleInfo DispHTMLDocumentCompatibleInfo;
#ifdef __cplusplus
interface DispHTMLDocumentCompatibleInfo;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLDocumentCompatibleInfoCollection;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface HTMLDocumentEvents4;
#endif /* __cplusplus */
#endif

#ifndef __HTMLDocumentEvents3_FWD_DEFINED__
#define __HTMLDocumentEvents3_FWD_DEFINED__
typedef interface HTMLDocumentEvents3 HTMLDocumentEvents3;
#ifdef __cplusplus
interface HTMLDocumentEvents3;
#endif /* __cplusplus */
#endif

#ifndef __HTMLDocumentEvents2_FWD_DEFINED__
#define __HTMLDocumentEvents2_FWD_DEFINED__
typedef interface HTMLDocumentEvents2 HTMLDocumentEvents2;
#ifdef __cplusplus
interface HTMLDocumentEvents2;
#endif /* __cplusplus */
#endif

#ifndef __HTMLDocumentEvents_FWD_DEFINED__
#define __HTMLDocumentEvents_FWD_DEFINED__
typedef interface HTMLDocumentEvents HTMLDocumentEvents;
#ifdef __cplusplus
interface HTMLDocumentEvents;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDocument_FWD_DEFINED__
#define __IHTMLDocument_FWD_DEFINED__
typedef interface IHTMLDocument IHTMLDocument;
#ifdef __cplusplus
interface IHTMLDocument;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDocument2_FWD_DEFINED__
#define __IHTMLDocument2_FWD_DEFINED__
typedef interface IHTMLDocument2 IHTMLDocument2;
#ifdef __cplusplus
interface IHTMLDocument2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDocument3_FWD_DEFINED__
#define __IHTMLDocument3_FWD_DEFINED__
typedef interface IHTMLDocument3 IHTMLDocument3;
#ifdef __cplusplus
interface IHTMLDocument3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDocument4_FWD_DEFINED__
#define __IHTMLDocument4_FWD_DEFINED__
typedef interface IHTMLDocument4 IHTMLDocument4;
#ifdef __cplusplus
interface IHTMLDocument4;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDocument5_FWD_DEFINED__
#define __IHTMLDocument5_FWD_DEFINED__
typedef interface IHTMLDocument5 IHTMLDocument5;
#ifdef __cplusplus
interface IHTMLDocument5;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDocument6_FWD_DEFINED__
#define __IHTMLDocument6_FWD_DEFINED__
typedef interface IHTMLDocument6 IHTMLDocument6;
#ifdef __cplusplus
interface IHTMLDocument6;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDocument7_FWD_DEFINED__
#define __IHTMLDocument7_FWD_DEFINED__
typedef interface IHTMLDocument7 IHTMLDocument7;
#ifdef __cplusplus
interface IHTMLDocument7;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDocument8_FWD_DEFINED__
#define __IHTMLDocument8_FWD_DEFINED__
typedef interface IHTMLDocument8 IHTMLDocument8;
#ifdef __cplusplus
interface IHTMLDocument8;
#endif /* __cplusplus */
#endif

#ifndef __IDocumentEvent_FWD_DEFINED__
#define __IDocumentEvent_FWD_DEFINED__
typedef interface IDocumentEvent IDocumentEvent;
#ifdef __cplusplus
interface IDocumentEvent;
#endif /* __cplusplus */
#endif

#ifndef __IDocumentRange_FWD_DEFINED__
#define __IDocumentRange_FWD_DEFINED__
typedef interface IDocumentRange IDocumentRange;
#ifdef __cplusplus
interface IDocumentRange;
#endif /* __cplusplus */
#endif

#ifndef __IDocumentSelector_FWD_DEFINED__
#define __IDocumentSelector_FWD_DEFINED__
typedef interface IDocumentSelector IDocumentSelector;
#ifdef __cplusplus
interface IDocumentSelector;
#endif /* __cplusplus */
#endif

#ifndef __IDocumentTraversal_FWD_DEFINED__
#define __IDocumentTraversal_FWD_DEFINED__
typedef interface IDocumentTraversal IDocumentTraversal;
#ifdef __cplusplus
interface IDocumentTraversal;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLDocument_FWD_DEFINED__
#define __DispHTMLDocument_FWD_DEFINED__
typedef interface DispHTMLDocument DispHTMLDocument;
#ifdef __cplusplus
interface DispHTMLDocument;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DWebBridgeEvents;
#endif /* __cplusplus */
#endif

#ifndef __IWebBridge_FWD_DEFINED__
#define __IWebBridge_FWD_DEFINED__
typedef interface IWebBridge IWebBridge;
#ifdef __cplusplus
interface IWebBridge;
#endif /* __cplusplus */
#endif

#ifndef __IWBScriptControl_FWD_DEFINED__
#define __IWBScriptControl_FWD_DEFINED__
typedef interface IWBScriptControl IWBScriptControl;
#ifdef __cplusplus
interface IWBScriptControl;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLEmbedElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLEmbedElement2_FWD_DEFINED__
#define __IHTMLEmbedElement2_FWD_DEFINED__
typedef interface IHTMLEmbedElement2 IHTMLEmbedElement2;
#ifdef __cplusplus
interface IHTMLEmbedElement2;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLEmbed_FWD_DEFINED__
#define __DispHTMLEmbed_FWD_DEFINED__
typedef interface DispHTMLEmbed DispHTMLEmbed;
#ifdef __cplusplus
interface DispHTMLEmbed;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface HTMLMapEvents2;
#endif /* __cplusplus */
#endif

#ifndef __HTMLMapEvents_FWD_DEFINED__
#define __HTMLMapEvents_FWD_DEFINED__
typedef interface HTMLMapEvents HTMLMapEvents;
#ifdef __cplusplus
interface HTMLMapEvents;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLAreasCollection_FWD_DEFINED__
#define __IHTMLAreasCollection_FWD_DEFINED__
typedef interface IHTMLAreasCollection IHTMLAreasCollection;
#ifdef __cplusplus
interface IHTMLAreasCollection;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLAreasCollection2_FWD_DEFINED__
#define __IHTMLAreasCollection2_FWD_DEFINED__
typedef interface IHTMLAreasCollection2 IHTMLAreasCollection2;
#ifdef __cplusplus
interface IHTMLAreasCollection2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLAreasCollection3_FWD_DEFINED__
#define __IHTMLAreasCollection3_FWD_DEFINED__
typedef interface IHTMLAreasCollection3 IHTMLAreasCollection3;
#ifdef __cplusplus
interface IHTMLAreasCollection3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLAreasCollection4_FWD_DEFINED__
#define __IHTMLAreasCollection4_FWD_DEFINED__
typedef interface IHTMLAreasCollection4 IHTMLAreasCollection4;
#ifdef __cplusplus
interface IHTMLAreasCollection4;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLMapElement_FWD_DEFINED__
#define __IHTMLMapElement_FWD_DEFINED__
typedef interface IHTMLMapElement IHTMLMapElement;
#ifdef __cplusplus
interface IHTMLMapElement;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLAreasCollection_FWD_DEFINED__
#define __DispHTMLAreasCollection_FWD_DEFINED__
typedef interface DispHTMLAreasCollection DispHTMLAreasCollection;
#ifdef __cplusplus
interface DispHTMLAreasCollection;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLMapElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface HTMLAreaEvents2;
#endif /* __cplusplus */
#endif

#ifndef __HTMLAreaEvents_FWD_DEFINED__
#define __HTMLAreaEvents_FWD_DEFINED__
typedef interface HTMLAreaEvents HTMLAreaEvents;
#ifdef __cplusplus
interface HTMLAreaEvents;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLAreaElement_FWD_DEFINED__
#define __IHTMLAreaElement_FWD_DEFINED__
typedef interface IHTMLAreaElement IHTMLAreaElement;
#ifdef __cplusplus
interface IHTMLAreaElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLAreaElement2_FWD_DEFINED__
#define __IHTMLAreaElement2_FWD_DEFINED__
typedef interface IHTMLAreaElement2 IHTMLAreaElement2;
#ifdef __cplusplus
interface IHTMLAreaElement2;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLAreaElement_FWD_DEFINED__
#define __DispHTMLAreaElement_FWD_DEFINED__
typedef interface DispHTMLAreaElement DispHTMLAreaElement;
#ifdef __cplusplus
interface DispHTMLAreaElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLTableCaption;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLTableCaption_FWD_DEFINED__
#define __DispHTMLTableCaption_FWD_DEFINED__
typedef interface DispHTMLTableCaption DispHTMLTableCaption;
#ifdef __cplusplus
interface DispHTMLTableCaption;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLCommentElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLCommentElement2_FWD_DEFINED__
#define __IHTMLCommentElement2_FWD_DEFINED__
typedef interface IHTMLCommentElement2 IHTMLCommentElement2;
#ifdef __cplusplus
interface IHTMLCommentElement2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLCommentElement3_FWD_DEFINED__
#define __IHTMLCommentElement3_FWD_DEFINED__
typedef interface IHTMLCommentElement3 IHTMLCommentElement3;
#ifdef __cplusplus
interface IHTMLCommentElement3;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLCommentElement_FWD_DEFINED__
#define __DispHTMLCommentElement_FWD_DEFINED__
typedef interface DispHTMLCommentElement DispHTMLCommentElement;
#ifdef __cplusplus
interface DispHTMLCommentElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLPhraseElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLPhraseElement2_FWD_DEFINED__
#define __IHTMLPhraseElement2_FWD_DEFINED__
typedef interface IHTMLPhraseElement2 IHTMLPhraseElement2;
#ifdef __cplusplus
interface IHTMLPhraseElement2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLPhraseElement3_FWD_DEFINED__
#define __IHTMLPhraseElement3_FWD_DEFINED__
typedef interface IHTMLPhraseElement3 IHTMLPhraseElement3;
#ifdef __cplusplus
interface IHTMLPhraseElement3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLSpanElement_FWD_DEFINED__
#define __IHTMLSpanElement_FWD_DEFINED__
typedef interface IHTMLSpanElement IHTMLSpanElement;
#ifdef __cplusplus
interface IHTMLSpanElement;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLPhraseElement_FWD_DEFINED__
#define __DispHTMLPhraseElement_FWD_DEFINED__
typedef interface DispHTMLPhraseElement DispHTMLPhraseElement;
#ifdef __cplusplus
interface DispHTMLPhraseElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLSpanElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface HTMLTableEvents2;
#endif /* __cplusplus */
#endif

#ifndef __HTMLTableEvents_FWD_DEFINED__
#define __HTMLTableEvents_FWD_DEFINED__
typedef interface HTMLTableEvents HTMLTableEvents;
#ifdef __cplusplus
interface HTMLTableEvents;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLTable_FWD_DEFINED__
#define __IHTMLTable_FWD_DEFINED__
typedef interface IHTMLTable IHTMLTable;
#ifdef __cplusplus
interface IHTMLTable;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLTable2_FWD_DEFINED__
#define __IHTMLTable2_FWD_DEFINED__
typedef interface IHTMLTable2 IHTMLTable2;
#ifdef __cplusplus
interface IHTMLTable2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLTable3_FWD_DEFINED__
#define __IHTMLTable3_FWD_DEFINED__
typedef interface IHTMLTable3 IHTMLTable3;
#ifdef __cplusplus
interface IHTMLTable3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLTable4_FWD_DEFINED__
#define __IHTMLTable4_FWD_DEFINED__
typedef interface IHTMLTable4 IHTMLTable4;
#ifdef __cplusplus
interface IHTMLTable4;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLTableCol_FWD_DEFINED__
#define __IHTMLTableCol_FWD_DEFINED__
typedef interface IHTMLTableCol IHTMLTableCol;
#ifdef __cplusplus
interface IHTMLTableCol;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLTableCol2_FWD_DEFINED__
#define __IHTMLTableCol2_FWD_DEFINED__
typedef interface IHTMLTableCol2 IHTMLTableCol2;
#ifdef __cplusplus
interface IHTMLTableCol2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLTableCol3_FWD_DEFINED__
#define __IHTMLTableCol3_FWD_DEFINED__
typedef interface IHTMLTableCol3 IHTMLTableCol3;
#ifdef __cplusplus
interface IHTMLTableCol3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLTableSection_FWD_DEFINED__
#define __IHTMLTableSection_FWD_DEFINED__
typedef interface IHTMLTableSection IHTMLTableSection;
#ifdef __cplusplus
interface IHTMLTableSection;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLTableSection2_FWD_DEFINED__
#define __IHTMLTableSection2_FWD_DEFINED__
typedef interface IHTMLTableSection2 IHTMLTableSection2;
#ifdef __cplusplus
interface IHTMLTableSection2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLTableSection3_FWD_DEFINED__
#define __IHTMLTableSection3_FWD_DEFINED__
typedef interface IHTMLTableSection3 IHTMLTableSection3;
#ifdef __cplusplus
interface IHTMLTableSection3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLTableSection4_FWD_DEFINED__
#define __IHTMLTableSection4_FWD_DEFINED__
typedef interface IHTMLTableSection4 IHTMLTableSection4;
#ifdef __cplusplus
interface IHTMLTableSection4;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLTableRow_FWD_DEFINED__
#define __IHTMLTableRow_FWD_DEFINED__
typedef interface IHTMLTableRow IHTMLTableRow;
#ifdef __cplusplus
interface IHTMLTableRow;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLTableRow2_FWD_DEFINED__
#define __IHTMLTableRow2_FWD_DEFINED__
typedef interface IHTMLTableRow2 IHTMLTableRow2;
#ifdef __cplusplus
interface IHTMLTableRow2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLTableRow3_FWD_DEFINED__
#define __IHTMLTableRow3_FWD_DEFINED__
typedef interface IHTMLTableRow3 IHTMLTableRow3;
#ifdef __cplusplus
interface IHTMLTableRow3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLTableRow4_FWD_DEFINED__
#define __IHTMLTableRow4_FWD_DEFINED__
typedef interface IHTMLTableRow4 IHTMLTableRow4;
#ifdef __cplusplus
interface IHTMLTableRow4;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLTableRowMetrics_FWD_DEFINED__
#define __IHTMLTableRowMetrics_FWD_DEFINED__
typedef interface IHTMLTableRowMetrics IHTMLTableRowMetrics;
#ifdef __cplusplus
interface IHTMLTableRowMetrics;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLTableCell_FWD_DEFINED__
#define __IHTMLTableCell_FWD_DEFINED__
typedef interface IHTMLTableCell IHTMLTableCell;
#ifdef __cplusplus
interface IHTMLTableCell;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLTableCell2_FWD_DEFINED__
#define __IHTMLTableCell2_FWD_DEFINED__
typedef interface IHTMLTableCell2 IHTMLTableCell2;
#ifdef __cplusplus
interface IHTMLTableCell2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLTableCell3_FWD_DEFINED__
#define __IHTMLTableCell3_FWD_DEFINED__
typedef interface IHTMLTableCell3 IHTMLTableCell3;
#ifdef __cplusplus
interface IHTMLTableCell3;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLTable_FWD_DEFINED__
#define __DispHTMLTable_FWD_DEFINED__
typedef interface DispHTMLTable DispHTMLTable;
#ifdef __cplusplus
interface DispHTMLTable;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLTableCol;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLTableSection;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLTableRow;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLTableCell;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface HTMLScriptEvents2;
#endif /* __cplusplus */
#endif

#ifndef __HTMLScriptEvents_FWD_DEFINED__
#define __HTMLScriptEvents_FWD_DEFINED__
typedef interface HTMLScriptEvents HTMLScriptEvents;
#ifdef __cplusplus
interface HTMLScriptEvents;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLScriptElement_FWD_DEFINED__
#define __IHTMLScriptElement_FWD_DEFINED__
typedef interface IHTMLScriptElement IHTMLScriptElement;
#ifdef __cplusplus
interface IHTMLScriptElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLScriptElement2_FWD_DEFINED__
#define __IHTMLScriptElement2_FWD_DEFINED__
typedef interface IHTMLScriptElement2 IHTMLScriptElement2;
#ifdef __cplusplus
interface IHTMLScriptElement2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLScriptElement3_FWD_DEFINED__
#define __IHTMLScriptElement3_FWD_DEFINED__
typedef interface IHTMLScriptElement3 IHTMLScriptElement3;
#ifdef __cplusplus
interface IHTMLScriptElement3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLScriptElement4_FWD_DEFINED__
#define __IHTMLScriptElement4_FWD_DEFINED__
typedef interface IHTMLScriptElement4 IHTMLScriptElement4;
#ifdef __cplusplus
interface IHTMLScriptElement4;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLScriptElement_FWD_DEFINED__
#define __DispHTMLScriptElement_FWD_DEFINED__
typedef interface DispHTMLScriptElement DispHTMLScriptElement;
#ifdef __cplusplus
interface DispHTMLScriptElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLNoShowElement;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLNoShowElement_FWD_DEFINED__
#define __DispHTMLNoShowElement_FWD_DEFINED__
typedef interface DispHTMLNoShowElement DispHTMLNoShowElement;
#ifdef __cplusplus
interface DispHTMLNoShowElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface HTMLObjectElementEvents2;
#endif /* __cplusplus */
#endif

#ifndef __HTMLObjectElementEvents_FWD_DEFINED__
#define __HTMLObjectElementEvents_FWD_DEFINED__
typedef interface HTMLObjectElementEvents HTMLObjectElementEvents;
#ifdef __cplusplus
interface HTMLObjectElementEvents;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLObjectElement_FWD_DEFINED__
#define __IHTMLObjectElement_FWD_DEFINED__
typedef interface IHTMLObjectElement IHTMLObjectElement;
#ifdef __cplusplus
interface IHTMLObjectElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLObjectElement2_FWD_DEFINED__
#define __IHTMLObjectElement2_FWD_DEFINED__
typedef interface IHTMLObjectElement2 IHTMLObjectElement2;
#ifdef __cplusplus
interface IHTMLObjectElement2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLObjectElement3_FWD_DEFINED__
#define __IHTMLObjectElement3_FWD_DEFINED__
typedef interface IHTMLObjectElement3 IHTMLObjectElement3;
#ifdef __cplusplus
interface IHTMLObjectElement3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLObjectElement4_FWD_DEFINED__
#define __IHTMLObjectElement4_FWD_DEFINED__
typedef interface IHTMLObjectElement4 IHTMLObjectElement4;
#ifdef __cplusplus
interface IHTMLObjectElement4;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLObjectElement5_FWD_DEFINED__
#define __IHTMLObjectElement5_FWD_DEFINED__
typedef interface IHTMLObjectElement5 IHTMLObjectElement5;
#ifdef __cplusplus
interface IHTMLObjectElement5;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLParamElement_FWD_DEFINED__
#define __IHTMLParamElement_FWD_DEFINED__
typedef interface IHTMLParamElement IHTMLParamElement;
#ifdef __cplusplus
interface IHTMLParamElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLParamElement2_FWD_DEFINED__
#define __IHTMLParamElement2_FWD_DEFINED__
typedef interface IHTMLParamElement2 IHTMLParamElement2;
#ifdef __cplusplus
interface IHTMLParamElement2;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLObjectElement_FWD_DEFINED__
#define __DispHTMLObjectElement_FWD_DEFINED__
typedef interface DispHTMLObjectElement DispHTMLObjectElement;
#ifdef __cplusplus
interface DispHTMLObjectElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLParamElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface HTMLFrameSiteEvents2;
#endif /* __cplusplus */
#endif

#ifndef __HTMLFrameSiteEvents_FWD_DEFINED__
#define __HTMLFrameSiteEvents_FWD_DEFINED__
typedef interface HTMLFrameSiteEvents HTMLFrameSiteEvents;
#ifdef __cplusplus
interface HTMLFrameSiteEvents;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLFrameBase_FWD_DEFINED__
#define __IHTMLFrameBase_FWD_DEFINED__
typedef interface IHTMLFrameBase IHTMLFrameBase;
#ifdef __cplusplus
interface IHTMLFrameBase;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLFrameBase2_FWD_DEFINED__
#define __IHTMLFrameBase2_FWD_DEFINED__
typedef interface IHTMLFrameBase2 IHTMLFrameBase2;
#ifdef __cplusplus
interface IHTMLFrameBase2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLFrameBase3_FWD_DEFINED__
#define __IHTMLFrameBase3_FWD_DEFINED__
typedef interface IHTMLFrameBase3 IHTMLFrameBase3;
#ifdef __cplusplus
interface IHTMLFrameBase3;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLFrameBase_FWD_DEFINED__
#define __DispHTMLFrameBase_FWD_DEFINED__
typedef interface DispHTMLFrameBase DispHTMLFrameBase;
#ifdef __cplusplus
interface DispHTMLFrameBase;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLFrameElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLFrameElement2_FWD_DEFINED__
#define __IHTMLFrameElement2_FWD_DEFINED__
typedef interface IHTMLFrameElement2 IHTMLFrameElement2;
#ifdef __cplusplus
interface IHTMLFrameElement2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLFrameElement3_FWD_DEFINED__
#define __IHTMLFrameElement3_FWD_DEFINED__
typedef interface IHTMLFrameElement3 IHTMLFrameElement3;
#ifdef __cplusplus
interface IHTMLFrameElement3;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLFrameElement_FWD_DEFINED__
#define __DispHTMLFrameElement_FWD_DEFINED__
typedef interface DispHTMLFrameElement DispHTMLFrameElement;
#ifdef __cplusplus
interface DispHTMLFrameElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLIFrameElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLIFrameElement2_FWD_DEFINED__
#define __IHTMLIFrameElement2_FWD_DEFINED__
typedef interface IHTMLIFrameElement2 IHTMLIFrameElement2;
#ifdef __cplusplus
interface IHTMLIFrameElement2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLIFrameElement3_FWD_DEFINED__
#define __IHTMLIFrameElement3_FWD_DEFINED__
typedef interface IHTMLIFrameElement3 IHTMLIFrameElement3;
#ifdef __cplusplus
interface IHTMLIFrameElement3;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLIFrame_FWD_DEFINED__
#define __DispHTMLIFrame_FWD_DEFINED__
typedef interface DispHTMLIFrame DispHTMLIFrame;
#ifdef __cplusplus
interface DispHTMLIFrame;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLDivPosition;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLFieldSetElement_FWD_DEFINED__
#define __IHTMLFieldSetElement_FWD_DEFINED__
typedef interface IHTMLFieldSetElement IHTMLFieldSetElement;
#ifdef __cplusplus
interface IHTMLFieldSetElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLFieldSetElement2_FWD_DEFINED__
#define __IHTMLFieldSetElement2_FWD_DEFINED__
typedef interface IHTMLFieldSetElement2 IHTMLFieldSetElement2;
#ifdef __cplusplus
interface IHTMLFieldSetElement2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLLegendElement_FWD_DEFINED__
#define __IHTMLLegendElement_FWD_DEFINED__
typedef interface IHTMLLegendElement IHTMLLegendElement;
#ifdef __cplusplus
interface IHTMLLegendElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLLegendElement2_FWD_DEFINED__
#define __IHTMLLegendElement2_FWD_DEFINED__
typedef interface IHTMLLegendElement2 IHTMLLegendElement2;
#ifdef __cplusplus
interface IHTMLLegendElement2;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLDivPosition_FWD_DEFINED__
#define __DispHTMLDivPosition_FWD_DEFINED__
typedef interface DispHTMLDivPosition DispHTMLDivPosition;
#ifdef __cplusplus
interface DispHTMLDivPosition;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLFieldSetElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLLegendElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLSpanFlow;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLSpanFlow_FWD_DEFINED__
#define __DispHTMLSpanFlow_FWD_DEFINED__
typedef interface DispHTMLSpanFlow DispHTMLSpanFlow;
#ifdef __cplusplus
interface DispHTMLSpanFlow;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLFrameSetElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLFrameSetElement2_FWD_DEFINED__
#define __IHTMLFrameSetElement2_FWD_DEFINED__
typedef interface IHTMLFrameSetElement2 IHTMLFrameSetElement2;
#ifdef __cplusplus
interface IHTMLFrameSetElement2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLFrameSetElement3_FWD_DEFINED__
#define __IHTMLFrameSetElement3_FWD_DEFINED__
typedef interface IHTMLFrameSetElement3 IHTMLFrameSetElement3;
#ifdef __cplusplus
interface IHTMLFrameSetElement3;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLFrameSetSite_FWD_DEFINED__
#define __DispHTMLFrameSetSite_FWD_DEFINED__
typedef interface DispHTMLFrameSetSite DispHTMLFrameSetSite;
#ifdef __cplusplus
interface DispHTMLFrameSetSite;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLBGsound;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLBGsound_FWD_DEFINED__
#define __DispHTMLBGsound_FWD_DEFINED__
typedef interface DispHTMLBGsound DispHTMLBGsound;
#ifdef __cplusplus
interface DispHTMLBGsound;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLFontNamesCollection;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLFontSizesCollection_FWD_DEFINED__
#define __IHTMLFontSizesCollection_FWD_DEFINED__
typedef interface IHTMLFontSizesCollection IHTMLFontSizesCollection;
#ifdef __cplusplus
interface IHTMLFontSizesCollection;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLOptionsHolder_FWD_DEFINED__
#define __IHTMLOptionsHolder_FWD_DEFINED__
typedef interface IHTMLOptionsHolder IHTMLOptionsHolder;
#ifdef __cplusplus
interface IHTMLOptionsHolder;
#endif /* __cplusplus */
#endif

#ifndef __HTMLStyleElementEvents2_FWD_DEFINED__
#define __HTMLStyleElementEvents2_FWD_DEFINED__
typedef interface HTMLStyleElementEvents2 HTMLStyleElementEvents2;
#ifdef __cplusplus
interface HTMLStyleElementEvents2;
#endif /* __cplusplus */
#endif

#ifndef __HTMLStyleElementEvents_FWD_DEFINED__
#define __HTMLStyleElementEvents_FWD_DEFINED__
typedef interface HTMLStyleElementEvents HTMLStyleElementEvents;
#ifdef __cplusplus
interface HTMLStyleElementEvents;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLStyleElement_FWD_DEFINED__
#define __IHTMLStyleElement_FWD_DEFINED__
typedef interface IHTMLStyleElement IHTMLStyleElement;
#ifdef __cplusplus
interface IHTMLStyleElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLStyleElement2_FWD_DEFINED__
#define __IHTMLStyleElement2_FWD_DEFINED__
typedef interface IHTMLStyleElement2 IHTMLStyleElement2;
#ifdef __cplusplus
interface IHTMLStyleElement2;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLStyleElement_FWD_DEFINED__
#define __DispHTMLStyleElement_FWD_DEFINED__
typedef interface DispHTMLStyleElement DispHTMLStyleElement;
#ifdef __cplusplus
interface DispHTMLStyleElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLStyleFontFace;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLStyleFontFace2_FWD_DEFINED__
#define __IHTMLStyleFontFace2_FWD_DEFINED__
typedef interface IHTMLStyleFontFace2 IHTMLStyleFontFace2;
#ifdef __cplusplus
interface IHTMLStyleFontFace2;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLStyleFontFace_FWD_DEFINED__
#define __DispHTMLStyleFontFace_FWD_DEFINED__
typedef interface DispHTMLStyleFontFace DispHTMLStyleFontFace;
#ifdef __cplusplus
interface DispHTMLStyleFontFace;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLXDomainRequest;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLXDomainRequestFactory_FWD_DEFINED__
#define __IHTMLXDomainRequestFactory_FWD_DEFINED__
typedef interface IHTMLXDomainRequestFactory IHTMLXDomainRequestFactory;
#ifdef __cplusplus
interface IHTMLXDomainRequestFactory;
#endif /* __cplusplus */
#endif

#ifndef __DispXDomainRequest_FWD_DEFINED__
#define __DispXDomainRequest_FWD_DEFINED__
typedef interface DispXDomainRequest DispXDomainRequest;
#ifdef __cplusplus
interface DispXDomainRequest;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLStorage;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLStorage2_FWD_DEFINED__
#define __IHTMLStorage2_FWD_DEFINED__
typedef interface IHTMLStorage2 IHTMLStorage2;
#ifdef __cplusplus
interface IHTMLStorage2;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLStorage_FWD_DEFINED__
#define __DispHTMLStorage_FWD_DEFINED__
typedef interface DispHTMLStorage DispHTMLStorage;
#ifdef __cplusplus
interface DispHTMLStorage;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IEventTarget;
#endif /* __cplusplus */
#endif

#ifndef __IDOMEvent_FWD_DEFINED__
#define __IDOMEvent_FWD_DEFINED__
typedef interface IDOMEvent IDOMEvent;
#ifdef __cplusplus
interface IDOMEvent;
#endif /* __cplusplus */
#endif

#ifndef __DispDOMEvent_FWD_DEFINED__
#define __DispDOMEvent_FWD_DEFINED__
typedef interface DispDOMEvent DispDOMEvent;
#ifdef __cplusplus
interface DispDOMEvent;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IDOMUIEvent;
#endif /* __cplusplus */
#endif

#ifndef __DispDOMUIEvent_FWD_DEFINED__
#define __DispDOMUIEvent_FWD_DEFINED__
typedef interface DispDOMUIEvent DispDOMUIEvent;
#ifdef __cplusplus
interface DispDOMUIEvent;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IDOMMouseEvent;
#endif /* __cplusplus */
#endif

#ifndef __DispDOMMouseEvent_FWD_DEFINED__
#define __DispDOMMouseEvent_FWD_DEFINED__
typedef interface DispDOMMouseEvent DispDOMMouseEvent;
#ifdef __cplusplus
interface DispDOMMouseEvent;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IDOMDragEvent;
#endif /* __cplusplus */
#endif

#ifndef __DispDOMDragEvent_FWD_DEFINED__
#define __DispDOMDragEvent_FWD_DEFINED__
typedef interface DispDOMDragEvent DispDOMDragEvent;
#ifdef __cplusplus
interface DispDOMDragEvent;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IDOMMouseWheelEvent;
#endif /* __cplusplus */
#endif

#ifndef __DispDOMMouseWheelEvent_FWD_DEFINED__
#define __DispDOMMouseWheelEvent_FWD_DEFINED__
typedef interface DispDOMMouseWheelEvent DispDOMMouseWheelEvent;
#ifdef __cplusplus
interface DispDOMMouseWheelEvent;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IDOMWheelEvent;
#endif /* __cplusplus */
#endif

#ifndef __DispDOMWheelEvent_FWD_DEFINED__
#define __DispDOMWheelEvent_FWD_DEFINED__
typedef interface DispDOMWheelEvent DispDOMWheelEvent;
#ifdef __cplusplus
interface DispDOMWheelEvent;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IDOMTextEvent;
#endif /* __cplusplus */
#endif

#ifndef __DispDOMTextEvent_FWD_DEFINED__
#define __DispDOMTextEvent_FWD_DEFINED__
typedef interface DispDOMTextEvent DispDOMTextEvent;
#ifdef __cplusplus
interface DispDOMTextEvent;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IDOMKeyboardEvent;
#endif /* __cplusplus */
#endif

#ifndef __DispDOMKeyboardEvent_FWD_DEFINED__
#define __DispDOMKeyboardEvent_FWD_DEFINED__
typedef interface DispDOMKeyboardEvent DispDOMKeyboardEvent;
#ifdef __cplusplus
interface DispDOMKeyboardEvent;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IDOMCompositionEvent;
#endif /* __cplusplus */
#endif

#ifndef __DispDOMCompositionEvent_FWD_DEFINED__
#define __DispDOMCompositionEvent_FWD_DEFINED__
typedef interface DispDOMCompositionEvent DispDOMCompositionEvent;
#ifdef __cplusplus
interface DispDOMCompositionEvent;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IDOMMutationEvent;
#endif /* __cplusplus */
#endif

#ifndef __DispDOMMutationEvent_FWD_DEFINED__
#define __DispDOMMutationEvent_FWD_DEFINED__
typedef interface DispDOMMutationEvent DispDOMMutationEvent;
#ifdef __cplusplus
interface DispDOMMutationEvent;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IDOMBeforeUnloadEvent;
#endif /* __cplusplus */
#endif

#ifndef __DispDOMBeforeUnloadEvent_FWD_DEFINED__
#define __DispDOMBeforeUnloadEvent_FWD_DEFINED__
typedef interface DispDOMBeforeUnloadEvent DispDOMBeforeUnloadEvent;
#ifdef __cplusplus
interface DispDOMBeforeUnloadEvent;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IDOMFocusEvent;
#endif /* __cplusplus */
#endif

#ifndef __DispDOMFocusEvent_FWD_DEFINED__
#define __DispDOMFocusEvent_FWD_DEFINED__
typedef interface DispDOMFocusEvent DispDOMFocusEvent;
#ifdef __cplusplus
interface DispDOMFocusEvent;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IDOMCustomEvent;
#endif /* __cplusplus */
#endif

#ifndef __DispDOMCustomEvent_FWD_DEFINED__
#define __DispDOMCustomEvent_FWD_DEFINED__
typedef interface DispDOMCustomEvent DispDOMCustomEvent;
#ifdef __cplusplus
interface DispDOMCustomEvent;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ICanvasGradient;
#endif /* __cplusplus */
#endif

#ifndef __ICanvasPattern_FWD_DEFINED__
#define __ICanvasPattern_FWD_DEFINED__
typedef interface ICanvasPattern ICanvasPattern;
#ifdef __cplusplus
interface ICanvasPattern;
#endif /* __cplusplus */
#endif

#ifndef __ICanvasTextMetrics_FWD_DEFINED__
#define __ICanvasTextMetrics_FWD_DEFINED__
typedef interface ICanvasTextMetrics ICanvasTextMetrics;
#ifdef __cplusplus
interface ICanvasTextMetrics;
#endif /* __cplusplus */
#endif

#ifndef __ICanvasImageData_FWD_DEFINED__
#define __ICanvasImageData_FWD_DEFINED__
typedef interface ICanvasImageData ICanvasImageData;
#ifdef __cplusplus
interface ICanvasImageData;
#endif /* __cplusplus */
#endif

#ifndef __ICanvasPixelArray_FWD_DEFINED__
#define __ICanvasPixelArray_FWD_DEFINED__
typedef interface ICanvasPixelArray ICanvasPixelArray;
#ifdef __cplusplus
interface ICanvasPixelArray;
#endif /* __cplusplus */
#endif

#ifndef __ICanvasRenderingContext2D_FWD_DEFINED__
#define __ICanvasRenderingContext2D_FWD_DEFINED__
typedef interface ICanvasRenderingContext2D ICanvasRenderingContext2D;
#ifdef __cplusplus
interface ICanvasRenderingContext2D;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLCanvasElement_FWD_DEFINED__
#define __IHTMLCanvasElement_FWD_DEFINED__
typedef interface IHTMLCanvasElement IHTMLCanvasElement;
#ifdef __cplusplus
interface IHTMLCanvasElement;
#endif /* __cplusplus */
#endif

#ifndef __DispCanvasGradient_FWD_DEFINED__
#define __DispCanvasGradient_FWD_DEFINED__
typedef interface DispCanvasGradient DispCanvasGradient;
#ifdef __cplusplus
interface DispCanvasGradient;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispCanvasPattern;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispCanvasTextMetrics;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispCanvasImageData;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispCanvasRenderingContext2D;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLCanvasElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IDOMProgressEvent;
#endif /* __cplusplus */
#endif

#ifndef __DispDOMProgressEvent_FWD_DEFINED__
#define __DispDOMProgressEvent_FWD_DEFINED__
typedef interface DispDOMProgressEvent DispDOMProgressEvent;
#ifdef __cplusplus
interface DispDOMProgressEvent;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IDOMMessageEvent;
#endif /* __cplusplus */
#endif

#ifndef __DispDOMMessageEvent_FWD_DEFINED__
#define __DispDOMMessageEvent_FWD_DEFINED__
typedef interface DispDOMMessageEvent DispDOMMessageEvent;
#ifdef __cplusplus
interface DispDOMMessageEvent;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IDOMSiteModeEvent;
#endif /* __cplusplus */
#endif

#ifndef __DispDOMSiteModeEvent_FWD_DEFINED__
#define __DispDOMSiteModeEvent_FWD_DEFINED__
typedef interface DispDOMSiteModeEvent DispDOMSiteModeEvent;
#ifdef __cplusplus
interface DispDOMSiteModeEvent;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IDOMStorageEvent;
#endif /* __cplusplus */
#endif

#ifndef __DispDOMStorageEvent_FWD_DEFINED__
#define __DispDOMStorageEvent_FWD_DEFINED__
typedef interface DispDOMStorageEvent DispDOMStorageEvent;
#ifdef __cplusplus
interface DispDOMStorageEvent;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IXMLHttpRequestEventTarget;
#endif /* __cplusplus */
#endif

#ifndef __DispXMLHttpRequestEventTarget_FWD_DEFINED__
#define __DispXMLHttpRequestEventTarget_FWD_DEFINED__
typedef interface DispXMLHttpRequestEventTarget DispXMLHttpRequestEventTarget;
#ifdef __cplusplus
interface DispXMLHttpRequestEventTarget;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface HTMLXMLHttpRequestEvents;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLXMLHttpRequest_FWD_DEFINED__
#define __IHTMLXMLHttpRequest_FWD_DEFINED__
typedef interface IHTMLXMLHttpRequest IHTMLXMLHttpRequest;
#ifdef __cplusplus
interface IHTMLXMLHttpRequest;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLXMLHttpRequest2_FWD_DEFINED__
#define __IHTMLXMLHttpRequest2_FWD_DEFINED__
typedef interface IHTMLXMLHttpRequest2 IHTMLXMLHttpRequest2;
#ifdef __cplusplus
interface IHTMLXMLHttpRequest2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLXMLHttpRequestFactory_FWD_DEFINED__
#define __IHTMLXMLHttpRequestFactory_FWD_DEFINED__
typedef interface IHTMLXMLHttpRequestFactory IHTMLXMLHttpRequestFactory;
#ifdef __cplusplus
interface IHTMLXMLHttpRequestFactory;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLXMLHttpRequest_FWD_DEFINED__
#define __DispHTMLXMLHttpRequest_FWD_DEFINED__
typedef interface DispHTMLXMLHttpRequest DispHTMLXMLHttpRequest;
#ifdef __cplusplus
interface DispHTMLXMLHttpRequest;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGAngle;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGStylable;
#endif /* __cplusplus */
#endif

#ifndef __ISVGLocatable_FWD_DEFINED__
#define __ISVGLocatable_FWD_DEFINED__
typedef interface ISVGLocatable ISVGLocatable;
#ifdef __cplusplus
interface ISVGLocatable;
#endif /* __cplusplus */
#endif

#ifndef __ISVGTransformable_FWD_DEFINED__
#define __ISVGTransformable_FWD_DEFINED__
typedef interface ISVGTransformable ISVGTransformable;
#ifdef __cplusplus
interface ISVGTransformable;
#endif /* __cplusplus */
#endif

#ifndef __ISVGTests_FWD_DEFINED__
#define __ISVGTests_FWD_DEFINED__
typedef interface ISVGTests ISVGTests;
#ifdef __cplusplus
interface ISVGTests;
#endif /* __cplusplus */
#endif

#ifndef __ISVGLangSpace_FWD_DEFINED__
#define __ISVGLangSpace_FWD_DEFINED__
typedef interface ISVGLangSpace ISVGLangSpace;
#ifdef __cplusplus
interface ISVGLangSpace;
#endif /* __cplusplus */
#endif

#ifndef __ISVGExternalResourcesRequired_FWD_DEFINED__
#define __ISVGExternalResourcesRequired_FWD_DEFINED__
typedef interface ISVGExternalResourcesRequired ISVGExternalResourcesRequired;
#ifdef __cplusplus
interface ISVGExternalResourcesRequired;
#endif /* __cplusplus */
#endif

#ifndef __ISVGFitToViewBox_FWD_DEFINED__
#define __ISVGFitToViewBox_FWD_DEFINED__
typedef interface ISVGFitToViewBox ISVGFitToViewBox;
#ifdef __cplusplus
interface ISVGFitToViewBox;
#endif /* __cplusplus */
#endif

#ifndef __ISVGZoomAndPan_FWD_DEFINED__
#define __ISVGZoomAndPan_FWD_DEFINED__
typedef interface ISVGZoomAndPan ISVGZoomAndPan;
#ifdef __cplusplus
interface ISVGZoomAndPan;
#endif /* __cplusplus */
#endif

#ifndef __ISVGURIReference_FWD_DEFINED__
#define __ISVGURIReference_FWD_DEFINED__
typedef interface ISVGURIReference ISVGURIReference;
#ifdef __cplusplus
interface ISVGURIReference;
#endif /* __cplusplus */
#endif

#ifndef __ISVGAnimatedAngle_FWD_DEFINED__
#define __ISVGAnimatedAngle_FWD_DEFINED__
typedef interface ISVGAnimatedAngle ISVGAnimatedAngle;
#ifdef __cplusplus
interface ISVGAnimatedAngle;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGAnimatedTransformList;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGAnimatedBoolean;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGAnimatedEnumeration;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGAnimatedInteger;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGAnimatedLength;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGAnimatedLengthList;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGAnimatedNumber;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGAnimatedNumberList;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGAnimatedRect;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGAnimatedString;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGClipPathElement;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGClipPathElement_FWD_DEFINED__
#define __DispSVGClipPathElement_FWD_DEFINED__
typedef interface DispSVGClipPathElement DispSVGClipPathElement;
#ifdef __cplusplus
interface DispSVGClipPathElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGDocument;
#endif /* __cplusplus */
#endif

#ifndef __IGetSVGDocument_FWD_DEFINED__
#define __IGetSVGDocument_FWD_DEFINED__
typedef interface IGetSVGDocument IGetSVGDocument;
#ifdef __cplusplus
interface IGetSVGDocument;
#endif /* __cplusplus */
#endif

#ifndef __ISVGElement_FWD_DEFINED__
#define __ISVGElement_FWD_DEFINED__
typedef interface ISVGElement ISVGElement;
#ifdef __cplusplus
interface ISVGElement;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGElement_FWD_DEFINED__
#define __DispSVGElement_FWD_DEFINED__
typedef interface DispSVGElement DispSVGElement;
#ifdef __cplusplus
interface DispSVGElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IICCSVGColor;
#endif /* __cplusplus */
#endif

#ifndef __ISVGLength_FWD_DEFINED__
#define __ISVGLength_FWD_DEFINED__
typedef interface ISVGLength ISVGLength;
#ifdef __cplusplus
interface ISVGLength;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGLengthList;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGMatrix;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGNumber;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGNumberList;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGPaint;
#endif /* __cplusplus */
#endif

#ifndef __ISVGPatternElement_FWD_DEFINED__
#define __ISVGPatternElement_FWD_DEFINED__
typedef interface ISVGPatternElement ISVGPatternElement;
#ifdef __cplusplus
interface ISVGPatternElement;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGPatternElement_FWD_DEFINED__
#define __DispSVGPatternElement_FWD_DEFINED__
typedef interface DispSVGPatternElement DispSVGPatternElement;
#ifdef __cplusplus
interface DispSVGPatternElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGPathSeg;
#endif /* __cplusplus */
#endif

#ifndef __ISVGPathSegArcAbs_FWD_DEFINED__
#define __ISVGPathSegArcAbs_FWD_DEFINED__
typedef interface ISVGPathSegArcAbs ISVGPathSegArcAbs;
#ifdef __cplusplus
interface ISVGPathSegArcAbs;
#endif /* __cplusplus */
#endif

#ifndef __ISVGPathSegArcRel_FWD_DEFINED__
#define __ISVGPathSegArcRel_FWD_DEFINED__
typedef interface ISVGPathSegArcRel ISVGPathSegArcRel;
#ifdef __cplusplus
interface ISVGPathSegArcRel;
#endif /* __cplusplus */
#endif

#ifndef __ISVGPathSegClosePath_FWD_DEFINED__
#define __ISVGPathSegClosePath_FWD_DEFINED__
typedef interface ISVGPathSegClosePath ISVGPathSegClosePath;
#ifdef __cplusplus
interface ISVGPathSegClosePath;
#endif /* __cplusplus */
#endif

#ifndef __ISVGPathSegMovetoAbs_FWD_DEFINED__
#define __ISVGPathSegMovetoAbs_FWD_DEFINED__
typedef interface ISVGPathSegMovetoAbs ISVGPathSegMovetoAbs;
#ifdef __cplusplus
interface ISVGPathSegMovetoAbs;
#endif /* __cplusplus */
#endif

#ifndef __ISVGPathSegMovetoRel_FWD_DEFINED__
#define __ISVGPathSegMovetoRel_FWD_DEFINED__
typedef interface ISVGPathSegMovetoRel ISVGPathSegMovetoRel;
#ifdef __cplusplus
interface ISVGPathSegMovetoRel;
#endif /* __cplusplus */
#endif

#ifndef __ISVGPathSegLinetoAbs_FWD_DEFINED__
#define __ISVGPathSegLinetoAbs_FWD_DEFINED__
typedef interface ISVGPathSegLinetoAbs ISVGPathSegLinetoAbs;
#ifdef __cplusplus
interface ISVGPathSegLinetoAbs;
#endif /* __cplusplus */
#endif

#ifndef __ISVGPathSegLinetoRel_FWD_DEFINED__
#define __ISVGPathSegLinetoRel_FWD_DEFINED__
typedef interface ISVGPathSegLinetoRel ISVGPathSegLinetoRel;
#ifdef __cplusplus
interface ISVGPathSegLinetoRel;
#endif /* __cplusplus */
#endif

#ifndef __ISVGPathSegCurvetoCubicAbs_FWD_DEFINED__
#define __ISVGPathSegCurvetoCubicAbs_FWD_DEFINED__
typedef interface ISVGPathSegCurvetoCubicAbs ISVGPathSegCurvetoCubicAbs;
#ifdef __cplusplus
interface ISVGPathSegCurvetoCubicAbs;
#endif /* __cplusplus */
#endif

#ifndef __ISVGPathSegCurvetoCubicRel_FWD_DEFINED__
#define __ISVGPathSegCurvetoCubicRel_FWD_DEFINED__
typedef interface ISVGPathSegCurvetoCubicRel ISVGPathSegCurvetoCubicRel;
#ifdef __cplusplus
interface ISVGPathSegCurvetoCubicRel;
#endif /* __cplusplus */
#endif

#ifndef __ISVGPathSegCurvetoCubicSmoothAbs_FWD_DEFINED__
#define __ISVGPathSegCurvetoCubicSmoothAbs_FWD_DEFINED__
typedef interface ISVGPathSegCurvetoCubicSmoothAbs ISVGPathSegCurvetoCubicSmoothAbs;
#ifdef __cplusplus
interface ISVGPathSegCurvetoCubicSmoothAbs;
#endif /* __cplusplus */
#endif

#ifndef __ISVGPathSegCurvetoCubicSmoothRel_FWD_DEFINED__
#define __ISVGPathSegCurvetoCubicSmoothRel_FWD_DEFINED__
typedef interface ISVGPathSegCurvetoCubicSmoothRel ISVGPathSegCurvetoCubicSmoothRel;
#ifdef __cplusplus
interface ISVGPathSegCurvetoCubicSmoothRel;
#endif /* __cplusplus */
#endif

#ifndef __ISVGPathSegCurvetoQuadraticAbs_FWD_DEFINED__
#define __ISVGPathSegCurvetoQuadraticAbs_FWD_DEFINED__
typedef interface ISVGPathSegCurvetoQuadraticAbs ISVGPathSegCurvetoQuadraticAbs;
#ifdef __cplusplus
interface ISVGPathSegCurvetoQuadraticAbs;
#endif /* __cplusplus */
#endif

#ifndef __ISVGPathSegCurvetoQuadraticRel_FWD_DEFINED__
#define __ISVGPathSegCurvetoQuadraticRel_FWD_DEFINED__
typedef interface ISVGPathSegCurvetoQuadraticRel ISVGPathSegCurvetoQuadraticRel;
#ifdef __cplusplus
interface ISVGPathSegCurvetoQuadraticRel;
#endif /* __cplusplus */
#endif

#ifndef __ISVGPathSegCurvetoQuadraticSmoothAbs_FWD_DEFINED__
#define __ISVGPathSegCurvetoQuadraticSmoothAbs_FWD_DEFINED__
typedef interface ISVGPathSegCurvetoQuadraticSmoothAbs ISVGPathSegCurvetoQuadraticSmoothAbs;
#ifdef __cplusplus
interface ISVGPathSegCurvetoQuadraticSmoothAbs;
#endif /* __cplusplus */
#endif

#ifndef __ISVGPathSegCurvetoQuadraticSmoothRel_FWD_DEFINED__
#define __ISVGPathSegCurvetoQuadraticSmoothRel_FWD_DEFINED__
typedef interface ISVGPathSegCurvetoQuadraticSmoothRel ISVGPathSegCurvetoQuadraticSmoothRel;
#ifdef __cplusplus
interface ISVGPathSegCurvetoQuadraticSmoothRel;
#endif /* __cplusplus */
#endif

#ifndef __ISVGPathSegLinetoHorizontalAbs_FWD_DEFINED__
#define __ISVGPathSegLinetoHorizontalAbs_FWD_DEFINED__
typedef interface ISVGPathSegLinetoHorizontalAbs ISVGPathSegLinetoHorizontalAbs;
#ifdef __cplusplus
interface ISVGPathSegLinetoHorizontalAbs;
#endif /* __cplusplus */
#endif

#ifndef __ISVGPathSegLinetoHorizontalRel_FWD_DEFINED__
#define __ISVGPathSegLinetoHorizontalRel_FWD_DEFINED__
typedef interface ISVGPathSegLinetoHorizontalRel ISVGPathSegLinetoHorizontalRel;
#ifdef __cplusplus
interface ISVGPathSegLinetoHorizontalRel;
#endif /* __cplusplus */
#endif

#ifndef __ISVGPathSegLinetoVerticalAbs_FWD_DEFINED__
#define __ISVGPathSegLinetoVerticalAbs_FWD_DEFINED__
typedef interface ISVGPathSegLinetoVerticalAbs ISVGPathSegLinetoVerticalAbs;
#ifdef __cplusplus
interface ISVGPathSegLinetoVerticalAbs;
#endif /* __cplusplus */
#endif

#ifndef __ISVGPathSegLinetoVerticalRel_FWD_DEFINED__
#define __ISVGPathSegLinetoVerticalRel_FWD_DEFINED__
typedef interface ISVGPathSegLinetoVerticalRel ISVGPathSegLinetoVerticalRel;
#ifdef __cplusplus
interface ISVGPathSegLinetoVerticalRel;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispSVGPathSegArcAbs;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispSVGPathSegArcRel;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispSVGPathSegClosePath;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispSVGPathSegMovetoAbs;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispSVGPathSegMovetoRel;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispSVGPathSegLinetoAbs;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispSVGPathSegLinetoRel;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispSVGPathSegCurvetoCubicAbs;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispSVGPathSegCurvetoCubicRel;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispSVGPathSegCurvetoCubicSmoothAbs;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispSVGPathSegCurvetoCubicSmoothRel;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispSVGPathSegCurvetoQuadraticAbs;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispSVGPathSegCurvetoQuadraticRel;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispSVGPathSegCurvetoQuadraticSmoothAbs;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispSVGPathSegCurvetoQuadraticSmoothRel;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispSVGPathSegLinetoHorizontalAbs;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispSVGPathSegLinetoHorizontalRel;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispSVGPathSegLinetoVerticalAbs;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispSVGPathSegLinetoVerticalRel;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGPathSegList;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGPoint;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGPointList;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGRect;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGStringList;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGViewSpec;
#endif /* __cplusplus */
#endif

#ifndef __ISVGTransform_FWD_DEFINED__
#define __ISVGTransform_FWD_DEFINED__
typedef interface ISVGTransform ISVGTransform;
#ifdef __cplusplus
interface ISVGTransform;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGSVGElement;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGSVGElement_FWD_DEFINED__
#define __DispSVGSVGElement_FWD_DEFINED__
typedef interface DispSVGSVGElement DispSVGSVGElement;
#ifdef __cplusplus
interface DispSVGSVGElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGUseElement;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGUseElement_FWD_DEFINED__
#define __DispSVGUseElement_FWD_DEFINED__
typedef interface DispSVGUseElement DispSVGUseElement;
#ifdef __cplusplus
interface DispSVGUseElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLStyleSheetRulesAppliedCollection;
#endif /* __cplusplus */
#endif

#ifndef __IRulesApplied_FWD_DEFINED__
#define __IRulesApplied_FWD_DEFINED__
typedef interface IRulesApplied IRulesApplied;
#ifdef __cplusplus
interface IRulesApplied;
#endif /* __cplusplus */
#endif

#ifndef __IRulesAppliedCollection_FWD_DEFINED__
#define __IRulesAppliedCollection_FWD_DEFINED__
typedef interface IRulesAppliedCollection IRulesAppliedCollection;
#ifdef __cplusplus
interface IRulesAppliedCollection;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLStyleSheetRulesAppliedCollection_FWD_DEFINED__
#define __DispHTMLStyleSheetRulesAppliedCollection_FWD_DEFINED__
typedef interface DispHTMLStyleSheetRulesAppliedCollection DispHTMLStyleSheetRulesAppliedCollection;
#ifdef __cplusplus
interface DispHTMLStyleSheetRulesAppliedCollection;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispRulesApplied;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispRulesAppliedCollection;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLW3CComputedStyle;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGTransformList;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGAnimatedPoints;
#endif /* __cplusplus */
#endif

#ifndef __ISVGCircleElement_FWD_DEFINED__
#define __ISVGCircleElement_FWD_DEFINED__
typedef interface ISVGCircleElement ISVGCircleElement;
#ifdef __cplusplus
interface ISVGCircleElement;
#endif /* __cplusplus */
#endif

#ifndef __ISVGEllipseElement_FWD_DEFINED__
#define __ISVGEllipseElement_FWD_DEFINED__
typedef interface ISVGEllipseElement ISVGEllipseElement;
#ifdef __cplusplus
interface ISVGEllipseElement;
#endif /* __cplusplus */
#endif

#ifndef __ISVGLineElement_FWD_DEFINED__
#define __ISVGLineElement_FWD_DEFINED__
typedef interface ISVGLineElement ISVGLineElement;
#ifdef __cplusplus
interface ISVGLineElement;
#endif /* __cplusplus */
#endif

#ifndef __ISVGRectElement_FWD_DEFINED__
#define __ISVGRectElement_FWD_DEFINED__
typedef interface ISVGRectElement ISVGRectElement;
#ifdef __cplusplus
interface ISVGRectElement;
#endif /* __cplusplus */
#endif

#ifndef __ISVGPolygonElement_FWD_DEFINED__
#define __ISVGPolygonElement_FWD_DEFINED__
typedef interface ISVGPolygonElement ISVGPolygonElement;
#ifdef __cplusplus
interface ISVGPolygonElement;
#endif /* __cplusplus */
#endif

#ifndef __ISVGPolylineElement_FWD_DEFINED__
#define __ISVGPolylineElement_FWD_DEFINED__
typedef interface ISVGPolylineElement ISVGPolylineElement;
#ifdef __cplusplus
interface ISVGPolylineElement;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGCircleElement_FWD_DEFINED__
#define __DispSVGCircleElement_FWD_DEFINED__
typedef interface DispSVGCircleElement DispSVGCircleElement;
#ifdef __cplusplus
interface DispSVGCircleElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispSVGEllipseElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispSVGLineElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispSVGRectElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispSVGPolygonElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispSVGPolylineElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGGElement;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGGElement_FWD_DEFINED__
#define __DispSVGGElement_FWD_DEFINED__
typedef interface DispSVGGElement DispSVGGElement;
#ifdef __cplusplus
interface DispSVGGElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGSymbolElement;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGSymbolElement_FWD_DEFINED__
#define __DispSVGSymbolElement_FWD_DEFINED__
typedef interface DispSVGSymbolElement DispSVGSymbolElement;
#ifdef __cplusplus
interface DispSVGSymbolElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGDefsElement;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGDefsElement_FWD_DEFINED__
#define __DispSVGDefsElement_FWD_DEFINED__
typedef interface DispSVGDefsElement DispSVGDefsElement;
#ifdef __cplusplus
interface DispSVGDefsElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGAnimatedPathData;
#endif /* __cplusplus */
#endif

#ifndef __ISVGPathElement_FWD_DEFINED__
#define __ISVGPathElement_FWD_DEFINED__
typedef interface ISVGPathElement ISVGPathElement;
#ifdef __cplusplus
interface ISVGPathElement;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGPathElement_FWD_DEFINED__
#define __DispSVGPathElement_FWD_DEFINED__
typedef interface DispSVGPathElement DispSVGPathElement;
#ifdef __cplusplus
interface DispSVGPathElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGPreserveAspectRatio;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGTextElement;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGTextElement_FWD_DEFINED__
#define __DispSVGTextElement_FWD_DEFINED__
typedef interface DispSVGTextElement DispSVGTextElement;
#ifdef __cplusplus
interface DispSVGTextElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGAnimatedPreserveAspectRatio;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGImageElement;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGImageElement_FWD_DEFINED__
#define __DispSVGImageElement_FWD_DEFINED__
typedef interface DispSVGImageElement DispSVGImageElement;
#ifdef __cplusplus
interface DispSVGImageElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGStopElement;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGStopElement_FWD_DEFINED__
#define __DispSVGStopElement_FWD_DEFINED__
typedef interface DispSVGStopElement DispSVGStopElement;
#ifdef __cplusplus
interface DispSVGStopElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGGradientElement;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGGradientElement_FWD_DEFINED__
#define __DispSVGGradientElement_FWD_DEFINED__
typedef interface DispSVGGradientElement DispSVGGradientElement;
#ifdef __cplusplus
interface DispSVGGradientElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGLinearGradientElement;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGLinearGradientElement_FWD_DEFINED__
#define __DispSVGLinearGradientElement_FWD_DEFINED__
typedef interface DispSVGLinearGradientElement DispSVGLinearGradientElement;
#ifdef __cplusplus
interface DispSVGLinearGradientElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGRadialGradientElement;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGRadialGradientElement_FWD_DEFINED__
#define __DispSVGRadialGradientElement_FWD_DEFINED__
typedef interface DispSVGRadialGradientElement DispSVGRadialGradientElement;
#ifdef __cplusplus
interface DispSVGRadialGradientElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGMaskElement;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGMaskElement_FWD_DEFINED__
#define __DispSVGMaskElement_FWD_DEFINED__
typedef interface DispSVGMaskElement DispSVGMaskElement;
#ifdef __cplusplus
interface DispSVGMaskElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGMarkerElement;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGMarkerElement_FWD_DEFINED__
#define __DispSVGMarkerElement_FWD_DEFINED__
typedef interface DispSVGMarkerElement DispSVGMarkerElement;
#ifdef __cplusplus
interface DispSVGMarkerElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGZoomEvent;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGZoomEvent_FWD_DEFINED__
#define __DispSVGZoomEvent_FWD_DEFINED__
typedef interface DispSVGZoomEvent DispSVGZoomEvent;
#ifdef __cplusplus
interface DispSVGZoomEvent;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGAElement;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGAElement_FWD_DEFINED__
#define __DispSVGAElement_FWD_DEFINED__
typedef interface DispSVGAElement DispSVGAElement;
#ifdef __cplusplus
interface DispSVGAElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGViewElement;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGViewElement_FWD_DEFINED__
#define __DispSVGViewElement_FWD_DEFINED__
typedef interface DispSVGViewElement DispSVGViewElement;
#ifdef __cplusplus
interface DispSVGViewElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLMediaError;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLTimeRanges_FWD_DEFINED__
#define __IHTMLTimeRanges_FWD_DEFINED__
typedef interface IHTMLTimeRanges IHTMLTimeRanges;
#ifdef __cplusplus
interface IHTMLTimeRanges;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLTimeRanges2_FWD_DEFINED__
#define __IHTMLTimeRanges2_FWD_DEFINED__
typedef interface IHTMLTimeRanges2 IHTMLTimeRanges2;
#ifdef __cplusplus
interface IHTMLTimeRanges2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLMediaElement_FWD_DEFINED__
#define __IHTMLMediaElement_FWD_DEFINED__
typedef interface IHTMLMediaElement IHTMLMediaElement;
#ifdef __cplusplus
interface IHTMLMediaElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLMediaElement2_FWD_DEFINED__
#define __IHTMLMediaElement2_FWD_DEFINED__
typedef interface IHTMLMediaElement2 IHTMLMediaElement2;
#ifdef __cplusplus
interface IHTMLMediaElement2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLMSMediaElement_FWD_DEFINED__
#define __IHTMLMSMediaElement_FWD_DEFINED__
typedef interface IHTMLMSMediaElement IHTMLMSMediaElement;
#ifdef __cplusplus
interface IHTMLMSMediaElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLSourceElement_FWD_DEFINED__
#define __IHTMLSourceElement_FWD_DEFINED__
typedef interface IHTMLSourceElement IHTMLSourceElement;
#ifdef __cplusplus
interface IHTMLSourceElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLAudioElement_FWD_DEFINED__
#define __IHTMLAudioElement_FWD_DEFINED__
typedef interface IHTMLAudioElement IHTMLAudioElement;
#ifdef __cplusplus
interface IHTMLAudioElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLVideoElement_FWD_DEFINED__
#define __IHTMLVideoElement_FWD_DEFINED__
typedef interface IHTMLVideoElement IHTMLVideoElement;
#ifdef __cplusplus
interface IHTMLVideoElement;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLAudioElementFactory_FWD_DEFINED__
#define __IHTMLAudioElementFactory_FWD_DEFINED__
typedef interface IHTMLAudioElementFactory IHTMLAudioElementFactory;
#ifdef __cplusplus
interface IHTMLAudioElementFactory;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLMediaError_FWD_DEFINED__
#define __DispHTMLMediaError_FWD_DEFINED__
typedef interface DispHTMLMediaError DispHTMLMediaError;
#ifdef __cplusplus
interface DispHTMLMediaError;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLTimeRanges;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLMediaElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLSourceElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLAudioElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLVideoElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGSwitchElement;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGSwitchElement_FWD_DEFINED__
#define __DispSVGSwitchElement_FWD_DEFINED__
typedef interface DispSVGSwitchElement DispSVGSwitchElement;
#ifdef __cplusplus
interface DispSVGSwitchElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGDescElement;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGDescElement_FWD_DEFINED__
#define __DispSVGDescElement_FWD_DEFINED__
typedef interface DispSVGDescElement DispSVGDescElement;
#ifdef __cplusplus
interface DispSVGDescElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGTitleElement;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGTitleElement_FWD_DEFINED__
#define __DispSVGTitleElement_FWD_DEFINED__
typedef interface DispSVGTitleElement DispSVGTitleElement;
#ifdef __cplusplus
interface DispSVGTitleElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGMetadataElement;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGMetadataElement_FWD_DEFINED__
#define __DispSVGMetadataElement_FWD_DEFINED__
typedef interface DispSVGMetadataElement DispSVGMetadataElement;
#ifdef __cplusplus
interface DispSVGMetadataElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGElementInstance;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGElementInstance_FWD_DEFINED__
#define __DispSVGElementInstance_FWD_DEFINED__
typedef interface DispSVGElementInstance DispSVGElementInstance;
#ifdef __cplusplus
interface DispSVGElementInstance;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGElementInstanceList;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGElementInstanceList_FWD_DEFINED__
#define __DispSVGElementInstanceList_FWD_DEFINED__
typedef interface DispSVGElementInstanceList DispSVGElementInstanceList;
#ifdef __cplusplus
interface DispSVGElementInstanceList;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IDOMException;
#endif /* __cplusplus */
#endif

#ifndef __IRangeException_FWD_DEFINED__
#define __IRangeException_FWD_DEFINED__
typedef interface IRangeException IRangeException;
#ifdef __cplusplus
interface IRangeException;
#endif /* __cplusplus */
#endif

#ifndef __ISVGException_FWD_DEFINED__
#define __ISVGException_FWD_DEFINED__
typedef interface ISVGException ISVGException;
#ifdef __cplusplus
interface ISVGException;
#endif /* __cplusplus */
#endif

#ifndef __IEventException_FWD_DEFINED__
#define __IEventException_FWD_DEFINED__
typedef interface IEventException IEventException;
#ifdef __cplusplus
interface IEventException;
#endif /* __cplusplus */
#endif

#ifndef __DispDOMException_FWD_DEFINED__
#define __DispDOMException_FWD_DEFINED__
typedef interface DispDOMException DispDOMException;
#ifdef __cplusplus
interface DispDOMException;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispRangeException;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispSVGException;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispEventException;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGScriptElement;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGScriptElement_FWD_DEFINED__
#define __DispSVGScriptElement_FWD_DEFINED__
typedef interface DispSVGScriptElement DispSVGScriptElement;
#ifdef __cplusplus
interface DispSVGScriptElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGStyleElement;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGStyleElement_FWD_DEFINED__
#define __DispSVGStyleElement_FWD_DEFINED__
typedef interface DispSVGStyleElement DispSVGStyleElement;
#ifdef __cplusplus
interface DispSVGStyleElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGTextContentElement;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGTextContentElement_FWD_DEFINED__
#define __DispSVGTextContentElement_FWD_DEFINED__
typedef interface DispSVGTextContentElement DispSVGTextContentElement;
#ifdef __cplusplus
interface DispSVGTextContentElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGTextPositioningElement;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGTextPositioningElement_FWD_DEFINED__
#define __DispSVGTextPositioningElement_FWD_DEFINED__
typedef interface DispSVGTextPositioningElement DispSVGTextPositioningElement;
#ifdef __cplusplus
interface DispSVGTextPositioningElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IDOMDocumentType;
#endif /* __cplusplus */
#endif

#ifndef __DispDOMDocumentType_FWD_DEFINED__
#define __DispDOMDocumentType_FWD_DEFINED__
typedef interface DispDOMDocumentType DispDOMDocumentType;
#ifdef __cplusplus
interface DispDOMDocumentType;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IDOMNodeIterator;
#endif /* __cplusplus */
#endif

#ifndef __IDOMTreeWalker_FWD_DEFINED__
#define __IDOMTreeWalker_FWD_DEFINED__
typedef interface IDOMTreeWalker IDOMTreeWalker;
#ifdef __cplusplus
interface IDOMTreeWalker;
#endif /* __cplusplus */
#endif

#ifndef __DispNodeIterator_FWD_DEFINED__
#define __DispNodeIterator_FWD_DEFINED__
typedef interface DispNodeIterator DispNodeIterator;
#ifdef __cplusplus
interface DispNodeIterator;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispTreeWalker;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IDOMProcessingInstruction;
#endif /* __cplusplus */
#endif

#ifndef __DispDOMProcessingInstruction_FWD_DEFINED__
#define __DispDOMProcessingInstruction_FWD_DEFINED__
typedef interface DispDOMProcessingInstruction DispDOMProcessingInstruction;
#ifdef __cplusplus
interface DispDOMProcessingInstruction;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLPerformance;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLPerformanceNavigation_FWD_DEFINED__
#define __IHTMLPerformanceNavigation_FWD_DEFINED__
typedef interface IHTMLPerformanceNavigation IHTMLPerformanceNavigation;
#ifdef __cplusplus
interface IHTMLPerformanceNavigation;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLPerformanceTiming_FWD_DEFINED__
#define __IHTMLPerformanceTiming_FWD_DEFINED__
typedef interface IHTMLPerformanceTiming IHTMLPerformanceTiming;
#ifdef __cplusplus
interface IHTMLPerformanceTiming;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLPerformance_FWD_DEFINED__
#define __DispHTMLPerformance_FWD_DEFINED__
typedef interface DispHTMLPerformance DispHTMLPerformance;
#ifdef __cplusplus
interface DispHTMLPerformance;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLPerformanceNavigation;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLPerformanceTiming;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGTSpanElement;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGTSpanElement_FWD_DEFINED__
#define __DispSVGTSpanElement_FWD_DEFINED__
typedef interface DispSVGTSpanElement DispSVGTSpanElement;
#ifdef __cplusplus
interface DispSVGTSpanElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ITemplatePrinter;
#endif /* __cplusplus */
#endif

#ifndef __ITemplatePrinter2_FWD_DEFINED__
#define __ITemplatePrinter2_FWD_DEFINED__
typedef interface ITemplatePrinter2 ITemplatePrinter2;
#ifdef __cplusplus
interface ITemplatePrinter2;
#endif /* __cplusplus */
#endif

#ifndef __ITemplatePrinter3_FWD_DEFINED__
#define __ITemplatePrinter3_FWD_DEFINED__
typedef interface ITemplatePrinter3 ITemplatePrinter3;
#ifdef __cplusplus
interface ITemplatePrinter3;
#endif /* __cplusplus */
#endif

#ifndef __IPrintManagerTemplatePrinter_FWD_DEFINED__
#define __IPrintManagerTemplatePrinter_FWD_DEFINED__
typedef interface IPrintManagerTemplatePrinter IPrintManagerTemplatePrinter;
#ifdef __cplusplus
interface IPrintManagerTemplatePrinter;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispCPrintManagerTemplatePrinter;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ISVGTextPathElement;
#endif /* __cplusplus */
#endif

#ifndef __DispSVGTextPathElement_FWD_DEFINED__
#define __DispSVGTextPathElement_FWD_DEFINED__
typedef interface DispSVGTextPathElement DispSVGTextPathElement;
#ifdef __cplusplus
interface DispSVGTextPathElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IDOMXmlSerializer;
#endif /* __cplusplus */
#endif

#ifndef __IDOMXmlSerializerFactory_FWD_DEFINED__
#define __IDOMXmlSerializerFactory_FWD_DEFINED__
typedef interface IDOMXmlSerializerFactory IDOMXmlSerializerFactory;
#ifdef __cplusplus
interface IDOMXmlSerializerFactory;
#endif /* __cplusplus */
#endif

#ifndef __IDOMParser_FWD_DEFINED__
#define __IDOMParser_FWD_DEFINED__
typedef interface IDOMParser IDOMParser;
#ifdef __cplusplus
interface IDOMParser;
#endif /* __cplusplus */
#endif

#ifndef __IDOMParserFactory_FWD_DEFINED__
#define __IDOMParserFactory_FWD_DEFINED__
typedef interface IDOMParserFactory IDOMParserFactory;
#ifdef __cplusplus
interface IDOMParserFactory;
#endif /* __cplusplus */
#endif

#ifndef __DispXMLSerializer_FWD_DEFINED__
#define __DispXMLSerializer_FWD_DEFINED__
typedef interface DispXMLSerializer DispXMLSerializer;
#ifdef __cplusplus
interface DispXMLSerializer;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispDOMParser;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLSemanticElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLProgressElement;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLProgressElement_FWD_DEFINED__
#define __DispHTMLProgressElement_FWD_DEFINED__
typedef interface DispHTMLProgressElement DispHTMLProgressElement;
#ifdef __cplusplus
interface DispHTMLProgressElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IDOMMSTransitionEvent;
#endif /* __cplusplus */
#endif

#ifndef __DispDOMMSTransitionEvent_FWD_DEFINED__
#define __DispDOMMSTransitionEvent_FWD_DEFINED__
typedef interface DispDOMMSTransitionEvent DispDOMMSTransitionEvent;
#ifdef __cplusplus
interface DispDOMMSTransitionEvent;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IDOMMSAnimationEvent;
#endif /* __cplusplus */
#endif

#ifndef __DispDOMMSAnimationEvent_FWD_DEFINED__
#define __DispDOMMSAnimationEvent_FWD_DEFINED__
typedef interface DispDOMMSAnimationEvent DispDOMMSAnimationEvent;
#ifdef __cplusplus
interface DispDOMMSAnimationEvent;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IWebGeolocation;
#endif /* __cplusplus */
#endif

#ifndef __IWebGeocoordinates_FWD_DEFINED__
#define __IWebGeocoordinates_FWD_DEFINED__
typedef interface IWebGeocoordinates IWebGeocoordinates;
#ifdef __cplusplus
interface IWebGeocoordinates;
#endif /* __cplusplus */
#endif

#ifndef __IWebGeopositionError_FWD_DEFINED__
#define __IWebGeopositionError_FWD_DEFINED__
typedef interface IWebGeopositionError IWebGeopositionError;
#ifdef __cplusplus
interface IWebGeopositionError;
#endif /* __cplusplus */
#endif

#ifndef __IWebGeoposition_FWD_DEFINED__
#define __IWebGeoposition_FWD_DEFINED__
typedef interface IWebGeoposition IWebGeoposition;
#ifdef __cplusplus
interface IWebGeoposition;
#endif /* __cplusplus */
#endif

#ifndef __DispWebGeolocation_FWD_DEFINED__
#define __DispWebGeolocation_FWD_DEFINED__
typedef interface DispWebGeolocation DispWebGeolocation;
#ifdef __cplusplus
interface DispWebGeolocation;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispWebGeocoordinates;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispWebGeopositionError;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispWebGeoposition;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IClientCaps;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IDOMMSManipulationEvent;
#endif /* __cplusplus */
#endif

#ifndef __DispDOMMSManipulationEvent_FWD_DEFINED__
#define __DispDOMMSManipulationEvent_FWD_DEFINED__
typedef interface DispDOMMSManipulationEvent DispDOMMSManipulationEvent;
#ifdef __cplusplus
interface DispDOMMSManipulationEvent;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IDOMCloseEvent;
#endif /* __cplusplus */
#endif

#ifndef __DispDOMCloseEvent_FWD_DEFINED__
#define __DispDOMCloseEvent_FWD_DEFINED__
typedef interface DispDOMCloseEvent DispDOMCloseEvent;
#ifdef __cplusplus
interface DispDOMCloseEvent;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLApplicationCache;
#endif /* __cplusplus */
#endif

#ifndef __DispApplicationCache_FWD_DEFINED__
#define __DispApplicationCache_FWD_DEFINED__
typedef interface DispApplicationCache DispApplicationCache;
#ifdef __cplusplus
interface DispApplicationCache;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface ICSSFilterSite;
#endif /* __cplusplus */
#endif

#ifndef __ICSSFilter_FWD_DEFINED__
#define __ICSSFilter_FWD_DEFINED__
typedef interface ICSSFilter ICSSFilter;
#ifdef __cplusplus
interface ICSSFilter;
#endif /* __cplusplus */
#endif

#ifndef __ISecureUrlHost_FWD_DEFINED__
#define __ISecureUrlHost_FWD_DEFINED__
typedef interface ISecureUrlHost ISecureUrlHost;
#ifdef __cplusplus
interface ISecureUrlHost;
#endif /* __cplusplus */
#endif

#ifndef __IMarkupServices_FWD_DEFINED__
#define __IMarkupServices_FWD_DEFINED__
typedef interface IMarkupServices IMarkupServices;
#ifdef __cplusplus
interface IMarkupServices;
#endif /* __cplusplus */
#endif

#ifndef __IMarkupServices2_FWD_DEFINED__
#define __IMarkupServices2_FWD_DEFINED__
typedef interface IMarkupServices2 IMarkupServices2;
#ifdef __cplusplus
interface IMarkupServices2;
#endif /* __cplusplus */
#endif

#ifndef __IMarkupContainer_FWD_DEFINED__
#define __IMarkupContainer_FWD_DEFINED__
typedef interface IMarkupContainer IMarkupContainer;
#ifdef __cplusplus
interface IMarkupContainer;
#endif /* __cplusplus */
#endif

#ifndef __IMarkupContainer2_FWD_DEFINED__
#define __IMarkupContainer2_FWD_DEFINED__
typedef interface IMarkupContainer2 IMarkupContainer2;
#ifdef __cplusplus
interface IMarkupContainer2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLChangePlayback_FWD_DEFINED__
#define __IHTMLChangePlayback_FWD_DEFINED__
typedef interface IHTMLChangePlayback IHTMLChangePlayback;
#ifdef __cplusplus
interface IHTMLChangePlayback;
#endif /* __cplusplus */
#endif

#ifndef __IMarkupPointer_FWD_DEFINED__
#define __IMarkupPointer_FWD_DEFINED__
typedef interface IMarkupPointer IMarkupPointer;
#ifdef __cplusplus
interface IMarkupPointer;
#endif /* __cplusplus */
#endif

#ifndef __IMarkupPointer2_FWD_DEFINED__
#define __IMarkupPointer2_FWD_DEFINED__
typedef interface IMarkupPointer2 IMarkupPointer2;
#ifdef __cplusplus
interface IMarkupPointer2;
#endif /* __cplusplus */
#endif

#ifndef __IMarkupTextFrags_FWD_DEFINED__
#define __IMarkupTextFrags_FWD_DEFINED__
typedef interface IMarkupTextFrags IMarkupTextFrags;
#ifdef __cplusplus
interface IMarkupTextFrags;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLChangeLog_FWD_DEFINED__
#define __IHTMLChangeLog_FWD_DEFINED__
typedef interface IHTMLChangeLog IHTMLChangeLog;
#ifdef __cplusplus
interface IHTMLChangeLog;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLChangeSink_FWD_DEFINED__
#define __IHTMLChangeSink_FWD_DEFINED__
typedef interface IHTMLChangeSink IHTMLChangeSink;
#ifdef __cplusplus
interface IHTMLChangeSink;
#endif /* __cplusplus */
#endif

#ifndef __IXMLGenericParse_FWD_DEFINED__
#define __IXMLGenericParse_FWD_DEFINED__
typedef interface IXMLGenericParse IXMLGenericParse;
#ifdef __cplusplus
interface IXMLGenericParse;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLEditHost_FWD_DEFINED__
#define __IHTMLEditHost_FWD_DEFINED__
typedef interface IHTMLEditHost IHTMLEditHost;
#ifdef __cplusplus
interface IHTMLEditHost;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLEditHost2_FWD_DEFINED__
#define __IHTMLEditHost2_FWD_DEFINED__
typedef interface IHTMLEditHost2 IHTMLEditHost2;
#ifdef __cplusplus
interface IHTMLEditHost2;
#endif /* __cplusplus */
#endif

#ifndef __ISegment_FWD_DEFINED__
#define __ISegment_FWD_DEFINED__
typedef interface ISegment ISegment;
#ifdef __cplusplus
interface ISegment;
#endif /* __cplusplus */
#endif

#ifndef __ISegmentListIterator_FWD_DEFINED__
#define __ISegmentListIterator_FWD_DEFINED__
typedef interface ISegmentListIterator ISegmentListIterator;
#ifdef __cplusplus
interface ISegmentListIterator;
#endif /* __cplusplus */
#endif

#ifndef __ISegmentList_FWD_DEFINED__
#define __ISegmentList_FWD_DEFINED__
typedef interface ISegmentList ISegmentList;
#ifdef __cplusplus
interface ISegmentList;
#endif /* __cplusplus */
#endif

#ifndef __ISequenceNumber_FWD_DEFINED__
#define __ISequenceNumber_FWD_DEFINED__
typedef interface ISequenceNumber ISequenceNumber;
#ifdef __cplusplus
interface ISequenceNumber;
#endif /* __cplusplus */
#endif

#ifndef __IIMEServices_FWD_DEFINED__
#define __IIMEServices_FWD_DEFINED__
typedef interface IIMEServices IIMEServices;
#ifdef __cplusplus
interface IIMEServices;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLCaret_FWD_DEFINED__
#define __IHTMLCaret_FWD_DEFINED__
typedef interface IHTMLCaret IHTMLCaret;
#ifdef __cplusplus
interface IHTMLCaret;
#endif /* __cplusplus */
#endif

#ifndef __IHighlightRenderingServices_FWD_DEFINED__
#define __IHighlightRenderingServices_FWD_DEFINED__
typedef interface IHighlightRenderingServices IHighlightRenderingServices;
#ifdef __cplusplus
interface IHighlightRenderingServices;
#endif /* __cplusplus */
#endif

#ifndef __ISelectionServicesListener_FWD_DEFINED__
#define __ISelectionServicesListener_FWD_DEFINED__
typedef interface ISelectionServicesListener ISelectionServicesListener;
#ifdef __cplusplus
interface ISelectionServicesListener;
#endif /* __cplusplus */
#endif

#ifndef __ISelectionServices_FWD_DEFINED__
#define __ISelectionServices_FWD_DEFINED__
typedef interface ISelectionServices ISelectionServices;
#ifdef __cplusplus
interface ISelectionServices;
#endif /* __cplusplus */
#endif

#ifndef __IElementSegment_FWD_DEFINED__
#define __IElementSegment_FWD_DEFINED__
typedef interface IElementSegment IElementSegment;
#ifdef __cplusplus
interface IElementSegment;
#endif /* __cplusplus */
#endif

#ifndef __IHighlightSegment_FWD_DEFINED__
#define __IHighlightSegment_FWD_DEFINED__
typedef interface IHighlightSegment IHighlightSegment;
#ifdef __cplusplus
interface IHighlightSegment;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLEditDesigner_FWD_DEFINED__
#define __IHTMLEditDesigner_FWD_DEFINED__
typedef interface IHTMLEditDesigner IHTMLEditDesigner;
#ifdef __cplusplus
interface IHTMLEditDesigner;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLEditServices_FWD_DEFINED__
#define __IHTMLEditServices_FWD_DEFINED__
typedef interface IHTMLEditServices IHTMLEditServices;
#ifdef __cplusplus
interface IHTMLEditServices;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLEditServices2_FWD_DEFINED__
#define __IHTMLEditServices2_FWD_DEFINED__
typedef interface IHTMLEditServices2 IHTMLEditServices2;
#ifdef __cplusplus
interface IHTMLEditServices2;
#endif /* __cplusplus */
#endif

#ifndef __ILineInfo_FWD_DEFINED__
#define __ILineInfo_FWD_DEFINED__
typedef interface ILineInfo ILineInfo;
#ifdef __cplusplus
interface ILineInfo;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLComputedStyle_FWD_DEFINED__
#define __IHTMLComputedStyle_FWD_DEFINED__
typedef interface IHTMLComputedStyle IHTMLComputedStyle;
#ifdef __cplusplus
interface IHTMLComputedStyle;
#endif /* __cplusplus */
#endif

#ifndef __IDisplayPointer_FWD_DEFINED__
#define __IDisplayPointer_FWD_DEFINED__
typedef interface IDisplayPointer IDisplayPointer;
#ifdef __cplusplus
interface IDisplayPointer;
#endif /* __cplusplus */
#endif

#ifndef __IDisplayServices_FWD_DEFINED__
#define __IDisplayServices_FWD_DEFINED__
typedef interface IDisplayServices IDisplayServices;
#ifdef __cplusplus
interface IDisplayServices;
#endif /* __cplusplus */
#endif

#ifndef __IHtmlDlgSafeHelper_FWD_DEFINED__
#define __IHtmlDlgSafeHelper_FWD_DEFINED__
typedef interface IHtmlDlgSafeHelper IHtmlDlgSafeHelper;
#ifdef __cplusplus
interface IHtmlDlgSafeHelper;
#endif /* __cplusplus */
#endif

#ifndef __IBlockFormats_FWD_DEFINED__
#define __IBlockFormats_FWD_DEFINED__
typedef interface IBlockFormats IBlockFormats;
#ifdef __cplusplus
interface IBlockFormats;
#endif /* __cplusplus */
#endif

#ifndef __IFontNames_FWD_DEFINED__
#define __IFontNames_FWD_DEFINED__
typedef interface IFontNames IFontNames;
#ifdef __cplusplus
interface IFontNames;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IDeveloperConsoleMessageReceiver;
#endif /* __cplusplus */
#endif

#ifndef __IDebugCallbackNotificationHandler_FWD_DEFINED__
#define __IDebugCallbackNotificationHandler_FWD_DEFINED__
typedef interface IDebugCallbackNotificationHandler IDebugCallbackNotificationHandler;
#ifdef __cplusplus
interface IDebugCallbackNotificationHandler;
#endif /* __cplusplus */
#endif

#ifndef __IScriptEventHandler_FWD_DEFINED__
#define __IScriptEventHandler_FWD_DEFINED__
typedef interface IScriptEventHandler IScriptEventHandler;
#ifdef __cplusplus
interface IScriptEventHandler;
#endif /* __cplusplus */
#endif

#ifndef __IScriptEventHandlerSourceInfo_FWD_DEFINED__
#define __IScriptEventHandlerSourceInfo_FWD_DEFINED__
typedef interface IScriptEventHandlerSourceInfo IScriptEventHandlerSourceInfo;
#ifdef __cplusplus
interface IScriptEventHandlerSourceInfo;
#endif /* __cplusplus */
#endif

#ifndef __IDOMEventRegistrationCallback_FWD_DEFINED__
#define __IDOMEventRegistrationCallback_FWD_DEFINED__
typedef interface IDOMEventRegistrationCallback IDOMEventRegistrationCallback;
#ifdef __cplusplus
interface IDOMEventRegistrationCallback;
#endif /* __cplusplus */
#endif

#ifndef __IEventTarget2_FWD_DEFINED__
#define __IEventTarget2_FWD_DEFINED__
typedef interface IEventTarget2 IEventTarget2;
#ifdef __cplusplus
interface IEventTarget2;
#endif /* __cplusplus */
#endif

#ifndef __HTMLNamespaceEvents_FWD_DEFINED__
#define __HTMLNamespaceEvents_FWD_DEFINED__
typedef interface HTMLNamespaceEvents HTMLNamespaceEvents;
#ifdef __cplusplus
interface HTMLNamespaceEvents;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLNamespace_FWD_DEFINED__
#define __IHTMLNamespace_FWD_DEFINED__
typedef interface IHTMLNamespace IHTMLNamespace;
#ifdef __cplusplus
interface IHTMLNamespace;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLNamespaceCollection_FWD_DEFINED__
#define __IHTMLNamespaceCollection_FWD_DEFINED__
typedef interface IHTMLNamespaceCollection IHTMLNamespaceCollection;
#ifdef __cplusplus
interface IHTMLNamespaceCollection;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLNamespace_FWD_DEFINED__
#define __DispHTMLNamespace_FWD_DEFINED__
typedef interface DispHTMLNamespace DispHTMLNamespace;
#ifdef __cplusplus
interface DispHTMLNamespace;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispHTMLNamespaceCollection;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLPainter;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLPainterEventInfo_FWD_DEFINED__
#define __IHTMLPainterEventInfo_FWD_DEFINED__
typedef interface IHTMLPainterEventInfo IHTMLPainterEventInfo;
#ifdef __cplusplus
interface IHTMLPainterEventInfo;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLPainterOverlay_FWD_DEFINED__
#define __IHTMLPainterOverlay_FWD_DEFINED__
typedef interface IHTMLPainterOverlay IHTMLPainterOverlay;
#ifdef __cplusplus
interface IHTMLPainterOverlay;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLPaintSite_FWD_DEFINED__
#define __IHTMLPaintSite_FWD_DEFINED__
typedef interface IHTMLPaintSite IHTMLPaintSite;
#ifdef __cplusplus
interface IHTMLPaintSite;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLIPrintCollection_FWD_DEFINED__
#define __IHTMLIPrintCollection_FWD_DEFINED__
typedef interface IHTMLIPrintCollection IHTMLIPrintCollection;
#ifdef __cplusplus
interface IHTMLIPrintCollection;
#endif /* __cplusplus */
#endif

#ifndef __IEnumPrivacyRecords_FWD_DEFINED__
#define __IEnumPrivacyRecords_FWD_DEFINED__
typedef interface IEnumPrivacyRecords IEnumPrivacyRecords;
#ifdef __cplusplus
interface IEnumPrivacyRecords;
#endif /* __cplusplus */
#endif

#ifndef __IWPCBlockedUrls_FWD_DEFINED__
#define __IWPCBlockedUrls_FWD_DEFINED__
typedef interface IWPCBlockedUrls IWPCBlockedUrls;
#ifdef __cplusplus
interface IWPCBlockedUrls;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDOMConstructorCollection_FWD_DEFINED__
#define __IHTMLDOMConstructorCollection_FWD_DEFINED__
typedef interface IHTMLDOMConstructorCollection IHTMLDOMConstructorCollection;
#ifdef __cplusplus
interface IHTMLDOMConstructorCollection;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDialog_FWD_DEFINED__
#define __IHTMLDialog_FWD_DEFINED__
typedef interface IHTMLDialog IHTMLDialog;
#ifdef __cplusplus
interface IHTMLDialog;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDialog2_FWD_DEFINED__
#define __IHTMLDialog2_FWD_DEFINED__
typedef interface IHTMLDialog2 IHTMLDialog2;
#ifdef __cplusplus
interface IHTMLDialog2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDialog3_FWD_DEFINED__
#define __IHTMLDialog3_FWD_DEFINED__
typedef interface IHTMLDialog3 IHTMLDialog3;
#ifdef __cplusplus
interface IHTMLDialog3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLModelessInit_FWD_DEFINED__
#define __IHTMLModelessInit_FWD_DEFINED__
typedef interface IHTMLModelessInit IHTMLModelessInit;
#ifdef __cplusplus
interface IHTMLModelessInit;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLPopup;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLPopup_FWD_DEFINED__
#define __DispHTMLPopup_FWD_DEFINED__
typedef interface DispHTMLPopup DispHTMLPopup;
#ifdef __cplusplus
interface DispHTMLPopup;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IHTMLAppBehavior;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLAppBehavior2_FWD_DEFINED__
#define __IHTMLAppBehavior2_FWD_DEFINED__
typedef interface IHTMLAppBehavior2 IHTMLAppBehavior2;
#ifdef __cplusplus
interface IHTMLAppBehavior2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLAppBehavior3_FWD_DEFINED__
#define __IHTMLAppBehavior3_FWD_DEFINED__
typedef interface IHTMLAppBehavior3 IHTMLAppBehavior3;
#ifdef __cplusplus
interface IHTMLAppBehavior3;
#endif /* __cplusplus */
#endif

#ifndef __DispHTMLAppBehavior_FWD_DEFINED__
#define __DispHTMLAppBehavior_FWD_DEFINED__
typedef interface DispHTMLAppBehavior DispHTMLAppBehavior;
#ifdef __cplusplus
interface DispHTMLAppBehavior;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispIHTMLInputButtonElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispIHTMLInputTextElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispIHTMLInputFileElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispIHTMLOptionButtonElement;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface DispIHTMLInputImage;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IElementBehaviorFactory;
#endif /* __cplusplus */
#endif

#ifndef __IElementNamespace_FWD_DEFINED__
#define __IElementNamespace_FWD_DEFINED__
typedef interface IElementNamespace IElementNamespace;
#ifdef __cplusplus
interface IElementNamespace;
#endif /* __cplusplus */
#endif

#ifndef __IElementNamespaceTable_FWD_DEFINED__
#define __IElementNamespaceTable_FWD_DEFINED__
typedef interface IElementNamespaceTable IElementNamespaceTable;
#ifdef __cplusplus
interface IElementNamespaceTable;
#endif /* __cplusplus */
#endif

#ifndef __IElementNamespaceFactory_FWD_DEFINED__
#define __IElementNamespaceFactory_FWD_DEFINED__
typedef interface IElementNamespaceFactory IElementNamespaceFactory;
#ifdef __cplusplus
interface IElementNamespaceFactory;
#endif /* __cplusplus */
#endif

#ifndef __IElementNamespaceFactory2_FWD_DEFINED__
#define __IElementNamespaceFactory2_FWD_DEFINED__
typedef interface IElementNamespaceFactory2 IElementNamespaceFactory2;
#ifdef __cplusplus
interface IElementNamespaceFactory2;
#endif /* __cplusplus */
#endif

#ifndef __IElementNamespaceFactoryCallback_FWD_DEFINED__
#define __IElementNamespaceFactoryCallback_FWD_DEFINED__
typedef interface IElementNamespaceFactoryCallback IElementNamespaceFactoryCallback;
#ifdef __cplusplus
interface IElementNamespaceFactoryCallback;
#endif /* __cplusplus */
#endif

#ifndef __IElementBehavior_FWD_DEFINED__
#define __IElementBehavior_FWD_DEFINED__
typedef interface IElementBehavior IElementBehavior;
#ifdef __cplusplus
interface IElementBehavior;
#endif /* __cplusplus */
#endif

#ifndef __IElementBehaviorSite_FWD_DEFINED__
#define __IElementBehaviorSite_FWD_DEFINED__
typedef interface IElementBehaviorSite IElementBehaviorSite;
#ifdef __cplusplus
interface IElementBehaviorSite;
#endif /* __cplusplus */
#endif

#ifndef __IElementBehaviorSiteOM_FWD_DEFINED__
#define __IElementBehaviorSiteOM_FWD_DEFINED__
typedef interface IElementBehaviorSiteOM IElementBehaviorSiteOM;
#ifdef __cplusplus
interface IElementBehaviorSiteOM;
#endif /* __cplusplus */
#endif

#ifndef __IElementBehaviorSiteOM2_FWD_DEFINED__
#define __IElementBehaviorSiteOM2_FWD_DEFINED__
typedef interface IElementBehaviorSiteOM2 IElementBehaviorSiteOM2;
#ifdef __cplusplus
interface IElementBehaviorSiteOM2;
#endif /* __cplusplus */
#endif

#ifndef __IElementBehaviorRender_FWD_DEFINED__
#define __IElementBehaviorRender_FWD_DEFINED__
typedef interface IElementBehaviorRender IElementBehaviorRender;
#ifdef __cplusplus
interface IElementBehaviorRender;
#endif /* __cplusplus */
#endif

#ifndef __IElementBehaviorSiteRender_FWD_DEFINED__
#define __IElementBehaviorSiteRender_FWD_DEFINED__
typedef interface IElementBehaviorSiteRender IElementBehaviorSiteRender;
#ifdef __cplusplus
interface IElementBehaviorSiteRender;
#endif /* __cplusplus */
#endif

#ifndef __IElementBehaviorCategory_FWD_DEFINED__
#define __IElementBehaviorCategory_FWD_DEFINED__
typedef interface IElementBehaviorCategory IElementBehaviorCategory;
#ifdef __cplusplus
interface IElementBehaviorCategory;
#endif /* __cplusplus */
#endif

#ifndef __IElementBehaviorSiteCategory_FWD_DEFINED__
#define __IElementBehaviorSiteCategory_FWD_DEFINED__
typedef interface IElementBehaviorSiteCategory IElementBehaviorSiteCategory;
#ifdef __cplusplus
interface IElementBehaviorSiteCategory;
#endif /* __cplusplus */
#endif

#ifndef __IElementBehaviorSubmit_FWD_DEFINED__
#define __IElementBehaviorSubmit_FWD_DEFINED__
typedef interface IElementBehaviorSubmit IElementBehaviorSubmit;
#ifdef __cplusplus
interface IElementBehaviorSubmit;
#endif /* __cplusplus */
#endif

#ifndef __IElementBehaviorFocus_FWD_DEFINED__
#define __IElementBehaviorFocus_FWD_DEFINED__
typedef interface IElementBehaviorFocus IElementBehaviorFocus;
#ifdef __cplusplus
interface IElementBehaviorFocus;
#endif /* __cplusplus */
#endif

#ifndef __IElementBehaviorLayout_FWD_DEFINED__
#define __IElementBehaviorLayout_FWD_DEFINED__
typedef interface IElementBehaviorLayout IElementBehaviorLayout;
#ifdef __cplusplus
interface IElementBehaviorLayout;
#endif /* __cplusplus */
#endif

#ifndef __IElementBehaviorLayout2_FWD_DEFINED__
#define __IElementBehaviorLayout2_FWD_DEFINED__
typedef interface IElementBehaviorLayout2 IElementBehaviorLayout2;
#ifdef __cplusplus
interface IElementBehaviorLayout2;
#endif /* __cplusplus */
#endif

#ifndef __IElementBehaviorSiteLayout_FWD_DEFINED__
#define __IElementBehaviorSiteLayout_FWD_DEFINED__
typedef interface IElementBehaviorSiteLayout IElementBehaviorSiteLayout;
#ifdef __cplusplus
interface IElementBehaviorSiteLayout;
#endif /* __cplusplus */
#endif

#ifndef __IElementBehaviorSiteLayout2_FWD_DEFINED__
#define __IElementBehaviorSiteLayout2_FWD_DEFINED__
typedef interface IElementBehaviorSiteLayout2 IElementBehaviorSiteLayout2;
#ifdef __cplusplus
interface IElementBehaviorSiteLayout2;
#endif /* __cplusplus */
#endif

#ifndef __IHostBehaviorInit_FWD_DEFINED__
#define __IHostBehaviorInit_FWD_DEFINED__
typedef interface IHostBehaviorInit IHostBehaviorInit;
#ifdef __cplusplus
interface IHostBehaviorInit;
#endif /* __cplusplus */
#endif

#ifndef __IViewObjectPresentSite_FWD_DEFINED__
#define __IViewObjectPresentSite_FWD_DEFINED__
typedef interface IViewObjectPresentSite IViewObjectPresentSite;
#ifdef __cplusplus
interface IViewObjectPresentSite;
#endif /* __cplusplus */
#endif

#ifndef __ISurfacePresenter_FWD_DEFINED__
#define __ISurfacePresenter_FWD_DEFINED__
typedef interface ISurfacePresenter ISurfacePresenter;
#ifdef __cplusplus
interface ISurfacePresenter;
#endif /* __cplusplus */
#endif

#ifndef __ICanvasPixelArrayData_FWD_DEFINED__
#define __ICanvasPixelArrayData_FWD_DEFINED__
typedef interface ICanvasPixelArrayData ICanvasPixelArrayData;
#ifdef __cplusplus
interface ICanvasPixelArrayData;
#endif /* __cplusplus */
#endif

#ifndef __IViewObjectPrint_FWD_DEFINED__
#define __IViewObjectPrint_FWD_DEFINED__
typedef interface IViewObjectPrint IViewObjectPrint;
#ifdef __cplusplus
interface IViewObjectPrint;
#endif /* __cplusplus */
#endif

#ifndef __IViewObjectPresentNotifySite_FWD_DEFINED__
#define __IViewObjectPresentNotifySite_FWD_DEFINED__
typedef interface IViewObjectPresentNotifySite IViewObjectPresentNotifySite;
#ifdef __cplusplus
interface IViewObjectPresentNotifySite;
#endif /* __cplusplus */
#endif

#ifndef __IViewObjectPresentNotify_FWD_DEFINED__
#define __IViewObjectPresentNotify_FWD_DEFINED__
typedef interface IViewObjectPresentNotify IViewObjectPresentNotify;
#ifdef __cplusplus
interface IViewObjectPresentNotify;
#endif /* __cplusplus */
#endif

#ifndef __ITrackingProtection_FWD_DEFINED__
#define __ITrackingProtection_FWD_DEFINED__
typedef interface ITrackingProtection ITrackingProtection;
#ifdef __cplusplus
interface ITrackingProtection;
#endif /* __cplusplus */
#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


#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__ */

#ifndef __MSHTML_LIBRARY_DEFINED__
#define __MSHTML_LIBRARY_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;
#ifdef __cplusplus
interface IDOMEvent;
#endif /* __cplusplus */
#endif

#ifndef __IElementBehavior_FWD_DEFINED__
#define __IElementBehavior_FWD_DEFINED__
typedef interface IElementBehavior IElementBehavior;
#ifdef __cplusplus
interface IElementBehavior;
#endif /* __cplusplus */
#endif

#ifndef __IElementBehaviorFactory_FWD_DEFINED__
#define __IElementBehaviorFactory_FWD_DEFINED__
typedef interface IElementBehaviorFactory IElementBehaviorFactory;
#ifdef __cplusplus
interface IElementBehaviorFactory;
#endif /* __cplusplus */
#endif

#ifndef __IElementBehaviorRender_FWD_DEFINED__
#define __IElementBehaviorRender_FWD_DEFINED__
typedef interface IElementBehaviorRender IElementBehaviorRender;
#ifdef __cplusplus
interface IElementBehaviorRender;
#endif /* __cplusplus */
#endif

#ifndef __IElementBehaviorSite_FWD_DEFINED__
#define __IElementBehaviorSite_FWD_DEFINED__
typedef interface IElementBehaviorSite IElementBehaviorSite;
#ifdef __cplusplus
interface IElementBehaviorSite;
#endif /* __cplusplus */
#endif

#ifndef __IElementBehaviorSiteOM_FWD_DEFINED__
#define __IElementBehaviorSiteOM_FWD_DEFINED__
typedef interface IElementBehaviorSiteOM IElementBehaviorSiteOM;
#ifdef __cplusplus
interface IElementBehaviorSiteOM;
#endif /* __cplusplus */
#endif

#ifndef __IElementBehaviorSiteRender_FWD_DEFINED__
#define __IElementBehaviorSiteRender_FWD_DEFINED__
typedef interface IElementBehaviorSiteRender IElementBehaviorSiteRender;
#ifdef __cplusplus
interface IElementBehaviorSiteRender;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLEventObj_FWD_DEFINED__
#define __IHTMLEventObj_FWD_DEFINED__
typedef interface IHTMLEventObj IHTMLEventObj;
#ifdef __cplusplus
interface IHTMLEventObj;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLStyleSheetRule_FWD_DEFINED__
#define __IHTMLStyleSheetRule_FWD_DEFINED__
typedef interface IHTMLStyleSheetRule IHTMLStyleSheetRule;
#ifdef __cplusplus
interface IHTMLStyleSheetRule;
#endif /* __cplusplus */
#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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;
#ifdef __cplusplus
interface IHTMLStyleSheetRulesCollection;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLStyleSheet_FWD_DEFINED__
#define __IHTMLStyleSheet_FWD_DEFINED__
typedef interface IHTMLStyleSheet IHTMLStyleSheet;
#ifdef __cplusplus
interface IHTMLStyleSheet;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLRuleStyle_FWD_DEFINED__
#define __IHTMLRuleStyle_FWD_DEFINED__
typedef interface IHTMLRuleStyle IHTMLRuleStyle;
#ifdef __cplusplus
interface IHTMLRuleStyle;
#endif /* __cplusplus */
#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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;
#ifdef __cplusplus
interface IHTMLElement;
#endif /* __cplusplus */
#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


#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


#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


#endif  /* __IHTMLRectCollection_INTERFACE_DEFINED__ */

#ifndef __IHTMLElementCollection_FWD_DEFINED__
#define __IHTMLElementCollection_FWD_DEFINED__
typedef interface IHTMLElementCollection IHTMLElementCollection;
#ifdef __cplusplus
interface IHTMLElementCollection;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLElement2_FWD_DEFINED__
#define __IHTMLElement2_FWD_DEFINED__
typedef interface IHTMLElement2 IHTMLElement2;
#ifdef __cplusplus
interface IHTMLElement2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLAttributeCollection3_FWD_DEFINED__
#define __IHTMLAttributeCollection3_FWD_DEFINED__
typedef interface IHTMLAttributeCollection3 IHTMLAttributeCollection3;
#ifdef __cplusplus
interface IHTMLAttributeCollection3;
#endif /* __cplusplus */
#endif

#ifndef __IDOMDocumentType_FWD_DEFINED__
#define __IDOMDocumentType_FWD_DEFINED__
typedef interface IDOMDocumentType IDOMDocumentType;
#ifdef __cplusplus
interface IDOMDocumentType;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDocument7_FWD_DEFINED__
#define __IHTMLDocument7_FWD_DEFINED__
typedef interface IHTMLDocument7 IHTMLDocument7;
#ifdef __cplusplus
interface IHTMLDocument7;
#endif /* __cplusplus */
#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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;
#ifdef __cplusplus
interface IHTMLEventObj;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLElementCollection_FWD_DEFINED__
#define __IHTMLElementCollection_FWD_DEFINED__
typedef interface IHTMLElementCollection IHTMLElementCollection;
#ifdef __cplusplus
interface IHTMLElementCollection;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLFiltersCollection_FWD_DEFINED__
#define __IHTMLFiltersCollection_FWD_DEFINED__
typedef interface IHTMLFiltersCollection IHTMLFiltersCollection;
#ifdef __cplusplus
interface IHTMLFiltersCollection;
#endif /* __cplusplus */
#endif

#ifndef __IRulesAppliedCollection_FWD_DEFINED__
#define __IRulesAppliedCollection_FWD_DEFINED__
typedef interface IRulesAppliedCollection IRulesAppliedCollection;
#ifdef __cplusplus
interface IRulesAppliedCollection;
#endif /* __cplusplus */
#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#endif  /* __IHTMLDatabinding_INTERFACE_DEFINED__ */

#ifndef __IHTMLDocument_FWD_DEFINED__
#define __IHTMLDocument_FWD_DEFINED__
typedef interface IHTMLDocument IHTMLDocument;
#ifdef __cplusplus
interface IHTMLDocument;
#endif /* __cplusplus */
#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


#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;
#ifdef __cplusplus
interface IHTMLEventObj;
#endif /* __cplusplus */
#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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;
#ifdef __cplusplus
interface IHTMLStyleSheetsCollection;
#endif /* __cplusplus */
#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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;
#ifdef __cplusplus
interface IHTMLOptionElement;
#endif /* __cplusplus */
#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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;
#ifdef __cplusplus
interface IWebGeolocation;
#endif /* __cplusplus */
#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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;
#ifdef __cplusplus
interface IHTMLDocument;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDocument2_FWD_DEFINED__
#define __IHTMLDocument2_FWD_DEFINED__
typedef interface IHTMLDocument2 IHTMLDocument2;
#ifdef __cplusplus
interface IHTMLDocument2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLFramesCollection2_FWD_DEFINED__
#define __IHTMLFramesCollection2_FWD_DEFINED__
typedef interface IHTMLFramesCollection2 IHTMLFramesCollection2;
#ifdef __cplusplus
interface IHTMLFramesCollection2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLWindow2_FWD_DEFINED__
#define __IHTMLWindow2_FWD_DEFINED__
typedef interface IHTMLWindow2 IHTMLWindow2;
#ifdef __cplusplus
interface IHTMLWindow2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLWindow3_FWD_DEFINED__
#define __IHTMLWindow3_FWD_DEFINED__
typedef interface IHTMLWindow3 IHTMLWindow3;
#ifdef __cplusplus
interface IHTMLWindow3;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLFrameBase_FWD_DEFINED__
#define __IHTMLFrameBase_FWD_DEFINED__
typedef interface IHTMLFrameBase IHTMLFrameBase;
#ifdef __cplusplus
interface IHTMLFrameBase;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLStorage_FWD_DEFINED__
#define __IHTMLStorage_FWD_DEFINED__
typedef interface IHTMLStorage IHTMLStorage;
#ifdef __cplusplus
interface IHTMLStorage;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLPerformance_FWD_DEFINED__
#define __IHTMLPerformance_FWD_DEFINED__
typedef interface IHTMLPerformance IHTMLPerformance;
#ifdef __cplusplus
interface IHTMLPerformance;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLCSSStyleDeclaration_FWD_DEFINED__
#define __IHTMLCSSStyleDeclaration_FWD_DEFINED__
typedef interface IHTMLCSSStyleDeclaration IHTMLCSSStyleDeclaration;
#ifdef __cplusplus
interface IHTMLCSSStyleDeclaration;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLApplicationCache_FWD_DEFINED__
#define __IHTMLApplicationCache_FWD_DEFINED__
typedef interface IHTMLApplicationCache IHTMLApplicationCache;
#ifdef __cplusplus
interface IHTMLApplicationCache;
#endif /* __cplusplus */
#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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;
#ifdef __cplusplus
interface ISVGSVGElement;
#endif /* __cplusplus */
#endif

#ifndef __IDOMNodeIterator_FWD_DEFINED__
#define __IDOMNodeIterator_FWD_DEFINED__
typedef interface IDOMNodeIterator IDOMNodeIterator;
#ifdef __cplusplus
interface IDOMNodeIterator;
#endif /* __cplusplus */
#endif

#ifndef __IDOMTreeWalker_FWD_DEFINED__
#define __IDOMTreeWalker_FWD_DEFINED__
typedef interface IDOMTreeWalker IDOMTreeWalker;
#ifdef __cplusplus
interface IDOMTreeWalker;
#endif /* __cplusplus */
#endif

#ifndef __IDOMProcessingInstruction_FWD_DEFINED__
#define __IDOMProcessingInstruction_FWD_DEFINED__
typedef interface IDOMProcessingInstruction IDOMProcessingInstruction;
#ifdef __cplusplus
interface IDOMProcessingInstruction;
#endif /* __cplusplus */
#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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;
#ifdef __cplusplus
interface IHTMLTableSection;
#endif /* __cplusplus */
#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#endif  /* __ICanvasPixelArray_INTERFACE_DEFINED__ */

#ifndef __IHTMLCanvasElement_FWD_DEFINED__
#define __IHTMLCanvasElement_FWD_DEFINED__
typedef interface IHTMLCanvasElement IHTMLCanvasElement;
#ifdef __cplusplus
interface IHTMLCanvasElement;
#endif /* __cplusplus */
#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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;
#ifdef __cplusplus
interface ISVGElement;
#endif /* __cplusplus */
#endif

#ifndef __ISVGRect_FWD_DEFINED__
#define __ISVGRect_FWD_DEFINED__
typedef interface ISVGRect ISVGRect;
#ifdef __cplusplus
interface ISVGRect;
#endif /* __cplusplus */
#endif

#ifndef __ISVGMatrix_FWD_DEFINED__
#define __ISVGMatrix_FWD_DEFINED__
typedef interface ISVGMatrix ISVGMatrix;
#ifdef __cplusplus
interface ISVGMatrix;
#endif /* __cplusplus */
#endif

#ifndef __ISVGStringList_FWD_DEFINED__
#define __ISVGStringList_FWD_DEFINED__
typedef interface ISVGStringList ISVGStringList;
#ifdef __cplusplus
interface ISVGStringList;
#endif /* __cplusplus */
#endif

#ifndef __ISVGAnimatedRect_FWD_DEFINED__
#define __ISVGAnimatedRect_FWD_DEFINED__
typedef interface ISVGAnimatedRect ISVGAnimatedRect;
#ifdef __cplusplus
interface ISVGAnimatedRect;
#endif /* __cplusplus */
#endif

#ifndef __ISVGAnimatedString_FWD_DEFINED__
#define __ISVGAnimatedString_FWD_DEFINED__
typedef interface ISVGAnimatedString ISVGAnimatedString;
#ifdef __cplusplus
interface ISVGAnimatedString;
#endif /* __cplusplus */
#endif

#ifndef __ISVGAnimatedBoolean_FWD_DEFINED__
#define __ISVGAnimatedBoolean_FWD_DEFINED__
typedef interface ISVGAnimatedBoolean ISVGAnimatedBoolean;
#ifdef __cplusplus
interface ISVGAnimatedBoolean;
#endif /* __cplusplus */
#endif

#ifndef __ISVGAnimatedTransformList_FWD_DEFINED__
#define __ISVGAnimatedTransformList_FWD_DEFINED__
typedef interface ISVGAnimatedTransformList ISVGAnimatedTransformList;
#ifdef __cplusplus
interface ISVGAnimatedTransformList;
#endif /* __cplusplus */
#endif

#ifndef __ISVGAnimatedPreserveAspectRatio_FWD_DEFINED__
#define __ISVGAnimatedPreserveAspectRatio_FWD_DEFINED__
typedef interface ISVGAnimatedPreserveAspectRatio ISVGAnimatedPreserveAspectRatio;
#ifdef __cplusplus
interface ISVGAnimatedPreserveAspectRatio;
#endif /* __cplusplus */
#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


#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


#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


#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


#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


#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


#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


#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


#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


#endif  /* __ISVGURIReference_INTERFACE_DEFINED__ */

#ifndef __ISVGAngle_FWD_DEFINED__
#define __ISVGAngle_FWD_DEFINED__
typedef interface ISVGAngle ISVGAngle;
#ifdef __cplusplus
interface ISVGAngle;
#endif /* __cplusplus */
#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


#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;
#ifdef __cplusplus
interface ISVGTransformList;
#endif /* __cplusplus */
#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


#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


#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


#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


#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;
#ifdef __cplusplus
interface ISVGLength;
#endif /* __cplusplus */
#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


#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;
#ifdef __cplusplus
interface ISVGLengthList;
#endif /* __cplusplus */
#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


#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;
#ifdef __cplusplus
interface ISVGNumber;
#endif /* __cplusplus */
#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


#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;
#ifdef __cplusplus
interface ISVGNumberList;
#endif /* __cplusplus */
#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


#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;
#ifdef __cplusplus
interface ISVGRect;
#endif /* __cplusplus */
#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


#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


#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


#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


#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


#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;
#ifdef __cplusplus
interface ISVGSVGElement;
#endif /* __cplusplus */
#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


#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


#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;
#ifdef __cplusplus
interface ISVGLength;
#endif /* __cplusplus */
#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


#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


#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


#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;
#ifdef __cplusplus
interface ISVGNumber;
#endif /* __cplusplus */
#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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;
#ifdef __cplusplus
interface ISVGPathSeg;
#endif /* __cplusplus */
#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


#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;
#ifdef __cplusplus
interface ISVGMatrix;
#endif /* __cplusplus */
#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


#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;
#ifdef __cplusplus
interface ISVGPoint;
#endif /* __cplusplus */
#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


#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


#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


#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;
#ifdef __cplusplus
interface ISVGMatrix;
#endif /* __cplusplus */
#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


#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;
#ifdef __cplusplus
interface IHTMLElement;
#endif /* __cplusplus */
#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


#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;
#ifdef __cplusplus
interface ISVGElementInstance;
#endif /* __cplusplus */
#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


#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;
#ifdef __cplusplus
interface IHTMLStyleSheetRulesAppliedCollection;
#endif /* __cplusplus */
#endif

#ifndef __IRulesApplied_FWD_DEFINED__
#define __IRulesApplied_FWD_DEFINED__
typedef interface IRulesApplied IRulesApplied;
#ifdef __cplusplus
interface IRulesApplied;
#endif /* __cplusplus */
#endif

#ifndef __IRulesAppliedCollection_FWD_DEFINED__
#define __IRulesAppliedCollection_FWD_DEFINED__
typedef interface IRulesAppliedCollection IRulesAppliedCollection;
#ifdef __cplusplus
interface IRulesAppliedCollection;
#endif /* __cplusplus */
#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


#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


#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


#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;
#ifdef __cplusplus
interface ISVGTransform;
#endif /* __cplusplus */
#endif

#ifndef __ISVGMatrix_FWD_DEFINED__
#define __ISVGMatrix_FWD_DEFINED__
typedef interface ISVGMatrix ISVGMatrix;
#ifdef __cplusplus
interface ISVGMatrix;
#endif /* __cplusplus */
#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


#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;
#ifdef __cplusplus
interface ISVGPointList;
#endif /* __cplusplus */
#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


#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


#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


#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


#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


#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


#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


#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


#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;
#ifdef __cplusplus
interface ISVGPreserveAspectRatio;
#endif /* __cplusplus */
#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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;
#ifdef __cplusplus
interface ISVGElement;
#endif /* __cplusplus */
#endif

#ifndef __ISVGUseElement_FWD_DEFINED__
#define __ISVGUseElement_FWD_DEFINED__
typedef interface ISVGUseElement ISVGUseElement;
#ifdef __cplusplus
interface ISVGUseElement;
#endif /* __cplusplus */
#endif

#ifndef __ISVGElementInstanceList_FWD_DEFINED__
#define __ISVGElementInstanceList_FWD_DEFINED__
typedef interface ISVGElementInstanceList ISVGElementInstanceList;
#ifdef __cplusplus
interface ISVGElementInstanceList;
#endif /* __cplusplus */
#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


#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;
#ifdef __cplusplus
interface ISVGElementInstance;
#endif /* __cplusplus */
#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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;
#ifdef __cplusplus
interface IHTMLPerformance;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLPerformanceNavigation_FWD_DEFINED__
#define __IHTMLPerformanceNavigation_FWD_DEFINED__
typedef interface IHTMLPerformanceNavigation IHTMLPerformanceNavigation;
#ifdef __cplusplus
interface IHTMLPerformanceNavigation;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLPerformanceTiming_FWD_DEFINED__
#define __IHTMLPerformanceTiming_FWD_DEFINED__
typedef interface IHTMLPerformanceTiming IHTMLPerformanceTiming;
#ifdef __cplusplus
interface IHTMLPerformanceTiming;
#endif /* __cplusplus */
#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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;
#ifdef __cplusplus
interface IElementBehaviorSite;
#endif /* __cplusplus */
#endif

#ifndef __ICSSFilterSite_FWD_DEFINED__
#define __ICSSFilterSite_FWD_DEFINED__
typedef interface ICSSFilterSite ICSSFilterSite;
#ifdef __cplusplus
interface ICSSFilterSite;
#endif /* __cplusplus */
#endif

#ifndef __IMarkupPointer_FWD_DEFINED__
#define __IMarkupPointer_FWD_DEFINED__
typedef interface IMarkupPointer IMarkupPointer;
#ifdef __cplusplus
interface IMarkupPointer;
#endif /* __cplusplus */
#endif

#ifndef __IMarkupContainer_FWD_DEFINED__
#define __IMarkupContainer_FWD_DEFINED__
typedef interface IMarkupContainer IMarkupContainer;
#ifdef __cplusplus
interface IMarkupContainer;
#endif /* __cplusplus */
#endif

#ifndef __IMarkupContainer2_FWD_DEFINED__
#define __IMarkupContainer2_FWD_DEFINED__
typedef interface IMarkupContainer2 IMarkupContainer2;
#ifdef __cplusplus
interface IMarkupContainer2;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLChangeLog_FWD_DEFINED__
#define __IHTMLChangeLog_FWD_DEFINED__
typedef interface IHTMLChangeLog IHTMLChangeLog;
#ifdef __cplusplus
interface IHTMLChangeLog;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLChangeSink_FWD_DEFINED__
#define __IHTMLChangeSink_FWD_DEFINED__
typedef interface IHTMLChangeSink IHTMLChangeSink;
#ifdef __cplusplus
interface IHTMLChangeSink;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLDocument2_FWD_DEFINED__
#define __IHTMLDocument2_FWD_DEFINED__
typedef interface IHTMLDocument2 IHTMLDocument2;
#ifdef __cplusplus
interface IHTMLDocument2;
#endif /* __cplusplus */
#endif

#ifndef __IActiveIMMApp_FWD_DEFINED__
#define __IActiveIMMApp_FWD_DEFINED__
typedef interface IActiveIMMApp IActiveIMMApp;
#ifdef __cplusplus
interface IActiveIMMApp;
#endif /* __cplusplus */
#endif

#ifndef __ISegmentList_FWD_DEFINED__
#define __ISegmentList_FWD_DEFINED__
typedef interface ISegmentList ISegmentList;
#ifdef __cplusplus
interface ISegmentList;
#endif /* __cplusplus */
#endif

#ifndef __ISegmentListIterator_FWD_DEFINED__
#define __ISegmentListIterator_FWD_DEFINED__
typedef interface ISegmentListIterator ISegmentListIterator;
#ifdef __cplusplus
interface ISegmentListIterator;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLCaret_FWD_DEFINED__
#define __IHTMLCaret_FWD_DEFINED__
typedef interface IHTMLCaret IHTMLCaret;
#ifdef __cplusplus
interface IHTMLCaret;
#endif /* __cplusplus */
#endif

#ifndef __ISegment_FWD_DEFINED__
#define __ISegment_FWD_DEFINED__
typedef interface ISegment ISegment;
#ifdef __cplusplus
interface ISegment;
#endif /* __cplusplus */
#endif

#ifndef __IElementSegment_FWD_DEFINED__
#define __IElementSegment_FWD_DEFINED__
typedef interface IElementSegment IElementSegment;
#ifdef __cplusplus
interface IElementSegment;
#endif /* __cplusplus */
#endif

#ifndef __IHighlightSegment_FWD_DEFINED__
#define __IHighlightSegment_FWD_DEFINED__
typedef interface IHighlightSegment IHighlightSegment;
#ifdef __cplusplus
interface IHighlightSegment;
#endif /* __cplusplus */
#endif

#ifndef __IHighlightRenderingServices_FWD_DEFINED__
#define __IHighlightRenderingServices_FWD_DEFINED__
typedef interface IHighlightRenderingServices IHighlightRenderingServices;
#ifdef __cplusplus
interface IHighlightRenderingServices;
#endif /* __cplusplus */
#endif

#ifndef __ILineInfo_FWD_DEFINED__
#define __ILineInfo_FWD_DEFINED__
typedef interface ILineInfo ILineInfo;
#ifdef __cplusplus
interface ILineInfo;
#endif /* __cplusplus */
#endif

#ifndef __IDisplayPointer_FWD_DEFINED__
#define __IDisplayPointer_FWD_DEFINED__
typedef interface IDisplayPointer IDisplayPointer;
#ifdef __cplusplus
interface IDisplayPointer;
#endif /* __cplusplus */
#endif

#ifndef __IDisplayServices_FWD_DEFINED__
#define __IDisplayServices_FWD_DEFINED__
typedef interface IDisplayServices IDisplayServices;
#ifdef __cplusplus
interface IDisplayServices;
#endif /* __cplusplus */
#endif

#ifndef __IHtmlDlgSafeHelper_FWD_DEFINED__
#define __IHtmlDlgSafeHelper_FWD_DEFINED__
typedef interface IHtmlDlgSafeHelper IHtmlDlgSafeHelper;
#ifdef __cplusplus
interface IHtmlDlgSafeHelper;
#endif /* __cplusplus */
#endif

#ifndef __IBlockFormats_FWD_DEFINED__
#define __IBlockFormats_FWD_DEFINED__
typedef interface IBlockFormats IBlockFormats;
#ifdef __cplusplus
interface IBlockFormats;
#endif /* __cplusplus */
#endif

#ifndef __IFontNames_FWD_DEFINED__
#define __IFontNames_FWD_DEFINED__
typedef interface IFontNames IFontNames;
#ifdef __cplusplus
interface IFontNames;
#endif /* __cplusplus */
#endif

#ifndef __IScriptEventHandler_FWD_DEFINED__
#define __IScriptEventHandler_FWD_DEFINED__
typedef interface IScriptEventHandler IScriptEventHandler;
#ifdef __cplusplus
interface IScriptEventHandler;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLPainter_FWD_DEFINED__
#define __IHTMLPainter_FWD_DEFINED__
typedef interface IHTMLPainter IHTMLPainter;
#ifdef __cplusplus
interface IHTMLPainter;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLPaintSite_FWD_DEFINED__
#define __IHTMLPaintSite_FWD_DEFINED__
typedef interface IHTMLPaintSite IHTMLPaintSite;
#ifdef __cplusplus
interface IHTMLPaintSite;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IElementBehavior;
#endif /* __cplusplus */
#endif

#ifndef __IElementBehaviorSite_FWD_DEFINED__
#define __IElementBehaviorSite_FWD_DEFINED__
typedef interface IElementBehaviorSite IElementBehaviorSite;
#ifdef __cplusplus
interface IElementBehaviorSite;
#endif /* __cplusplus */
#endif

#ifndef __IHTMLElementDefaults_FWD_DEFINED__
#define __IHTMLElementDefaults_FWD_DEFINED__
typedef interface IHTMLElementDefaults IHTMLElementDefaults;
#ifdef __cplusplus
interface IHTMLElementDefaults;
#endif /* __cplusplus */
#endif

#ifndef __ISurfacePresenter_FWD_DEFINED__
#define __ISurfacePresenter_FWD_DEFINED__
typedef interface ISurfacePresenter ISurfacePresenter;
#ifdef __cplusplus
interface ISurfacePresenter;
#endif /* __cplusplus */
#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#endif  /* __ITrackingProtection_INTERFACE_DEFINED__ */

#endif /* __MSHTML_LIBRARY_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__ */
